|
28391
|
588
|
27
|
2026-04-15T14:14:20.991013+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776262460991_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
9781702349812035158/185toImperial Age--Light Caval 9781702349812035158/185toImperial Age--Light Cavalry Created---Blast Furnace Research Complete---Elite Longbowman Created--Warning: You are being attacked byPlayer 2 Rajyapala!!!-5 Magnus Olafsson: 33015/330151 kovaliklukas: 26589/26589NVIVRajyapala: 25100/251008 Almish Yiltawar: 23792/23792ON6 /LAsz16 Io 12166/12166 NV26°...
|
NULL
|
-8946886613276255578
|
NULL
|
click
|
ocr
|
NULL
|
9781702349812035158/185toImperial Age--Light Caval 9781702349812035158/185toImperial Age--Light Cavalry Created---Blast Furnace Research Complete---Elite Longbowman Created--Warning: You are being attacked byPlayer 2 Rajyapala!!!-5 Magnus Olafsson: 33015/330151 kovaliklukas: 26589/26589NVIVRajyapala: 25100/251008 Almish Yiltawar: 23792/23792ON6 /LAsz16 Io 12166/12166 NV26°...
|
NULL
|
|
36822
|
748
|
28
|
2026-04-16T11:02:57.783063+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776337377783_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileNavigateEdit→ViewCodeCJIMINNY+Account PhpStormFileNavigateEdit→ViewCodeCJIMINNY+Account disconnectedIt looks like your Zoho CRM account has become disconnectedPlease re-connect to continueSign in with Zoho CRMLộ3LaravelRefactorRunToolsGitWindowHelpSupport Daily • in 58 m100% <478Thu 16 Apr 14:02:57• app.dev.jiminny.com/connect/zohocrm• InspectorConsoleDebuggerN Network() Style Editor@ Performance05 07 Filter URLs+Disable CacheNo Throttling+AllHTMLCSSJSXHRWS OtherDoECOECAECOECOECOEFOECOECOECOECOEFOECOECOECOECOECOEFOECOECOECOECOEFOECAECOECAECOEFOFileconnect incS...5...connect xhself-aut incj3....self-aut xhf0 Bzohocrn incj2...zohocrn xh r 0 Bconnect incj5..connect xhF 0Bself-aut incj3..self-aut xhFOBzohoern inc j 2...connect inc izohoern xh F 0Bconnect xhFOBself-aut inc3..self-aut xh0 Bzohoern inc2...zohocrn xhT OBconnect inc5..connect xh0 Bself-aut inc3....self-aut xhzohocrn incconnect inc jb..zohoern xhconnect xhself-aut incjzohoern inc j2...connect incj5..94 requestsFontsImagesMediaHeadersCookiesRequestResponseTimingsStack TraceSecurityY Filter propertiesJSONRawisDeactivated: falselogoUri: "https://static.integration.app/connectors/zoho-crm/logo.pngconnectorid: "64a158e7d2605720d232e07b"connectorVersion: "3.0.3"oAuthCallbackUri: "https://api.integration.app/oauth-callback"hasMissingParameters: falsehasDocumentation: falsehasOperations: trueoperationsCount: 569hasData: truedataCollectionsCount: 20hasEvents: falseeventsCount: 0hasGlobalWebhooks: falsehasUdm: trueauthType: "client-credentials"• connection: { id: "69e0b983da98fa74f98aebfb", name: "Connection to 66fe6c913202f3a165e3c14d for Dev ZohoCRM client", userld: "1ece66c8-feb1-4df1-b321-21607daf4623", ...)id: "69e0b983da98fa74f98aebfb"name: "Connection to 66fe6c913202f3a165e3c14d for Dev Zoho CRM client"userld: "1ece66c8-feb1-4df1-b321-21607daf4623"tenantid: "69e0b3faef3e7b6248189289"isTest: falseO Bconnected: true2...state: "READY"errors: Dintegrationld: "66fe6c913202f3a165e3c14d"0 BexternalAppld: "6671653e7e2d642e4e41b0fa"authOptionKey: "oauth"3....createdAt: "2026-04-16T10:27:15.579Z"updatedAt: "2026-04-16T10:34:08.702Z"retryAttempts: 0isDeactivated: false92.01 k • authOptions: [(...), (..} ]...
|
NULL
|
-8946875297309644506
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileNavigateEdit→ViewCodeCJIMINNY+Account PhpStormFileNavigateEdit→ViewCodeCJIMINNY+Account disconnectedIt looks like your Zoho CRM account has become disconnectedPlease re-connect to continueSign in with Zoho CRMLộ3LaravelRefactorRunToolsGitWindowHelpSupport Daily • in 58 m100% <478Thu 16 Apr 14:02:57• app.dev.jiminny.com/connect/zohocrm• InspectorConsoleDebuggerN Network() Style Editor@ Performance05 07 Filter URLs+Disable CacheNo Throttling+AllHTMLCSSJSXHRWS OtherDoECOECAECOECOECOEFOECOECOECOECOEFOECOECOECOECOECOEFOECOECOECOECOEFOECAECOECAECOEFOFileconnect incS...5...connect xhself-aut incj3....self-aut xhf0 Bzohocrn incj2...zohocrn xh r 0 Bconnect incj5..connect xhF 0Bself-aut incj3..self-aut xhFOBzohoern inc j 2...connect inc izohoern xh F 0Bconnect xhFOBself-aut inc3..self-aut xh0 Bzohoern inc2...zohocrn xhT OBconnect inc5..connect xh0 Bself-aut inc3....self-aut xhzohocrn incconnect inc jb..zohoern xhconnect xhself-aut incjzohoern inc j2...connect incj5..94 requestsFontsImagesMediaHeadersCookiesRequestResponseTimingsStack TraceSecurityY Filter propertiesJSONRawisDeactivated: falselogoUri: "https://static.integration.app/connectors/zoho-crm/logo.pngconnectorid: "64a158e7d2605720d232e07b"connectorVersion: "3.0.3"oAuthCallbackUri: "https://api.integration.app/oauth-callback"hasMissingParameters: falsehasDocumentation: falsehasOperations: trueoperationsCount: 569hasData: truedataCollectionsCount: 20hasEvents: falseeventsCount: 0hasGlobalWebhooks: falsehasUdm: trueauthType: "client-credentials"• connection: { id: "69e0b983da98fa74f98aebfb", name: "Connection to 66fe6c913202f3a165e3c14d for Dev ZohoCRM client", userld: "1ece66c8-feb1-4df1-b321-21607daf4623", ...)id: "69e0b983da98fa74f98aebfb"name: "Connection to 66fe6c913202f3a165e3c14d for Dev Zoho CRM client"userld: "1ece66c8-feb1-4df1-b321-21607daf4623"tenantid: "69e0b3faef3e7b6248189289"isTest: falseO Bconnected: true2...state: "READY"errors: Dintegrationld: "66fe6c913202f3a165e3c14d"0 BexternalAppld: "6671653e7e2d642e4e41b0fa"authOptionKey: "oauth"3....createdAt: "2026-04-16T10:27:15.579Z"updatedAt: "2026-04-16T10:34:08.702Z"retryAttempts: 0isDeactivated: false92.01 k • authOptions: [(...), (..} ]...
|
NULL
|
|
66850
|
1506
|
4
|
2026-04-21T15:10:49.368488+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776784249368_m2.jpg...
|
PhpStorm
|
faVsco.js – AutomatedReportsService.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavigarecodeFV faVsco.js( #11894 on J PhostormVIewINavigarecodeFV faVsco.js( #11894 on JY-18909-automated-reports-aslProledey© AskJiminnyReportActivitySC) Automateakeporscallbackc Automateakeporisservice.cDealstagesservice.ong©) kecipientsservice.onpt keporsortonc© ReportSortDirection.phpC) KioskService.php0 MailMeetingGeneratorNotiticationW 0Auth2Security• StrategyD Streaming• Team• TelephonyiM UicerDilotM Wehhont© AbstractService.phpC) [EMAIL]) AoiResponseservice.ong© ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpc) IntercomService.onp© IpapiClient.php© IpapiService.php(c) Participantshareservice.php© PlanhatService.php(c) Playbackservice.php€ PlaybackVideoOnlvService.phpc)Plavoookcatecorvservice.oho• PlaylistGeneratorInterface.php© ResolveTeamCrmConnection.phpC) SimoleThrottleService.ohoC) SlackService.oho@ SocialAccountService.ohn(c) SorPhoneService.ohnl©TeamDeactivatedService.php© TeamOwnerService.php@ TeamService nhn© TranscodeParameterResolver.ph@ UcerService nhnC) Uuid nhn> D Traits> O UseCases> D User• Mi ttileTects naccod. 214/4 mlC) Service.php© Field.phpC) AutomatedReportsSendcommand.onguse Jiminny Repos1tories GroupRepositoryuse Jiminny Repos1tories SearchRepos1tory:use Jiminny Repositories StageRepository:class AutomatedRenortsServicelpublic const string TYPE_LOSS ANALYSIS = 'loss analvsicIpublic const string TYPE_ASK_JIMINNY = 'ask_jiminny';* Standard report types (used by kiosk for existing automated reports)./I @TODO this will add filter, however if we need to control feature by FF we need conditional logic/usagespublic const array TYPES = [['id' => 'exec_summary', 'name' => 'Exec Summary'].['id' =>'coaching_profiles', 'name' => 'Coaching Profiles'],['id' => 'product_feedback','name' => 'Product Feedback'],['id' => self::TYPE_LOSS_ANALYSIS, 'name' => 'Loss Analysis']['id' => 'questions', 'name' => 'Questions']['id' => 'statistical quant', 'name' => 'Statistical Quantitative'].1usagepublic const array ALL TYPES =….selt:"TYPES)f'id' => self::TYPE ASK JIMINNY. 'name' => 'Ask Jiminnv'1.33 usagespublic const string FREQUENCY DAILY = 'dailv':22 ucadeс33 usages17 ucadespublic const string FREQUENCY_WEEKLY = 'weekly';public const string FREQUENCY_MONTHLY = 'monthly';public const string FREQUENCY_QUARTERLY = 'quarterly';18 usagespublic const string FREQUENCY_ONE_OFF ='one_off';= custom.log=laravel.log4 SF [jiminny@localhost] XA HS_local [iminny@localhost)# concole [pponlA console (EU]report-not-generated.blade.phgC) sendreportNotGenerateamallJob.phpA102 X3 X34 ^ Y Q 161162t265166172|176-179180181182183= 1901801187189-191193— 194195E196201A console [STAGING]e jiminnyvseleel * rrun aculvity searches where aSELECT * FROM activity_ search_filters WHERE018 A14 V2 V4 A VSELECT * FROM automated_ reports where id = 68UPUAIEautomated_reports set playbook categories = NULL where idSELECT * FROM automated_ report_ results where id = 275:SELECT * FROM automated_reports order by id desc;SELECT * FROM automated reportresults order by 1d desc:select * from activity_searches where user_id = 143;select * from askSELEC * FROM GrOUOS WHERE 10 = 14591SELEC * EROM users WHERE aroun 1d = 1439:select * From permissions: # 158select * from roles:select * from permission roleselect * from teams where id = 1;select * from groups g JOIN playbooks p 1..n<->1: on g.playbook_idselect * from groups where id = 28;select * from playbooks where team_id = 1;select * from playbooks where id = 179;select * from playbook_categories where id = 1391;select x Tron users where 10 = 145select * from crm_profiles where user_id = 143;select * from activities where crm_confiquration id = 39 and typeand crm_provider id IS NOT NULL ORDER by id desc:select * from activities where id = 422003: # 00U0400000pB6fpMAC|SELECT ar.id. ar.uuid. ar.media_type. ar.status, a.typeFROM automated_report_results arJOIN automated reports a ON a.1d = ar.report1dWHERE a.type ='ask_jiminnyLIME 10:SELECTautomated revort results' * FROM 'automated remort res.automated report results', revort id = 'automated remortsautomated_report_results'.'generated_at' IS NOT NULLautomated nenonts'."team id' = 1AND JSON_CONTAINS( automated_reports'. 'recipients', 1635, '$.100% LzTue 21 Apr 18:10:50AutomatedReportsServiceTest ~CascadeReview Planhat IntearAutomated Reports RCalendar Multi-Domal+0..run tests and fix if not passingThouahtsdeste/umt/Reposcor/es/Au tona tedheportsReposttorytest.php lest5/inst/Pol1ctes/CanAcCe3sA.Reportstest. php/tects/linit/Policies/GanAcceccAiRenortsTect.nhn 2>61PHPUnit 11.5.55 by Sebastian Bergmann and contributors.PhP 0.3:30Configuration: /home/jaminny/phpunit.xml95 4 452 127939 / 453 ( 419A| 453 tests pass (6 ore-existina skiooed. 5 unrelated PHPUnit deprecation notices). No fixes needed.Teal aeAsk anvthina (&4-D+ « Code IClaude Qnus 4.7 MediumW Windsurf TeamsA6.20 /22 charc) UTF.8Po 4 spaces...
|
NULL
|
-8945611932252160867
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavigarecodeFV faVsco.js( #11894 on J PhostormVIewINavigarecodeFV faVsco.js( #11894 on JY-18909-automated-reports-aslProledey© AskJiminnyReportActivitySC) Automateakeporscallbackc Automateakeporisservice.cDealstagesservice.ong©) kecipientsservice.onpt keporsortonc© ReportSortDirection.phpC) KioskService.php0 MailMeetingGeneratorNotiticationW 0Auth2Security• StrategyD Streaming• Team• TelephonyiM UicerDilotM Wehhont© AbstractService.phpC) [EMAIL]) AoiResponseservice.ong© ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpc) IntercomService.onp© IpapiClient.php© IpapiService.php(c) Participantshareservice.php© PlanhatService.php(c) Playbackservice.php€ PlaybackVideoOnlvService.phpc)Plavoookcatecorvservice.oho• PlaylistGeneratorInterface.php© ResolveTeamCrmConnection.phpC) SimoleThrottleService.ohoC) SlackService.oho@ SocialAccountService.ohn(c) SorPhoneService.ohnl©TeamDeactivatedService.php© TeamOwnerService.php@ TeamService nhn© TranscodeParameterResolver.ph@ UcerService nhnC) Uuid nhn> D Traits> O UseCases> D User• Mi ttileTects naccod. 214/4 mlC) Service.php© Field.phpC) AutomatedReportsSendcommand.onguse Jiminny Repos1tories GroupRepositoryuse Jiminny Repos1tories SearchRepos1tory:use Jiminny Repositories StageRepository:class AutomatedRenortsServicelpublic const string TYPE_LOSS ANALYSIS = 'loss analvsicIpublic const string TYPE_ASK_JIMINNY = 'ask_jiminny';* Standard report types (used by kiosk for existing automated reports)./I @TODO this will add filter, however if we need to control feature by FF we need conditional logic/usagespublic const array TYPES = [['id' => 'exec_summary', 'name' => 'Exec Summary'].['id' =>'coaching_profiles', 'name' => 'Coaching Profiles'],['id' => 'product_feedback','name' => 'Product Feedback'],['id' => self::TYPE_LOSS_ANALYSIS, 'name' => 'Loss Analysis']['id' => 'questions', 'name' => 'Questions']['id' => 'statistical quant', 'name' => 'Statistical Quantitative'].1usagepublic const array ALL TYPES =….selt:"TYPES)f'id' => self::TYPE ASK JIMINNY. 'name' => 'Ask Jiminnv'1.33 usagespublic const string FREQUENCY DAILY = 'dailv':22 ucadeс33 usages17 ucadespublic const string FREQUENCY_WEEKLY = 'weekly';public const string FREQUENCY_MONTHLY = 'monthly';public const string FREQUENCY_QUARTERLY = 'quarterly';18 usagespublic const string FREQUENCY_ONE_OFF ='one_off';= custom.log=laravel.log4 SF [jiminny@localhost] XA HS_local [iminny@localhost)# concole [pponlA console (EU]report-not-generated.blade.phgC) sendreportNotGenerateamallJob.phpA102 X3 X34 ^ Y Q 161162t265166172|176-179180181182183= 1901801187189-191193— 194195E196201A console [STAGING]e jiminnyvseleel * rrun aculvity searches where aSELECT * FROM activity_ search_filters WHERE018 A14 V2 V4 A VSELECT * FROM automated_ reports where id = 68UPUAIEautomated_reports set playbook categories = NULL where idSELECT * FROM automated_ report_ results where id = 275:SELECT * FROM automated_reports order by id desc;SELECT * FROM automated reportresults order by 1d desc:select * from activity_searches where user_id = 143;select * from askSELEC * FROM GrOUOS WHERE 10 = 14591SELEC * EROM users WHERE aroun 1d = 1439:select * From permissions: # 158select * from roles:select * from permission roleselect * from teams where id = 1;select * from groups g JOIN playbooks p 1..n<->1: on g.playbook_idselect * from groups where id = 28;select * from playbooks where team_id = 1;select * from playbooks where id = 179;select * from playbook_categories where id = 1391;select x Tron users where 10 = 145select * from crm_profiles where user_id = 143;select * from activities where crm_confiquration id = 39 and typeand crm_provider id IS NOT NULL ORDER by id desc:select * from activities where id = 422003: # 00U0400000pB6fpMAC|SELECT ar.id. ar.uuid. ar.media_type. ar.status, a.typeFROM automated_report_results arJOIN automated reports a ON a.1d = ar.report1dWHERE a.type ='ask_jiminnyLIME 10:SELECTautomated revort results' * FROM 'automated remort res.automated report results', revort id = 'automated remortsautomated_report_results'.'generated_at' IS NOT NULLautomated nenonts'."team id' = 1AND JSON_CONTAINS( automated_reports'. 'recipients', 1635, '$.100% LzTue 21 Apr 18:10:50AutomatedReportsServiceTest ~CascadeReview Planhat IntearAutomated Reports RCalendar Multi-Domal+0..run tests and fix if not passingThouahtsdeste/umt/Reposcor/es/Au tona tedheportsReposttorytest.php lest5/inst/Pol1ctes/CanAcCe3sA.Reportstest. php/tects/linit/Policies/GanAcceccAiRenortsTect.nhn 2>61PHPUnit 11.5.55 by Sebastian Bergmann and contributors.PhP 0.3:30Configuration: /home/jaminny/phpunit.xml95 4 452 127939 / 453 ( 419A| 453 tests pass (6 ore-existina skiooed. 5 unrelated PHPUnit deprecation notices). No fixes needed.Teal aeAsk anvthina (&4-D+ « Code IClaude Qnus 4.7 MediumW Windsurf TeamsA6.20 /22 charc) UTF.8Po 4 spaces...
|
NULL
|
|
65745
|
1468
|
14
|
2026-04-21T13:00:36.952798+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776776436952_m2.jpg...
|
Slack
|
! Aneliya Angelova (DM) - Jiminny Inc - 2 new item ! Aneliya Angelova (DM) - Jiminny Inc - 2 new items - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
More unreads
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
c-learning-people
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
people-with-copilot-licences
people-with-zoom-phone-licences
platform-team
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Aneliya Angelova
Gabriela Dureva
Todor Stamatov
Petko Kashinski
Vasil Vasilev
Nikolay Nikolov
Galya Dimitrova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Aneliya Angelova
Yesterday at 9:41:47 AM
9:41 AM
Здрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита със съответния Saved search bez da e dobawen filtyr za data
Lukas Kovalik
Yesterday at 10:31:47 AM
10:31 AM
Ани след малко може да се чуем
Aneliya Angelova
Yesterday at 11:27:34 AM
11:27 AM
направо звънни когато можеш
Lukas Kovalik
Yesterday at 11:35:37 AM
11:35 AM
тука съм
A huddle happened
Yesterday at 11:35:41 AM
11:35 AM
Lukas Kovalik
Yesterday at 1:50:24 PM
1:50 PM
Ани оправих ги и двете само не успах да тествам това със филтър
Yesterday at 1:50:57 PM
1:50
добавя се но нямам activity-та локално да го тествам
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Yesterday at 1:51:10 PM
1:51 PM
Оки
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Yesterday at 1:51:18 PM
1:51 PM
те са със ES и малко тегаво се правят
React with white_check_mark
React with eyes
React with raised_hands...
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.0056515955,"top":0.058260176,"width":0.011968086,"height":0.028731046},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.0029920214,"top":0.10055866,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.0066489363,"top":0.13806863,"width":0.009973404,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.0029920214,"top":0.15482841,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.0076462766,"top":0.19233839,"width":0.007978723,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.0029920214,"top":0.20909816,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.004986702,"top":0.24660814,"width":0.012965426,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.0029920214,"top":0.26336792,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.0076462766,"top":0.3008779,"width":0.0076462766,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.0029920214,"top":0.31763768,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.00731383,"top":0.35514766,"width":0.008643617,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.0029920214,"top":0.3719074,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.006981383,"top":0.4094174,"width":0.008976064,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"More unreads","depth":17,"bounds":{"left":0.038896278,"top":0.096568234,"width":0.041888297,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Unreads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"c-learning-people","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"infra-changes","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"people-with-copilot-licences","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"people-with-zoom-phone-licences","depth":23,"bounds":{"left":0.042220745,"top":0.09177973,"width":0.045877658,"height":0.007980846},"role_description":"text"},{"role":"AXStaticText","text":"platform-team","depth":23,"bounds":{"left":0.042220745,"top":0.10774142,"width":0.03125,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.042220745,"top":0.1300878,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.042220745,"top":0.15243416,"width":0.03856383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.042220745,"top":0.17478053,"width":0.01662234,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.042220745,"top":0.1971269,"width":0.018284574,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.042220745,"top":0.21947326,"width":0.016954787,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.042220745,"top":0.24181964,"width":0.024268618,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.042220745,"top":0.264166,"width":0.04488032,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.042220745,"top":0.31683958,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Gabriela Dureva","depth":23,"bounds":{"left":0.042220745,"top":0.33918595,"width":0.03523936,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Todor Stamatov","depth":23,"bounds":{"left":0.042220745,"top":0.36153233,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.042220745,"top":0.38387868,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.042220745,"top":0.40622506,"width":0.026263298,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":23,"bounds":{"left":0.042220745,"top":0.42857143,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.042220745,"top":0.4509178,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.042220745,"top":0.47326416,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tomov","depth":23,"bounds":{"left":0.042220745,"top":0.49561054,"width":0.030585106,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.042220745,"top":0.5179569,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.07945479,"top":0.5179569,"width":0.0063164895,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.08211436,"top":0.5179569,"width":0.014295213,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.09607713,"top":0.5355148,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.09607713,"top":0.5355148,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"bounds":{"left":0.042220745,"top":0.5403033,"width":0.028922873,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.042220745,"top":0.56264967,"width":0.031914894,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Ves","depth":23,"bounds":{"left":0.042220745,"top":0.584996,"width":0.0076462766,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.042220745,"top":0.63766956,"width":0.011968086,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.042220745,"top":0.66001594,"width":0.021609042,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.10206117,"top":0.09177973,"width":0.030585106,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.111369684,"top":0.10055866,"width":0.01861702,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Add canvas","depth":18,"bounds":{"left":0.13397606,"top":0.09177973,"width":0.033909574,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add canvas","depth":20,"bounds":{"left":0.14328457,"top":0.10055866,"width":0.021941489,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.16921543,"top":0.09177973,"width":0.020944148,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.17852394,"top":0.10055866,"width":0.008976064,"height":0.012769354},"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.19115691,"top":0.09177973,"width":0.010970744,"height":0.030327214},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.015625,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.0076462766,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.14660904,"top":0.12689546,"width":0.032579787,"height":0.022346368},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 9:41:47 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9:41 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Здрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита със съответния Saved search bez da e dobawen filtyr za data","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 10:31:47 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:31 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Ани след малко може да се чуем","depth":25,"role_description":"text"},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:27:34 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:27 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"направо звънни когато можеш","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:35:37 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:35 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"тука съм","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"A huddle happened","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:35:41 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:35 AM","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:50:24 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:50 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Ани оправих ги и двете само не успах да тествам това със филтър","depth":25,"bounds":{"left":0.11801862,"top":0.11572227,"width":0.09375,"height":0.021548284},"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:50:57 PM","depth":25,"bounds":{"left":0.107380316,"top":0.14924182,"width":0.007978723,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:50","depth":26,"bounds":{"left":0.107380316,"top":0.14924182,"width":0.007978723,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"добавя се но нямам activity-та локално да го тествам","depth":25,"bounds":{"left":0.11801862,"top":0.14684756,"width":0.10305851,"height":0.031923383},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.12210695,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.12210695,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.12210695,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.12210695,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.12210695,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.12210695,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.12210695,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.12210695,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.11801862,"top":0.1867518,"width":0.038896278,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.15658244,"top":0.18834797,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:51:10 PM","depth":24,"bounds":{"left":0.15924202,"top":0.19074222,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:51 PM","depth":25,"bounds":{"left":0.15924202,"top":0.19074222,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Оки","depth":25,"bounds":{"left":0.11801862,"top":0.20590582,"width":0.00930851,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.17318435,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.17318435,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.17318435,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.17318435,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.17318435,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.17318435,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.17318435,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.17318435,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.11801862,"top":0.22825219,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.14860372,"top":0.22984837,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:51:18 PM","depth":24,"bounds":{"left":0.1512633,"top":0.23224261,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:51 PM","depth":25,"bounds":{"left":0.1512633,"top":0.23224261,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"те са със ES и малко тегаво се правят","depth":25,"bounds":{"left":0.11801862,"top":0.24740623,"width":0.08577128,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.21468475,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.21468475,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.21468475,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8944711843998758874
|
-1207072612788070280
|
click
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
More unreads
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
c-learning-people
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
people-with-copilot-licences
people-with-zoom-phone-licences
platform-team
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Aneliya Angelova
Gabriela Dureva
Todor Stamatov
Petko Kashinski
Vasil Vasilev
Nikolay Nikolov
Galya Dimitrova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Aneliya Angelova
Yesterday at 9:41:47 AM
9:41 AM
Здрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита със съответния Saved search bez da e dobawen filtyr za data
Lukas Kovalik
Yesterday at 10:31:47 AM
10:31 AM
Ани след малко може да се чуем
Aneliya Angelova
Yesterday at 11:27:34 AM
11:27 AM
направо звънни когато можеш
Lukas Kovalik
Yesterday at 11:35:37 AM
11:35 AM
тука съм
A huddle happened
Yesterday at 11:35:41 AM
11:35 AM
Lukas Kovalik
Yesterday at 1:50:24 PM
1:50 PM
Ани оправих ги и двете само не успах да тествам това със филтър
Yesterday at 1:50:57 PM
1:50
добавя се но нямам activity-та локално да го тествам
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Yesterday at 1:51:10 PM
1:51 PM
Оки
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Yesterday at 1:51:18 PM
1:51 PM
те са със ES и малко тегаво се правят
React with white_check_mark
React with eyes
React with raised_hands
ActivitySlackcalVIewJiminny…..uDeon# ? More unreads# platform-tickets# product_launches# random# release‹# support# thank-yous# the_people_of jimi...^ Direct messagesP. Aneliya Angelo…... Gabriela DurevaZ Todor Stamatov& Petko Kashinski€. Vasil Vasilev. Nikolay NikolovGalva DimitrovaA. Stefka Stoyanova8. Stoyan Tomov3 Aneliva Angelova…2. Stoyan TanevC. Nikolay IvanovF Vec••: Aons® ToastG Jira CloudV A PRODA console [PROD]A console_1 [PROD]LDI PROD I> AOA> A QAIA QAI PRODV & STAGING& console STAGING¿ console STAGING#uranus STAGINGII→ Extensions>MScratches.MistonWindowhelp. Aneliya Angelova• Messagest Add canvasO Filesдобавя се но нямам асимісу-та локално да готествамAneliya Angelova 1:51PMLukas Kovalik 1:51 PMте са сьс ES и малко тегаво се правятAneliya Angelova 1:51 PMАз ще го видяTodayvAneliya Angelova 2:15 PMЗппасти Лvvaшlимашили 5 минда видим нещо по репортитеLukas Kovallik 2:18 PMAnuddlle nanbened 2:30 PMYou and Aneliva Angelova were in the huddleAneliva Angelova 4:00 PMУукаш мисля повече ла не тествам. самокажи, когато фикснеш това с тима да гопоглелна и ла качваме на поолMessage Aneliya Angelova+ Aal...* doqnam leam sceam* @return Collectionpublic function getReportsByTeam(Tereturn AutomatedReport::where* Get all report results for a soi* Gparam AutomatedRenort Srenorti* [JY-203/2) Al keports > empty paProiect Phoenix - FigmaM limiony Maill0) Pioelines - jiminnylapp(SRD-6793) Les Mills activity type:Search results: calendar I.liminnvNew Ta:* Fdit - Calendar - Enaineerina - Col@<40100% C42 & Tue 21 Apr 16:00:37app.dev.jiminny.com/kiosk/users?id=158496ef-bdda-44db-91a4-6f95ccdb53d4KioskOrganizationsSetup AccountUsersActivitiesAutomated ReportsMobile versionSEARCH BY NAME OR E-MAIL [EMAIL]: Moni Georgieva AEmail Address:[EMAIL]: 2024-09-10T08:16:12+00:00Organization: Salesforce TeamAccount Owner: LukasKovalik a$...
|
65744
|
|
15893
|
352
|
82
|
2026-04-14T15:02:01.180929+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776178921180_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelp>0 lolRetro - Platform - 13 m leftA-zshDOCKER• 881DEV (-zsh)O 82APP (-zsh)ec2-user@ip-10-... O 884System SettingsI59Activity MonitorI45OrionI43CleanShot XI42lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/ screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name,COUNT(*) as rows,AVG(LENGTH(text)) as avg_text_len,SUM(LENGTH(text))/1024/1024 as total_mbFROM ocr_textJOIN frames ON ocr_text.frame_id = frames.idGROUP BY app_nameORDER BY total_mb DESCLIMIT 15;"Error: in prepare, ambiguous column name: app_nameSELECTapp_name,COUNT(*) as rows,AeeeAVG(LENGTH(text)) as avg_text_len,error hereLukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTf.app_name,COUNT(*) as rows,AVG(LENGTH(o.text)) as avg_text_len,SUMCLENGTH(o.text))/1024/1024 as total_mbFROM ocr_text oJOIN frames f ON o. frame_id = f.idGROUP BY f.app_nameORDER BY total_mb DESCLIMIT 15;"16206|2989.91637125363117Boosteroid 3593|1169.4336209295914Slack 38713164.1834625323|1PhpStorm|29913867.36454849498|1FirefoxI36613405.68852459016|1iTerm2|10|2601.110UserNotificationCenter|11664.010Tailscalel213256.510Raycast|2|1539.510QuickTime Player|1513574.3333333333310Preview|112829.010Finder|3812407.4473684210510Dial6312062.6507936507910CoreServicesUIAgent|1|1962.010Control Centrel1214385.8333333333310lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $-zsh-zsh86-zsh100% <47Tue 14 Apr 18:02:00T810 87* Unable to acce...O x8...
|
NULL
|
-8944299565113309999
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelp>0 lolRetro - Platform - 13 m leftA-zshDOCKER• 881DEV (-zsh)O 82APP (-zsh)ec2-user@ip-10-... O 884System SettingsI59Activity MonitorI45OrionI43CleanShot XI42lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/ screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name,COUNT(*) as rows,AVG(LENGTH(text)) as avg_text_len,SUM(LENGTH(text))/1024/1024 as total_mbFROM ocr_textJOIN frames ON ocr_text.frame_id = frames.idGROUP BY app_nameORDER BY total_mb DESCLIMIT 15;"Error: in prepare, ambiguous column name: app_nameSELECTapp_name,COUNT(*) as rows,AeeeAVG(LENGTH(text)) as avg_text_len,error hereLukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTf.app_name,COUNT(*) as rows,AVG(LENGTH(o.text)) as avg_text_len,SUMCLENGTH(o.text))/1024/1024 as total_mbFROM ocr_text oJOIN frames f ON o. frame_id = f.idGROUP BY f.app_nameORDER BY total_mb DESCLIMIT 15;"16206|2989.91637125363117Boosteroid 3593|1169.4336209295914Slack 38713164.1834625323|1PhpStorm|29913867.36454849498|1FirefoxI36613405.68852459016|1iTerm2|10|2601.110UserNotificationCenter|11664.010Tailscalel213256.510Raycast|2|1539.510QuickTime Player|1513574.3333333333310Preview|112829.010Finder|3812407.4473684210510Dial6312062.6507936507910CoreServicesUIAgent|1|1962.010Control Centrel1214385.8333333333310lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $-zsh-zsh86-zsh100% <47Tue 14 Apr 18:02:00T810 87* Unable to acce...O x8...
|
15891
|
|
40933
|
871
|
5
|
2026-04-17T05:56:40.740024+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776405400740_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SackFileEoitViewLukas Kovalk's Macsook Pro mil SackFileEoitViewLukas Kovalk's Macsook Pro milnnv).88HomeDMsAchivityFile:MoreJiminny ...- CUros ao# engineering# frontend# generals infra-changes#liminny-bg# platform-tickets# product launches# random# releasessona-otnce# supporta thank-vous# the people of iimi....02 Direct messages3 Aneliva Angelova. ...1% Galya DimitrovaIe. Nikolay NikolovEo Stoyan Tanev3o Vasil VasilevNikolay Ivanov0 Aneliva AngelovaCo VesStelivan Georgiev:::Apps® Toast7' Jira CloudHistoryWindowHelpSearch Jiminny Inc# product launches To communicate new features and products8 3660Messages7 Files* PinsTeam Insights → Coaching tablodayyon-demane iliersOrg settings• Playback pageUP tooltips are enabled to guide users through this change. They are visible to all clients who previously used Automated Call Scoringane nave Hemin or ManarerrolesThe KB article has also been updated to reflect the new namingThis feature will now be treated as an add-on 5 and is currently enabled only for clients who already had scorecards active.@cs When working with clients and enabling the new Al scorecards. please check whether the existing ones can be disabled if they'renot being used, so we can help reduce costs (edited'2hles€ Downldad alllNameMacintosh mb>Networkhal100% 142Fri 17 Apr 8:56:40• SearchLukas Kovalik's MacBook Pro (Jiminny)Date ModitiedSizeKind4 Aua 2024 at 13:31200.16 GBStartup VolumeNeighbourhoodua Driveic toldenMessage #product launchesAa...
|
NULL
|
-8943859400861535307
|
NULL
|
visual_change
|
ocr
|
NULL
|
SackFileEoitViewLukas Kovalk's Macsook Pro mil SackFileEoitViewLukas Kovalk's Macsook Pro milnnv).88HomeDMsAchivityFile:MoreJiminny ...- CUros ao# engineering# frontend# generals infra-changes#liminny-bg# platform-tickets# product launches# random# releasessona-otnce# supporta thank-vous# the people of iimi....02 Direct messages3 Aneliva Angelova. ...1% Galya DimitrovaIe. Nikolay NikolovEo Stoyan Tanev3o Vasil VasilevNikolay Ivanov0 Aneliva AngelovaCo VesStelivan Georgiev:::Apps® Toast7' Jira CloudHistoryWindowHelpSearch Jiminny Inc# product launches To communicate new features and products8 3660Messages7 Files* PinsTeam Insights → Coaching tablodayyon-demane iliersOrg settings• Playback pageUP tooltips are enabled to guide users through this change. They are visible to all clients who previously used Automated Call Scoringane nave Hemin or ManarerrolesThe KB article has also been updated to reflect the new namingThis feature will now be treated as an add-on 5 and is currently enabled only for clients who already had scorecards active.@cs When working with clients and enabling the new Al scorecards. please check whether the existing ones can be disabled if they'renot being used, so we can help reduce costs (edited'2hles€ Downldad alllNameMacintosh mb>Networkhal100% 142Fri 17 Apr 8:56:40• SearchLukas Kovalik's MacBook Pro (Jiminny)Date ModitiedSizeKind4 Aua 2024 at 13:31200.16 GBStartup VolumeNeighbourhoodua Driveic toldenMessage #product launchesAa...
|
40929
|
|
57959
|
1244
|
60
|
2026-04-20T12:18:40.044755+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776687520044_m1.jpg...
|
Firefox
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp→meet.google.com/cxs-eips-npt?authuser=0Nikolay Yankov (Presenting)FleEditM InborCJ-g xOAsky xCost2 (лY-22 tr-2 xPrойXIhttps://app.stagingjiminny.com/ondemand7topic_ja%58%5D=e0210932-cb76-41b6-ac41-6b6- JmnnlProjectsE Datadoo100% C428• Mon 20 Apr 15:18:3900 7deva4 DemL Tasksnght & Coachn- DevU UXXPreserre lodDisable cache• Big request roms2 Overvien200• Group by frameO ScreenshoesRRRRRRRRIEMon 20 Apr 15:18L Al bookmarks|023 41 1116Nikolay YankovStefka Stoyanova1299tc-1.mi 0.180 -s180 ms196 ms130 L2 othersDeleteThis will delete the saved search and the associatedNikolay Nikoloy12901c-1 ml ...194 ms210 mgLukas KovalikSộ33:18 PM| [Platform] Refinement •16:51...
|
NULL
|
-8943471574153160431
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp→meet.google.com/cxs-eips-npt?authuser=0Nikolay Yankov (Presenting)FleEditM InborCJ-g xOAsky xCost2 (лY-22 tr-2 xPrойXIhttps://app.stagingjiminny.com/ondemand7topic_ja%58%5D=e0210932-cb76-41b6-ac41-6b6- JmnnlProjectsE Datadoo100% C428• Mon 20 Apr 15:18:3900 7deva4 DemL Tasksnght & Coachn- DevU UXXPreserre lodDisable cache• Big request roms2 Overvien200• Group by frameO ScreenshoesRRRRRRRRIEMon 20 Apr 15:18L Al bookmarks|023 41 1116Nikolay YankovStefka Stoyanova1299tc-1.mi 0.180 -s180 ms196 ms130 L2 othersDeleteThis will delete the saved search and the associatedNikolay Nikoloy12901c-1 ml ...194 ms210 mgLukas KovalikSộ33:18 PM| [Platform] Refinement •16:51...
|
NULL
|
|
14421
|
324
|
32
|
2026-04-14T13:48:12.304630+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776174492304_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV ( SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV (docker)882APP (-zsh)[EMAIL]'s next:Try Docker Debug forseamless,persistentdebugging tools in any container or imaLearn moreat [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-asdocker exec -it docker_lamp_1./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.diPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminskiandcontributors.PHP runtime: 8.3.30Running analysis on 7 cores with 10 files per process.Parallel runner is an experimental feature and may be unstable,useitatyourownLoadedconfig default from-php-cs-fixer.dist.php".5589/5589100%Fixed 0 of 5589 files in 49.458 seconds, 67.00 MB memory usedWhat's next:Try Docker Debug forseamless, persistent debugging tools in any container or imaLearn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Jiminny/app (JY-18909-automated-reports-as.env.localMapp/Console/Commands/JiminnyDebugCommand.phpapp/Http/Controllers/API/ActivityController.phpapp/Http/Controllers/Webhook/ReportController.phpapp/Jobs/Team/SyncToIntercom.phpMapp/Services/PlaybackService.phpconfig/logging.phproutes/web.phpAlready on 'JY-18909-automated-reports-ask-jiminny'Your branch is up to date with 'origin/JY-18909-automated-reports-ask-jiminny'.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-as+> 0HomeDMsActivityFilesLater.*•MoreJiminny ...+tscnicrel# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesAneliya Angelova, ...€. Vasil Vasilevlo Steliyan GeorgievAdelina Petrova, Ili...0. Adelina Petrova. Galya Dimitrova *Rs Nikolay Nikolov "2 Galya Dimitrova, Ni...2Galya Dimitrova, Ni...P. Nikolay Yankov::: AppsToastJira CloudGoogle Cale...• Retro - Platform • in 12m100% 147Tue 14 Apr 16:48:11→Search Jiminny IncAneliya Angelova, ...846 0• MessagesAdd canvas@ Files+изпратенToday ~Steliyan Georgiev 4:08 PMВиждам 2 проблема с линковете:• линковете са в края на документа, а неинлайн в отговорите• има странни символи в тях. Това езащото в заглавията на срещите иманякакви имотикони - тикви например,предполагам, че ги нямаме в шрифта наПДФ-а. Не съм сигурен какво да гиправя?@Nikolay Yankov, някой от горните ли имашпредвид или трето? (edited)Nikolay Yankov 4:09 PMпоследния дето пратихSteliyan Georgiev 4:09 PMда, за него говоря и азNikolay Yankov 4:10 PMможе би да ги скипваме такива emojisда не пречат на процесването и отговораSteliyan Georgiev 4:10 PMне сьм много сигурен какMessage Aneliya Angelova, Nikolay Yankov, Steli...AaNew...
|
NULL
|
-8943050769724782067
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV ( SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV (docker)882APP (-zsh)[EMAIL]'s next:Try Docker Debug forseamless,persistentdebugging tools in any container or imaLearn moreat [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-asdocker exec -it docker_lamp_1./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.diPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminskiandcontributors.PHP runtime: 8.3.30Running analysis on 7 cores with 10 files per process.Parallel runner is an experimental feature and may be unstable,useitatyourownLoadedconfig default from-php-cs-fixer.dist.php".5589/5589100%Fixed 0 of 5589 files in 49.458 seconds, 67.00 MB memory usedWhat's next:Try Docker Debug forseamless, persistent debugging tools in any container or imaLearn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Jiminny/app (JY-18909-automated-reports-as.env.localMapp/Console/Commands/JiminnyDebugCommand.phpapp/Http/Controllers/API/ActivityController.phpapp/Http/Controllers/Webhook/ReportController.phpapp/Jobs/Team/SyncToIntercom.phpMapp/Services/PlaybackService.phpconfig/logging.phproutes/web.phpAlready on 'JY-18909-automated-reports-ask-jiminny'Your branch is up to date with 'origin/JY-18909-automated-reports-ask-jiminny'.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-as+> 0HomeDMsActivityFilesLater.*•MoreJiminny ...+tscnicrel# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesAneliya Angelova, ...€. Vasil Vasilevlo Steliyan GeorgievAdelina Petrova, Ili...0. Adelina Petrova. Galya Dimitrova *Rs Nikolay Nikolov "2 Galya Dimitrova, Ni...2Galya Dimitrova, Ni...P. Nikolay Yankov::: AppsToastJira CloudGoogle Cale...• Retro - Platform • in 12m100% 147Tue 14 Apr 16:48:11→Search Jiminny IncAneliya Angelova, ...846 0• MessagesAdd canvas@ Files+изпратенToday ~Steliyan Georgiev 4:08 PMВиждам 2 проблема с линковете:• линковете са в края на документа, а неинлайн в отговорите• има странни символи в тях. Това езащото в заглавията на срещите иманякакви имотикони - тикви например,предполагам, че ги нямаме в шрифта наПДФ-а. Не съм сигурен какво да гиправя?@Nikolay Yankov, някой от горните ли имашпредвид или трето? (edited)Nikolay Yankov 4:09 PMпоследния дето пратихSteliyan Georgiev 4:09 PMда, за него говоря и азNikolay Yankov 4:10 PMможе би да ги скипваме такива emojisда не пречат на процесването и отговораSteliyan Georgiev 4:10 PMне сьм много сигурен какMessage Aneliya Angelova, Nikolay Yankov, Steli...AaNew...
|
14419
|
|
20519
|
445
|
38
|
2026-04-15T09:01:12.770328+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776243672770_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0alelSupport Daily - in 2h 59m(A100% C47 8 Wed 15 Apr 12:01:12• .Add Configuration• ReportController.php • SendReportJob.phpAutomatedReportsCommand.php• AutomatedReportsCommandTest.php • AutomatedReportsSendCommand.php • Stage.php • AddLayoutEntities.php • Team.php• AutomatedReportsRepository.php • AutomatedReportsService.php • CreateHeldActivityEvent.php • TrackProviderInstalledEvent.php • CreateActivityLoggedEvent.php • UserPilotActivityListener.php • ActivityLogged.php• AutomatedReportsCallbackService.php • RequestGenerateAskJiminnyReportJob.php • RequestGenerateReportJob.phpAutomatedReportResult.php • AutomatedReport.phpMinimizeAnalyzing project to enable smart features...
|
NULL
|
-8942571760042930630
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0alelSupport Daily - in 2h 59m(A100% C47 8 Wed 15 Apr 12:01:12• .Add Configuration• ReportController.php • SendReportJob.phpAutomatedReportsCommand.php• AutomatedReportsCommandTest.php • AutomatedReportsSendCommand.php • Stage.php • AddLayoutEntities.php • Team.php• AutomatedReportsRepository.php • AutomatedReportsService.php • CreateHeldActivityEvent.php • TrackProviderInstalledEvent.php • CreateActivityLoggedEvent.php • UserPilotActivityListener.php • ActivityLogged.php• AutomatedReportsCallbackService.php • RequestGenerateAskJiminnyReportJob.php • RequestGenerateReportJob.phpAutomatedReportResult.php • AutomatedReport.phpMinimizeAnalyzing project to enable smart features...
|
20518
|
|
40433
|
843
|
23
|
2026-04-16T16:03:52.775061+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776355432775_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksProfilesToolsWi FirefoxFileEoitViewHistoryBookmarksProfilesToolsWindowHelp@ Not Securehttp://[IP_ADDRESS]:8767/frames_fts/content/~ Google GeminiGeminiE3®PLUSp! Western Digital Red Plus 3.5 6TB 5400rpm 256MB SASl I SeneticТвърд диск, Western Digital Red 6TB Plus ( 3.5", 256N* SQLite Web: db.sqlitew Screenpipe DashboardV Welcome to Steam• YoulubeNew Tab+ New TabHi LukásWhere should westart?Create image* Create musicBoost my dayHelp me learnWrite anythingCreate a videoSharper images, better text.Meet Nano Banana 2.Ask Gemini+ °Summarize pageTry itPre vsqlite-web 0.7.2table name…_sqlx_migrationsaudio_chunksaudio_tagsaudio_transcriptionsaudio_transcriptions_fts (v)audio_transcriptions_audio_transcriptions_audio_transcriptions_..elementselements_fts (v)elements_fts_configelements_fts_dataelements_fts_idxframesframes_fts (V)frames_fts_configframes_fts_dataframes_fts_idxmeetingsmemoriesmemories_fts (v)memories_fts_configmemories_fts_datamemories_fts_idxocr_textoloe executionspipe_scheduler_statesecretsspeaker_embeddingsspeakerssqlite_sequencetagsui_eventsui_events_fts (v)ui_events_fts_configui_events_fts_dataul_events_nis_laxvideo_chunksvision_tagsToggle helper tablesdb.sqlite frames_fts 39761 rows, showing page 1StructureConteryQueryExportfull_textiTerm2ShellEditViewSessionScriptsProfilesWindowHel.iTerm2ShellEditViewSessionScriptsProfilesWindowHelBack Bookmarks Search Favourites Favourites Favour ...:llermzshellcatviewsessionschlorsrrorllesvindowrel.Back Bookmarks Search Favourites Favourites Favour ..ermzsnelicctlewsessionscrlorsrrorleswincowrel.Physical Memory: 16,00 GB Memory Used: 12,84 GB Ca ...erm/snellicotlewsessionscrlostrorleswineowre..Physical Memory: 16,00 GB Memory Used: 12,77 GB Ca ...iTerm2ShellEditViewSessionScripts|ProfilesWindowHe.Skip to content Skip to content Navigation Menu Na ....Last login: Thu Apr 9 19:52:08 on ttys007 Poetry …Last login: Thu Apr 9 19:52:08 on ttys007 Poetry …..Last login: Thu Apr 9 19:52:08 on ttys007 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry …..Last locin: nu hory 'y.or.vo on twsouy roeur ..iTerm2ShellEditViewSessionScriptsProfilesWindowHel …erm/snellicotvlewsessionscrlostrorleswineowre..Last login: Thu Apr 9 19:52:08 on ttys009 Poetry …..Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2 -ShellEditViewSessionScriptsProfilesWindowHe ...iTerm2ShelllEditViewSessionScriptsProfilesWindowHeiTerm2ShelllEditViewSessionScriptsProfilesWindowHeiTerm2ShelllEditViewSessionScriptsProfilesWindowHellermzonemcanviewsessionscrlosrromleswindowrieerm/snellicotvlewsessionscrlostrorleswineowre.lermzshelllcakviewsesslonscrlorsrrotlleswindowneerm/snellicotlewsessionscrlostrorleswineowre..iTerm2ShelllEditViewSessionScriptsProfilesWindowHe.iTerm2ShelllEditViewSessionScriptsProfilesWindowHe…Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry….Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel ..iTerm2ShellEditViewSessionScriptsProfilesWindowHel ...Last login: Inu Apry 1y.o2.0o on tysouy Poetry ..lermzshell taltviewsessionscriptsProtlleswindowhe …iTerm2Shell EditViewSessionScriptsProfilesWindowHe...iTerm2Shell EditViewSessionScriptsProfilesWindowHe...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel..iTerm2. •ShellEditViewSessionScripts|ProfilesWindollermz•onellcalviewsessionscrosrromlleswinao.Skip to content Skip to content Navigation Menu Na ....bаck bookmarks searen ravourtes ravourites ravour ...lermz. snellcotvlewsessionscriorsirrotleswineo ...ermz. snelrotvlewsessionscrlorsivrotleswineo .iTerm2• •ShellEditViewSessionScripts|ProfilesWindo …Page 1/796nito://100./3.200.120:8/o/Trames us/contentapp_llalleSafariSafariActivity MonitoActivity MonitorDia 1iTerm2iTerm2iTerm2iTerm2iTerm2DiaiTerm2iTerm2iTerm2iTerm2iTerm2iTerm2lermziTerm2DiaSafariwindow_nameOrder Room Service • HBO MaxOrder Room Service • HBO MaxActivity Monitor - All ProcessesActivity Monitor - All ProcessesPersonal: GitHub - scree...screenpipe"screenpipe"screenpipe"-zsh-ZSM-zsh-zsh-zsh-zsh-zsh-zsh-zsh-zshPersonal: GitHub - scree...Order Room Service • HBO MaxhhlA100% C• Thu 16 Apr 19:03:52browser_urlhttps://play.hbomax.com/video/watch/16b35e6c-e745-https://play.hbomax.com/video/watch/16b35e6c-e745-https://play.hbomax.com/video/watch/16b35e6c-e745-...
|
NULL
|
-8942292434299983206
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksProfilesToolsWi FirefoxFileEoitViewHistoryBookmarksProfilesToolsWindowHelp@ Not Securehttp://[IP_ADDRESS]:8767/frames_fts/content/~ Google GeminiGeminiE3®PLUSp! Western Digital Red Plus 3.5 6TB 5400rpm 256MB SASl I SeneticТвърд диск, Western Digital Red 6TB Plus ( 3.5", 256N* SQLite Web: db.sqlitew Screenpipe DashboardV Welcome to Steam• YoulubeNew Tab+ New TabHi LukásWhere should westart?Create image* Create musicBoost my dayHelp me learnWrite anythingCreate a videoSharper images, better text.Meet Nano Banana 2.Ask Gemini+ °Summarize pageTry itPre vsqlite-web 0.7.2table name…_sqlx_migrationsaudio_chunksaudio_tagsaudio_transcriptionsaudio_transcriptions_fts (v)audio_transcriptions_audio_transcriptions_audio_transcriptions_..elementselements_fts (v)elements_fts_configelements_fts_dataelements_fts_idxframesframes_fts (V)frames_fts_configframes_fts_dataframes_fts_idxmeetingsmemoriesmemories_fts (v)memories_fts_configmemories_fts_datamemories_fts_idxocr_textoloe executionspipe_scheduler_statesecretsspeaker_embeddingsspeakerssqlite_sequencetagsui_eventsui_events_fts (v)ui_events_fts_configui_events_fts_dataul_events_nis_laxvideo_chunksvision_tagsToggle helper tablesdb.sqlite frames_fts 39761 rows, showing page 1StructureConteryQueryExportfull_textiTerm2ShellEditViewSessionScriptsProfilesWindowHel.iTerm2ShellEditViewSessionScriptsProfilesWindowHelBack Bookmarks Search Favourites Favourites Favour ...:llermzshellcatviewsessionschlorsrrorllesvindowrel.Back Bookmarks Search Favourites Favourites Favour ..ermzsnelicctlewsessionscrlorsrrorleswincowrel.Physical Memory: 16,00 GB Memory Used: 12,84 GB Ca ...erm/snellicotlewsessionscrlostrorleswineowre..Physical Memory: 16,00 GB Memory Used: 12,77 GB Ca ...iTerm2ShellEditViewSessionScripts|ProfilesWindowHe.Skip to content Skip to content Navigation Menu Na ....Last login: Thu Apr 9 19:52:08 on ttys007 Poetry …Last login: Thu Apr 9 19:52:08 on ttys007 Poetry …..Last login: Thu Apr 9 19:52:08 on ttys007 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry …..Last locin: nu hory 'y.or.vo on twsouy roeur ..iTerm2ShellEditViewSessionScriptsProfilesWindowHel …erm/snellicotvlewsessionscrlostrorleswineowre..Last login: Thu Apr 9 19:52:08 on ttys009 Poetry …..Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2 -ShellEditViewSessionScriptsProfilesWindowHe ...iTerm2ShelllEditViewSessionScriptsProfilesWindowHeiTerm2ShelllEditViewSessionScriptsProfilesWindowHeiTerm2ShelllEditViewSessionScriptsProfilesWindowHellermzonemcanviewsessionscrlosrromleswindowrieerm/snellicotvlewsessionscrlostrorleswineowre.lermzshelllcakviewsesslonscrlorsrrotlleswindowneerm/snellicotlewsessionscrlostrorleswineowre..iTerm2ShelllEditViewSessionScriptsProfilesWindowHe.iTerm2ShelllEditViewSessionScriptsProfilesWindowHe…Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry….Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel ..iTerm2ShellEditViewSessionScriptsProfilesWindowHel ...Last login: Inu Apry 1y.o2.0o on tysouy Poetry ..lermzshell taltviewsessionscriptsProtlleswindowhe …iTerm2Shell EditViewSessionScriptsProfilesWindowHe...iTerm2Shell EditViewSessionScriptsProfilesWindowHe...Last login: Thu Apr 9 19:52:08 on ttys009 Poetry ...iTerm2ShellEditViewSessionScriptsProfilesWindowHel..iTerm2. •ShellEditViewSessionScripts|ProfilesWindollermz•onellcalviewsessionscrosrromlleswinao.Skip to content Skip to content Navigation Menu Na ....bаck bookmarks searen ravourtes ravourites ravour ...lermz. snellcotvlewsessionscriorsirrotleswineo ...ermz. snelrotvlewsessionscrlorsivrotleswineo .iTerm2• •ShellEditViewSessionScripts|ProfilesWindo …Page 1/796nito://100./3.200.120:8/o/Trames us/contentapp_llalleSafariSafariActivity MonitoActivity MonitorDia 1iTerm2iTerm2iTerm2iTerm2iTerm2DiaiTerm2iTerm2iTerm2iTerm2iTerm2iTerm2lermziTerm2DiaSafariwindow_nameOrder Room Service • HBO MaxOrder Room Service • HBO MaxActivity Monitor - All ProcessesActivity Monitor - All ProcessesPersonal: GitHub - scree...screenpipe"screenpipe"screenpipe"-zsh-ZSM-zsh-zsh-zsh-zsh-zsh-zsh-zsh-zshPersonal: GitHub - scree...Order Room Service • HBO MaxhhlA100% C• Thu 16 Apr 19:03:52browser_urlhttps://play.hbomax.com/video/watch/16b35e6c-e745-https://play.hbomax.com/video/watch/16b35e6c-e745-https://play.hbomax.com/video/watch/16b35e6c-e745-...
|
40431
|
|
50687
|
1090
|
13
|
2026-04-17T15:17:21.600034+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776439041600_m2.jpg...
|
Finder
|
screenpipe
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Desktop
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F8
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
db.sqlite
14 Apr 2026 at 20:49
1,42 GB
Document
data
14 Apr 2026 at 19:32
1,34 GB
Folder
archive.db
Today at 18:09
240,3 MB
Document
archive.db-journal
Today at 18:09
26 KB
Document
pipes
11 Apr 2026 at 16:51
13 KB
Folder
screenpipe-day.sh
11 Apr 2026 at 17:00
3 KB
Terminal scripts
screenpipe.db
13 Apr 2026 at 17:21
Zero bytes
Document
test_write
11 Apr 2026 at 17:26
Zero bytes
Unix Executable File
Name
Date Modified
Size
Kind
8 items, 2,1 TB available
Recents
Close tab
Lukas Kovalik's MacBook Pro (Jiminny)
Close tab
screenpipe
Close tab
Work
Close tab
screenpipe
Close tab
new tab
screenpipe...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Favourites","depth":6,"bounds":{"left":0.5054687,"top":0.05347222,"width":0.07304688,"height":0.013194445},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"jiminny","depth":6,"bounds":{"left":0.51484376,"top":0.07083333,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"AirDrop","depth":6,"bounds":{"left":0.51484376,"top":0.090277776,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Recents","depth":6,"bounds":{"left":0.51484376,"top":0.10972222,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Applications","depth":6,"bounds":{"left":0.51484376,"top":0.12916666,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Documents","depth":6,"bounds":{"left":0.51484376,"top":0.14861111,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Desktop","depth":6,"bounds":{"left":0.51484376,"top":0.16805555,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Downloads","depth":6,"bounds":{"left":0.51484376,"top":0.1875,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"lukas","depth":6,"bounds":{"left":0.51484376,"top":0.20694445,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"iCloud","depth":6,"bounds":{"left":0.5054687,"top":0.23125,"width":0.07304688,"height":0.013194445},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"iCloud Drive","depth":6,"bounds":{"left":0.51484376,"top":0.24861111,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Sync folder","depth":6,"bounds":{"left":0.51484376,"top":0.26805556,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Locations","depth":6,"bounds":{"left":0.5054687,"top":0.2923611,"width":0.07304688,"height":0.013194445},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":6,"bounds":{"left":0.51484376,"top":0.30972221,"width":0.051171876,"height":0.011111111},"role_description":"text"},{"role":"AXButton","text":"Eject","depth":6,"bounds":{"left":0.5667969,"top":0.31111112,"width":0.005078125,"height":0.008333334},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"Network","depth":6,"bounds":{"left":0.51484376,"top":0.32916668,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Tags","depth":6,"bounds":{"left":0.5054687,"top":0.35347223,"width":0.07304688,"height":0.013194445},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"CRM","depth":6,"bounds":{"left":0.51484376,"top":0.37083334,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Orange","depth":6,"bounds":{"left":0.51484376,"top":0.39027777,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Red","depth":6,"bounds":{"left":0.51484376,"top":0.4097222,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Yellow","depth":6,"bounds":{"left":0.51484376,"top":0.42916667,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Green","depth":6,"bounds":{"left":0.51484376,"top":0.4486111,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Blue","depth":6,"bounds":{"left":0.51484376,"top":0.46805555,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Purple","depth":6,"bounds":{"left":0.51484376,"top":0.4875,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"All Tags…","depth":6,"bounds":{"left":0.51484376,"top":0.5069444,"width":0.058203124,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Name","depth":7,"bounds":{"left":0.5972656,"top":0.077083334,"width":0.013671875,"height":0.009722223},"role_description":"text"},{"role":"AXStaticText","text":"Date Modified","depth":7,"bounds":{"left":0.8421875,"top":0.077083334,"width":0.03046875,"height":0.009722223},"role_description":"text"},{"role":"AXStaticText","text":"Size","depth":7,"bounds":{"left":0.9128906,"top":0.077083334,"width":0.010546875,"height":0.009722223},"role_description":"text"},{"role":"AXStaticText","text":"Kind","depth":7,"bounds":{"left":0.9507812,"top":0.077083334,"width":0.0109375,"height":0.009722223},"role_description":"text"},{"role":"AXTextField","text":"db.sqlite","depth":7,"bounds":{"left":0.5972656,"top":0.097222224,"width":0.023828125,"height":0.011111111},"value":"db.sqlite","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"14 Apr 2026 at 20:49","depth":7,"bounds":{"left":0.8421875,"top":0.097222224,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"1,42 GB","depth":7,"bounds":{"left":0.92578125,"top":0.097222224,"width":0.02109375,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.9507812,"top":0.097222224,"width":0.027734375,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"data","depth":7,"bounds":{"left":0.5972656,"top":0.11111111,"width":0.013671875,"height":0.011111111},"value":"data","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"14 Apr 2026 at 19:32","depth":7,"bounds":{"left":0.8421875,"top":0.11111111,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"1,34 GB","depth":7,"bounds":{"left":0.92578125,"top":0.11111111,"width":0.02109375,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.9507812,"top":0.11111111,"width":0.016796876,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"archive.db","depth":7,"bounds":{"left":0.5972656,"top":0.125,"width":0.028125,"height":0.011111111},"value":"archive.db","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 18:09","depth":7,"bounds":{"left":0.8421875,"top":0.125,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"240,3 MB","depth":7,"bounds":{"left":0.921875,"top":0.125,"width":0.025,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.9507812,"top":0.125,"width":0.027734375,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"archive.db-journal","depth":7,"bounds":{"left":0.5972656,"top":0.1388889,"width":0.046484374,"height":0.011111111},"value":"archive.db-journal","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 18:09","depth":7,"bounds":{"left":0.8421875,"top":0.1388889,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"26 KB","depth":7,"bounds":{"left":0.9308594,"top":0.1388889,"width":0.016015625,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.9507812,"top":0.1388889,"width":0.027734375,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"pipes","depth":7,"bounds":{"left":0.5972656,"top":0.15277778,"width":0.016015625,"height":0.011111111},"value":"pipes","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"11 Apr 2026 at 16:51","depth":7,"bounds":{"left":0.8421875,"top":0.15277778,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"13 KB","depth":7,"bounds":{"left":0.9308594,"top":0.15277778,"width":0.016015625,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.9507812,"top":0.15277778,"width":0.016796876,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"screenpipe-day.sh","depth":7,"bounds":{"left":0.5972656,"top":0.16666667,"width":0.046875,"height":0.011111111},"value":"screenpipe-day.sh","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"11 Apr 2026 at 17:00","depth":7,"bounds":{"left":0.8421875,"top":0.16666667,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"3 KB","depth":7,"bounds":{"left":0.9339844,"top":0.16666667,"width":0.012890625,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Terminal scripts","depth":7,"bounds":{"left":0.9507812,"top":0.16666667,"width":0.039453126,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"screenpipe.db","depth":7,"bounds":{"left":0.5972656,"top":0.18055555,"width":0.037109375,"height":0.011111111},"value":"screenpipe.db","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"13 Apr 2026 at 17:21","depth":7,"bounds":{"left":0.8421875,"top":0.18055555,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Zero bytes","depth":7,"bounds":{"left":0.9183594,"top":0.18055555,"width":0.028515626,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.9507812,"top":0.18055555,"width":0.027734375,"height":0.011111111},"role_description":"text"},{"role":"AXTextField","text":"test_write","depth":7,"bounds":{"left":0.5972656,"top":0.19444445,"width":0.0265625,"height":0.011111111},"value":"test_write","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"11 Apr 2026 at 17:26","depth":7,"bounds":{"left":0.8421875,"top":0.19444445,"width":0.06679688,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Zero bytes","depth":7,"bounds":{"left":0.9183594,"top":0.19444445,"width":0.028515626,"height":0.011111111},"role_description":"text"},{"role":"AXStaticText","text":"Unix Executable File","depth":7,"bounds":{"left":0.9507812,"top":0.19444445,"width":0.041015625,"height":0.011111111},"role_description":"text"},{"role":"AXButton","text":"Name","depth":6,"bounds":{"left":0.5835937,"top":0.072916664,"width":0.2566406,"height":0.019444445},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Date Modified","depth":6,"bounds":{"left":0.8402344,"top":0.072916664,"width":0.07070313,"height":0.019444445},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Size","depth":6,"bounds":{"left":0.9109375,"top":0.072916664,"width":0.037890624,"height":0.019444445},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Kind","depth":6,"bounds":{"left":0.9488281,"top":0.072916664,"width":0.047265626,"height":0.019444445},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"8 items, 2,1 TB available","depth":2,"bounds":{"left":0.7601563,"top":0.98541665,"width":0.055078126,"height":0.009722223},"automation_id":"_NS:34","role_description":"text"},{"role":"AXRadioButton","text":"Recents","depth":2,"bounds":{"left":0.57890624,"top":0.05347222,"width":0.08515625,"height":0.019444445},"help_text":"Recents","role_description":"tab","subrole":"AXTabButton","is_focused":false},{"role":"AXButton","text":"Close tab","depth":3,"bounds":{"left":0.58085936,"top":0.057638887,"width":0.00625,"height":0.011111111},"automation_id":"_closeButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"Lukas Kovalik's MacBook Pro (Jiminny)","depth":2,"bounds":{"left":0.66367185,"top":0.05347222,"width":0.08515625,"height":0.019444445},"help_text":"Lukas Kovalik's MacBook Pro (Jiminny)","role_description":"tab","subrole":"AXTabButton","is_focused":false},{"role":"AXButton","text":"Close tab","depth":3,"bounds":{"left":0.665625,"top":0.057638887,"width":0.00625,"height":0.011111111},"automation_id":"_closeButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"screenpipe","depth":2,"bounds":{"left":0.7484375,"top":0.05347222,"width":0.08242188,"height":0.019444445},"help_text":"screenpipe","role_description":"tab","subrole":"AXTabButton","is_focused":false},{"role":"AXButton","text":"Close tab","depth":3,"bounds":{"left":0.75039065,"top":0.057638887,"width":0.00625,"height":0.011111111},"automation_id":"_closeButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"Work","depth":2,"bounds":{"left":0.8304688,"top":0.05347222,"width":0.0796875,"height":0.019444445},"help_text":"Work","role_description":"tab","subrole":"AXTabButton","is_focused":false},{"role":"AXButton","text":"Close tab","depth":3,"bounds":{"left":0.8324219,"top":0.057638887,"width":0.00625,"height":0.011111111},"automation_id":"_closeButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"screenpipe","depth":2,"bounds":{"left":0.9097656,"top":0.05347222,"width":0.0796875,"height":0.019444445},"help_text":"screenpipe","role_description":"tab","subrole":"AXTabButton","is_focused":false},{"role":"AXButton","text":"Close tab","depth":3,"bounds":{"left":0.9117187,"top":0.057638887,"width":0.00625,"height":0.011111111},"automation_id":"_closeButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"new tab","depth":2,"bounds":{"left":0.9890625,"top":0.05347222,"width":0.0109375,"height":0.019444445},"help_text":"Create a new tab","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"screenpipe","depth":1,"bounds":{"left":0.6125,"top":0.017361112,"width":0.125,"height":0.036111113},"role_description":"text"}]...
|
-8941785777979754219
|
-4363407116028334199
|
visual_change
|
accessibility
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Desktop
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F8
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
db.sqlite
14 Apr 2026 at 20:49
1,42 GB
Document
data
14 Apr 2026 at 19:32
1,34 GB
Folder
archive.db
Today at 18:09
240,3 MB
Document
archive.db-journal
Today at 18:09
26 KB
Document
pipes
11 Apr 2026 at 16:51
13 KB
Folder
screenpipe-day.sh
11 Apr 2026 at 17:00
3 KB
Terminal scripts
screenpipe.db
13 Apr 2026 at 17:21
Zero bytes
Document
test_write
11 Apr 2026 at 17:26
Zero bytes
Unix Executable File
Name
Date Modified
Size
Kind
8 items, 2,1 TB available
Recents
Close tab
Lukas Kovalik's MacBook Pro (Jiminny)
Close tab
screenpipe
Close tab
Work
Close tab
screenpipe
Close tab
new tab
screenpipe...
|
NULL
|
|
27107
|
570
|
7
|
2026-04-15T13:41:14.094573+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776260474094_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
531765802055139/145Imperial Age-Halberdier Created 531765802055139/145Imperial Age-Halberdier Created--Scout Cavalry Created---House Built----Warning: You are being attacked byPlayer 6 László I!!!-5 Magnus Olafsson: 21116/21116NV8 Almish Yiltawar: 17690/176901 kovaliklukas: 17638/176382 Rajyapala: 16962/16962NV6 László I: 11626/116267 Mazimilian of Habsbung: 6965/6865-W4 Leuis VI: 6407/64973 HuascÁr: 6223/223 0 NV...
|
NULL
|
-8940801086870975742
|
NULL
|
click
|
ocr
|
NULL
|
531765802055139/145Imperial Age-Halberdier Created 531765802055139/145Imperial Age-Halberdier Created--Scout Cavalry Created---House Built----Warning: You are being attacked byPlayer 6 László I!!!-5 Magnus Olafsson: 21116/21116NV8 Almish Yiltawar: 17690/176901 kovaliklukas: 17638/176382 Rajyapala: 16962/16962NV6 László I: 11626/116267 Mazimilian of Habsbung: 6965/6865-W4 Leuis VI: 6407/64973 HuascÁr: 6223/223 0 NV...
|
27104
|
|
68520
|
1555
|
16
|
2026-04-22T06:17:36.739791+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776838656739_m2.jpg...
|
Firefox
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira — Work...
|
True
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Close tab
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny Mail
Jiminny Mail
[JY-20500] Batch initial sync for Salesforce - Jira
[JY-20500] Batch initial sync for Salesforce - Jira
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Jiminny
Jiminny
Pipelines - jiminny/app
Pipelines - jiminny/app
Formalize
Formalize
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
Search results: calendar | Jiminny Help Center
Search results: calendar | Jiminny Help Center
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Edit - Engineering - Confluence
Edit - Engineering - Confluence
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
CloudWatch | us-east-2
CloudWatch | us-east-2
Usage | Windsurf
Usage | Windsurf
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Main Content
Main Content
Top Bar
Top Bar
Sidebar
Sidebar
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
Over 9 Notifications
Over 9 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New)
Jiminny (New)
Platform Team
Platform Team
Add people
Add people
Board actions
Board actions
Share
Automation
Give feedback
Give feedback
Enter full screen
Enter full screen
Summary
Summary
Timeline
Timeline
Backlog
Backlog
Active sprints
Active sprints
Calendar
Calendar
Reports
Reports
Testing Board
Testing Board
List
List
Forms
Forms
Components
Components
Development
Development
Code
Code
Security
Security
Releases
Releases
Deployments
Deployments
5 more tabs
More
5
Add to navigation
As you type to search or apply filters, the board updates with work items to match.
Search on current page
Filter by assignee
Filter assignees by Lukas Kovalik
Filter assignees by Nikolay Ivanov
Filter assignees by Nikolay Nikolov
Filter assignees by Nikolay Yankov
Filter assignees by Steliyan Georgiev
Filter assignees by Unassigned
Epic
Epic
Type
Type
Label
Label
Quick filters
Quick filters
Complete sprint
Complete sprint
Sprint details
Sprint details
Group by Queries
Group
: Queries
Sprint insights
Sprint insights
View settings
View settings
More actions
More actions
Ready For DEV
READY FOR DEV
4
JY-20564 Investigate and fix why exceed Fontawesome package limits. Use the enter key to load the work item.
Investigate and fix why exceed Fontawesome package limits
MAINTENANCE
Ready for Dev
JY-20564
JY-20564
1
pull request
JY-20508 Notify a user before the AJ Report expires. Use the enter key to load the work item.
Notify a user before the AJ Report expires
AJ REPORTS
Backlog
JY-20508
JY-20508
1
JY-20352 Sync opportunities without a local owner (user_id is null). Use the enter key to load the work item.
Sync opportunities without a local owner (user_id is null)
PLATFORM STABILITY
Backlog
JY-20352
JY-20352
4
JY-19957 Upgrade BE libraries - Apr. Use the enter key to load the work item.
Upgrade BE libraries - Apr
MAINTENANCE
Backlog
JY-19957
JY-19957
1
In DEV
IN DEV
5
JY-20489 Rework Nudges - Phase 2 - change Nudges to use the indexed_at period. Use the enter key to load the work item.
Rework Nudges - Phase 2 - change Nudges to use the indexed_at period
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-20489
JY-20489
5
JY-9712 Change forever nudges to 1 year expiration. Use the enter key to load the work item.
Change forever nudges to 1 year expiration
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-9712
JY-9712
4.5
pull request
JY-20372 AI Reports > Empty page design and promotion . Use the enter key to load the work item.
AI Reports > Empty page design and promotion
AJ Reports, Edit Parent
AJ REPORTS
In Dev
JY-20372
JY-20372
6
branch
JY-20157 Send email notification when the report is not generated. Use the enter key to load the work item.
Send email notification when the report is not generated
Edit summary
Edit summary
AJ Reports, Edit Parent
AJ REPORTS
In Dev
JY-20157
JY-20157
2
More actions for JY-20157 Send email notification when the report is not generated
More actions for JY-20157 Send email notification when the report is not generated
JY-20566 AI Review - Q1 - Summary/Action items/Key Points. Use the enter key to load the work item.
AI Review - Q1 - Summary/Action items/Key Points
GROWTH - MAINTAIN OUR COMPETITIVE POSITION
In Dev
JY-20566
JY-20566
3
Code Review
CODE REVIEW
Create work item in Code Review
Create
Blocked
BLOCKED
Create work item in Blocked
Create
QA
QA
1
Create work item
JY-18909 [Part2] Automated reports with Ask Jiminny. Use the enter key to load the work item.
[Part2] Automated reports with Ask Jiminny
AJ REPORTS
In QA
AI
BE
FE
QA
JY-18909
JY-18909
5
pull request
Create work item in QA
Create
PO Acceptance
PO ACCEPTANCE
Create work item in PO Acceptance
Create
Deploy
DEPLOY
9
JY-19798 Evaluation for AI Activity Types. Use the enter key to load the work item.
Evaluation for AI Activity Types
AUTO-DETECTED ACTIVITY TYPE
Deployed
JY-19798
JY-19798
1
Successful deployment to production.
JY-20553 Delays in CRM Sync. Use the enter key to load the work item.
Delays in CRM Sync
PLATFORM STABILITY
Deployed
JY-20553
JY-20553
3.5
merged pull request
JY-20632 Prepare fallback with email for SSO for `persistent` name_id_format. Use the enter key to load the work item.
Prepare fallback with email for SSO for `persistent` name_id_format
REDUCE CHURN
Closed
JY-20632
JY-20632
1
merged pull request
JY-20278 AJ Panorama> Don't show internal errors to customers. Use the enter key to load the work item.
AJ Panorama> Don't show internal errors to customers
ASK ANYTHING ON ANYTHING
Deployed
Prophet
JY-20278
JY-20278
1
Successful deployment to production.
JY-19967 Upgrade Python and libraries - Apr. Use the enter key to load the work item.
Upgrade Python and libraries - Apr
MAINTENANCE
Deployed
JY-19967
JY-19967
1
Successful deployment to production.
JY-20681 CLONE - [Team insights] Filter gets reset automatically. Use the enter key to load the work item.
CLONE - [Team insights] Filter gets reset automatically
SUPPORT TICKETS
Deployed
JY-20681
JY-20681
0.5
merged pull request
JY-20692 Issue with reconnecting Zoho. Use the enter key to load the work item.
Issue with reconnecting Zoho
SUPPORT TICKETS
Deployed
JY-20692
JY-20692
2
merged pull request
JY-20696 [Tech Day] Improve Dependabot Bot & Experiment with Github Actions. Use the enter key to load the work item.
[Tech Day] Improve Dependabot Bot & Experiment with Github Actions
Closed
JY-20696
JY-20696
0
JY-20698 Les Mills activity types not pulling in. Use the enter key to load the work item.
Les Mills activity types not pulling in
SUPPORT TICKETS
Deployed
JY-20698
JY-20698
1
merged pull request
Open Rovo Chat
Open Rovo Chat...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.23287898,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.23105054,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.2443484,"top":0.10614525,"width":0.10106383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.29837102,"top":0.10215483,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.23105054,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2443484,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.23105054,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2443484,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny Mail","depth":4,"bounds":{"left":0.23105054,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny Mail","depth":5,"bounds":{"left":0.2443484,"top":0.20430966,"width":0.02144282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20500] Batch initial sync for Salesforce - Jira","depth":4,"bounds":{"left":0.23105054,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20500] Batch initial sync for Salesforce - Jira","depth":5,"bounds":{"left":0.2443484,"top":0.23703113,"width":0.08610372,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.23105054,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.2443484,"top":0.2697526,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23105054,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2443484,"top":0.30247405,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.23105054,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.2443484,"top":0.33519554,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Formalize","depth":4,"bounds":{"left":0.23105054,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Formalize","depth":5,"bounds":{"left":0.2443484,"top":0.367917,"width":0.016788565,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.23105054,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.2443484,"top":0.40063846,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results: calendar | Jiminny Help Center","depth":4,"bounds":{"left":0.23105054,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results: calendar | Jiminny Help Center","depth":5,"bounds":{"left":0.2443484,"top":0.43335995,"width":0.080119684,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23105054,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2443484,"top":0.4660814,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23105054,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2443484,"top":0.49880287,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23105054,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2443484,"top":0.53152436,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Edit - Engineering - Confluence","depth":4,"bounds":{"left":0.23105054,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit - Engineering - Confluence","depth":5,"bounds":{"left":0.2443484,"top":0.5642458,"width":0.054853722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.23105054,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.2443484,"top":0.5969673,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.23105054,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2443484,"top":0.62968874,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.23105054,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2443484,"top":0.6624102,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"bounds":{"left":0.23105054,"top":0.6839585,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"bounds":{"left":0.2443484,"top":0.69513166,"width":0.029920213,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.23387633,"top":0.71827614,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.23387633,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.24484707,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.25598404,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.26712102,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.27825797,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to:","depth":9,"bounds":{"left":0.32130983,"top":0.07861133,"width":0.016954787,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Main Content","depth":10,"bounds":{"left":0.32130983,"top":0.097765364,"width":0.029421542,"height":0.01396648},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Main Content","depth":11,"bounds":{"left":0.32130983,"top":0.097765364,"width":0.029421542,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Top Bar","depth":10,"bounds":{"left":0.32130983,"top":0.11691939,"width":0.016954787,"height":0.01396648},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Top Bar","depth":11,"bounds":{"left":0.32130983,"top":0.11691939,"width":0.016954787,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sidebar","depth":10,"bounds":{"left":0.32130983,"top":0.13607343,"width":0.016954787,"height":0.01396648},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sidebar","depth":11,"bounds":{"left":0.32130983,"top":0.13607343,"width":0.016954787,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Space navigation","depth":10,"bounds":{"left":0.32130983,"top":0.15522745,"width":0.037898935,"height":0.01396648},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Space navigation","depth":11,"bounds":{"left":0.32130983,"top":0.15522745,"width":0.037898935,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse sidebar [","depth":9,"bounds":{"left":0.3146609,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse sidebar [","depth":11,"bounds":{"left":0.31981382,"top":0.06344773,"width":0.039727394,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Switch sites or apps","depth":10,"bounds":{"left":0.32662898,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch sites or apps","depth":12,"bounds":{"left":0.33178192,"top":0.06344773,"width":0.044215426,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to your Jira homepage","depth":9,"bounds":{"left":0.33992687,"top":0.057861134,"width":0.029421542,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Search, press enter to navigate to advanced search with your text query","depth":11,"bounds":{"left":0.5202792,"top":0.06264964,"width":0.24268617,"height":0.015961692},"help_text":"","placeholder":"Search","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Create","depth":10,"bounds":{"left":0.7712766,"top":0.057861134,"width":0.030086435,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":12,"bounds":{"left":0.7825798,"top":0.06384677,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Rovo Ask Rovo","depth":12,"bounds":{"left":0.91223407,"top":0.057861134,"width":0.035904255,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Rovo","depth":14,"bounds":{"left":0.92353725,"top":0.06384677,"width":0.020611702,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Over 9 Notifications","depth":12,"bounds":{"left":0.9494681,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Over 9 Notifications","depth":14,"bounds":{"left":0.954621,"top":0.06344773,"width":0.043882977,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Help","depth":12,"bounds":{"left":0.96143615,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Help","depth":14,"bounds":{"left":0.9665891,"top":0.06344773,"width":0.010139627,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Settings","depth":12,"bounds":{"left":0.9734042,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Settings","depth":14,"bounds":{"left":0.97855717,"top":0.06344773,"width":0.017952127,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.98537236,"top":0.057861134,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lukas.kovalik@jiminny.com","depth":14,"bounds":{"left":0.99052525,"top":0.06344773,"width":0.009474754,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"For you","depth":12,"bounds":{"left":0.3146609,"top":0.09976058,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"For you","depth":15,"bounds":{"left":0.3252992,"top":0.10574621,"width":0.01662234,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Recent","depth":12,"bounds":{"left":0.3146609,"top":0.12529927,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Recent","depth":15,"bounds":{"left":0.3252992,"top":0.13128492,"width":0.015458777,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Starred","depth":12,"bounds":{"left":0.3146609,"top":0.15083799,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Starred","depth":15,"bounds":{"left":0.3252992,"top":0.15682362,"width":0.016456118,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Apps","depth":12,"bounds":{"left":0.3146609,"top":0.1763767,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Apps","depth":15,"bounds":{"left":0.3252992,"top":0.18236233,"width":0.011635638,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Apps","depth":13,"bounds":{"left":0.38414228,"top":0.17956904,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Apps","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Spaces","depth":12,"bounds":{"left":0.3146609,"top":0.2019154,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Spaces","depth":15,"bounds":{"left":0.3252992,"top":0.20790103,"width":0.016456118,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create space","depth":13,"bounds":{"left":0.36751994,"top":0.20510775,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create space","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for spaces","depth":13,"bounds":{"left":0.37682846,"top":0.20510775,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for spaces","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recent","depth":16,"bounds":{"left":0.32064494,"top":0.23423783,"width":0.013464096,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New)","depth":17,"bounds":{"left":0.31865028,"top":0.2529928,"width":0.0674867,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":20,"bounds":{"left":0.32928857,"top":0.25897846,"width":0.032081116,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Jiminny (New)","depth":18,"bounds":{"left":0.31998006,"top":0.25618514,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXMenuButton","text":"Create board","depth":18,"bounds":{"left":0.36751994,"top":0.25618514,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Create board","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Jiminny (New)","depth":18,"bounds":{"left":0.37682846,"top":0.25618514,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Jiminny (New)","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Platform Team","depth":19,"bounds":{"left":0.3226396,"top":0.27853152,"width":0.06349734,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Team","depth":22,"bounds":{"left":0.3332779,"top":0.28451717,"width":0.032247342,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.38414228,"top":0.28172386,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SE Kanban","depth":19,"bounds":{"left":0.3226396,"top":0.30407023,"width":0.06349734,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SE Kanban","depth":22,"bounds":{"left":0.3332779,"top":0.31005585,"width":0.024102394,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.38414228,"top":0.30726257,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Capture Team","depth":19,"bounds":{"left":0.3226396,"top":0.32960895,"width":0.06349734,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Capture Team","depth":22,"bounds":{"left":0.3332779,"top":0.33559456,"width":0.03125,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.38414228,"top":0.33280128,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise Stability Issues 🤕","depth":19,"bounds":{"left":0.3226396,"top":0.35514766,"width":0.06349734,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise Stability Issues 🤕","depth":22,"bounds":{"left":0.3332779,"top":0.36113328,"width":0.050531916,"height":0.030726258},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.38414228,"top":0.35834,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Processing Team","depth":19,"bounds":{"left":0.3226396,"top":0.38068634,"width":0.06349734,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Processing Team","depth":22,"bounds":{"left":0.3332779,"top":0.386672,"width":0.038231384,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.38414228,"top":0.38387868,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Service-Desk","depth":17,"bounds":{"left":0.31865028,"top":0.40622506,"width":0.0674867,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Service-Desk","depth":20,"bounds":{"left":0.32928857,"top":0.4122107,"width":0.03025266,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Service-Desk","depth":18,"bounds":{"left":0.3854721,"top":0.4094174,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Service-Desk","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More spaces","depth":17,"bounds":{"left":0.31865028,"top":0.43176377,"width":0.0674867,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More spaces","depth":20,"bounds":{"left":0.32928857,"top":0.43774942,"width":0.028756648,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Filters","depth":12,"bounds":{"left":0.3146609,"top":0.45730248,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Filters","depth":15,"bounds":{"left":0.3252992,"top":0.4632881,"width":0.013796543,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Filters","depth":13,"bounds":{"left":0.38414228,"top":0.46049482,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Filters","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dashboards","depth":12,"bounds":{"left":0.3146609,"top":0.4828412,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dashboards","depth":15,"bounds":{"left":0.3252992,"top":0.4888268,"width":0.026761968,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create dashboard","depth":13,"bounds":{"left":0.38613698,"top":0.48603353,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create dashboard","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Dashboards","depth":13,"bounds":{"left":0.3934508,"top":0.48603353,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Dashboards","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Operations","depth":12,"bounds":{"left":0.3146609,"top":0.5083799,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Operations","depth":15,"bounds":{"left":0.3252992,"top":0.5143655,"width":0.02443484,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Operations","depth":13,"bounds":{"left":0.38414228,"top":0.51157224,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Operations","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Confluence , (opens new window)","depth":13,"bounds":{"left":0.3146609,"top":0.5434956,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Confluence","depth":17,"bounds":{"left":0.3252992,"top":0.5494813,"width":0.025764627,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", (opens new window)","depth":15,"bounds":{"left":0.3146609,"top":0.55706304,"width":0.04837101,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Teams , (opens new window)","depth":13,"bounds":{"left":0.3146609,"top":0.56903434,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Teams","depth":17,"bounds":{"left":0.3252992,"top":0.57501996,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", (opens new window)","depth":15,"bounds":{"left":0.3146609,"top":0.5826017,"width":0.04837101,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"open menu","depth":14,"bounds":{"left":0.37483376,"top":0.57222664,"width":0.0039893617,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"open menu","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Customise sidebar","depth":12,"bounds":{"left":0.3146609,"top":0.60415006,"width":0.071476065,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Customise sidebar","depth":15,"bounds":{"left":0.3252992,"top":0.6101357,"width":0.04155585,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resize side navigation panel","depth":13,"bounds":{"left":0.44198802,"top":0.0981644,"width":0.062333778,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Spaces","depth":13,"bounds":{"left":0.3984375,"top":0.09976058,"width":0.016289894,"height":0.01915403},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Spaces","depth":15,"bounds":{"left":0.3984375,"top":0.102553874,"width":0.016289894,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":13,"bounds":{"left":0.41788563,"top":0.102553874,"width":0.0016622341,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New)","depth":13,"bounds":{"left":0.42270613,"top":0.09976058,"width":0.03174867,"height":0.01915403},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":15,"bounds":{"left":0.42270613,"top":0.102553874,"width":0.03174867,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Platform Team","depth":10,"bounds":{"left":0.3984375,"top":0.12210695,"width":0.045877658,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Platform Team","depth":11,"bounds":{"left":0.3984375,"top":0.12210695,"width":0.045877658,"height":0.019553073},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add people","depth":10,"bounds":{"left":0.44630983,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add people","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":10,"bounds":{"left":0.45894283,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Share","depth":10,"bounds":{"left":0.94148934,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Automation","depth":10,"bounds":{"left":0.95478725,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Give feedback","depth":10,"bounds":{"left":0.9680851,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Give feedback","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Enter full screen","depth":10,"bounds":{"left":0.98138297,"top":0.118914604,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enter full screen","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Summary","depth":13,"bounds":{"left":0.3957779,"top":0.14764565,"width":0.035904255,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summary","depth":15,"bounds":{"left":0.40708113,"top":0.15363128,"width":0.021276595,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Timeline","depth":13,"bounds":{"left":0.43301198,"top":0.14764565,"width":0.03357713,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Timeline","depth":15,"bounds":{"left":0.44431517,"top":0.15363128,"width":0.018949468,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Backlog","depth":13,"bounds":{"left":0.46791887,"top":0.14764565,"width":0.032413565,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Backlog","depth":15,"bounds":{"left":0.4792221,"top":0.15363128,"width":0.017785905,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Active sprints","depth":13,"bounds":{"left":0.50166225,"top":0.14764565,"width":0.045212764,"height":0.025538707},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Active sprints","depth":15,"bounds":{"left":0.51296544,"top":0.15363128,"width":0.030585106,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Calendar","depth":13,"bounds":{"left":0.5482048,"top":0.14764565,"width":0.03474069,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Calendar","depth":15,"bounds":{"left":0.55950797,"top":0.15363128,"width":0.020113032,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reports","depth":13,"bounds":{"left":0.58427525,"top":0.14764565,"width":0.031914894,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reports","depth":15,"bounds":{"left":0.59557843,"top":0.15363128,"width":0.017287234,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Testing Board","depth":13,"bounds":{"left":0.61752,"top":0.14764565,"width":0.046708778,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Testing Board","depth":15,"bounds":{"left":0.62882316,"top":0.15363128,"width":0.030751329,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"List","depth":13,"bounds":{"left":0.6655585,"top":0.14764565,"width":0.02244016,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"List","depth":15,"bounds":{"left":0.6768617,"top":0.15363128,"width":0.0078125,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forms","depth":13,"bounds":{"left":0.68932843,"top":0.14764565,"width":0.028590426,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forms","depth":15,"bounds":{"left":0.7006317,"top":0.15363128,"width":0.013962766,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Components","depth":13,"bounds":{"left":0.71924865,"top":0.14764565,"width":0.04305186,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Components","depth":15,"bounds":{"left":0.73055184,"top":0.15363128,"width":0.028424202,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Development","depth":13,"bounds":{"left":0.76363033,"top":0.14764565,"width":0.044049203,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Development","depth":15,"bounds":{"left":0.7749335,"top":0.15363128,"width":0.029421542,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":13,"bounds":{"left":0.8090093,"top":0.14764565,"width":0.02642952,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":15,"bounds":{"left":0.8203125,"top":0.15363128,"width":0.011801862,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security","depth":13,"bounds":{"left":0.8367686,"top":0.14764565,"width":0.03324468,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security","depth":15,"bounds":{"left":0.8480718,"top":0.15363128,"width":0.01861702,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Releases","depth":13,"bounds":{"left":0.8713431,"top":0.14764565,"width":0.034574468,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Releases","depth":15,"bounds":{"left":0.88264626,"top":0.15363128,"width":0.019946808,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Deployments","depth":13,"bounds":{"left":0.90724736,"top":0.14764565,"width":0.043882977,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Deployments","depth":15,"bounds":{"left":0.91855055,"top":0.15363128,"width":0.02925532,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"5 more tabs","depth":11,"bounds":{"left":0.9524601,"top":0.14764565,"width":0.026097074,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":12,"bounds":{"left":0.95578456,"top":0.15363128,"width":0.011469414,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":13,"bounds":{"left":0.97140956,"top":0.15442938,"width":0.0023271276,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add to navigation","depth":11,"bounds":{"left":0.97988695,"top":0.15083799,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"As you type to search or apply filters, the board updates with work items to match.","depth":11,"bounds":{"left":0.3984375,"top":0.20271349,"width":0.18134974,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Search on current page","depth":11,"bounds":{"left":0.40674868,"top":0.188747,"width":0.050531916,"height":0.026735835},"placeholder":"Search board","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Filter by assignee","depth":12,"bounds":{"left":0.46226728,"top":0.19034317,"width":0.03873005,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Filter assignees by Lukas Kovalik","depth":11,"bounds":{"left":0.4635971,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Filter assignees by Nikolay Ivanov","depth":11,"bounds":{"left":0.4715758,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Filter assignees by Nikolay Nikolov","depth":11,"bounds":{"left":0.47955453,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Filter assignees by Nikolay Yankov","depth":11,"bounds":{"left":0.48753324,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Filter assignees by Steliyan Georgiev","depth":11,"bounds":{"left":0.49551198,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Filter assignees by Unassigned","depth":11,"bounds":{"left":0.5034907,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Epic","depth":13,"bounds":{"left":0.51545876,"top":0.18914606,"width":0.0234375,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Epic","depth":16,"bounds":{"left":0.51944816,"top":0.19513169,"width":0.009474734,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Type","depth":13,"bounds":{"left":0.5415558,"top":0.18914606,"width":0.025099734,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Type","depth":16,"bounds":{"left":0.5455452,"top":0.19513169,"width":0.011136968,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Label","depth":13,"bounds":{"left":0.56931514,"top":0.18914606,"width":0.025930852,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Label","depth":16,"bounds":{"left":0.57330453,"top":0.19513169,"width":0.011968086,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Quick filters","depth":13,"bounds":{"left":0.5979056,"top":0.18914606,"width":0.04089096,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Quick filters","depth":16,"bounds":{"left":0.601895,"top":0.19513169,"width":0.026928192,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Complete sprint","depth":10,"bounds":{"left":0.85106385,"top":0.18914606,"width":0.04338431,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Complete sprint","depth":12,"bounds":{"left":0.8550532,"top":0.19513169,"width":0.035405584,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Sprint details","depth":10,"bounds":{"left":0.8971077,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sprint details","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Group by Queries","depth":10,"bounds":{"left":0.9104056,"top":0.18914606,"width":0.041722074,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Group","depth":13,"bounds":{"left":0.914395,"top":0.19513169,"width":0.013796543,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Queries","depth":13,"bounds":{"left":0.9281915,"top":0.19513169,"width":0.019946808,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Sprint insights","depth":10,"bounds":{"left":0.95478725,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sprint insights","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"View settings","depth":10,"bounds":{"left":0.9680851,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"View settings","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions","depth":10,"bounds":{"left":0.98138297,"top":0.18914606,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Ready For DEV","depth":16,"bounds":{"left":0.4010971,"top":0.24022347,"width":0.042220745,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"READY FOR DEV","depth":18,"bounds":{"left":0.4010971,"top":0.2406225,"width":0.03158245,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":21,"bounds":{"left":0.43666887,"top":0.2406225,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-20564 Investigate and fix why exceed Fontawesome package limits. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.40009972,"top":0.2697526,"width":0.07895612,"height":0.13727055},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Investigate and fix why exceed Fontawesome package limits","depth":17,"bounds":{"left":0.4040891,"top":0.28052673,"width":0.051363032,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MAINTENANCE","depth":18,"bounds":{"left":0.40541887,"top":0.33439744,"width":0.029089095,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ready for Dev","depth":17,"bounds":{"left":0.4040891,"top":0.35395053,"width":0.031083776,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20564","depth":17,"bounds":{"left":0.41073802,"top":0.37988827,"width":0.016456118,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20564","depth":19,"bounds":{"left":0.40824467,"top":0.38028732,"width":0.018949468,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.43168217,"top":0.38028732,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"pull request","depth":16,"bounds":{"left":0.43849733,"top":0.37669593,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20508 Notify a user before the AJ Report expires. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.40009972,"top":0.4102155,"width":0.07895612,"height":0.121308856},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Notify a user before the AJ Report expires","depth":17,"bounds":{"left":0.4040891,"top":0.42098963,"width":0.059341755,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ REPORTS","depth":18,"bounds":{"left":0.40541887,"top":0.45889863,"width":0.023271276,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Backlog","depth":17,"bounds":{"left":0.4040891,"top":0.47845173,"width":0.01761968,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20508","depth":17,"bounds":{"left":0.41073802,"top":0.50438946,"width":0.018949468,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20508","depth":19,"bounds":{"left":0.41073802,"top":0.5047885,"width":0.018949468,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.4409907,"top":0.5047885,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-20352 Sync opportunities without a local owner (user_id is null). Use the enter key to load the work item.","depth":16,"bounds":{"left":0.40009972,"top":0.53471667,"width":0.07895612,"height":0.13727055},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sync opportunities without a local owner (user_id is null)","depth":17,"bounds":{"left":0.4040891,"top":0.5454908,"width":0.05900931,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PLATFORM STABILITY","depth":18,"bounds":{"left":0.40541887,"top":0.59936154,"width":0.042054523,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Backlog","depth":17,"bounds":{"left":0.4040891,"top":0.6189146,"width":0.01761968,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20352","depth":17,"bounds":{"left":0.41073802,"top":0.64485234,"width":0.018949468,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20352","depth":19,"bounds":{"left":0.41073802,"top":0.6452514,"width":0.018949468,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":17,"bounds":{"left":0.44065824,"top":0.6452514,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-19957 Upgrade BE libraries - Apr. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.40009972,"top":0.67517954,"width":0.07895612,"height":0.105347164},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Upgrade BE libraries - Apr","depth":17,"bounds":{"left":0.4040891,"top":0.68595374,"width":0.057679523,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MAINTENANCE","depth":18,"bounds":{"left":0.40541887,"top":0.70790106,"width":0.029089095,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Backlog","depth":17,"bounds":{"left":0.4040891,"top":0.7274541,"width":0.01761968,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-19957","depth":17,"bounds":{"left":0.41073802,"top":0.75339186,"width":0.017952127,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-19957","depth":19,"bounds":{"left":0.41073802,"top":0.7537909,"width":0.017952127,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.4409907,"top":0.7537909,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"In DEV","depth":16,"bounds":{"left":0.48603722,"top":0.24022347,"width":0.024767287,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"IN DEV","depth":18,"bounds":{"left":0.48603722,"top":0.2406225,"width":0.01412899,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":21,"bounds":{"left":0.5041556,"top":0.2406225,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-20489 Rework Nudges - Phase 2 - change Nudges to use the indexed_at period. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.4850399,"top":0.2697526,"width":0.07912234,"height":0.1376696},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Rework Nudges - Phase 2 - change Nudges to use the indexed_at period","depth":18,"bounds":{"left":0.48902926,"top":0.28052673,"width":0.057347074,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Cost-effective and faster nudges, Edit Parent","depth":17,"bounds":{"left":0.48902926,"top":0.33359936,"width":0.07114362,"height":0.0131683955},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"COST-EFFECTIVE AND FASTER NUDGES","depth":21,"bounds":{"left":0.49035904,"top":0.3347965,"width":0.07430186,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In Dev","depth":17,"bounds":{"left":0.48902926,"top":0.35434955,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20489","depth":17,"bounds":{"left":0.4956782,"top":0.38028732,"width":0.019281914,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20489","depth":19,"bounds":{"left":0.4956782,"top":0.38068634,"width":0.019281914,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":17,"bounds":{"left":0.5369016,"top":0.38068634,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-9712 Change forever nudges to 1 year expiration. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.4850399,"top":0.41061452,"width":0.07912234,"height":0.1217079},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Change forever nudges to 1 year expiration","depth":18,"bounds":{"left":0.48902926,"top":0.42138866,"width":0.057347074,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Cost-effective and faster nudges, Edit Parent","depth":17,"bounds":{"left":0.48902926,"top":0.4584996,"width":0.07114362,"height":0.0131683955},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"COST-EFFECTIVE AND FASTER NUDGES","depth":21,"bounds":{"left":0.49035904,"top":0.45969674,"width":0.07430186,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In Dev","depth":17,"bounds":{"left":0.48902926,"top":0.4792498,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-9712","depth":17,"bounds":{"left":0.4956782,"top":0.5051876,"width":0.015458777,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712","depth":19,"bounds":{"left":0.4956782,"top":0.50558656,"width":0.015458777,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4.5","depth":17,"bounds":{"left":0.5142952,"top":0.50558656,"width":0.005984043,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"pull request","depth":16,"bounds":{"left":0.52360374,"top":0.5019952,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20372 AI Reports > Empty page design and promotion . Use the enter key to load the work item.","depth":16,"bounds":{"left":0.4850399,"top":0.5355148,"width":0.07912234,"height":0.1217079},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI Reports > Empty page design and promotion","depth":18,"bounds":{"left":0.48902926,"top":0.5462889,"width":0.055684842,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"AJ Reports, Edit Parent","depth":17,"bounds":{"left":0.48902926,"top":0.58339983,"width":0.025930852,"height":0.0131683955},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AJ REPORTS","depth":21,"bounds":{"left":0.49035904,"top":0.584597,"width":0.023271276,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In Dev","depth":17,"bounds":{"left":0.48902926,"top":0.60415006,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20372","depth":17,"bounds":{"left":0.4956782,"top":0.6300878,"width":0.018783245,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20372","depth":19,"bounds":{"left":0.4956782,"top":0.63048685,"width":0.018783245,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":17,"bounds":{"left":0.5275931,"top":0.63048685,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"branch","depth":16,"bounds":{"left":0.5349069,"top":0.6268954,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20157 Send email notification when the report is not generated. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.4850399,"top":0.660415,"width":0.07912234,"height":0.1376696},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Send email notification when the report is not generated","depth":18,"bounds":{"left":0.48902926,"top":0.6711891,"width":0.050199468,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit summary","depth":20,"bounds":{"left":0.5134641,"top":0.70111734,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit summary","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"AJ Reports, Edit Parent","depth":17,"bounds":{"left":0.48902926,"top":0.72426176,"width":0.025930852,"height":0.0131683955},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AJ REPORTS","depth":21,"bounds":{"left":0.49035904,"top":0.7254589,"width":0.023271276,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In Dev","depth":17,"bounds":{"left":0.48902926,"top":0.745012,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20157","depth":17,"bounds":{"left":0.4956782,"top":0.7709497,"width":0.017952127,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20157","depth":19,"bounds":{"left":0.4956782,"top":0.7713488,"width":0.017952127,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":17,"bounds":{"left":0.5369016,"top":0.7713488,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for JY-20157 Send email notification when the report is not generated","depth":17,"bounds":{"left":0.5521942,"top":0.669992,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for JY-20157 Send email notification when the report is not generated","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-20566 AI Review - Q1 - Summary/Action items/Key Points. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.4850399,"top":0.8012769,"width":0.07912234,"height":0.121308856},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI Review - Q1 - Summary/Action items/Key Points","depth":17,"bounds":{"left":0.48902926,"top":0.81205106,"width":0.059507977,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"GROWTH - MAINTAIN OUR COMPETITIVE POSITION","depth":18,"bounds":{"left":0.49035904,"top":0.8499601,"width":0.098902926,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In Dev","depth":17,"bounds":{"left":0.48902926,"top":0.86951315,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20566","depth":17,"bounds":{"left":0.4956782,"top":0.8954509,"width":0.018949468,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20566","depth":19,"bounds":{"left":0.4956782,"top":0.89584994,"width":0.018949468,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":17,"bounds":{"left":0.52825797,"top":0.89584994,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Code Review","depth":16,"bounds":{"left":0.5711436,"top":0.24022347,"width":0.02825798,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CODE REVIEW","depth":18,"bounds":{"left":0.5711436,"top":0.2406225,"width":0.02825798,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create work item in Code Review","depth":16,"bounds":{"left":0.57014626,"top":0.2697526,"width":0.07895612,"height":0.028731046},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":19,"bounds":{"left":0.58144945,"top":0.2773344,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Blocked","depth":16,"bounds":{"left":0.65608376,"top":0.24022347,"width":0.018783245,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BLOCKED","depth":18,"bounds":{"left":0.65608376,"top":0.2406225,"width":0.018783245,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create work item in Blocked","depth":16,"bounds":{"left":0.65508646,"top":0.2697526,"width":0.07895612,"height":0.028731046},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":19,"bounds":{"left":0.66638964,"top":0.2773344,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"QA","depth":16,"bounds":{"left":0.74102396,"top":0.24022347,"width":0.016456118,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QA","depth":18,"bounds":{"left":0.74102396,"top":0.2406225,"width":0.005817819,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":21,"bounds":{"left":0.7513298,"top":0.2406225,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create work item","depth":16,"bounds":{"left":0.73603725,"top":0.2585794,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"JY-18909 [Part2] Automated reports with Ask Jiminny. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.7400266,"top":0.2697526,"width":0.07912234,"height":0.14046289},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[Part2] Automated reports with Ask Jiminny","depth":17,"bounds":{"left":0.74401593,"top":0.28052673,"width":0.057513297,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ REPORTS","depth":18,"bounds":{"left":0.7453458,"top":0.31843576,"width":0.023271276,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In QA","depth":17,"bounds":{"left":0.74401593,"top":0.33798882,"width":0.012799202,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AI","depth":21,"bounds":{"left":0.7456782,"top":0.35714287,"width":0.005319149,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BE","depth":21,"bounds":{"left":0.7569814,"top":0.35714287,"width":0.005817819,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FE","depth":21,"bounds":{"left":0.7687833,"top":0.35714287,"width":0.005485372,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QA","depth":21,"bounds":{"left":0.78025264,"top":0.35714287,"width":0.0066489363,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-18909","depth":17,"bounds":{"left":0.7506649,"top":0.3830806,"width":0.018450798,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-18909","depth":19,"bounds":{"left":0.7506649,"top":0.38347965,"width":0.018450798,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":17,"bounds":{"left":0.77393615,"top":0.38347965,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"pull request","depth":16,"bounds":{"left":0.78125,"top":0.37988827,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Create work item in QA","depth":16,"bounds":{"left":0.7400266,"top":0.41340783,"width":0.07912234,"height":0.028731046},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":19,"bounds":{"left":0.7513298,"top":0.42098963,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"PO Acceptance","depth":16,"bounds":{"left":0.82613033,"top":0.24022347,"width":0.03357713,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PO ACCEPTANCE","depth":18,"bounds":{"left":0.82613033,"top":0.2406225,"width":0.03357713,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create work item in PO Acceptance","depth":16,"bounds":{"left":0.82513297,"top":0.2697526,"width":0.07895612,"height":0.028731046},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":19,"bounds":{"left":0.83643615,"top":0.2773344,"width":0.014793883,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Deploy","depth":16,"bounds":{"left":0.91107047,"top":0.24022347,"width":0.026263298,"height":0.012769354},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DEPLOY","depth":18,"bounds":{"left":0.91107047,"top":0.2406225,"width":0.015625,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"9","depth":21,"bounds":{"left":0.93085104,"top":0.2406225,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-19798 Evaluation for AI Activity Types. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.2697526,"width":0.07895612,"height":0.121308856},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Evaluation for AI Activity Types","depth":17,"bounds":{"left":0.9140625,"top":0.28052673,"width":0.054521278,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AUTO-DETECTED ACTIVITY TYPE","depth":18,"bounds":{"left":0.9153923,"top":0.31843576,"width":0.06349734,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"bounds":{"left":0.9140625,"top":0.33798882,"width":0.020777926,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-19798","depth":17,"bounds":{"left":0.92071146,"top":0.3639266,"width":0.017952127,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-19798","depth":19,"bounds":{"left":0.92071146,"top":0.3643256,"width":0.017952127,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.95295876,"top":0.3643256,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Successful deployment to production.","depth":16,"bounds":{"left":0.95977396,"top":0.36073422,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20553 Delays in CRM Sync. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.3942538,"width":0.07895612,"height":0.105347164},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Delays in CRM Sync","depth":17,"bounds":{"left":0.9140625,"top":0.40502793,"width":0.044215426,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PLATFORM STABILITY","depth":18,"bounds":{"left":0.9153923,"top":0.42697525,"width":0.042054523,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"bounds":{"left":0.9140625,"top":0.44652835,"width":0.020777926,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553","depth":17,"bounds":{"left":0.92071146,"top":0.47246608,"width":0.018783245,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553","depth":19,"bounds":{"left":0.92071146,"top":0.47286513,"width":0.018783245,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3.5","depth":17,"bounds":{"left":0.9506317,"top":0.47286513,"width":0.005817819,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"merged pull request","depth":16,"bounds":{"left":0.95977396,"top":0.46927375,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20632 Prepare fallback with email for SSO for `persistent` name_id_format. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.5027933,"width":0.07895612,"height":0.13727055},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Prepare fallback with email for SSO for `persistent` name_id_format","depth":17,"bounds":{"left":0.9140625,"top":0.51356745,"width":0.059341755,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"REDUCE CHURN","depth":18,"bounds":{"left":0.9153923,"top":0.5674381,"width":0.029587766,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Closed","depth":17,"bounds":{"left":0.9140625,"top":0.58699125,"width":0.015292553,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20632","depth":17,"bounds":{"left":0.92071146,"top":0.612929,"width":0.016456118,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20632","depth":19,"bounds":{"left":0.9182181,"top":0.61332804,"width":0.018949468,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.9416556,"top":0.61332804,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"merged pull request","depth":16,"bounds":{"left":0.9484708,"top":0.6097366,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20278 AJ Panorama> Don't show internal errors to customers. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.6432562,"width":0.07895612,"height":0.15642458},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AJ Panorama> Don't show internal errors to customers","depth":17,"bounds":{"left":0.9140625,"top":0.6540303,"width":0.05851064,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ASK ANYTHING ON ANYTHING","depth":18,"bounds":{"left":0.9153923,"top":0.70790106,"width":0.058344416,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"bounds":{"left":0.9140625,"top":0.7274541,"width":0.020777926,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prophet","depth":21,"bounds":{"left":0.91572475,"top":0.74660814,"width":0.017287234,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20278","depth":17,"bounds":{"left":0.92071146,"top":0.7725459,"width":0.016456118,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20278","depth":19,"bounds":{"left":0.9183843,"top":0.7729449,"width":0.018783245,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.9416556,"top":0.7729449,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Successful deployment to production.","depth":16,"bounds":{"left":0.9484708,"top":0.76935357,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-19967 Upgrade Python and libraries - Apr. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.8028731,"width":0.07895612,"height":0.121308856},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Upgrade Python and libraries - Apr","depth":17,"bounds":{"left":0.9140625,"top":0.8136473,"width":0.04537899,"height":0.029928172},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MAINTENANCE","depth":18,"bounds":{"left":0.9153923,"top":0.85155624,"width":0.028922873,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"bounds":{"left":0.9140625,"top":0.87110937,"width":0.020777926,"height":0.01396648},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-19967","depth":17,"bounds":{"left":0.92071146,"top":0.8970471,"width":0.018118352,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-19967","depth":19,"bounds":{"left":0.92071146,"top":0.89744616,"width":0.018118352,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"bounds":{"left":0.94431514,"top":0.89744616,"width":0.0016622341,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Successful deployment to production.","depth":16,"bounds":{"left":0.95113033,"top":0.89385474,"width":0.007978723,"height":0.01915403},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20681 CLONE - [Team insights] Filter gets reset automatically. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":0.9273743,"width":0.07895612,"height":0.0726257},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CLONE - [Team insights] Filter gets reset automatically","depth":17,"bounds":{"left":0.9140625,"top":0.93814844,"width":0.05435505,"height":0.045889866},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SUPPORT TICKETS","depth":18,"bounds":{"left":0.9153923,"top":0.9920192,"width":0.03557181,"height":0.0079808235},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"bounds":{"left":0.9140625,"top":1.0,"width":0.020777926,"height":-0.011572242},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20681","depth":17,"bounds":{"left":0.92071146,"top":1.0,"width":0.018118352,"height":-0.03750992},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20681","depth":19,"bounds":{"left":0.92071146,"top":1.0,"width":0.018118352,"height":-0.03790903},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5","depth":17,"bounds":{"left":0.9459774,"top":1.0,"width":0.005817819,"height":-0.03790903},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"merged pull request","depth":16,"bounds":{"left":0.95511967,"top":1.0,"width":0.007978723,"height":-0.034317613},"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20692 Issue with reconnecting Zoho. Use the enter key to load the work item.","depth":16,"bounds":{"left":0.91007316,"top":1.0,"width":0.07895612,"height":-0.06783724},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue with reconnecting Zoho","depth":17,"bounds":{"left":0.9140625,"top":1.0,"width":0.05319149,"height":-0.078611374},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SUPPORT TICKETS","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20692","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"merged pull request","depth":16,"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20696 [Tech Day] Improve Dependabot Bot & Experiment with Github Actions. Use the enter key to load the work item.","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[Tech Day] Improve Dependabot Bot & Experiment with Github Actions","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Closed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20696","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20696","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"JY-20698 Les Mills activity types not pulling in. Use the enter key to load the work item.","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Les Mills activity types not pulling in","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SUPPORT TICKETS","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deployed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20698","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"merged pull request","depth":16,"role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Rovo Chat","depth":9,"bounds":{"left":0.97606385,"top":0.9425379,"width":0.015957447,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Open Rovo Chat","depth":11,"bounds":{"left":0.98387635,"top":0.9612929,"width":0.016123652,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8940748548091297316
|
5931357412174059591
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Close tab
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny Mail
Jiminny Mail
[JY-20500] Batch initial sync for Salesforce - Jira
[JY-20500] Batch initial sync for Salesforce - Jira
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Jiminny
Jiminny
Pipelines - jiminny/app
Pipelines - jiminny/app
Formalize
Formalize
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
Search results: calendar | Jiminny Help Center
Search results: calendar | Jiminny Help Center
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Edit - Engineering - Confluence
Edit - Engineering - Confluence
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
CloudWatch | us-east-2
CloudWatch | us-east-2
Usage | Windsurf
Usage | Windsurf
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Main Content
Main Content
Top Bar
Top Bar
Sidebar
Sidebar
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
Over 9 Notifications
Over 9 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New)
Jiminny (New)
Platform Team
Platform Team
Add people
Add people
Board actions
Board actions
Share
Automation
Give feedback
Give feedback
Enter full screen
Enter full screen
Summary
Summary
Timeline
Timeline
Backlog
Backlog
Active sprints
Active sprints
Calendar
Calendar
Reports
Reports
Testing Board
Testing Board
List
List
Forms
Forms
Components
Components
Development
Development
Code
Code
Security
Security
Releases
Releases
Deployments
Deployments
5 more tabs
More
5
Add to navigation
As you type to search or apply filters, the board updates with work items to match.
Search on current page
Filter by assignee
Filter assignees by Lukas Kovalik
Filter assignees by Nikolay Ivanov
Filter assignees by Nikolay Nikolov
Filter assignees by Nikolay Yankov
Filter assignees by Steliyan Georgiev
Filter assignees by Unassigned
Epic
Epic
Type
Type
Label
Label
Quick filters
Quick filters
Complete sprint
Complete sprint
Sprint details
Sprint details
Group by Queries
Group
: Queries
Sprint insights
Sprint insights
View settings
View settings
More actions
More actions
Ready For DEV
READY FOR DEV
4
JY-20564 Investigate and fix why exceed Fontawesome package limits. Use the enter key to load the work item.
Investigate and fix why exceed Fontawesome package limits
MAINTENANCE
Ready for Dev
JY-20564
JY-20564
1
pull request
JY-20508 Notify a user before the AJ Report expires. Use the enter key to load the work item.
Notify a user before the AJ Report expires
AJ REPORTS
Backlog
JY-20508
JY-20508
1
JY-20352 Sync opportunities without a local owner (user_id is null). Use the enter key to load the work item.
Sync opportunities without a local owner (user_id is null)
PLATFORM STABILITY
Backlog
JY-20352
JY-20352
4
JY-19957 Upgrade BE libraries - Apr. Use the enter key to load the work item.
Upgrade BE libraries - Apr
MAINTENANCE
Backlog
JY-19957
JY-19957
1
In DEV
IN DEV
5
JY-20489 Rework Nudges - Phase 2 - change Nudges to use the indexed_at period. Use the enter key to load the work item.
Rework Nudges - Phase 2 - change Nudges to use the indexed_at period
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-20489
JY-20489
5
JY-9712 Change forever nudges to 1 year expiration. Use the enter key to load the work item.
Change forever nudges to 1 year expiration
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-9712
JY-9712
4.5
pull request
JY-20372 AI Reports > Empty page design and promotion . Use the enter key to load the work item.
AI Reports > Empty page design and promotion
AJ Reports, Edit Parent
AJ REPORTS
In Dev
JY-20372
JY-20372
6
branch
JY-20157 Send email notification when the report is not generated. Use the enter key to load the work item.
Send email notification when the report is not generated
Edit summary
Edit summary
AJ Reports, Edit Parent
AJ REPORTS
In Dev
JY-20157
JY-20157
2
More actions for JY-20157 Send email notification when the report is not generated
More actions for JY-20157 Send email notification when the report is not generated
JY-20566 AI Review - Q1 - Summary/Action items/Key Points. Use the enter key to load the work item.
AI Review - Q1 - Summary/Action items/Key Points
GROWTH - MAINTAIN OUR COMPETITIVE POSITION
In Dev
JY-20566
JY-20566
3
Code Review
CODE REVIEW
Create work item in Code Review
Create
Blocked
BLOCKED
Create work item in Blocked
Create
QA
QA
1
Create work item
JY-18909 [Part2] Automated reports with Ask Jiminny. Use the enter key to load the work item.
[Part2] Automated reports with Ask Jiminny
AJ REPORTS
In QA
AI
BE
FE
QA
JY-18909
JY-18909
5
pull request
Create work item in QA
Create
PO Acceptance
PO ACCEPTANCE
Create work item in PO Acceptance
Create
Deploy
DEPLOY
9
JY-19798 Evaluation for AI Activity Types. Use the enter key to load the work item.
Evaluation for AI Activity Types
AUTO-DETECTED ACTIVITY TYPE
Deployed
JY-19798
JY-19798
1
Successful deployment to production.
JY-20553 Delays in CRM Sync. Use the enter key to load the work item.
Delays in CRM Sync
PLATFORM STABILITY
Deployed
JY-20553
JY-20553
3.5
merged pull request
JY-20632 Prepare fallback with email for SSO for `persistent` name_id_format. Use the enter key to load the work item.
Prepare fallback with email for SSO for `persistent` name_id_format
REDUCE CHURN
Closed
JY-20632
JY-20632
1
merged pull request
JY-20278 AJ Panorama> Don't show internal errors to customers. Use the enter key to load the work item.
AJ Panorama> Don't show internal errors to customers
ASK ANYTHING ON ANYTHING
Deployed
Prophet
JY-20278
JY-20278
1
Successful deployment to production.
JY-19967 Upgrade Python and libraries - Apr. Use the enter key to load the work item.
Upgrade Python and libraries - Apr
MAINTENANCE
Deployed
JY-19967
JY-19967
1
Successful deployment to production.
JY-20681 CLONE - [Team insights] Filter gets reset automatically. Use the enter key to load the work item.
CLONE - [Team insights] Filter gets reset automatically
SUPPORT TICKETS
Deployed
JY-20681
JY-20681
0.5
merged pull request
JY-20692 Issue with reconnecting Zoho. Use the enter key to load the work item.
Issue with reconnecting Zoho
SUPPORT TICKETS
Deployed
JY-20692
JY-20692
2
merged pull request
JY-20696 [Tech Day] Improve Dependabot Bot & Experiment with Github Actions. Use the enter key to load the work item.
[Tech Day] Improve Dependabot Bot & Experiment with Github Actions
Closed
JY-20696
JY-20696
0
JY-20698 Les Mills activity types not pulling in. Use the enter key to load the work item.
Les Mills activity types not pulling in
SUPPORT TICKETS
Deployed
JY-20698
JY-20698
1
merged pull request
Open Rovo Chat
Open Rovo Chat...
|
NULL
|
|
58452
|
1257
|
24
|
2026-04-20T12:48:40.084723+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776689320084_m2.jpg...
|
PhpStorm
|
PhpStorm
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormNavigatecodeFV faVsco.js°9 master kProlete PhostormNavigatecodeFV faVsco.js°9 master kProletey© StageRepository.php© SubscriptionSetRepository.php© TaskRepository.php© TeamAiContextRepository.phpleambomainskepository.onp© TeaminsightsRepository.phpcleamkeposilorv.onoc) Tnemereposilorv.onoC) TimezoneRepositorv.phpc) Topicrepositorv.phpc) TopictriaaerRepositorv.phpc) TrackRepositorv.ohp© TranscriptionModelLocaleRepository.php(c) TranscriotionReoositorv.ono© TranscriptionSummaryRepository.php@ UserRepositorv.php© VocabularyRepository.phpRules• ServicesD ActivityIM AiRenortsC Copper07 CrmObiectsm DecorateActivily_ Dummy>C Helpersv @ Hubspot@ AccountSyncStrategy•DActions_contactsvncstrateav•DDTO• Fields› ournal7 Metadatal• @poortunitvSvncStrateavv M Pacination© HubspotPaginationService.php(C) PaainationConfig.nhnl© PaginationState.php› D ProspectSearchStrategyM Redisv M ServiceTraitcT OpportunitySyncTrait.phpT SyncCrmEntitiesTrait.php© SyncFieldsTrait.php=laravel.logA SF [jiminny@localhost]A HS_local (jiminny@localhost]© AutomatedReportsCommand.phpA console [PROD] X A console (EU](@ client.phpc HubspotpaginaAutor567C) RequestGenerateReportJob.phpC) AutomatedReportResult.pho(c) AutomatedReport.photrait OpportunitvSvnctrartA33 X2 X19 ^ v 569499500private function batchSyncCrm0bjects(string $objectType, array $crmIds): array$sync0bjects = lJ:Sermohrectids = arnav vailues (Sermids)foreach (array_chunk(Scrm0bjectIdstryflenath: self••RATCH ST7S) as Schunka«$objects = SobjectType === 'companies' ?$this->client->getCompahiesByIds($chunk, $this->getCompanyFieldsO) :$this->client->getContactsByIds($chunk, $this->getContactFieldsO):foreach (Sobiects as SobiectId => SobiectData) {Sthis->importCrm0biect($obiectType, (string) SobiectId, SobiectData, &: Ssync0biects):Sthis->getDisplayName. '] Batch synced' . SobiectType,— 578579580=561—582— 583584585586} catch (\Throwable Se) {Sthis->logger-›warning('[' • Sthis-›getDispLayName() • '] Batch ' • SobjectType . ' sync failed','error' => Se->aetMessageo.return Ssvnchbiects:_sog599AaalTusageprivate function importCrm0bject(string $objectType, string SobjectId, mixed SobjectData, array &$sync0bjects)601zozl* Prepare associations for a single opportunity=605606* The return value is an array with the following structure.'companies' => [scompanucrmld = scompanuld.contacts' => [w' hac heon rectored Il Pollback Il Confiaure (todav 14-061A console [STAGING]do jiminny v034 A1 A34 M62 ^ -SELECT * FROM crm_configurations WHERE id = 555;SELECT * FROM Users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, аcтSELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN • (owner)' ELSE •• END) ASu.email,sa.*,t.owner_id FROM social_accounts saJOTN usens u on u.id = sa.sociable idiJOIN teams t 1..n<->1: on t.id = u.team_idVHERE u.team_id = 581 and sa.provider = 'salesforce';SELECT * FROM automated report results order by id descselect * from features:select * from team_features where feature id = 40:select * from teams where id = 556-select * from automated reports where id = 54: # 4fdd41f6-dcf0-30d0-b339-734weledrdeolailantamotoort results WHERE uuid to bin('822fa41b-afd3-43a9select * fromautomated report results order by 1d descGELECT * FROM automated report results WHERE id = 1919:ellect * from autcated renort results WHERE remort 1d = 541select * from onnortunities where 1d = 7594349:SELECT * FROM teamsWHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyinteselect * from nlavbooks where team 1d = 711: # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;RELECT * CROM eom Fiolde WHERE 1d = 224147•BELECT * EPOM eom field valuec WHEPE eom field id = 296147.SELECT * FROM crm_configurations WHERE id = 692:RELECTCONCAT(u.id, CASE WHEN v.id = t.owner id THEN ' (owner)' ELSE •• END) A!nomadlsa.*t.owner id FROM social accounts saJOTN users u on u.id = sa,sociable_ idIOTA toome + 1 necs1. on + ¿d = n +oom ¿dlVHERE u.team_id = 711 and sa.provider = 'salesforce':SELECT A FRON ena profiles ep JOll users U Lineail: on u.ad ep. user-36 m100% C47• Mon 20 Apr 15:48:39L AskJiminnyReportActivityServiceTestCascadeRetactor ConnectionCRM Initial Sync Over+0 ..syncProfiles() (HubSpot or Salesforce) calls ProfileRepository::update0rCreateProfile(...) and a new Crm\Profile row ismnsented, Froreteobserver•pupetz-to les promttecreated •LventserviceProv1der.oho: 139-14z subscribes two listeners:• ListenersCrm SyncProt1leopportunities (SyncProt1leopportun1t1es.pno:42-103) - applies to Mubspot, salestorce, Bullnorn, copperPipedrive, Zoho. For each new profile it:1. Dispatches SyncProfileMetadata (see below).Z. Ensures a Deal insiahts lavout exists (createDea@insightsLavouttDoesNotExist, lines 105-146 Via CrmOwnerResolver + buildLayout .3. Comoutes since= confjiqurationSettinasService-saetSvncPeriod(Scr-Confjauration).l4. Dispalches SyncopportunitiesJob with Strategy LAST MODIFIED BY PROFILE SYNC OPPORTUNITY STRATEGY, elther as a single lob or, when reaud recSLidinohindorSearch is true (Salesforce larae tenants). chooned into rollina <7-dav windows via TimePerioditerator)•Listeners\crm\SyncProtileLeads (SyncrrotlleLeads.pnp:32-/9) - 40no-only, dispatches Syncleads . Muospot salestorce do notrun aper-orofile lead sunc here•SyncProtileretadata (Syncrrot1lemetadaca. php: 39-113) - runs per promile/user: crmservice=>syncProtilerields(), and for providersimolementina SvncCrmProfileRecordTvnesInterface (Salesforce) it also calls svncProfileRecordTvnes()End-to-end flow summary• HubSnot• Team creation - no CRM svnc.• Owner connects HubSpot OAuth (SocialAccountConnected ) → no automatic data import (HubSpot's onActivityProviderIntegrated is ano-op; BootstrapIntegrationApp only fires for Integration.app providers). Initial metadata is typically triggered via CrmAccountReconnected → ImportMetadata crm:sync-team-metadata which in turn runs syncOrganization importStages importBusinessProcesses • importRecordTypes syncProfiles syncFields•syncProfiles® creates Profile rows→ ProfileCreated SyncProfileOpportunities creates Deal Insights layout + dispatches SyncOpportunitiesJob with the profile-modified strategy) + SyncProfileMetadata (syncs that user's profile fields)salesforce•leam creation → only tne optional salestorce Account stamp in Updatesalestorceccount IT a linkea account existses/syncProtiles/syncFields Salestorce implementations in Service.php)eopportunities USes TimePeriodIterator Sliding window to avoia soeL limits) + SyncProfileMetadata which also runs syncProtileRecordTunes() because Salesforce imolements SvncGrnProf1leRecordTvnesInterface.Notable observations• HubSoot and Salesforce do not have a direct SocialAccountConnected → initial-svnc wire: the metadata imoort runs via the reconnectJonAnn → TeanTnitialSunclah)•The per-profile opportunity backiill is entirely driven by ProfileCreated, so new deal opportunity ingestion starts only after syncProfilesohas recolved CPM ownerclucers to.liminnv ucere•lihe opportunity sync uses sirateay LAST MODIETED BY PROFILE SYNC OPPORIUNY STIRATEGY andrespecis team=level aetSyncPerlod and reau4recSLidinoWindowSearch settingswhat obiects are sunced on team creation and orofile creationClaude Qnus 17 MediumA51-41 /19 charcllPo 4 spaces...
|
NULL
|
-8940425503976644640
|
NULL
|
click
|
ocr
|
NULL
|
PhostormNavigatecodeFV faVsco.js°9 master kProlete PhostormNavigatecodeFV faVsco.js°9 master kProletey© StageRepository.php© SubscriptionSetRepository.php© TaskRepository.php© TeamAiContextRepository.phpleambomainskepository.onp© TeaminsightsRepository.phpcleamkeposilorv.onoc) Tnemereposilorv.onoC) TimezoneRepositorv.phpc) Topicrepositorv.phpc) TopictriaaerRepositorv.phpc) TrackRepositorv.ohp© TranscriptionModelLocaleRepository.php(c) TranscriotionReoositorv.ono© TranscriptionSummaryRepository.php@ UserRepositorv.php© VocabularyRepository.phpRules• ServicesD ActivityIM AiRenortsC Copper07 CrmObiectsm DecorateActivily_ Dummy>C Helpersv @ Hubspot@ AccountSyncStrategy•DActions_contactsvncstrateav•DDTO• Fields› ournal7 Metadatal• @poortunitvSvncStrateavv M Pacination© HubspotPaginationService.php(C) PaainationConfig.nhnl© PaginationState.php› D ProspectSearchStrategyM Redisv M ServiceTraitcT OpportunitySyncTrait.phpT SyncCrmEntitiesTrait.php© SyncFieldsTrait.php=laravel.logA SF [jiminny@localhost]A HS_local (jiminny@localhost]© AutomatedReportsCommand.phpA console [PROD] X A console (EU](@ client.phpc HubspotpaginaAutor567C) RequestGenerateReportJob.phpC) AutomatedReportResult.pho(c) AutomatedReport.photrait OpportunitvSvnctrartA33 X2 X19 ^ v 569499500private function batchSyncCrm0bjects(string $objectType, array $crmIds): array$sync0bjects = lJ:Sermohrectids = arnav vailues (Sermids)foreach (array_chunk(Scrm0bjectIdstryflenath: self••RATCH ST7S) as Schunka«$objects = SobjectType === 'companies' ?$this->client->getCompahiesByIds($chunk, $this->getCompanyFieldsO) :$this->client->getContactsByIds($chunk, $this->getContactFieldsO):foreach (Sobiects as SobiectId => SobiectData) {Sthis->importCrm0biect($obiectType, (string) SobiectId, SobiectData, &: Ssync0biects):Sthis->getDisplayName. '] Batch synced' . SobiectType,— 578579580=561—582— 583584585586} catch (\Throwable Se) {Sthis->logger-›warning('[' • Sthis-›getDispLayName() • '] Batch ' • SobjectType . ' sync failed','error' => Se->aetMessageo.return Ssvnchbiects:_sog599AaalTusageprivate function importCrm0bject(string $objectType, string SobjectId, mixed SobjectData, array &$sync0bjects)601zozl* Prepare associations for a single opportunity=605606* The return value is an array with the following structure.'companies' => [scompanucrmld = scompanuld.contacts' => [w' hac heon rectored Il Pollback Il Confiaure (todav 14-061A console [STAGING]do jiminny v034 A1 A34 M62 ^ -SELECT * FROM crm_configurations WHERE id = 555;SELECT * FROM Users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, аcтSELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN • (owner)' ELSE •• END) ASu.email,sa.*,t.owner_id FROM social_accounts saJOTN usens u on u.id = sa.sociable idiJOIN teams t 1..n<->1: on t.id = u.team_idVHERE u.team_id = 581 and sa.provider = 'salesforce';SELECT * FROM automated report results order by id descselect * from features:select * from team_features where feature id = 40:select * from teams where id = 556-select * from automated reports where id = 54: # 4fdd41f6-dcf0-30d0-b339-734weledrdeolailantamotoort results WHERE uuid to bin('822fa41b-afd3-43a9select * fromautomated report results order by 1d descGELECT * FROM automated report results WHERE id = 1919:ellect * from autcated renort results WHERE remort 1d = 541select * from onnortunities where 1d = 7594349:SELECT * FROM teamsWHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyinteselect * from nlavbooks where team 1d = 711: # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;RELECT * CROM eom Fiolde WHERE 1d = 224147•BELECT * EPOM eom field valuec WHEPE eom field id = 296147.SELECT * FROM crm_configurations WHERE id = 692:RELECTCONCAT(u.id, CASE WHEN v.id = t.owner id THEN ' (owner)' ELSE •• END) A!nomadlsa.*t.owner id FROM social accounts saJOTN users u on u.id = sa,sociable_ idIOTA toome + 1 necs1. on + ¿d = n +oom ¿dlVHERE u.team_id = 711 and sa.provider = 'salesforce':SELECT A FRON ena profiles ep JOll users U Lineail: on u.ad ep. user-36 m100% C47• Mon 20 Apr 15:48:39L AskJiminnyReportActivityServiceTestCascadeRetactor ConnectionCRM Initial Sync Over+0 ..syncProfiles() (HubSpot or Salesforce) calls ProfileRepository::update0rCreateProfile(...) and a new Crm\Profile row ismnsented, Froreteobserver•pupetz-to les promttecreated •LventserviceProv1der.oho: 139-14z subscribes two listeners:• ListenersCrm SyncProt1leopportunities (SyncProt1leopportun1t1es.pno:42-103) - applies to Mubspot, salestorce, Bullnorn, copperPipedrive, Zoho. For each new profile it:1. Dispatches SyncProfileMetadata (see below).Z. Ensures a Deal insiahts lavout exists (createDea@insightsLavouttDoesNotExist, lines 105-146 Via CrmOwnerResolver + buildLayout .3. Comoutes since= confjiqurationSettinasService-saetSvncPeriod(Scr-Confjauration).l4. Dispalches SyncopportunitiesJob with Strategy LAST MODIFIED BY PROFILE SYNC OPPORTUNITY STRATEGY, elther as a single lob or, when reaud recSLidinohindorSearch is true (Salesforce larae tenants). chooned into rollina <7-dav windows via TimePerioditerator)•Listeners\crm\SyncProtileLeads (SyncrrotlleLeads.pnp:32-/9) - 40no-only, dispatches Syncleads . Muospot salestorce do notrun aper-orofile lead sunc here•SyncProtileretadata (Syncrrot1lemetadaca. php: 39-113) - runs per promile/user: crmservice=>syncProtilerields(), and for providersimolementina SvncCrmProfileRecordTvnesInterface (Salesforce) it also calls svncProfileRecordTvnes()End-to-end flow summary• HubSnot• Team creation - no CRM svnc.• Owner connects HubSpot OAuth (SocialAccountConnected ) → no automatic data import (HubSpot's onActivityProviderIntegrated is ano-op; BootstrapIntegrationApp only fires for Integration.app providers). Initial metadata is typically triggered via CrmAccountReconnected → ImportMetadata crm:sync-team-metadata which in turn runs syncOrganization importStages importBusinessProcesses • importRecordTypes syncProfiles syncFields•syncProfiles® creates Profile rows→ ProfileCreated SyncProfileOpportunities creates Deal Insights layout + dispatches SyncOpportunitiesJob with the profile-modified strategy) + SyncProfileMetadata (syncs that user's profile fields)salesforce•leam creation → only tne optional salestorce Account stamp in Updatesalestorceccount IT a linkea account existses/syncProtiles/syncFields Salestorce implementations in Service.php)eopportunities USes TimePeriodIterator Sliding window to avoia soeL limits) + SyncProfileMetadata which also runs syncProtileRecordTunes() because Salesforce imolements SvncGrnProf1leRecordTvnesInterface.Notable observations• HubSoot and Salesforce do not have a direct SocialAccountConnected → initial-svnc wire: the metadata imoort runs via the reconnectJonAnn → TeanTnitialSunclah)•The per-profile opportunity backiill is entirely driven by ProfileCreated, so new deal opportunity ingestion starts only after syncProfilesohas recolved CPM ownerclucers to.liminnv ucere•lihe opportunity sync uses sirateay LAST MODIETED BY PROFILE SYNC OPPORIUNY STIRATEGY andrespecis team=level aetSyncPerlod and reau4recSLidinoWindowSearch settingswhat obiects are sunced on team creation and orofile creationClaude Qnus 17 MediumA51-41 /19 charcllPo 4 spaces...
|
NULL
|
|
76584
|
1921
|
2
|
2026-04-24T08:10:18.391780+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-24/1777 /Users/lukas/.screenpipe/data/data/2026-04-24/1777018218391_m1.jpg...
|
Firefox
|
[JY-20543] AJ Reports > Tracking - Jira — Work
|
True
|
jiminny.atlassian.net/browse/JY-20543?search_id=f4 jiminny.atlassian.net/browse/JY-20543?search_id=f484c0ee-9edf-42e1-8cff-52c73f5b3a7e&referrer=quick-find...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
[JY-20543] AJ Reports > Tracking - Jira
JY-2048 [JY-20543] AJ Reports > Tracking - Jira
JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app
JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app
New Tab
New Tab
AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app
AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app
JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app
Jiminny
Jiminny
Userpilot | Nudge-created
Userpilot | Nudge-created
Summary - app in Jiminny SonarQube Cloud
Summary - app in Jiminny SonarQube Cloud
Pipelines - jiminny/app
Pipelines - jiminny/app
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
tracking
tracking
Create
Create
Rovo Ask Rovo
Ask Rovo
1 Notification
1 Notification
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New) Jiminny (New)
Jiminny (New)
/
Epic - Change parent
JY-19240
JY-19240
/
Story - Change work type
JY-20543
JY-20543
Copy link
AJ Reports > Tracking- Summary, edit
AJ Reports > Tracking
AJ Reports > Tracking
Add or create work related to this Story
Add or create work related to this Story
View app actions
View app actions
Collapse Description Description
Collapse Description
Collapse Description
Description
Edit Description, edit
We want to be able to track the usage of the
AJ
reports. We will use this to keep track of the adoption but also to use Userpilot tooltips to push users who are not using it to use it.
track each generated reports in
DD
- include company name and frequency
for AJ reports - track each generated report in UserPilot as an event on the user - track it only for the user who has created the report
for Exec reports - track each generated report - set the tracking for each user in the non-jiminny participants list
note: for UP you can see how we currently track events such as Logged-activity, Held-conference
Subtasks
Subtasks
Add subtask
Add subtask
Linked work items
Linked work items
Add linked work item
Add linked work item
Collapse Activity Activity
Collapse Activity
Collapse Activity
Activity...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Nudge-created","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Nudge-created","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Summary - app in Jiminny SonarQube Cloud","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summary - app in Jiminny SonarQube Cloud","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.016666668,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to:","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Top Bar","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Top Bar","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sidebar","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sidebar","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Main Content","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Main Content","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse sidebar [","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse sidebar [","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Switch sites or apps","depth":10,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch sites or apps","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to your Jira homepage","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"tracking","depth":11,"value":"tracking","help_text":"","placeholder":"Search","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"tracking","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Rovo Ask Rovo","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Rovo","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"1 Notification","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1 Notification","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Help","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Help","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Settings","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"lukas.kovalik@jiminny.com","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lukas.kovalik@jiminny.com","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"For you","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"For you","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Recent","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Recent","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Starred","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Starred","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Apps","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Apps","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Apps","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Apps","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Spaces","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Spaces","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create space","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create space","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for spaces","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for spaces","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recent","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New)","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Jiminny (New)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXMenuButton","text":"Create board","depth":18,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Create board","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Jiminny (New)","depth":18,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Jiminny (New)","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Platform Team","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Team","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SE Kanban","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SE Kanban","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Capture Team","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Capture Team","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise Stability Issues 🤕","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise Stability Issues 🤕","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Processing Team","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Processing Team","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Service-Desk","depth":17,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Service-Desk","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Service-Desk","depth":18,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Service-Desk","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More spaces","depth":17,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More spaces","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Filters","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Filters","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Filters","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Filters","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dashboards","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dashboards","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create dashboard","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create dashboard","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Dashboards","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Dashboards","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Operations","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Operations","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Operations","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Operations","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Confluence , (opens new window)","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Confluence","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", (opens new window)","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Teams , (opens new window)","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", (opens new window)","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"open menu","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"open menu","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Customise sidebar","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Customise sidebar","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resize side navigation panel","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Spaces","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Spaces","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New) Jiminny (New)","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Epic - Change parent","depth":15,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"JY-19240","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-19240","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Story - Change work type","depth":15,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"JY-20543","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20543","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy link","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AJ Reports > Tracking- Summary, edit","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"AJ Reports > Tracking","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add or create work related to this Story","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add or create work related to this Story","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"View app actions","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"View app actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Collapse Description Description","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Description","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse Description","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Description","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit Description, edit","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"We want to be able to track the usage of the","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"reports. We will use this to keep track of the adoption but also to use Userpilot tooltips to push users who are not using it to use it.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"track each generated reports in","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DD","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"- include company name and frequency","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for AJ reports - track each generated report in UserPilot as an event on the user - track it only for the user who has created the report","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for Exec reports - track each generated report - set the tracking for each user in the non-jiminny participants list","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"note: for UP you can see how we currently track events such as Logged-activity, Held-conference","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Subtasks","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Subtasks","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add subtask","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add subtask","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Linked work items","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Linked work items","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add linked work item","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add linked work item","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Collapse Activity Activity","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Activity","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse Activity","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8939399042967568893
|
1662212697172441327
|
click
|
accessibility
|
NULL
|
[JY-20543] AJ Reports > Tracking - Jira
JY-2048 [JY-20543] AJ Reports > Tracking - Jira
JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app
JY-20489 | Optimize Nudges - Phase 2 by yalokin-jiminny · Pull Request #11997 · jiminny/app
New Tab
New Tab
AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app
AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app
JY-20157 add not enough activities notification by LakyLak · Pull Request #12011 · jiminny/app
Jiminny
Jiminny
Userpilot | Nudge-created
Userpilot | Nudge-created
Summary - app in Jiminny SonarQube Cloud
Summary - app in Jiminny SonarQube Cloud
Pipelines - jiminny/app
Pipelines - jiminny/app
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
tracking
tracking
Create
Create
Rovo Ask Rovo
Ask Rovo
1 Notification
1 Notification
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New) Jiminny (New)
Jiminny (New)
/
Epic - Change parent
JY-19240
JY-19240
/
Story - Change work type
JY-20543
JY-20543
Copy link
AJ Reports > Tracking- Summary, edit
AJ Reports > Tracking
AJ Reports > Tracking
Add or create work related to this Story
Add or create work related to this Story
View app actions
View app actions
Collapse Description Description
Collapse Description
Collapse Description
Description
Edit Description, edit
We want to be able to track the usage of the
AJ
reports. We will use this to keep track of the adoption but also to use Userpilot tooltips to push users who are not using it to use it.
track each generated reports in
DD
- include company name and frequency
for AJ reports - track each generated report in UserPilot as an event on the user - track it only for the user who has created the report
for Exec reports - track each generated report - set the tracking for each user in the non-jiminny participants list
note: for UP you can see how we currently track events such as Logged-activity, Held-conference
Subtasks
Subtasks
Add subtask
Add subtask
Linked work items
Linked work items
Add linked work item
Add linked work item
Collapse Activity Activity
Collapse Activity
Collapse Activity
Activity...
|
76582
|
|
81904
|
NULL
|
0
|
2026-04-26T13:41:01.784285+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-26/1777 /Users/lukas/.screenpipe/data/data/2026-04-26/1777210861784_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
/Users/lukas/.screenpipe/data/data/2026-04-26/1777 /Users/lukas/.screenpipe/data/data/2026-04-26/1777210861784_m1.jpg...
|
iTerm2••ShellEditViewSessionScriptsProfilesWindowH iTerm2••ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1DEV (-zsh)0 882APP (-zsh)• *3-zshdrwxr-xr-x20rootwheel6404Aug2024Lrwxr-xr-x1rootwheel1 25 Apr 20:47 Macintosh HD -> /drwx-1 lukasstaff1638424 Apr 13:44Testdrwx-lukasstaff1638425 Apr 20:37 Workdrwxlukasstaff16384 25Apr 20:16screenpipelukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt && echo "0K" && rm /Volumes/screenpipe/test.txttouch: /Volumes/screenpipe/test.txt: Operation not permittedlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/total 96drwxr-xr-x6 rootwheel192 26 Apr 16:36 .drwxr-xr-x20 rootwheel6404 Auglrwxr-xr-x1 rootwheel1 25 Apr 20:47 Macintosh HD →> /drwx-1 lukasstaff16384 24 Apr 13:44 Testdrwx-1 lukasstaff16384 25 Apr 20:37 Workdrwx-1 lukasstaff16384 25 Apr 20:16screenpipelukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/ I grep screenpipedrwx-1 lukasstaff1638425 Apr 20:16 screenpipelukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/ I grep Testdrwx--1 lukas staff 16384 24 Apr 13:44 Testlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ mount | grep screenpipe//Adm1n@DXP4800PLUS-B5F._smb._tcp. local/screenpipe on /Volumes/screenpipe (smbfs, nodev, nosuid, mounted by lukas)lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ l1 screenpipetotal 0ls: screenpipe: Operation not permittedlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ 11 Testtotal 6660160drwxrwxrwx1 lukasstaff16384 11 Apr 15:53 #recycledrwx------1 lukasstaff16384 24 Apr 13:44drwxr-xr-x6 rootwheel192 26 Apr 16:36 ..-rwxrwxrwx@ 1 lukasstaff14340 26 Apr 16:33DS_Store-rwxrwxrwx1 lukasstaffdrwxrwxrwx® 1 lukasstaff0 28 Feb 09:08 1910229e6394bdc967d792141382106f .ug-tmp16384 30 Jan 12:37 Alfreddrwxrwxrwx® 1 lukasstaff16384 26 Apr 16:32 Alfred.alfredpreferencesdrwxrwxrwx1 lukasstaff16384 16 Oct2025 CODEdrwxrwxrwx1 lukasstaff16384 22 Nov 14:17 Computer Sciencedrwxrwxrwx1 lukasstaff16384 28 Jan 19:55 Gitaradrwxrwxrwx1 lukasstaff16384 16 Mar 10:32 Jazykydrwxrwxrwx1 lukasstaff16384 20 Apr 21:09 SyncDatadrwxrwxrwx1 lukasstaff16384 28 Jan 19:56 Skola-rwxrwxrwx1 lukasstaff1183495 16 Mar 06:53 location-history(1).json-rwxrwxrwx@ 1 lukasstaff1183495 16 Mar 06:43 location-history. jsondrwxrwxrwx1 lukasstaff-rwxrwxrwx1 lukasstaff16384 25 Apr 20:31 screenpipe1963108 14 Jun2008 start machine.wav-rwxrwxrwx® 1 lukasstaff34054696966 Mar 20:53 ubuntu-24.04.4-live-server-amd64.isolukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /olumes $100% C84screenpipe"Sun 26 Apr 16:41:01T81***5...
|
NULL
|
-8939227487115909932
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2••ShellEditViewSessionScriptsProfilesWindowH iTerm2••ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1DEV (-zsh)0 882APP (-zsh)• *3-zshdrwxr-xr-x20rootwheel6404Aug2024Lrwxr-xr-x1rootwheel1 25 Apr 20:47 Macintosh HD -> /drwx-1 lukasstaff1638424 Apr 13:44Testdrwx-lukasstaff1638425 Apr 20:37 Workdrwxlukasstaff16384 25Apr 20:16screenpipelukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt && echo "0K" && rm /Volumes/screenpipe/test.txttouch: /Volumes/screenpipe/test.txt: Operation not permittedlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/total 96drwxr-xr-x6 rootwheel192 26 Apr 16:36 .drwxr-xr-x20 rootwheel6404 Auglrwxr-xr-x1 rootwheel1 25 Apr 20:47 Macintosh HD →> /drwx-1 lukasstaff16384 24 Apr 13:44 Testdrwx-1 lukasstaff16384 25 Apr 20:37 Workdrwx-1 lukasstaff16384 25 Apr 20:16screenpipelukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/ I grep screenpipedrwx-1 lukasstaff1638425 Apr 20:16 screenpipelukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls -la /Volumes/ I grep Testdrwx--1 lukas staff 16384 24 Apr 13:44 Testlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ mount | grep screenpipe//Adm1n@DXP4800PLUS-B5F._smb._tcp. local/screenpipe on /Volumes/screenpipe (smbfs, nodev, nosuid, mounted by lukas)lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ l1 screenpipetotal 0ls: screenpipe: Operation not permittedlukas®Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ 11 Testtotal 6660160drwxrwxrwx1 lukasstaff16384 11 Apr 15:53 #recycledrwx------1 lukasstaff16384 24 Apr 13:44drwxr-xr-x6 rootwheel192 26 Apr 16:36 ..-rwxrwxrwx@ 1 lukasstaff14340 26 Apr 16:33DS_Store-rwxrwxrwx1 lukasstaffdrwxrwxrwx® 1 lukasstaff0 28 Feb 09:08 1910229e6394bdc967d792141382106f .ug-tmp16384 30 Jan 12:37 Alfreddrwxrwxrwx® 1 lukasstaff16384 26 Apr 16:32 Alfred.alfredpreferencesdrwxrwxrwx1 lukasstaff16384 16 Oct2025 CODEdrwxrwxrwx1 lukasstaff16384 22 Nov 14:17 Computer Sciencedrwxrwxrwx1 lukasstaff16384 28 Jan 19:55 Gitaradrwxrwxrwx1 lukasstaff16384 16 Mar 10:32 Jazykydrwxrwxrwx1 lukasstaff16384 20 Apr 21:09 SyncDatadrwxrwxrwx1 lukasstaff16384 28 Jan 19:56 Skola-rwxrwxrwx1 lukasstaff1183495 16 Mar 06:53 location-history(1).json-rwxrwxrwx@ 1 lukasstaff1183495 16 Mar 06:43 location-history. jsondrwxrwxrwx1 lukasstaff-rwxrwxrwx1 lukasstaff16384 25 Apr 20:31 screenpipe1963108 14 Jun2008 start machine.wav-rwxrwxrwx® 1 lukasstaff34054696966 Mar 20:53 ubuntu-24.04.4-live-server-amd64.isolukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /olumes $100% C84screenpipe"Sun 26 Apr 16:41:01T81***5...
|
NULL
|
|
24906
|
538
|
0
|
2026-04-15T12:36:25.761206+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776256585761_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
42615913020022/30toFeudal AgeMini-mapThe mini-map 42615913020022/30toFeudal AgeMini-mapThe mini-map shows the world at a smallerscale. Click the mini-map to go to thatlocation in the world.Town Center0/15Đ 3/5kovaliklnkas (Britons)Researching 19%Feudal Age2400/24005 Magnus Olafsson: 553/5532 Rajyapala: 553/5538 Almish Yiltawar: 552/5521 kovaliklukas: 549/5496 László I: 547/5474 Louis VI: 546/5467 Maximilian of Habsburg: 531/5313 Huascár: 507/507...
|
NULL
|
-8938845873685778608
|
NULL
|
click
|
ocr
|
NULL
|
42615913020022/30toFeudal AgeMini-mapThe mini-map 42615913020022/30toFeudal AgeMini-mapThe mini-map shows the world at a smallerscale. Click the mini-map to go to thatlocation in the world.Town Center0/15Đ 3/5kovaliklnkas (Britons)Researching 19%Feudal Age2400/24005 Magnus Olafsson: 553/5532 Rajyapala: 553/5538 Almish Yiltawar: 552/5521 kovaliklukas: 549/5496 László I: 547/5474 Louis VI: 546/5467 Maximilian of Habsburg: 531/5313 Huascár: 507/507...
|
NULL
|
|
36827
|
749
|
27
|
2026-04-16T11:03:05.552240+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776337385552_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.js v#11894 on JY-18909-automated-reports-ask-iminny kProject vT. Mockunuced benenden> D unit2022ApiGuardLogin.phpg lestcase.php•I venconso.editorcontigE.envE.env.circleci=.env.circleci-nightly=.env.local=.env.migrate=.env.nikilocal=.env.other= .env.production=.env.production-euE.env.qaE env.dailE env.rootE.env.staging=.gitattributes.gitignore=.php-cs-fixer.cachephp.php-cs-fixer.dist.phpphp.phpstorm.meta.php=.phpunit.result.cacheE.prettierignoreE windsurfrulesphp_Ide_helper.phppnpce neloermoces.onepnpalrsani composer.isonI composer.lockU dependency-checker.isonU dev.json= ids.txt= infection.json.distMIINSTALLmdM.INIEKNAL WE.HOOK S-1UPiiminny_storageM+ licenses.mdM Makefile# package-lock.ison= phostan.neon.dist=phostan-baseline.neor<> phpunit.xmlleraw_sql_query.sqlMIR-ADME molos sonar-project.properties= test.py<> Untitled Diagram.xmlus verur contio.isM-+ WEbnOOK HILIEKING_IMPLE> iih External Libraries=Scratches and Consolesv _ Database ConsolesLEU¿ console EUlL DEAL RISKS EUILDI EUIVite: Can't analyze // vite.config.js: codC ReportController.phpG TokenBuilder.phpC) TeamSetupController.php Xpip alione(©) SendReportJob.phpC) AutomatedReportsCommand.phpC AskJiminnyReportsController.phpC AutomatedReportsCommandTest.phpAulomaleakeporissendcommand.ongC Team.php© AutomatedReportsRepository.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpC CreateActivityLoggedEvent.php(©) UserPilotActivityListener.phpC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpC AutomatedReportResult.phpclass eaiseruoioncrouler excenos controutenououc tuncmon anreoram onkoouonnect, vsonresoonse194195196229->secstacuscodel code: usonkesponse:.HIIP_BAU_REQUESI):/** We keep all IntegrationAop providers as "intearation-qop" in the SocialAccount */$crmProviderKey = Providers::qetTranslatedCrmProviderKeuSrealProviderKey):** @var ?SocialAccount SsocialAccount *SsoclalAccount = suser->getSoc1aLAccount(scrmProviderKey)=1f (ssoc1aLAccount === null) 1sthis->Logger->error('LIntegrationApp) Unexpected error. Soclal account 1s missing.'. L"team_1d" → pceam->getla).'Lapp_provider = sreatrroviderkey.provider' => ScrmProviderKey,return responseo->ison(l'success' = false,'message' =>'Something went wrong. Social account is cannot be found.',->setstatuscode code: Jsonkesponse::HTTP_FATLED_DEPENDENCY):$socialAccount->setAttribute('state', SocialAccount::STATE_CONNECTED):SsocialAccount->saveO:$this->logger->info('[InteqrationAppl Social account is connected.'. 0'team_ id' => Steam->getido.'iapp provider' => SrealProviderKey.'provider'= $crmProviderKey,'state' => Soc1alAccount::STATE_CONNECTED,1):sch1s->eventu1spaucner->a1spaucntnew soclaLAccouncconnected(soclaLaccount)):return response->isondi'success' => true.'message'=> sprintforomidt os ts successrully connectedProviders::getinteqrationAppProviderLabel$realProviderKey->setstatuscodel code: Jsonkesponse: :HTTP_ACCEPTED)*oday 12:48,A4/2 лSupport Daily • in 57 mA]100% 145Thu 16 Apr 14:03:05AutomatedReportsCommandTest-= custom.log= laravel.l09L SF ([EMAIL]@nboard,vue≤ HS_local fiminny@localhostd console EU] ?& console (PROD]console SlAGiNG1007154015411522154315441154511546154715481549155015511554155515561558105715001561156215641565115661568156215/110/415731574157515761577157815791580Ix. Aulo vFlaycroundvliminnyISELECT * FROM playbooks WHERE id = 2033:026 49 421 ×3 У 102 ^select * from teams where created at > "2026-03-09'*SELECT * FROM crm_layouts WHERE crm_configuration_1d = 499: # 1065SELECT * FROM crm_layout_entitles WHERE crm_layout_1d = 16/8:seLect * trom opportunitles where team_1d = 5/5;ISELECT * FROM activities WHERE uuid to bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = vuid:select * from contacts cwhere c.crm confiquration id = 370 order by c.updated at desc:SELECT * FROM participants where activity_id = 38833541;SELECT * FROM participants where activity_1d = 39216301:SELECT * FROM activity_summary_Logs where activity_1d = 392163011SELECT * FROM aCtIVities WHERE UU1d_to_bin('c/d99fbe-1fb1-41f2-8f4d-52e2bf/0ele9) = vU1d; # 38833541, crm 4/8116564181SELECI * FRUM aCUIViCles wHERE UU1d_to_D1n( деoтт4а5-утаа-447а-aoс1-vасde4doosae = U01;# 59216501,crn 400150580select * trom crm_protiles where crm_contiguracion_1d = 51y and crm_provider_1d = 525/85080;select * trom opporcunttles where cri_conriguration_id = sty and crm_provider_1a = 410150124/47;select * from accounts where crm configuration id = 319 and crm provider id = 47150650569:select * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700'):# owner 13236 525785080# contact 1# contact 216779180 665587441856 - activity - Alex Howes [EMAIL] created 2026-01-2619247563 742723347700 - [EMAIL] 2026-03-24# company 4176135 47150650569# deal 7100953 410150124747ISELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,U.emall,sa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable_idJuin ceallsI.ns"l on c.10 = U.ceall 10WHERE U.team_id = 400 and sa.provider = 'hubspot":select * from features;select * from team_features where feature_1d = 40;select * from teats where id = 556; # owner: 18101, crm: 477seLect * trom crn_contiguraclons where 1d = 4771SELEL * Frum users wibke 10 =10101581 УISELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id1585Urelan t1084sa.x1585t.owner id FROM social accounts sa100015871588JOIN users u on U.id = sa.sociable idJOIN teams t1..n<->1: on t.1d = U.team_1dWHERE U.team_1d = 556 and sa.provider = "integration-app';158911=lilW Windsurt Teams15781113UTF-84 spaces...
|
NULL
|
-8938329638376594633
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.js v#11894 on JY-18909-automated-reports-ask-iminny kProject vT. Mockunuced benenden> D unit2022ApiGuardLogin.phpg lestcase.php•I venconso.editorcontigE.envE.env.circleci=.env.circleci-nightly=.env.local=.env.migrate=.env.nikilocal=.env.other= .env.production=.env.production-euE.env.qaE env.dailE env.rootE.env.staging=.gitattributes.gitignore=.php-cs-fixer.cachephp.php-cs-fixer.dist.phpphp.phpstorm.meta.php=.phpunit.result.cacheE.prettierignoreE windsurfrulesphp_Ide_helper.phppnpce neloermoces.onepnpalrsani composer.isonI composer.lockU dependency-checker.isonU dev.json= ids.txt= infection.json.distMIINSTALLmdM.INIEKNAL WE.HOOK S-1UPiiminny_storageM+ licenses.mdM Makefile# package-lock.ison= phostan.neon.dist=phostan-baseline.neor<> phpunit.xmlleraw_sql_query.sqlMIR-ADME molos sonar-project.properties= test.py<> Untitled Diagram.xmlus verur contio.isM-+ WEbnOOK HILIEKING_IMPLE> iih External Libraries=Scratches and Consolesv _ Database ConsolesLEU¿ console EUlL DEAL RISKS EUILDI EUIVite: Can't analyze // vite.config.js: codC ReportController.phpG TokenBuilder.phpC) TeamSetupController.php Xpip alione(©) SendReportJob.phpC) AutomatedReportsCommand.phpC AskJiminnyReportsController.phpC AutomatedReportsCommandTest.phpAulomaleakeporissendcommand.ongC Team.php© AutomatedReportsRepository.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpC CreateActivityLoggedEvent.php(©) UserPilotActivityListener.phpC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpC AutomatedReportResult.phpclass eaiseruoioncrouler excenos controutenououc tuncmon anreoram onkoouonnect, vsonresoonse194195196229->secstacuscodel code: usonkesponse:.HIIP_BAU_REQUESI):/** We keep all IntegrationAop providers as "intearation-qop" in the SocialAccount */$crmProviderKey = Providers::qetTranslatedCrmProviderKeuSrealProviderKey):** @var ?SocialAccount SsocialAccount *SsoclalAccount = suser->getSoc1aLAccount(scrmProviderKey)=1f (ssoc1aLAccount === null) 1sthis->Logger->error('LIntegrationApp) Unexpected error. Soclal account 1s missing.'. L"team_1d" → pceam->getla).'Lapp_provider = sreatrroviderkey.provider' => ScrmProviderKey,return responseo->ison(l'success' = false,'message' =>'Something went wrong. Social account is cannot be found.',->setstatuscode code: Jsonkesponse::HTTP_FATLED_DEPENDENCY):$socialAccount->setAttribute('state', SocialAccount::STATE_CONNECTED):SsocialAccount->saveO:$this->logger->info('[InteqrationAppl Social account is connected.'. 0'team_ id' => Steam->getido.'iapp provider' => SrealProviderKey.'provider'= $crmProviderKey,'state' => Soc1alAccount::STATE_CONNECTED,1):sch1s->eventu1spaucner->a1spaucntnew soclaLAccouncconnected(soclaLaccount)):return response->isondi'success' => true.'message'=> sprintforomidt os ts successrully connectedProviders::getinteqrationAppProviderLabel$realProviderKey->setstatuscodel code: Jsonkesponse: :HTTP_ACCEPTED)*oday 12:48,A4/2 лSupport Daily • in 57 mA]100% 145Thu 16 Apr 14:03:05AutomatedReportsCommandTest-= custom.log= laravel.l09L SF ([EMAIL]@nboard,vue≤ HS_local fiminny@localhostd console EU] ?& console (PROD]console SlAGiNG1007154015411522154315441154511546154715481549155015511554155515561558105715001561156215641565115661568156215/110/415731574157515761577157815791580Ix. Aulo vFlaycroundvliminnyISELECT * FROM playbooks WHERE id = 2033:026 49 421 ×3 У 102 ^select * from teams where created at > "2026-03-09'*SELECT * FROM crm_layouts WHERE crm_configuration_1d = 499: # 1065SELECT * FROM crm_layout_entitles WHERE crm_layout_1d = 16/8:seLect * trom opportunitles where team_1d = 5/5;ISELECT * FROM activities WHERE uuid to bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = vuid:select * from contacts cwhere c.crm confiquration id = 370 order by c.updated at desc:SELECT * FROM participants where activity_id = 38833541;SELECT * FROM participants where activity_1d = 39216301:SELECT * FROM activity_summary_Logs where activity_1d = 392163011SELECT * FROM aCtIVities WHERE UU1d_to_bin('c/d99fbe-1fb1-41f2-8f4d-52e2bf/0ele9) = vU1d; # 38833541, crm 4/8116564181SELECI * FRUM aCUIViCles wHERE UU1d_to_D1n( деoтт4а5-утаа-447а-aoс1-vасde4doosae = U01;# 59216501,crn 400150580select * trom crm_protiles where crm_contiguracion_1d = 51y and crm_provider_1d = 525/85080;select * trom opporcunttles where cri_conriguration_id = sty and crm_provider_1a = 410150124/47;select * from accounts where crm configuration id = 319 and crm provider id = 47150650569:select * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700'):# owner 13236 525785080# contact 1# contact 216779180 665587441856 - activity - Alex Howes [EMAIL] created 2026-01-2619247563 742723347700 - [EMAIL] 2026-03-24# company 4176135 47150650569# deal 7100953 410150124747ISELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,U.emall,sa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable_idJuin ceallsI.ns"l on c.10 = U.ceall 10WHERE U.team_id = 400 and sa.provider = 'hubspot":select * from features;select * from team_features where feature_1d = 40;select * from teats where id = 556; # owner: 18101, crm: 477seLect * trom crn_contiguraclons where 1d = 4771SELEL * Frum users wibke 10 =10101581 УISELECTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id1585Urelan t1084sa.x1585t.owner id FROM social accounts sa100015871588JOIN users u on U.id = sa.sociable idJOIN teams t1..n<->1: on t.1d = U.team_1dWHERE U.team_1d = 556 and sa.provider = "integration-app';158911=lilW Windsurt Teams15781113UTF-84 spaces...
|
36823
|
|
63503
|
1379
|
5
|
2026-04-21T09:12:33.475332+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776762753475_m1.jpg...
|
PhpStorm
|
History for Selection
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Previous Difference
Next Difference
Jump to Source Previous Difference
Next Difference
Jump to Source
Side-by-side viewer
Do not ignore
Highlight words
Collapse Unchanged Fragments
Synchronize Scrolling
Settings
Help
1 difference
Revision 91233e0cebed2d6935097d821eea048ac863a64c
Revision 91233e0cebed2d6935097d821eea048ac863a64c
text/html
text/html
text/html
$activity->save();
// Trigger lead converted event for updating scheduled activities etc.
event(new LeadConverted($activity, $leadData));
} else {
$payload += [
'WhoId' => $activity->lead->crm_provider_id,
'WhatId' => null, // In case it was set on the remote record.
];
}
Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f
Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f
text/html
text/html
text/html
$activity->save();
event(new ActivityLeadConverted($activity, $leadData));
} else {
$payload += [
'WhoId' => $activity->lead->crm_provider_id,
'WhatId' => null, // In case it was set on the remote record.
];
}
27a70bd6
27a70bd6
27.01.26, 18:09
27.01.26, 18:09
Lukas Kovalik
Lukas Kovalik
JY-20026 support both activity lead converted and lead converted
JY-20026 support both activity lead converted and lead converted
Version
Date
Author
Commit Message
Loading revision 90e1e286… (368/1044)
Changes only
Commit Message:
JY-20026 support both activity lead converted and lead converted
text/html
text/html
text/html
History for Selection...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Previous Difference","depth":2,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Difference","depth":2,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Jump to Source","depth":2,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Side-by-side viewer","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Do not ignore","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Highlight words","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse Unchanged Fragments","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Synchronize Scrolling","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Settings","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Help","depth":2,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1 difference","depth":1,"role_description":"text"},{"role":"AXStaticText","text":"Revision 91233e0cebed2d6935097d821eea048ac863a64c","depth":1,"role_description":"text"},{"role":"AXTextField","text":"Revision 91233e0cebed2d6935097d821eea048ac863a64c","depth":2,"value":"Revision 91233e0cebed2d6935097d821eea048ac863a64c","help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"$activity->save();\n\n // Trigger lead converted event for updating scheduled activities etc.\n event(new LeadConverted($activity, $leadData));\n } else {\n $payload += [\n 'WhoId' => $activity->lead->crm_provider_id,\n 'WhatId' => null, // In case it was set on the remote record.\n ];\n }","depth":2,"value":"$activity->save();\n\n // Trigger lead converted event for updating scheduled activities etc.\n event(new LeadConverted($activity, $leadData));\n } else {\n $payload += [\n 'WhoId' => $activity->lead->crm_provider_id,\n 'WhatId' => null, // In case it was set on the remote record.\n ];\n }","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f","depth":1,"role_description":"text"},{"role":"AXTextField","text":"Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f","depth":2,"value":"Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f","help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"$activity->save();\n\n event(new ActivityLeadConverted($activity, $leadData));\n } else {\n $payload += [\n 'WhoId' => $activity->lead->crm_provider_id,\n 'WhatId' => null, // In case it was set on the remote record.\n ];\n }","depth":2,"value":"$activity->save();\n\n event(new ActivityLeadConverted($activity, $leadData));\n } else {\n $payload += [\n 'WhoId' => $activity->lead->crm_provider_id,\n 'WhatId' => null, // In case it was set on the remote record.\n ];\n }","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"27a70bd6","depth":4,"role_description":"cell"},{"role":"AXStaticText","text":"27a70bd6","depth":5,"role_description":"text"},{"role":"AXCell","text":"27.01.26, 18:09","depth":4,"role_description":"cell"},{"role":"AXStaticText","text":"27.01.26, 18:09","depth":5,"role_description":"text"},{"role":"AXCell","text":"Lukas Kovalik","depth":4,"help_text":"Lukas Kovalik <kovaliklukas@gmail.com>","role_description":"cell"},{"role":"AXStaticText","text":"Lukas Kovalik","depth":5,"help_text":"Lukas Kovalik <kovaliklukas@gmail.com>","role_description":"text"},{"role":"AXCell","text":"JY-20026 support both activity lead converted and lead converted","depth":4,"role_description":"cell"},{"role":"AXStaticText","text":"JY-20026 support both activity lead converted and lead converted","depth":5,"role_description":"text"},{"role":"AXStaticText","text":"Version","depth":2,"role_description":"text"},{"role":"AXStaticText","text":"Date","depth":2,"role_description":"text"},{"role":"AXStaticText","text":"Author","depth":2,"role_description":"text"},{"role":"AXStaticText","text":"Commit Message","depth":2,"role_description":"text"},{"role":"AXStaticText","text":"Loading revision 90e1e286… (368/1044)","depth":1,"role_description":"text"},{"role":"AXCheckBox","text":"Changes only","depth":1,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Commit Message:","depth":1,"role_description":"text"},{"role":"AXTextField","text":"JY-20026 support both activity lead converted and lead converted","depth":2,"value":"JY-20026 support both activity lead converted and lead converted","help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":3,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"History for Selection","depth":1,"role_description":"text"}]...
|
-8937692951615229406
|
3870231841503632221
|
click
|
accessibility
|
NULL
|
Previous Difference
Next Difference
Jump to Source Previous Difference
Next Difference
Jump to Source
Side-by-side viewer
Do not ignore
Highlight words
Collapse Unchanged Fragments
Synchronize Scrolling
Settings
Help
1 difference
Revision 91233e0cebed2d6935097d821eea048ac863a64c
Revision 91233e0cebed2d6935097d821eea048ac863a64c
text/html
text/html
text/html
$activity->save();
// Trigger lead converted event for updating scheduled activities etc.
event(new LeadConverted($activity, $leadData));
} else {
$payload += [
'WhoId' => $activity->lead->crm_provider_id,
'WhatId' => null, // In case it was set on the remote record.
];
}
Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f
Revision 27a70bd647cd4a8b8b981b19e0e4b54418781e2f
text/html
text/html
text/html
$activity->save();
event(new ActivityLeadConverted($activity, $leadData));
} else {
$payload += [
'WhoId' => $activity->lead->crm_provider_id,
'WhatId' => null, // In case it was set on the remote record.
];
}
27a70bd6
27a70bd6
27.01.26, 18:09
27.01.26, 18:09
Lukas Kovalik
Lukas Kovalik
JY-20026 support both activity lead converted and lead converted
JY-20026 support both activity lead converted and lead converted
Version
Date
Author
Commit Message
Loading revision 90e1e286… (368/1044)
Changes only
Commit Message:
JY-20026 support both activity lead converted and lead converted
text/html
text/html
text/html
History for Selection...
|
NULL
|
|
23255
|
502
|
50
|
2026-04-15T11:18:05.916188+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776251885916_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditEDHomeDMsActivityFilesLater..•More+V +SlackFileEditEDHomeDMsActivityFilesLater..•More+ViewGoHistoryWindowHelp→CSearch Jiminny IncJiminny ...sos+# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesStoyan TanevVesGalya DimitrovaAneliya Angelova, ...Vasil Vasilev XSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...#: AppsJira CloudToast# releases8 226 0• Messages@ Files3 Bookmarks+07832f2e - JY-204/9• Iranscript downloadPDF optimizeToday~adfb58d3 - JY-20479: Adjust table stylings3bcf892f - JY-20479: Adjust table stylingscaa07f29 - Merge branch 'master' into JY-20479-optimize-transcript-pdf-download55f628c0 - JY-20479: Adjust table stylingsShow more( jiminny/app Added by GitHubCircleCl APP12:51 PMDeployment Successful!Project: appWhen:04/15/202609:51:25Tag:View JobGitHub APP1:53 PM2 new commits pushed to master by des-d0344ab16 - JY-20151: Enhance waveformdisplay with talk-to-listen ratio and stylingadjustments3c043232 - Merge pull request #11967from jiminny/JY-20151-add-talk-to-listen-to-the-waveformjiminny/app| Added by GitHubMessage #releasesAaNew(alolSupport Daily • in 42 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)FirefoxCP Isolated Web ContentclaudeNotion Helper (Renderer)FirefoxCP Isolated Web ContentClaude Helper (Renderer)iTerm2FirefoxCP Isolated Web ContentNotion Calendar Helper (GPU)FirefoxCP Isolated Web ContentMem...2,13 GB1,10 GB960,6 MB907,9 MB835,0 MB779,6 MB767,7 MB592,4 MB544,3 MB522,0 MB496,0 MB437,6 MB434,8 MB428,1 MB424,3 MB400,8 MB382,0 MB371,9 MB346,7 MB342,1 MB326,2 MB303,0 MB294,4 MB256,3 MB250,0 MB237,8 MB200,4 MB194,6 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 14:18:05CPUMemoryDiskThreads38232674842511262925232616252726221524132028156261327EnergyPorts61219 2441257321 20512419 446167253242126118124200123125127118176120723141252081 786122170126PID83696407429748014146644203084283701146738019367133548035831418633527643652430164817326548368985091011483583360519487856138265344829816,00 GB13,94 GB <2,02 GB3,07 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,54 GB2,96 GB5,89 GB...
|
NULL
|
-8937503420196427893
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditEDHomeDMsActivityFilesLater..•More+V +SlackFileEditEDHomeDMsActivityFilesLater..•More+ViewGoHistoryWindowHelp→CSearch Jiminny IncJiminny ...sos+# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesStoyan TanevVesGalya DimitrovaAneliya Angelova, ...Vasil Vasilev XSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...#: AppsJira CloudToast# releases8 226 0• Messages@ Files3 Bookmarks+07832f2e - JY-204/9• Iranscript downloadPDF optimizeToday~adfb58d3 - JY-20479: Adjust table stylings3bcf892f - JY-20479: Adjust table stylingscaa07f29 - Merge branch 'master' into JY-20479-optimize-transcript-pdf-download55f628c0 - JY-20479: Adjust table stylingsShow more( jiminny/app Added by GitHubCircleCl APP12:51 PMDeployment Successful!Project: appWhen:04/15/202609:51:25Tag:View JobGitHub APP1:53 PM2 new commits pushed to master by des-d0344ab16 - JY-20151: Enhance waveformdisplay with talk-to-listen ratio and stylingadjustments3c043232 - Merge pull request #11967from jiminny/JY-20151-add-talk-to-listen-to-the-waveformjiminny/app| Added by GitHubMessage #releasesAaNew(alolSupport Daily • in 42 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)FirefoxCP Isolated Web ContentclaudeNotion Helper (Renderer)FirefoxCP Isolated Web ContentClaude Helper (Renderer)iTerm2FirefoxCP Isolated Web ContentNotion Calendar Helper (GPU)FirefoxCP Isolated Web ContentMem...2,13 GB1,10 GB960,6 MB907,9 MB835,0 MB779,6 MB767,7 MB592,4 MB544,3 MB522,0 MB496,0 MB437,6 MB434,8 MB428,1 MB424,3 MB400,8 MB382,0 MB371,9 MB346,7 MB342,1 MB326,2 MB303,0 MB294,4 MB256,3 MB250,0 MB237,8 MB200,4 MB194,6 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 14:18:05CPUMemoryDiskThreads38232674842511262925232616252726221524132028156261327EnergyPorts61219 2441257321 20512419 446167253242126118124200123125127118176120723141252081 786122170126PID83696407429748014146644203084283701146738019367133548035831418633527643652430164817326548368985091011483583360519487856138265344829816,00 GB13,94 GB <2,02 GB3,07 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,54 GB2,96 GB5,89 GB...
|
NULL
|
|
14021
|
311
|
6
|
2026-04-14T13:09:44.185096+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776172184185_m2.jpg...
|
Firefox
|
Inbox (1,545) - lukas.kovalik@jiminny.com - Jiminn Inbox (1,545) - lukas.kovalik@jiminny.com - Jiminny Mail — Work...
|
True
|
mail.google.com/mail/u/0/#inbox
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
JY-18909 Add Ask Jiminny Report type in list by ni JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Inbox (1,545) - [EMAIL] - Jiminny Mail
JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
Issues - app in Jiminny SonarQube Cloud
Issues - app in Jiminny SonarQube Cloud
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
Console Home | Console Home | us-east-2
Console Home | Console Home | us-east-2
SecurityGroup | EC2 | us-east-2
SecurityGroup | EC2 | us-east-2
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app
SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app
Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet
Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet
Jiminny
Jiminny
Service-Desk - Queues - Platform team - Service space - Jira
Service-Desk - Queues - Platform team - Service space - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
New Tab
New Tab
CloudWatch | us-east-2...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.00234375,"top":0.045138888,"width":0.022265624,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.024609376,"top":0.045138888,"width":0.022265624,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.046875,"top":0.045138888,"width":0.022265624,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox (1,545) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.06914063,"top":0.045138888,"width":0.022265624,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.08263889,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.09236111,"width":0.20234375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Issues - app in Jiminny SonarQube Cloud","depth":4,"bounds":{"left":0.0,"top":0.11111111,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues - app in Jiminny SonarQube Cloud","depth":5,"bounds":{"left":0.015625,"top":0.12083333,"width":0.083984375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.13958333,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.015625,"top":0.14930555,"width":0.11796875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16805555,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.17777778,"width":0.18710938,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Configure SSH access to multiple environment - Engineering - Confluence","depth":4,"bounds":{"left":0.0,"top":0.19652778,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure SSH access to multiple environment - Engineering - Confluence","depth":5,"bounds":{"left":0.015625,"top":0.20625,"width":0.1515625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Console Home | Console Home | us-east-2","depth":4,"bounds":{"left":0.0,"top":0.225,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Console Home | Console Home | us-east-2","depth":5,"bounds":{"left":0.015625,"top":0.23472223,"width":0.08671875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SecurityGroup | EC2 | us-east-2","depth":4,"bounds":{"left":0.0,"top":0.2534722,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SecurityGroup | EC2 | us-east-2","depth":5,"bounds":{"left":0.015625,"top":0.26319444,"width":0.06484375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.28194445,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.29166666,"width":0.18710938,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.31041667,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.3201389,"width":0.23476562,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet","depth":4,"bounds":{"left":0.0,"top":0.33888888,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet","depth":5,"bounds":{"left":0.015625,"top":0.34861112,"width":0.1984375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.3673611,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.015625,"top":0.37708333,"width":0.015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Service-Desk - Queues - Platform team - Service space - Jira","depth":4,"bounds":{"left":0.0,"top":0.39583334,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Service-Desk - Queues - Platform team - Service space - Jira","depth":5,"bounds":{"left":0.015625,"top":0.40555555,"width":0.12617187,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42430556,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.4340278,"width":0.18710938,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Configure SSH access to multiple environment - Engineering - Confluence","depth":4,"bounds":{"left":0.0,"top":0.45277777,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure SSH access to multiple environment - Engineering - Confluence","depth":5,"bounds":{"left":0.015625,"top":0.4625,"width":0.1515625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.48125,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.015625,"top":0.49097222,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.0,"top":0.50972223,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-8937397896238669482
|
1663043912200087758
|
visual_change
|
accessibility
|
NULL
|
JY-18909 Add Ask Jiminny Report type in list by ni JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Inbox (1,545) - [EMAIL] - Jiminny Mail
JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
JY-18909 Add Ask Jiminny Report type in list by nikolay-yankov · Pull Request #11894 · jiminny/app
Issues - app in Jiminny SonarQube Cloud
Issues - app in Jiminny SonarQube Cloud
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
Console Home | Console Home | us-east-2
Console Home | Console Home | us-east-2
SecurityGroup | EC2 | us-east-2
SecurityGroup | EC2 | us-east-2
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app
SRD-6779 | JY-20632 | Unable to log in to Sidekick with SSO by yalokin-jiminny · Pull Request #11935 · jiminny/app
Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet
Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet
Jiminny
Jiminny
Service-Desk - Queues - Platform team - Service space - Jira
Service-Desk - Queues - Platform team - Service space - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
New Tab
New Tab
CloudWatch | us-east-2...
|
NULL
|
|
58098
|
1247
|
58
|
2026-04-20T12:23:17.195978+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776687797195_m2.jpg...
|
PhpStorm
|
PhpStorm
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormFV faVsco.jsProletey>D Coaching• m Conf PhostormFV faVsco.jsProletey>D Coaching• m Conferences> D Planhatv D UserPilot© CreateHeldActivityEvent.php© ConferenceListener.phpc) cnded.pnpc) Lockea.pnpC) MatchMeeuingownerevent.onp© ParticipantDeclinedRecordingListener.phpc) started.onga ConnectionsD CrmFollowinaProviders© DialerMetricsimportedActivityListener.php@ FlasticSearchMetricsRemoveActivitvListener.oh© GenerateExportTokens.phpP ImportRemoteTrackListener.php(C) PlanhatActivitvListener.ohoC ReindexForAccountListener.oho@ RoindeyForContactl ictener nhn(c) ReindexForGroupListener.pnpWo kelndexrorLedeListener.ongVo kelneexrorveeonunilyListener.ono© kelndexroruserListener.onpkesolverrovider.onpsetupintegrationAction.onp© UserPilotActivityListener.php> 0 Authenticationcalendars0h CrmBootstrapintegrationApp.phoc ImportActivitvivpes.phoC) ImportMetadata.ohpC)LavoutModitiedListener.ohoC) LavoutUodatedListener.ohnCRematchActivitv@[EMAIL](C) RemoteCrmRecordDeletedListener.ohoC) [EMAIL]) [EMAIL]@ SyncProfileLeads.php•SvncProfile@nnortunities.nhnDealPicks1M GlasticSearch100% C47• Mon 20 Apr 15:23:17L AskJiminnyReportActivityServiceTest v+0.= custom.log=laravel.logA SF (jiminny@localhost]4 HS_local jiminny@localhost]« console (PROD] XCascadeAskJlminnykeponscontroller.onpA console (EU]© SyncProfileOpportunities.php X|569C) RequestGenerateReportJob.phpC) AutomatedReportResult.pho(c) AutomatedReport.phoclass SvncProfilelpportunities imolements ShouldOueuepublic function handle(ProfileCreated Sevent): voidConfiquration:: PROVIDER COPPER.Iy 569102Configuration::PROVIDER_PIPEDRIVE,IntegrationAppProviders::Z0H0_CRM,574Sthis->logger->info('Syncing opportunities for the newly created profile', [ 57€'profile' => $crmId,578→ sreanlo,$this->iobDispatcher->dispatch(new SyncProfileMetadata(Sprofile->qetUserO)):sth1s->createbealIns1qhtsLayoutltboesnottx1stscrmcont1qurat1on)ssince = sth1s->contiqurationsettingsserv1ce->qetsyncPer10dscrmuontiqurat1onif (! Sthis->confiqurationSettingsService->requiresSlidingWindowSearch($crmCcsthns->n00u1soatcher->ospatchlnew SvncipportunitiesJobdScrmConfiquration->aetIdO.591crm profile id' => Scrmid.'since' => Ssince.1593rategy: OpportunitySyncStrategyResolver::LAST_MODIFIED_BY_PROFILI595598} else {599$this->timePeriodIterator->generateUnTillNowForMaxSevenDays(60€stantDate. Ssince.onPeriod: function (Carbon $start, Carbon Send) use (ScrmConfiguratic601604605607private function createDealInsightsLayoutIfDoesNotExist(Configuration $crmConfiguratiA console [STAGING)Refactor Connection CNew Cascade0р 0do jiminny vvnc that haopens at the moment when the Team is created. Also what baout orofile creation. Reviwe the code for both034 A1 A34 M62 M VSELEC * FROM crm profiles WHERE crm confiquration 1d = 555SELECT * FROM crm_configurations WHERE id = 555;SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182SELECTCONCAT(u.id, CASE WHEN v.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,U.elllasl,sa.*t.owner_id FROM social_accounts saJOIN users u on u.id = sa.sociable_idJOIN teams t 1.n<->1: on t.id = u.team_idVHERE u.team_id = 581 and sa.provider = 'salesforce';EGLSCT * SP0M autoited report results order by id descselect * from team features where feature id = 40:select * from teams where id = 556:select * from automated reports where id = 54: # 4fdd41f6-dcf0-30d0-b339-7345381b6044 . ["odf" "podcasSELECT * FROM automated report results WHERE uuid to bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuilselect * from automated renort results order oy 1d desc:SELECT * FROM automated report results WHERE id = 1919:select * from automated_report_results WHERE repont 1d = 54;select * from onnortunities where 1d = 7594349:SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL] * from playbooks where team_id = 711; # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;EELSCT * CO0M eom fiolde WHERE 1d = 224147•EELECT * EP0M eom field values WHERE eom fiold id = 224147-SELECT * FROM crm_ configurations WHERE id = 692'EELSCTICONCAT(u.id, CASE WHEN u.id = t.owner id THEN ' (owner)' ELSE '• END) AS user id.LШ Ш1 11 1u.emall,sa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1.n<->1: on t.id = u.team_idVHERE u.team_id = 711 and sa.provider = 'salesforce':SELECT * FROM crm profiles co JOIN users u 1..n<->1: on u.id = co.user id WHERE u.team_id = 711;Kat anuthina 19e At<> CodeClaude Qnus 4.7 Mediumac heon rectored Il Pollback Il Confiaure (todav 14-061WN Windsurf Toams 78.56UTF.8f 4 spaces...
|
NULL
|
-8936991629836427802
|
NULL
|
idle
|
ocr
|
NULL
|
PhostormFV faVsco.jsProletey>D Coaching• m Conf PhostormFV faVsco.jsProletey>D Coaching• m Conferences> D Planhatv D UserPilot© CreateHeldActivityEvent.php© ConferenceListener.phpc) cnded.pnpc) Lockea.pnpC) MatchMeeuingownerevent.onp© ParticipantDeclinedRecordingListener.phpc) started.onga ConnectionsD CrmFollowinaProviders© DialerMetricsimportedActivityListener.php@ FlasticSearchMetricsRemoveActivitvListener.oh© GenerateExportTokens.phpP ImportRemoteTrackListener.php(C) PlanhatActivitvListener.ohoC ReindexForAccountListener.oho@ RoindeyForContactl ictener nhn(c) ReindexForGroupListener.pnpWo kelndexrorLedeListener.ongVo kelneexrorveeonunilyListener.ono© kelndexroruserListener.onpkesolverrovider.onpsetupintegrationAction.onp© UserPilotActivityListener.php> 0 Authenticationcalendars0h CrmBootstrapintegrationApp.phoc ImportActivitvivpes.phoC) ImportMetadata.ohpC)LavoutModitiedListener.ohoC) LavoutUodatedListener.ohnCRematchActivitv@[EMAIL](C) RemoteCrmRecordDeletedListener.ohoC) [EMAIL]) [EMAIL]@ SyncProfileLeads.php•SvncProfile@nnortunities.nhnDealPicks1M GlasticSearch100% C47• Mon 20 Apr 15:23:17L AskJiminnyReportActivityServiceTest v+0.= custom.log=laravel.logA SF (jiminny@localhost]4 HS_local jiminny@localhost]« console (PROD] XCascadeAskJlminnykeponscontroller.onpA console (EU]© SyncProfileOpportunities.php X|569C) RequestGenerateReportJob.phpC) AutomatedReportResult.pho(c) AutomatedReport.phoclass SvncProfilelpportunities imolements ShouldOueuepublic function handle(ProfileCreated Sevent): voidConfiquration:: PROVIDER COPPER.Iy 569102Configuration::PROVIDER_PIPEDRIVE,IntegrationAppProviders::Z0H0_CRM,574Sthis->logger->info('Syncing opportunities for the newly created profile', [ 57€'profile' => $crmId,578→ sreanlo,$this->iobDispatcher->dispatch(new SyncProfileMetadata(Sprofile->qetUserO)):sth1s->createbealIns1qhtsLayoutltboesnottx1stscrmcont1qurat1on)ssince = sth1s->contiqurationsettingsserv1ce->qetsyncPer10dscrmuontiqurat1onif (! Sthis->confiqurationSettingsService->requiresSlidingWindowSearch($crmCcsthns->n00u1soatcher->ospatchlnew SvncipportunitiesJobdScrmConfiquration->aetIdO.591crm profile id' => Scrmid.'since' => Ssince.1593rategy: OpportunitySyncStrategyResolver::LAST_MODIFIED_BY_PROFILI595598} else {599$this->timePeriodIterator->generateUnTillNowForMaxSevenDays(60€stantDate. Ssince.onPeriod: function (Carbon $start, Carbon Send) use (ScrmConfiguratic601604605607private function createDealInsightsLayoutIfDoesNotExist(Configuration $crmConfiguratiA console [STAGING)Refactor Connection CNew Cascade0р 0do jiminny vvnc that haopens at the moment when the Team is created. Also what baout orofile creation. Reviwe the code for both034 A1 A34 M62 M VSELEC * FROM crm profiles WHERE crm confiquration 1d = 555SELECT * FROM crm_configurations WHERE id = 555;SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182SELECTCONCAT(u.id, CASE WHEN v.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,U.elllasl,sa.*t.owner_id FROM social_accounts saJOIN users u on u.id = sa.sociable_idJOIN teams t 1.n<->1: on t.id = u.team_idVHERE u.team_id = 581 and sa.provider = 'salesforce';EGLSCT * SP0M autoited report results order by id descselect * from team features where feature id = 40:select * from teams where id = 556:select * from automated reports where id = 54: # 4fdd41f6-dcf0-30d0-b339-7345381b6044 . ["odf" "podcasSELECT * FROM automated report results WHERE uuid to bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuilselect * from automated renort results order oy 1d desc:SELECT * FROM automated report results WHERE id = 1919:select * from automated_report_results WHERE repont 1d = 54;select * from onnortunities where 1d = 7594349:SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL] * from playbooks where team_id = 711; # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;EELSCT * CO0M eom fiolde WHERE 1d = 224147•EELECT * EP0M eom field values WHERE eom fiold id = 224147-SELECT * FROM crm_ configurations WHERE id = 692'EELSCTICONCAT(u.id, CASE WHEN u.id = t.owner id THEN ' (owner)' ELSE '• END) AS user id.LШ Ш1 11 1u.emall,sa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1.n<->1: on t.id = u.team_idVHERE u.team_id = 711 and sa.provider = 'salesforce':SELECT * FROM crm profiles co JOIN users u 1..n<->1: on u.id = co.user id WHERE u.team_id = 711;Kat anuthina 19e At<> CodeClaude Qnus 4.7 Mediumac heon rectored Il Pollback Il Confiaure (todav 14-061WN Windsurf Toams 78.56UTF.8f 4 spaces...
|
58094
|
|
24554
|
532
|
9
|
2026-04-15T12:26:45.100151+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776256005100_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Boosteroid-•0l0j Sprint Review • in 34 m• 0-zshDOC Boosteroid-•0l0j Sprint Review • in 34 m• 0-zshDOCKERO $1DEV (-zsh)182APP (-zsh)83ec2-user@ip-10-.. 884-zsh85-zsh861536336|244781accessibilitylAXStaticTextl1l-zshl0.48819443583488510.033333335071802110.02291666716337210.01777777820825581536335|24478laccessibility|AXStaticText|1|<x110.95486110448837310.032222222536802310.0388888902962208I0.[CREDIT_CARD]-zsh-100% C8 Wed 15 Apr 15:26:44181O 87* Unable to a...O x8-zshzsh: command not found: #31105|2026-04-15T12:22:33.375110+00:00|clipboardl ||||# What's in one day's folderls ~/.screenpipe/data/data/2026-04-15/ | head -40# Total size of jpg vs mp4find ~/.screenpipe/data -name "*.jpg" -exec du -c {} + 2>/dev/null | tail -1find ~/.screenpipe/data -name "*.mp4" -exec du -c {} + 2>/dev/null | tail -1# Sample filenames to understand naming patternls ~/.screenpipe/data/data/2026-04-15/ | head -20# One more query - sample ocr_text correctlysqlite3 ~/.screenpipe/db.sqliteSELECT o. frame_id, o.app_name, o.window_name, o. focused,substr(o.text, 1, 120) as text_previewFROM ocr_text oORDER BY o. frame_id DESCLIMIT 5;# And frames samplesqlite3 ~/.screenpipe/db.sqlite "SELECT id, timestamp, app_name, window_name, snapshot_path,capture_trigger, text_source, content_hashFROM framesORDER BY id DESCLIMIT 5;# And elements samplesqlite3 ~/.screenpipe/db.sqlite "SELECT id, frame_id, source, role, depth,substr(text,1,80) as text_preview,left_bound, top_bound, width_bound, height_boun...l31104|2026-04-15T12:22:33.374610+00:00|key|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]11|1131103|2026-04-15T12:22:32.539852+00:00|text|||||clear31102|2026-04-15T12:22:30.783272+00:00|click|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]192014791|AXTextArea| shell31101|2026-04-15T12:22:30.697760+00:00|click|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]19201479111lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
-8936085188294878964
|
NULL
|
click
|
ocr
|
NULL
|
Boosteroid-•0l0j Sprint Review • in 34 m• 0-zshDOC Boosteroid-•0l0j Sprint Review • in 34 m• 0-zshDOCKERO $1DEV (-zsh)182APP (-zsh)83ec2-user@ip-10-.. 884-zsh85-zsh861536336|244781accessibilitylAXStaticTextl1l-zshl0.48819443583488510.033333335071802110.02291666716337210.01777777820825581536335|24478laccessibility|AXStaticText|1|<x110.95486110448837310.032222222536802310.0388888902962208I0.[CREDIT_CARD]-zsh-100% C8 Wed 15 Apr 15:26:44181O 87* Unable to a...O x8-zshzsh: command not found: #31105|2026-04-15T12:22:33.375110+00:00|clipboardl ||||# What's in one day's folderls ~/.screenpipe/data/data/2026-04-15/ | head -40# Total size of jpg vs mp4find ~/.screenpipe/data -name "*.jpg" -exec du -c {} + 2>/dev/null | tail -1find ~/.screenpipe/data -name "*.mp4" -exec du -c {} + 2>/dev/null | tail -1# Sample filenames to understand naming patternls ~/.screenpipe/data/data/2026-04-15/ | head -20# One more query - sample ocr_text correctlysqlite3 ~/.screenpipe/db.sqliteSELECT o. frame_id, o.app_name, o.window_name, o. focused,substr(o.text, 1, 120) as text_previewFROM ocr_text oORDER BY o. frame_id DESCLIMIT 5;# And frames samplesqlite3 ~/.screenpipe/db.sqlite "SELECT id, timestamp, app_name, window_name, snapshot_path,capture_trigger, text_source, content_hashFROM framesORDER BY id DESCLIMIT 5;# And elements samplesqlite3 ~/.screenpipe/db.sqlite "SELECT id, frame_id, source, role, depth,substr(text,1,80) as text_preview,left_bound, top_bound, width_bound, height_boun...l31104|2026-04-15T12:22:33.374610+00:00|key|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]11|1131103|2026-04-15T12:22:32.539852+00:00|text|||||clear31102|2026-04-15T12:22:30.783272+00:00|click|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]192014791|AXTextArea| shell31101|2026-04-15T12:22:30.697760+00:00|click|Code|Getting started with Cla... - screenpipe [SSH: [IP_ADDRESS]]19201479111lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
24552
|
|
18638
|
395
|
92
|
2026-04-14T16:22:52.655714+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776183772655_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SteamVewFriendsSTOREGamesneloLIBRARYCOMMUNITYKOVAL SteamVewFriendsSTOREGamesneloLIBRARYCOMMUNITYKOVALIKLUKASkovaliklukasHomevamtesAge of Empires II: Definitive EditionG Green HellAGEEMPIRESLAST PLAYEDloudyX STOPslote raceDLCCLOUD STATUSUp to datecommunily nubPLAY TIME745 5 hoursACHIEVEMENTSrollils onotDiscussionsouldesSupportYou've played for 244 hoursWould you recommend this game to other players?Mavbe LaterFEATUREDACHIEVEMENISYouve unlockea 19/30/0%* Add a GameDLC RELEASE - FEBRUARY 17New DLC Available Now: TheLast ChieftainsManage DownloadsNAVBon VoyageFriends & Chat B...
|
NULL
|
-8936076745567981658
|
NULL
|
visual_change
|
ocr
|
NULL
|
SteamVewFriendsSTOREGamesneloLIBRARYCOMMUNITYKOVAL SteamVewFriendsSTOREGamesneloLIBRARYCOMMUNITYKOVALIKLUKASkovaliklukasHomevamtesAge of Empires II: Definitive EditionG Green HellAGEEMPIRESLAST PLAYEDloudyX STOPslote raceDLCCLOUD STATUSUp to datecommunily nubPLAY TIME745 5 hoursACHIEVEMENTSrollils onotDiscussionsouldesSupportYou've played for 244 hoursWould you recommend this game to other players?Mavbe LaterFEATUREDACHIEVEMENISYouve unlockea 19/30/0%* Add a GameDLC RELEASE - FEBRUARY 17New DLC Available Now: TheLast ChieftainsManage DownloadsNAVBon VoyageFriends & Chat B...
|
18637
|
|
33818
|
682
|
46
|
2026-04-16T08:08:21.455064+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776326901455_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SackFileEditViewDMsAchivityFilesMoreJiminny ...• D SackFileEditViewDMsAchivityFilesMoreJiminny ...• DirectoriesAb External connections Starred• iiminnv-x-integrati..© platform-inner-team# Channels# ai-chapter#: alertsac backend# capture-ticketsac contusion-cinid# curiosity lab# engineering# frontendi# general8 infosec_internal_all# infra-changes# infrastructure dev#: jbu-team-info# iiminnv-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# supportac tnank-vous#: the people of imi...0- Direct messages. Nikolay IvanovAneliva Angelova3 Vasil VasilevAneliya Angelova,o Stoyan TanevP. VesHistoryWindowHelpinteljiminny-x-integration-appShow results for: inteplatform-inner-teamIntegraton Account• Integraton Accountintegrations . Not in channe• Intercom Convert • AppIntercom Notifications • Appinfosec_internal_allinTosec tecn contros: Not in channelljiminny-integration-default-channel • Not in channelzoho_integration • Not in channelzoom-integration - Not in channeljiminny-academy-internal • Not in channelc-teamtailor-internal • Not in channelplanhat-integration • Not in channelsalesai-internal - Not in channel1 v Selectаз основно съм оправял в тоя ПР code style, и typehintsв следващий вече има лошикаLukas Kovalik 3:21 PMза stage се зачудих дали не е лошо да добавимVasil Vasilev 3:23 PMкое да добавим ?Lukas Kovalik 3:29 PMstage Kato crm syncable objectClearEnterapp/pull/11949Give feedbackYesterday ~Vasil Vasilev 5:56 PMЛукаш, приветутре ако имаш време, хвъоли моля те едно око на тоя PR: httos:/github.com/liminny/app/pu|/11879пoчиciвa ciaoy sile сіm ооекм, коипю мачваме в локаинаїа оaзапринципа на работа е: ако обект не е ъпдеитван о месеца, но го мачнем по меил, или телефон, прооваме да направимслин sink за а вилим сли всс оше сьшествува в ску-а.вмoveric iaeicmoa caos основнослед това ще пусна един піг, дето почиства и tasks / events, че и там имаме стари асоциации, дето от време на времепьoмятїMessage Vasil VasilevAaC< 40 ll O SupportDaily- in 3h52m 0 100%C2 & Thu 16 Apr 11:08:21IntegrationZoho CRM|TenantIShiji GroupDisconnectedDelete...
|
NULL
|
-8935540505314663978
|
NULL
|
visual_change
|
ocr
|
NULL
|
SackFileEditViewDMsAchivityFilesMoreJiminny ...• D SackFileEditViewDMsAchivityFilesMoreJiminny ...• DirectoriesAb External connections Starred• iiminnv-x-integrati..© platform-inner-team# Channels# ai-chapter#: alertsac backend# capture-ticketsac contusion-cinid# curiosity lab# engineering# frontendi# general8 infosec_internal_all# infra-changes# infrastructure dev#: jbu-team-info# iiminnv-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# supportac tnank-vous#: the people of imi...0- Direct messages. Nikolay IvanovAneliva Angelova3 Vasil VasilevAneliya Angelova,o Stoyan TanevP. VesHistoryWindowHelpinteljiminny-x-integration-appShow results for: inteplatform-inner-teamIntegraton Account• Integraton Accountintegrations . Not in channe• Intercom Convert • AppIntercom Notifications • Appinfosec_internal_allinTosec tecn contros: Not in channelljiminny-integration-default-channel • Not in channelzoho_integration • Not in channelzoom-integration - Not in channeljiminny-academy-internal • Not in channelc-teamtailor-internal • Not in channelplanhat-integration • Not in channelsalesai-internal - Not in channel1 v Selectаз основно съм оправял в тоя ПР code style, и typehintsв следващий вече има лошикаLukas Kovalik 3:21 PMза stage се зачудих дали не е лошо да добавимVasil Vasilev 3:23 PMкое да добавим ?Lukas Kovalik 3:29 PMstage Kato crm syncable objectClearEnterapp/pull/11949Give feedbackYesterday ~Vasil Vasilev 5:56 PMЛукаш, приветутре ако имаш време, хвъоли моля те едно око на тоя PR: httos:/github.com/liminny/app/pu|/11879пoчиciвa ciaoy sile сіm ооекм, коипю мачваме в локаинаїа оaзапринципа на работа е: ако обект не е ъпдеитван о месеца, но го мачнем по меил, или телефон, прооваме да направимслин sink за а вилим сли всс оше сьшествува в ску-а.вмoveric iaeicmoa caos основнослед това ще пусна един піг, дето почиства и tasks / events, че и там имаме стари асоциации, дето от време на времепьoмятїMessage Vasil VasilevAaC< 40 ll O SupportDaily- in 3h52m 0 100%C2 & Thu 16 Apr 11:08:21IntegrationZoho CRM|TenantIShiji GroupDisconnectedDelete...
|
NULL
|
|
50296
|
1075
|
22
|
2026-04-17T14:40:55.025126+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776436855025_m1.jpg...
|
PhpStorm
|
faVsco.js – Group.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20698-fix-SF-activity- Project: faVsco.js, menu
JY-20698-fix-SF-activity-types-on-new-playbook, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20698-fix-SF-activity-types-on-new-playbook, menu","depth":5,"help_text":"Git Branch: JY-20698-fix-SF-activity-types-on-new-playbook","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8935001712866996713
|
-8923567608528917628
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20698-fix-SF-activity- Project: faVsco.js, menu
JY-20698-fix-SF-activity-types-on-new-playbook, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
CodeFileEditSelectionViewGoRunTerminalWindowHelp‹$0Inh100% <478-zshDOCKER- ₴81UNION ALL SELECT'elements'UNION ALL SELECT "ui_events'UNION ALL SELECT 'ocr_text',DEV (docker)APP (-zsh)|COUNT(*)FROM elementsCOUNT(*) FROM ui_eventsCOUNT(*) FROM ocr_text;"*3-zsh-zsh• ₴5* Review screenp...frames150235elements 13279563ui_events160293ocr_text|39114lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ # 1. Measure NAS write speed (write 10MB test file, measure seconds)SPEED=SCdd if=/dev/urandom of="SNAS_MOUNT/.speed_test"bs=1m count=10 2>&1 | \grep-0 '[0-9.]* bytes/sec' | awk 'Éprint $1}'rm -f "SNAS_MOUNT/.speed_test"echo "NAS write speed: S(( SPEED / 1024 / 1024 )) MB/s"# 2. Get bytes/row for each table from dbstatBYTES_FRAMES=$(sqlite3 "SDB_SRC" "SELECT SUM(payload)/COUNT(*) FROM dbstat, frames WHERE dbstat.name='frames' ;")zsh: unknown file attribute: iNAS write speed: 0 MB/szsh:command not found:^CError: stepping, interrupted(9)Program interrupted.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ 1ltotal7525816drwxr-xr-xdrwx----rw-r--r--@-W-r--r--drwxr-xr-x-rw-r--r---rw-r--r---rw-r--r--drwxr-xr-x-rw-r--r---rw-r--r---rw-r--r---rw-r--r---rw-r--r---rw-r--r---rw-r--r---rwxr-xr-xlukas@Lukas-Kovaliks-MacBook-Pro-Jiminnylukas@Lukas-Kovaliks-MacBook-Pro-JiminnyLukas@Lukas-Kovaliks-MacBook-Pro-Jiminny• 286ec2-user@ip-10-...• [EMAIL] 17 Apr 17:40:54T*1• 88...
|
NULL
|
|
30684
|
623
|
40
|
2026-04-15T15:09:38.022759+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776265778022_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
1402185201694068231263142/200Imperial Age4*13*13*- 1402185201694068231263142/200Imperial Age4*13*13*--Light Cavalry Created--Warning: You are being attacked byPlayer 8 Almish Yiltawar!!!-Signal AlliesSend your allies a signal. They see a flashingX on the mini-map. Use this to alert yourfriends to resources, enemy bases, or whereyou need help.(Hotkey: Alt-F)1 kovaliklukas: 49802/49802E Magnus Olafsson: 40786/40706 8 IV8 Almish Yiltawar: 39224/39224ONRajyapala: 23275/23275NV6 Lhezl6 I: 12121/12124E Maximilian of Habsbung: 6531/6531 H IV3 HuascÁn: 5931/5231NV4 Lowig VI: 5782/5782...
|
NULL
|
-8934806959348334062
|
NULL
|
click
|
ocr
|
NULL
|
1402185201694068231263142/200Imperial Age4*13*13*- 1402185201694068231263142/200Imperial Age4*13*13*--Light Cavalry Created--Warning: You are being attacked byPlayer 8 Almish Yiltawar!!!-Signal AlliesSend your allies a signal. They see a flashingX on the mini-map. Use this to alert yourfriends to resources, enemy bases, or whereyou need help.(Hotkey: Alt-F)1 kovaliklukas: 49802/49802E Magnus Olafsson: 40786/40706 8 IV8 Almish Yiltawar: 39224/39224ONRajyapala: 23275/23275NV6 Lhezl6 I: 12121/12124E Maximilian of Habsbung: 6531/6531 H IV3 HuascÁn: 5931/5231NV4 Lowig VI: 5782/5782...
|
NULL
|
|
12930
|
279
|
34
|
2026-04-14T11:50:52.641967+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776167452641_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditFV faVsco.js vProject vProphetAiv PhpStormFileEditFV faVsco.js vProject vProphetAiv D Reports© AutomatedReportsCi© AutomatedReportsRe© AutomatedReportsS:© CreateMockAskJimir© DeleteReportComma© GenerateMarketingR© Team.php© Usage.phpIsack_leamsD TracksO TranscriptionO TwilioD UsersVocabularyDZoom© CoachingFeedbacksUpr© Command.phpcreateDatabaseusers.p© DatabaseTableCount.pr© DeleteOldAiCrmNotesC:© DeleteS3LeftoversComiViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on JY-18909-automated-reports-ask-jiminny© ReportController.php© SendReportJob.phpAutomatedReportsCommand.phpC AutomatedReportsSendCommand.php X© AddLayoutEntities.php©Team.phpAutomatedReportsRepository.php© AutomatedReportsService.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpCrealenctivityLoggeaevent.one© UserPilotActivityListener.php© ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.php© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsSendCommand extends CommandA1.x rxecure me consore coliiane* Qreturn intpublic function handle(): int$resultId = $this->option( key: 'result-id');if ($resultid !== null) {return $this->handleForceSend((int) $resultId);nreportkesuurs =uns->reoorcreros.corv-poercenerareororpentresuurs.orforeach ($reportResults as $reportResult) {/** @var AutomatedReportResult $reportResult */Local changesShelfLogConsole xLog XChanges 9 files= .env.local app© ActivityController.php app/Http/Controllers/API©AutomatedReportsSendCommand.php app/Console/Commands,c) minnvveouocommanc ono aoo consoe commanosphp logging.php config© PlaybackService.php app/Services© ReportController.php app/Http/Controllers/Webhook© SyncTolntercom.php app/Jobs/Teampip weo.ono roulesUnversioned Files 8 filesSide-by-side viewerDo not ignore8 b72153b7 app/Console/Commands/JiminnyDebugCommand.phpHighlight wordsX15 8declare(strict_types=1);namespace Jiminny\Console\Commands;use Illuminate\Console\Command;ccoss mnnuveovaconlane* opackage Jiminny console commanasclass JiminnyDebugCommand extends Commandprotected $signature = 'jiminny:debug';public function handle(): void$this->line('this is a debug tool'):exit(t);// View pull request (today 13:29)= custom.logconsole PRODE laravel.logA console (EU]A SF [jiminny@localhost]A console [STAGING] >A HS_local [iminny@localhost]557558SO1562563564565566567568 V569570Ix. AUTO VFlaycroundvSELECT r.* FROM automated_reports rjoin teams t on r.teamid = t.idWHERE r.frequency = 'daily'and r.status = 1AND t.status = 'activelAND (r.exRicesuat >= now() OR r.exeicesnat IS NULL);Sa jiminny v017 A15 X 13 Aselect * from automated_report_results where repontaig IN (18, 33);select * from activity_searches where id = 10932;select * from activity_search_filters where activity_search_id = 10932;select * from automated_reports order by id desc;select * from automated_report_results order by id desc;select * from automated_report_results where reRontaid IN (36);hiilSupport Daily • in 10 mAL AutomatedReportsCommandTest~100% C•Tue 14 Apr 14:50:52CascadeModify AutomatedRepparameters for @AutomatedReportsSendCommand.php as well and lets addIN sult t c as slets and i fo then then do nos foh eA houatsendpeport but calldire.p Senar eportiod tif vaiddvecioemisExplored 3 files and searched 3 queriesNow I have everything I need. I'll add an optional —-result-id argument to the command that bypasses shouldsendReport and dispatches directly if valid recipients exist.wAutomatedReportsSendCommand.php+38 -1Done. Here's what was added:--result-1d ootion on the signature — ovpasses the normal scheduled-time Tlow enurely.hand leForcesendd does.1. Finds AutomatedReportResult by ID - returns FAILURE with a log if not found2. Resolves valid recipients - returns FAILURE with a log if noneDispatches SendReportJo directv no shouldSendRenort checkusage instae tne docker contalner.D bashphp artisan automated-reports:send --result-id=<id>Ask anything (84L)+ <› CodeClaude Sonnet 4.66 differencescurrent versiondeclare(strict_types=1);namespace Jiminny\ConsoLe\Commands;use Carbon\Carbon;use Illuminate\Console\Command;use InvalidArgumentException;use saiunny Joos Autonaueckeoors oenokeoortral0o.use samuunny oos vopu soarcherintertaceruse Jilinny Models Accivicyuse salany mouecs AucomlaLeuneoor cnesucl.use Jiminny\Models\Team;use Jiminny\Services\Activity\CrmOwnerResolver;use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;* cLass lntaunesu cead* Opackage Jiminny\Console|Commands*/class JiminnyDebugCommand extends Commandpublic const string FREQUENCY_DAILY = 'daily';public const string FREQUENCY_WEEKLY = 'weekly'public const string FREQUENCY_MONTHLY = 'monthly';public const string FREQUENCY_QUARTERLY = 'quarterly':public const string FREQUENCY_ONE_OFF = 'one_off';protected $signature = 'liminny: debug';inale unidWinasun leams50:6UTF-8( 4 spaces...
|
NULL
|
-8934520614474338453
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditFV faVsco.js vProject vProphetAiv PhpStormFileEditFV faVsco.js vProject vProphetAiv D Reports© AutomatedReportsCi© AutomatedReportsRe© AutomatedReportsS:© CreateMockAskJimir© DeleteReportComma© GenerateMarketingR© Team.php© Usage.phpIsack_leamsD TracksO TranscriptionO TwilioD UsersVocabularyDZoom© CoachingFeedbacksUpr© Command.phpcreateDatabaseusers.p© DatabaseTableCount.pr© DeleteOldAiCrmNotesC:© DeleteS3LeftoversComiViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on JY-18909-automated-reports-ask-jiminny© ReportController.php© SendReportJob.phpAutomatedReportsCommand.phpC AutomatedReportsSendCommand.php X© AddLayoutEntities.php©Team.phpAutomatedReportsRepository.php© AutomatedReportsService.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpCrealenctivityLoggeaevent.one© UserPilotActivityListener.php© ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.php© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsSendCommand extends CommandA1.x rxecure me consore coliiane* Qreturn intpublic function handle(): int$resultId = $this->option( key: 'result-id');if ($resultid !== null) {return $this->handleForceSend((int) $resultId);nreportkesuurs =uns->reoorcreros.corv-poercenerareororpentresuurs.orforeach ($reportResults as $reportResult) {/** @var AutomatedReportResult $reportResult */Local changesShelfLogConsole xLog XChanges 9 files= .env.local app© ActivityController.php app/Http/Controllers/API©AutomatedReportsSendCommand.php app/Console/Commands,c) minnvveouocommanc ono aoo consoe commanosphp logging.php config© PlaybackService.php app/Services© ReportController.php app/Http/Controllers/Webhook© SyncTolntercom.php app/Jobs/Teampip weo.ono roulesUnversioned Files 8 filesSide-by-side viewerDo not ignore8 b72153b7 app/Console/Commands/JiminnyDebugCommand.phpHighlight wordsX15 8declare(strict_types=1);namespace Jiminny\Console\Commands;use Illuminate\Console\Command;ccoss mnnuveovaconlane* opackage Jiminny console commanasclass JiminnyDebugCommand extends Commandprotected $signature = 'jiminny:debug';public function handle(): void$this->line('this is a debug tool'):exit(t);// View pull request (today 13:29)= custom.logconsole PRODE laravel.logA console (EU]A SF [jiminny@localhost]A console [STAGING] >A HS_local [iminny@localhost]557558SO1562563564565566567568 V569570Ix. AUTO VFlaycroundvSELECT r.* FROM automated_reports rjoin teams t on r.teamid = t.idWHERE r.frequency = 'daily'and r.status = 1AND t.status = 'activelAND (r.exRicesuat >= now() OR r.exeicesnat IS NULL);Sa jiminny v017 A15 X 13 Aselect * from automated_report_results where repontaig IN (18, 33);select * from activity_searches where id = 10932;select * from activity_search_filters where activity_search_id = 10932;select * from automated_reports order by id desc;select * from automated_report_results order by id desc;select * from automated_report_results where reRontaid IN (36);hiilSupport Daily • in 10 mAL AutomatedReportsCommandTest~100% C•Tue 14 Apr 14:50:52CascadeModify AutomatedRepparameters for @AutomatedReportsSendCommand.php as well and lets addIN sult t c as slets and i fo then then do nos foh eA houatsendpeport but calldire.p Senar eportiod tif vaiddvecioemisExplored 3 files and searched 3 queriesNow I have everything I need. I'll add an optional —-result-id argument to the command that bypasses shouldsendReport and dispatches directly if valid recipients exist.wAutomatedReportsSendCommand.php+38 -1Done. Here's what was added:--result-1d ootion on the signature — ovpasses the normal scheduled-time Tlow enurely.hand leForcesendd does.1. Finds AutomatedReportResult by ID - returns FAILURE with a log if not found2. Resolves valid recipients - returns FAILURE with a log if noneDispatches SendReportJo directv no shouldSendRenort checkusage instae tne docker contalner.D bashphp artisan automated-reports:send --result-id=<id>Ask anything (84L)+ <› CodeClaude Sonnet 4.66 differencescurrent versiondeclare(strict_types=1);namespace Jiminny\ConsoLe\Commands;use Carbon\Carbon;use Illuminate\Console\Command;use InvalidArgumentException;use saiunny Joos Autonaueckeoors oenokeoortral0o.use samuunny oos vopu soarcherintertaceruse Jilinny Models Accivicyuse salany mouecs AucomlaLeuneoor cnesucl.use Jiminny\Models\Team;use Jiminny\Services\Activity\CrmOwnerResolver;use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;* cLass lntaunesu cead* Opackage Jiminny\Console|Commands*/class JiminnyDebugCommand extends Commandpublic const string FREQUENCY_DAILY = 'daily';public const string FREQUENCY_WEEKLY = 'weekly'public const string FREQUENCY_MONTHLY = 'monthly';public const string FREQUENCY_QUARTERLY = 'quarterly':public const string FREQUENCY_ONE_OFF = 'one_off';protected $signature = 'liminny: debug';inale unidWinasun leams50:6UTF-8( 4 spaces...
|
NULL
|
|
16939
|
369
|
41
|
2026-04-14T15:32:35.619782+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776180755619_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpED→CSearch Ji +SlackFileEditViewGoHistoryWindowHelpED→CSearch Jiminny IncHomeDMsActivityFilesLaterJiminny ...sos+# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Aneliya Angelova, ...86 0• MessagesAdd canvasпредполагTodayПДФ-а. Неправя?O Files+чямаме в шрифта на, рен какво да ги@Nikolay Yankov, някой от горните ли имашпредвид или трето? (edited)Nikolay Yankov 4:09 PMпоследния дето пратих..•Steliyan Georgiev 4:09 PMда, за него говоря и азNikolay Yankov 4:10 PMможе би да ги скипваме такива emojis* 1MoreDirect messagesAneliya Angelova, ...Vasil Vasilevда не пречат на процесването и отговораSteliyan GeorgievAdelina Petrova, Ili...P. Adelina Petrova% Galya DimitrovaRs Nikolay Nikolov "2Galya Dimitrova, Ni...2Galya Dimitrova, Ni...Steliyan Georgiev 4:10 PMне сьм много сигурен какLukas Kovalik 5:41 PMсега ще го добавя това за disable on expired,после може да се тества по сьщия начинкато генериране сьс сьщата командаH1Newi: AppsNikolay Yankov 6:14 PMпушнах фикса за delete да маха реда отраблицатаJira Cloud+ToastMessage Aneliya Angelova, Nikolay Yankov, Steli...Google Cale...+(lol14Activity MonitorAll ProcessesProcess NameBoosteroidFirefoxCP Isolated Web ContentWindowServerFirefoxFirefoxCP Isolated Web ContentFirefoxFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)Notion Calendar Helper (Renderer)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperSlack Helper (Renderer)FirefoxCP Isolated Web ContentNotion Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...2,00 GB1,18 GB987,3 MB903,7 MB782,2 MB768,5 MB745,9 MB734,4 MB636,9 MB599,6 MB591,9 MB547,1 MB541,6 MB532,1 MB486,1 MB483,1 MB475,3 MB437,7 MB417,7 MB383,0 MB379,3 MB378,8 MB372,8 MB337,6 MB335,6 MB321,1 MB278,9 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:32:35CPUMemoryDiskThreads382422813074242515112727163121232425242628242824232513EnergyPorts59312416 13894012770712212616 43617216822923919113233312012012312112312912312612512012372PID248351470040714664600358014500478484984226548248438019146732427370873114849623340701479150891133432824628931710951120232249278005091016,00 GB14,08 GB<1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,19 GB2,94 GB6,40 GB...
|
NULL
|
-8934399499991112118
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpED→CSearch Ji +SlackFileEditViewGoHistoryWindowHelpED→CSearch Jiminny IncHomeDMsActivityFilesLaterJiminny ...sos+# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Aneliya Angelova, ...86 0• MessagesAdd canvasпредполагTodayПДФ-а. Неправя?O Files+чямаме в шрифта на, рен какво да ги@Nikolay Yankov, някой от горните ли имашпредвид или трето? (edited)Nikolay Yankov 4:09 PMпоследния дето пратих..•Steliyan Georgiev 4:09 PMда, за него говоря и азNikolay Yankov 4:10 PMможе би да ги скипваме такива emojis* 1MoreDirect messagesAneliya Angelova, ...Vasil Vasilevда не пречат на процесването и отговораSteliyan GeorgievAdelina Petrova, Ili...P. Adelina Petrova% Galya DimitrovaRs Nikolay Nikolov "2Galya Dimitrova, Ni...2Galya Dimitrova, Ni...Steliyan Georgiev 4:10 PMне сьм много сигурен какLukas Kovalik 5:41 PMсега ще го добавя това за disable on expired,после може да се тества по сьщия начинкато генериране сьс сьщата командаH1Newi: AppsNikolay Yankov 6:14 PMпушнах фикса за delete да маха реда отраблицатаJira Cloud+ToastMessage Aneliya Angelova, Nikolay Yankov, Steli...Google Cale...+(lol14Activity MonitorAll ProcessesProcess NameBoosteroidFirefoxCP Isolated Web ContentWindowServerFirefoxFirefoxCP Isolated Web ContentFirefoxFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)Notion Calendar Helper (Renderer)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperSlack Helper (Renderer)FirefoxCP Isolated Web ContentNotion Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...2,00 GB1,18 GB987,3 MB903,7 MB782,2 MB768,5 MB745,9 MB734,4 MB636,9 MB599,6 MB591,9 MB547,1 MB541,6 MB532,1 MB486,1 MB483,1 MB475,3 MB437,7 MB417,7 MB383,0 MB379,3 MB378,8 MB372,8 MB337,6 MB335,6 MB321,1 MB278,9 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:32:35CPUMemoryDiskThreads382422813074242515112727163121232425242628242824232513EnergyPorts59312416 13894012770712212616 43617216822923919113233312012012312112312912312612512012372PID248351470040714664600358014500478484984226548248438019146732427370873114849623340701479150891133432824628931710951120232249278005091016,00 GB14,08 GB<1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,19 GB2,94 GB6,40 GB...
|
NULL
|
|
61377
|
1324
|
9
|
2026-04-21T06:52:59.598842+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776754379598_m1.jpg...
|
iTerm2
|
ec2-user@ip-10-30-159-186:~
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Tue Apr 21 09:09:33 on ttys012
Poetry Last login: Tue Apr 21 09:09:33 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
Warning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.
A newer release of "Amazon Linux" is available.
Version 2023.10.20260105:
Version 2023.10.20260120:
Version 2023.10.20260202:
Version 2023.10.20260216:
Version 2023.10.20260302:
Version 2023.10.20260325:
Version 2023.10.20260330:
Version 2023.11.20260406:
Version 2023.11.20260413:
Version 2023.8.20250707:
Version 2023.8.20250715:
Version 2023.8.20250721:
Version 2023.8.20250808:
Version 2023.8.20250818:
Version 2023.8.20250908:
Version 2023.8.20250915:
Version 2023.9.20250929:
Version 2023.9.20251014:
Version 2023.9.20251020:
Version 2023.9.20251027:
Version 2023.9.20251105:
Version 2023.9.20251110:
Version 2023.9.20251117:
Version 2023.9.20251208:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_
~~ \_#####\
~~ \###|
~~ \#/ ___ Amazon Linux 2023 (ECS Optimized)
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
For documentation, visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"
root@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync
[2026-04-21 06:39:44] production.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"crm:sync-team-metadata","memoryBeforeCommandInMb":116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"b3917ecb-2836-4f3a-a8b1-b9551e4c1890","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"encrypted"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"salesforce","crm_owner":16067,"team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {"provider":"Salesforce","team_name":"Les Mills","team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: Syncing organization... {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {"endpoint":"[URL_WITH_CREDENTIALS] ~]$
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
⌥⌘1
ec2-user@ip-10-30-159-186:~...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Tue Apr 21 09:09:33 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6\nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code. \nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \nWarning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.\n\nA newer release of \"Amazon Linux\" is available.\n Version 2023.10.20260105:\n Version 2023.10.20260120:\n Version 2023.10.20260202:\n Version 2023.10.20260216:\n Version 2023.10.20260302:\n Version 2023.10.20260325:\n Version 2023.10.20260330:\n Version 2023.11.20260406:\n Version 2023.11.20260413:\n Version 2023.8.20250707:\n Version 2023.8.20250715:\n Version 2023.8.20250721:\n Version 2023.8.20250808:\n Version 2023.8.20250818:\n Version 2023.8.20250908:\n Version 2023.8.20250915:\n Version 2023.9.20250929:\n Version 2023.9.20251014:\n Version 2023.9.20251020:\n Version 2023.9.20251027:\n Version 2023.9.20251105:\n Version 2023.9.20251110:\n Version 2023.9.20251117:\n Version 2023.9.20251208:\nRun \"/usr/bin/dnf check-release-update\" for full release and version update info\n , #_\n ~\\_ ####_\n ~~ \\_#####\\\n ~~ \\###|\n ~~ \\#/ ___ Amazon Linux 2023 (ECS Optimized)\n ~~ V~' '->\n ~~~ /\n ~~._. _/\n _/ _/\n _/m/'\n\nFor documentation, visit http://aws.amazon.com/documentation/ecs\nLast login: Tue Apr 21 06:33:23 2026 from 10.30.45.167\n[ec2-user@ip-10-30-159-186 ~]$ docker exec -it $(docker ps --format \"{{.ID}}\" --filter \"name=ecs-worker\" | head -1) /bin/bash -c \"cd /home/jiminny && bash\"\nroot@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync\n[2026-04-21 06:39:44] production.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"crm:sync-team-metadata\",\"memoryBeforeCommandInMb\":116.0,\"memoryPeakBeforeCommandInMb\":116.0} {\"correlation_id\":\"b3917ecb-2836-4f3a-a8b1-b9551e4c1890\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"encrypted\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"salesforce\",\"crm_owner\":16067,\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {\"provider\":\"Salesforce\",\"team_name\":\"Les Mills\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: Syncing organization... {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {\"endpoint\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox GET\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: [Salesforce] Request exception [404] The requested resource does not exist {\"url\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox\",\"data\":{\"headers\":{\"Authorization\":\"Bearer 00D90000000fUsz!AQEAQKRIt62MP5OBhF0_SPMdUfRNQaX22hSEy4wwlvkW0y7Y8vtMasenRvudh0QG9oI81aqNrLu.wGgkCiT09RHg0aQXiF_d\"}},\"response\":{\"GuzzleHttp\\\\Psr7\\\\Stream\":\"[{\\\"errorCode\\\":\\\"NOT_FOUND\\\",\\\"message\\\":\\\"The requested resource does not exist\\\"}]\"},\"fields\":[]} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: The requested resource does not exist {\"exception\":\"[object] (Jiminny\\\\Exceptions\\\\HttpNotFoundException(code: 404): The requested resource does not exist at /home/jiminny/app/Services/Crm/Salesforce/Client.php:573)\n[stacktrace]\n#0 /home/jiminny/app/Services/Crm/Salesforce/Client.php(408): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->request('GET', 'https://lesmill...', Array)\n#1 /home/jiminny/app/Services/Crm/Salesforce/Client.php(343): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->requestWithAutomaticReauthorize('GET', 'https://lesmill...', Array)\n#2 /home/jiminny/app/Services/Crm/Salesforce/ServiceTraits/RecordManipulationsTrait.php(58): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->get('https://lesmill...')\n#3 /home/jiminny/app/Services/Crm/Salesforce/Service.php(1602): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->getRecord('Organization', '00D90000000fUsz...', Array)\n#4 /home/jiminny/app/Jobs/Crm/SyncTeamMetadata.php(97): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->syncOrganization()\n#5 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata->handle(Object(Jiminny\\\\Services\\\\ResolveTeamCrmConnection), Object(Jiminny\\\\Repositories\\\\TeamRepository), Object(Illuminate\\\\Log\\\\LogManager))\n#6 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#7 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#8 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#9 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#10 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(129): Illuminate\\\\Container\\\\Container->call(Array)\n#11 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Bus\\\\Dispatcher->Illuminate\\\\Bus\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#12 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#13 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(133): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#14 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(136): Illuminate\\\\Bus\\\\Dispatcher->dispatchNow(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), false)\n#15 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Queue\\\\CallQueuedHandler->Illuminate\\\\Queue\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#16 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#17 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(129): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#18 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(70): Illuminate\\\\Queue\\\\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#19 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(102): Illuminate\\\\Queue\\\\CallQueuedHandler->call(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Array)\n#20 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(131): Illuminate\\\\Queue\\\\Jobs\\\\Job->fire()\n#21 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(111): Illuminate\\\\Queue\\\\SyncQueue->executeJob(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#22 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(246): Illuminate\\\\Queue\\\\SyncQueue->push(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#23 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(230): Illuminate\\\\Bus\\\\Dispatcher->pushCommandToQueue(Object(Illuminate\\\\Queue\\\\SyncQueue), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#24 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\\\\Bus\\\\Dispatcher->dispatchToQueue(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#25 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(477): Illuminate\\\\Bus\\\\Dispatcher->dispatchSync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), NULL)\n#26 /home/jiminny/app/Console/Commands/Command.php(102): dispatch_sync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#27 /home/jiminny/app/Console/Commands/Crm/SyncTeamMetadata.php(50): Jiminny\\\\Console\\\\Commands\\\\Command->dispatch(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#28 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata->handle()\n#29 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#30 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#31 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#32 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#33 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\\\Container\\\\Container->call(Array)\n#34 /home/jiminny/vendor/symfony/console/Command/Command.php(341): Illuminate\\\\Console\\\\Command->execute(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#35 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\\\Component\\\\Console\\\\Command\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#36 /home/jiminny/app/Console/Commands/Command.php(41): Illuminate\\\\Console\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#37 /home/jiminny/vendor/symfony/console/Application.php(1117): Jiminny\\\\Console\\\\Commands\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#38 /home/jiminny/vendor/symfony/console/Application.php(356): Symfony\\\\Component\\\\Console\\\\Application->doRunCommand(Object(Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata), Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#39 /home/jiminny/vendor/symfony/console/Application.php(195): Symfony\\\\Component\\\\Console\\\\Application->doRun(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#40 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(198): Symfony\\\\Component\\\\Console\\\\Application->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#41 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1235): Illuminate\\\\Foundation\\\\Console\\\\Kernel->handle(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#42 /home/jiminny/artisan(13): Illuminate\\\\Foundation\\\\Application->handleCommand(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput))\n#43 {main}\n\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n\nIn Client.php line 573:\n \n The requested resource does not exist \n \n\n[ec2-user@ip-10-30-159-186 ~]$","depth":4,"value":"Last login: Tue Apr 21 09:09:33 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6\nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code. \nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \nWarning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.\n\nA newer release of \"Amazon Linux\" is available.\n Version 2023.10.20260105:\n Version 2023.10.20260120:\n Version 2023.10.20260202:\n Version 2023.10.20260216:\n Version 2023.10.20260302:\n Version 2023.10.20260325:\n Version 2023.10.20260330:\n Version 2023.11.20260406:\n Version 2023.11.20260413:\n Version 2023.8.20250707:\n Version 2023.8.20250715:\n Version 2023.8.20250721:\n Version 2023.8.20250808:\n Version 2023.8.20250818:\n Version 2023.8.20250908:\n Version 2023.8.20250915:\n Version 2023.9.20250929:\n Version 2023.9.20251014:\n Version 2023.9.20251020:\n Version 2023.9.20251027:\n Version 2023.9.20251105:\n Version 2023.9.20251110:\n Version 2023.9.20251117:\n Version 2023.9.20251208:\nRun \"/usr/bin/dnf check-release-update\" for full release and version update info\n , #_\n ~\\_ ####_\n ~~ \\_#####\\\n ~~ \\###|\n ~~ \\#/ ___ Amazon Linux 2023 (ECS Optimized)\n ~~ V~' '->\n ~~~ /\n ~~._. _/\n _/ _/\n _/m/'\n\nFor documentation, visit http://aws.amazon.com/documentation/ecs\nLast login: Tue Apr 21 06:33:23 2026 from 10.30.45.167\n[ec2-user@ip-10-30-159-186 ~]$ docker exec -it $(docker ps --format \"{{.ID}}\" --filter \"name=ecs-worker\" | head -1) /bin/bash -c \"cd /home/jiminny && bash\"\nroot@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync\n[2026-04-21 06:39:44] production.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"crm:sync-team-metadata\",\"memoryBeforeCommandInMb\":116.0,\"memoryPeakBeforeCommandInMb\":116.0} {\"correlation_id\":\"b3917ecb-2836-4f3a-a8b1-b9551e4c1890\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"encrypted\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"salesforce\",\"crm_owner\":16067,\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {\"provider\":\"Salesforce\",\"team_name\":\"Les Mills\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: Syncing organization... {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {\"endpoint\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox GET\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: [Salesforce] Request exception [404] The requested resource does not exist {\"url\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox\",\"data\":{\"headers\":{\"Authorization\":\"Bearer 00D90000000fUsz!AQEAQKRIt62MP5OBhF0_SPMdUfRNQaX22hSEy4wwlvkW0y7Y8vtMasenRvudh0QG9oI81aqNrLu.wGgkCiT09RHg0aQXiF_d\"}},\"response\":{\"GuzzleHttp\\\\Psr7\\\\Stream\":\"[{\\\"errorCode\\\":\\\"NOT_FOUND\\\",\\\"message\\\":\\\"The requested resource does not exist\\\"}]\"},\"fields\":[]} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: The requested resource does not exist {\"exception\":\"[object] (Jiminny\\\\Exceptions\\\\HttpNotFoundException(code: 404): The requested resource does not exist at /home/jiminny/app/Services/Crm/Salesforce/Client.php:573)\n[stacktrace]\n#0 /home/jiminny/app/Services/Crm/Salesforce/Client.php(408): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->request('GET', 'https://lesmill...', Array)\n#1 /home/jiminny/app/Services/Crm/Salesforce/Client.php(343): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->requestWithAutomaticReauthorize('GET', 'https://lesmill...', Array)\n#2 /home/jiminny/app/Services/Crm/Salesforce/ServiceTraits/RecordManipulationsTrait.php(58): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->get('https://lesmill...')\n#3 /home/jiminny/app/Services/Crm/Salesforce/Service.php(1602): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->getRecord('Organization', '00D90000000fUsz...', Array)\n#4 /home/jiminny/app/Jobs/Crm/SyncTeamMetadata.php(97): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->syncOrganization()\n#5 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata->handle(Object(Jiminny\\\\Services\\\\ResolveTeamCrmConnection), Object(Jiminny\\\\Repositories\\\\TeamRepository), Object(Illuminate\\\\Log\\\\LogManager))\n#6 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#7 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#8 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#9 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#10 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(129): Illuminate\\\\Container\\\\Container->call(Array)\n#11 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Bus\\\\Dispatcher->Illuminate\\\\Bus\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#12 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#13 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(133): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#14 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(136): Illuminate\\\\Bus\\\\Dispatcher->dispatchNow(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), false)\n#15 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Queue\\\\CallQueuedHandler->Illuminate\\\\Queue\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#16 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#17 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(129): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#18 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(70): Illuminate\\\\Queue\\\\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#19 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(102): Illuminate\\\\Queue\\\\CallQueuedHandler->call(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Array)\n#20 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(131): Illuminate\\\\Queue\\\\Jobs\\\\Job->fire()\n#21 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(111): Illuminate\\\\Queue\\\\SyncQueue->executeJob(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#22 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(246): Illuminate\\\\Queue\\\\SyncQueue->push(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#23 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(230): Illuminate\\\\Bus\\\\Dispatcher->pushCommandToQueue(Object(Illuminate\\\\Queue\\\\SyncQueue), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#24 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\\\\Bus\\\\Dispatcher->dispatchToQueue(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#25 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(477): Illuminate\\\\Bus\\\\Dispatcher->dispatchSync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), NULL)\n#26 /home/jiminny/app/Console/Commands/Command.php(102): dispatch_sync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#27 /home/jiminny/app/Console/Commands/Crm/SyncTeamMetadata.php(50): Jiminny\\\\Console\\\\Commands\\\\Command->dispatch(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#28 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata->handle()\n#29 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#30 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#31 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#32 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#33 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\\\Container\\\\Container->call(Array)\n#34 /home/jiminny/vendor/symfony/console/Command/Command.php(341): Illuminate\\\\Console\\\\Command->execute(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#35 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\\\Component\\\\Console\\\\Command\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#36 /home/jiminny/app/Console/Commands/Command.php(41): Illuminate\\\\Console\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#37 /home/jiminny/vendor/symfony/console/Application.php(1117): Jiminny\\\\Console\\\\Commands\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#38 /home/jiminny/vendor/symfony/console/Application.php(356): Symfony\\\\Component\\\\Console\\\\Application->doRunCommand(Object(Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata), Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#39 /home/jiminny/vendor/symfony/console/Application.php(195): Symfony\\\\Component\\\\Console\\\\Application->doRun(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#40 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(198): Symfony\\\\Component\\\\Console\\\\Application->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#41 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1235): Illuminate\\\\Foundation\\\\Console\\\\Kernel->handle(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#42 /home/jiminny/artisan(13): Illuminate\\\\Foundation\\\\Application->handleCommand(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput))\n#43 {main}\n\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n\nIn Client.php line 573:\n \n The requested resource does not exist \n \n\n[ec2-user@ip-10-30-159-186 ~]$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Build full day activity summary from Screenpipe (node)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-159-186:~ (nc)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ec2-user@ip-10-30-159-186:~","depth":1,"role_description":"text"}]...
|
-8934304454485226437
|
4947246153183442425
|
click
|
accessibility
|
NULL
|
Last login: Tue Apr 21 09:09:33 on ttys012
Poetry Last login: Tue Apr 21 09:09:33 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
Warning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.
A newer release of "Amazon Linux" is available.
Version 2023.10.20260105:
Version 2023.10.20260120:
Version 2023.10.20260202:
Version 2023.10.20260216:
Version 2023.10.20260302:
Version 2023.10.20260325:
Version 2023.10.20260330:
Version 2023.11.20260406:
Version 2023.11.20260413:
Version 2023.8.20250707:
Version 2023.8.20250715:
Version 2023.8.20250721:
Version 2023.8.20250808:
Version 2023.8.20250818:
Version 2023.8.20250908:
Version 2023.8.20250915:
Version 2023.9.20250929:
Version 2023.9.20251014:
Version 2023.9.20251020:
Version 2023.9.20251027:
Version 2023.9.20251105:
Version 2023.9.20251110:
Version 2023.9.20251117:
Version 2023.9.20251208:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_
~~ \_#####\
~~ \###|
~~ \#/ ___ Amazon Linux 2023 (ECS Optimized)
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
For documentation, visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"
root@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync
[2026-04-21 06:39:44] production.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"crm:sync-team-metadata","memoryBeforeCommandInMb":116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"b3917ecb-2836-4f3a-a8b1-b9551e4c1890","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"encrypted"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"salesforce","crm_owner":16067,"team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {"provider":"Salesforce","team_name":"Les Mills","team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: Syncing organization... {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {"endpoint":"[URL_WITH_CREDENTIALS] ~]$
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
⌥⌘1
ec2-user@ip-10-30-159-186:~...
|
61375
|
|
61384
|
1324
|
12
|
2026-04-21T06:53:21.236459+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776754401236_m1.jpg...
|
iTerm2
|
ec2-user@ip-10-30-159-186:~
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Tue Apr 21 09:09:33 on ttys012
Poetry Last login: Tue Apr 21 09:09:33 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
Warning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.
A newer release of "Amazon Linux" is available.
Version 2023.10.20260105:
Version 2023.10.20260120:
Version 2023.10.20260202:
Version 2023.10.20260216:
Version 2023.10.20260302:
Version 2023.10.20260325:
Version 2023.10.20260330:
Version 2023.11.20260406:
Version 2023.11.20260413:
Version 2023.8.20250707:
Version 2023.8.20250715:
Version 2023.8.20250721:
Version 2023.8.20250808:
Version 2023.8.20250818:
Version 2023.8.20250908:
Version 2023.8.20250915:
Version 2023.9.20250929:
Version 2023.9.20251014:
Version 2023.9.20251020:
Version 2023.9.20251027:
Version 2023.9.20251105:
Version 2023.9.20251110:
Version 2023.9.20251117:
Version 2023.9.20251208:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_
~~ \_#####\
~~ \###|
~~ \#/ ___ Amazon Linux 2023 (ECS Optimized)
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
For documentation, visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"
root@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync
[2026-04-21 06:39:44] production.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"crm:sync-team-metadata","memoryBeforeCommandInMb":116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"b3917ecb-2836-4f3a-a8b1-b9551e4c1890","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"encrypted"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"salesforce","crm_owner":16067,"team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {"provider":"Salesforce","team_name":"Les Mills","team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: Syncing organization... {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {"endpoint":"[URL_WITH_CREDENTIALS] ~]$
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
⌥⌘1
ec2-user@ip-10-30-159-186:~...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Tue Apr 21 09:09:33 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6\nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code. \nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \nWarning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.\n\nA newer release of \"Amazon Linux\" is available.\n Version 2023.10.20260105:\n Version 2023.10.20260120:\n Version 2023.10.20260202:\n Version 2023.10.20260216:\n Version 2023.10.20260302:\n Version 2023.10.20260325:\n Version 2023.10.20260330:\n Version 2023.11.20260406:\n Version 2023.11.20260413:\n Version 2023.8.20250707:\n Version 2023.8.20250715:\n Version 2023.8.20250721:\n Version 2023.8.20250808:\n Version 2023.8.20250818:\n Version 2023.8.20250908:\n Version 2023.8.20250915:\n Version 2023.9.20250929:\n Version 2023.9.20251014:\n Version 2023.9.20251020:\n Version 2023.9.20251027:\n Version 2023.9.20251105:\n Version 2023.9.20251110:\n Version 2023.9.20251117:\n Version 2023.9.20251208:\nRun \"/usr/bin/dnf check-release-update\" for full release and version update info\n , #_\n ~\\_ ####_\n ~~ \\_#####\\\n ~~ \\###|\n ~~ \\#/ ___ Amazon Linux 2023 (ECS Optimized)\n ~~ V~' '->\n ~~~ /\n ~~._. _/\n _/ _/\n _/m/'\n\nFor documentation, visit http://aws.amazon.com/documentation/ecs\nLast login: Tue Apr 21 06:33:23 2026 from 10.30.45.167\n[ec2-user@ip-10-30-159-186 ~]$ docker exec -it $(docker ps --format \"{{.ID}}\" --filter \"name=ecs-worker\" | head -1) /bin/bash -c \"cd /home/jiminny && bash\"\nroot@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync\n[2026-04-21 06:39:44] production.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"crm:sync-team-metadata\",\"memoryBeforeCommandInMb\":116.0,\"memoryPeakBeforeCommandInMb\":116.0} {\"correlation_id\":\"b3917ecb-2836-4f3a-a8b1-b9551e4c1890\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"encrypted\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"salesforce\",\"crm_owner\":16067,\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {\"provider\":\"Salesforce\",\"team_name\":\"Les Mills\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: Syncing organization... {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {\"endpoint\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox GET\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: [Salesforce] Request exception [404] The requested resource does not exist {\"url\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox\",\"data\":{\"headers\":{\"Authorization\":\"Bearer 00D90000000fUsz!AQEAQKRIt62MP5OBhF0_SPMdUfRNQaX22hSEy4wwlvkW0y7Y8vtMasenRvudh0QG9oI81aqNrLu.wGgkCiT09RHg0aQXiF_d\"}},\"response\":{\"GuzzleHttp\\\\Psr7\\\\Stream\":\"[{\\\"errorCode\\\":\\\"NOT_FOUND\\\",\\\"message\\\":\\\"The requested resource does not exist\\\"}]\"},\"fields\":[]} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: The requested resource does not exist {\"exception\":\"[object] (Jiminny\\\\Exceptions\\\\HttpNotFoundException(code: 404): The requested resource does not exist at /home/jiminny/app/Services/Crm/Salesforce/Client.php:573)\n[stacktrace]\n#0 /home/jiminny/app/Services/Crm/Salesforce/Client.php(408): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->request('GET', 'https://lesmill...', Array)\n#1 /home/jiminny/app/Services/Crm/Salesforce/Client.php(343): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->requestWithAutomaticReauthorize('GET', 'https://lesmill...', Array)\n#2 /home/jiminny/app/Services/Crm/Salesforce/ServiceTraits/RecordManipulationsTrait.php(58): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->get('https://lesmill...')\n#3 /home/jiminny/app/Services/Crm/Salesforce/Service.php(1602): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->getRecord('Organization', '00D90000000fUsz...', Array)\n#4 /home/jiminny/app/Jobs/Crm/SyncTeamMetadata.php(97): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->syncOrganization()\n#5 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata->handle(Object(Jiminny\\\\Services\\\\ResolveTeamCrmConnection), Object(Jiminny\\\\Repositories\\\\TeamRepository), Object(Illuminate\\\\Log\\\\LogManager))\n#6 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#7 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#8 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#9 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#10 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(129): Illuminate\\\\Container\\\\Container->call(Array)\n#11 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Bus\\\\Dispatcher->Illuminate\\\\Bus\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#12 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#13 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(133): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#14 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(136): Illuminate\\\\Bus\\\\Dispatcher->dispatchNow(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), false)\n#15 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Queue\\\\CallQueuedHandler->Illuminate\\\\Queue\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#16 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#17 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(129): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#18 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(70): Illuminate\\\\Queue\\\\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#19 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(102): Illuminate\\\\Queue\\\\CallQueuedHandler->call(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Array)\n#20 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(131): Illuminate\\\\Queue\\\\Jobs\\\\Job->fire()\n#21 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(111): Illuminate\\\\Queue\\\\SyncQueue->executeJob(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#22 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(246): Illuminate\\\\Queue\\\\SyncQueue->push(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#23 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(230): Illuminate\\\\Bus\\\\Dispatcher->pushCommandToQueue(Object(Illuminate\\\\Queue\\\\SyncQueue), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#24 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\\\\Bus\\\\Dispatcher->dispatchToQueue(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#25 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(477): Illuminate\\\\Bus\\\\Dispatcher->dispatchSync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), NULL)\n#26 /home/jiminny/app/Console/Commands/Command.php(102): dispatch_sync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#27 /home/jiminny/app/Console/Commands/Crm/SyncTeamMetadata.php(50): Jiminny\\\\Console\\\\Commands\\\\Command->dispatch(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#28 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata->handle()\n#29 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#30 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#31 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#32 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#33 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\\\Container\\\\Container->call(Array)\n#34 /home/jiminny/vendor/symfony/console/Command/Command.php(341): Illuminate\\\\Console\\\\Command->execute(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#35 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\\\Component\\\\Console\\\\Command\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#36 /home/jiminny/app/Console/Commands/Command.php(41): Illuminate\\\\Console\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#37 /home/jiminny/vendor/symfony/console/Application.php(1117): Jiminny\\\\Console\\\\Commands\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#38 /home/jiminny/vendor/symfony/console/Application.php(356): Symfony\\\\Component\\\\Console\\\\Application->doRunCommand(Object(Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata), Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#39 /home/jiminny/vendor/symfony/console/Application.php(195): Symfony\\\\Component\\\\Console\\\\Application->doRun(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#40 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(198): Symfony\\\\Component\\\\Console\\\\Application->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#41 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1235): Illuminate\\\\Foundation\\\\Console\\\\Kernel->handle(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#42 /home/jiminny/artisan(13): Illuminate\\\\Foundation\\\\Application->handleCommand(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput))\n#43 {main}\n\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n\nIn Client.php line 573:\n \n The requested resource does not exist \n \n\n[ec2-user@ip-10-30-159-186 ~]$","depth":4,"value":"Last login: Tue Apr 21 09:09:33 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6\nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \n\nAn error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code. \nnc: missing hostname and port\nusage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-recv-anyif] [--apple-awdl-unres]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-boundif ifbound]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-cellular] [--apple-no-expensive]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-no-flowadv] [--apple-tcp-timeout conntimo]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tcp-adp-wtimo num_probes]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--setsockopt-later] [--apple-no-connectx]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-kao] [--apple-ext-bk-idle]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-netsvctype svc] [---apple-nowakefromsleep]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-notify-ack] [--apple-sockev]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [--apple-tos tos] [--apple-tos-cmsg]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-s source_ip_address] [-w timeout] [-X proxy_version]\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t [-x proxy_address[:port]] [hostname] [port[s]]\nConnection closed by UNKNOWN port 65535\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod\nEnter MFA code for arn:aws:iam::438740370364:mfa/lukas.kovalik@jiminny.com: \nWarning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.\n\nA newer release of \"Amazon Linux\" is available.\n Version 2023.10.20260105:\n Version 2023.10.20260120:\n Version 2023.10.20260202:\n Version 2023.10.20260216:\n Version 2023.10.20260302:\n Version 2023.10.20260325:\n Version 2023.10.20260330:\n Version 2023.11.20260406:\n Version 2023.11.20260413:\n Version 2023.8.20250707:\n Version 2023.8.20250715:\n Version 2023.8.20250721:\n Version 2023.8.20250808:\n Version 2023.8.20250818:\n Version 2023.8.20250908:\n Version 2023.8.20250915:\n Version 2023.9.20250929:\n Version 2023.9.20251014:\n Version 2023.9.20251020:\n Version 2023.9.20251027:\n Version 2023.9.20251105:\n Version 2023.9.20251110:\n Version 2023.9.20251117:\n Version 2023.9.20251208:\nRun \"/usr/bin/dnf check-release-update\" for full release and version update info\n , #_\n ~\\_ ####_\n ~~ \\_#####\\\n ~~ \\###|\n ~~ \\#/ ___ Amazon Linux 2023 (ECS Optimized)\n ~~ V~' '->\n ~~~ /\n ~~._. _/\n _/ _/\n _/m/'\n\nFor documentation, visit http://aws.amazon.com/documentation/ecs\nLast login: Tue Apr 21 06:33:23 2026 from 10.30.45.167\n[ec2-user@ip-10-30-159-186 ~]$ docker exec -it $(docker ps --format \"{{.ID}}\" --filter \"name=ecs-worker\" | head -1) /bin/bash -c \"cd /home/jiminny && bash\"\nroot@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync\n[2026-04-21 06:39:44] production.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"crm:sync-team-metadata\",\"memoryBeforeCommandInMb\":116.0,\"memoryPeakBeforeCommandInMb\":116.0} {\"correlation_id\":\"b3917ecb-2836-4f3a-a8b1-b9551e4c1890\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":45478,\"provider\":\"salesforce\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"encrypted\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {\"social_account_id\":45478} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"salesforce\",\"crm_owner\":16067,\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {\"provider\":\"Salesforce\",\"team_name\":\"Les Mills\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: Syncing organization... {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {\"endpoint\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox GET\",\"team_id\":711} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: [Salesforce] Request exception [404] The requested resource does not exist {\"url\":\"https://lesmills.my.salesforce.com/services/data/v50.0/sobjects/Organization/00D90000000fUszEAE?fields=InstanceName,OrganizationType,IsSandbox\",\"data\":{\"headers\":{\"Authorization\":\"Bearer 00D90000000fUsz!AQEAQKRIt62MP5OBhF0_SPMdUfRNQaX22hSEy4wwlvkW0y7Y8vtMasenRvudh0QG9oI81aqNrLu.wGgkCiT09RHg0aQXiF_d\"}},\"response\":{\"GuzzleHttp\\\\Psr7\\\\Stream\":\"[{\\\"errorCode\\\":\\\"NOT_FOUND\\\",\\\"message\\\":\\\"The requested resource does not exist\\\"}]\"},\"fields\":[]} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n[2026-04-21 06:39:44] production.ERROR: The requested resource does not exist {\"exception\":\"[object] (Jiminny\\\\Exceptions\\\\HttpNotFoundException(code: 404): The requested resource does not exist at /home/jiminny/app/Services/Crm/Salesforce/Client.php:573)\n[stacktrace]\n#0 /home/jiminny/app/Services/Crm/Salesforce/Client.php(408): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->request('GET', 'https://lesmill...', Array)\n#1 /home/jiminny/app/Services/Crm/Salesforce/Client.php(343): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->requestWithAutomaticReauthorize('GET', 'https://lesmill...', Array)\n#2 /home/jiminny/app/Services/Crm/Salesforce/ServiceTraits/RecordManipulationsTrait.php(58): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Client->get('https://lesmill...')\n#3 /home/jiminny/app/Services/Crm/Salesforce/Service.php(1602): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->getRecord('Organization', '00D90000000fUsz...', Array)\n#4 /home/jiminny/app/Jobs/Crm/SyncTeamMetadata.php(97): Jiminny\\\\Services\\\\Crm\\\\Salesforce\\\\Service->syncOrganization()\n#5 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata->handle(Object(Jiminny\\\\Services\\\\ResolveTeamCrmConnection), Object(Jiminny\\\\Repositories\\\\TeamRepository), Object(Illuminate\\\\Log\\\\LogManager))\n#6 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#7 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#8 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#9 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#10 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(129): Illuminate\\\\Container\\\\Container->call(Array)\n#11 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Bus\\\\Dispatcher->Illuminate\\\\Bus\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#12 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#13 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(133): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#14 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(136): Illuminate\\\\Bus\\\\Dispatcher->dispatchNow(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), false)\n#15 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\\\Queue\\\\CallQueuedHandler->Illuminate\\\\Queue\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#16 /home/jiminny/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\\\Pipeline\\\\Pipeline->Illuminate\\\\Pipeline\\\\{closure}(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#17 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(129): Illuminate\\\\Pipeline\\\\Pipeline->then(Object(Closure))\n#18 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(70): Illuminate\\\\Queue\\\\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#19 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(102): Illuminate\\\\Queue\\\\CallQueuedHandler->call(Object(Illuminate\\\\Queue\\\\Jobs\\\\SyncJob), Array)\n#20 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(131): Illuminate\\\\Queue\\\\Jobs\\\\Job->fire()\n#21 /home/jiminny/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php(111): Illuminate\\\\Queue\\\\SyncQueue->executeJob(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#22 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(246): Illuminate\\\\Queue\\\\SyncQueue->push(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), '', 'crm-sync')\n#23 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(230): Illuminate\\\\Bus\\\\Dispatcher->pushCommandToQueue(Object(Illuminate\\\\Queue\\\\SyncQueue), Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#24 /home/jiminny/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\\\\Bus\\\\Dispatcher->dispatchToQueue(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#25 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(477): Illuminate\\\\Bus\\\\Dispatcher->dispatchSync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata), NULL)\n#26 /home/jiminny/app/Console/Commands/Command.php(102): dispatch_sync(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#27 /home/jiminny/app/Console/Commands/Crm/SyncTeamMetadata.php(50): Jiminny\\\\Console\\\\Commands\\\\Command->dispatch(Object(Jiminny\\\\Jobs\\\\Crm\\\\SyncTeamMetadata))\n#28 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata->handle()\n#29 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\\\Container\\\\BoundMethod::Illuminate\\\\Container\\\\{closure}()\n#30 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(96): Illuminate\\\\Container\\\\Util::unwrapIfClosure(Object(Closure))\n#31 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\\\Container\\\\BoundMethod::callBoundMethod(Object(Illuminate\\\\Foundation\\\\Application), Array, Object(Closure))\n#32 /home/jiminny/vendor/laravel/framework/src/Illuminate/Container/Container.php(799): Illuminate\\\\Container\\\\BoundMethod::call(Object(Illuminate\\\\Foundation\\\\Application), Array, Array, NULL)\n#33 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\\\Container\\\\Container->call(Array)\n#34 /home/jiminny/vendor/symfony/console/Command/Command.php(341): Illuminate\\\\Console\\\\Command->execute(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#35 /home/jiminny/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\\\Component\\\\Console\\\\Command\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Illuminate\\\\Console\\\\OutputStyle))\n#36 /home/jiminny/app/Console/Commands/Command.php(41): Illuminate\\\\Console\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#37 /home/jiminny/vendor/symfony/console/Application.php(1117): Jiminny\\\\Console\\\\Commands\\\\Command->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#38 /home/jiminny/vendor/symfony/console/Application.php(356): Symfony\\\\Component\\\\Console\\\\Application->doRunCommand(Object(Jiminny\\\\Console\\\\Commands\\\\Crm\\\\SyncTeamMetadata), Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#39 /home/jiminny/vendor/symfony/console/Application.php(195): Symfony\\\\Component\\\\Console\\\\Application->doRun(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#40 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(198): Symfony\\\\Component\\\\Console\\\\Application->run(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#41 /home/jiminny/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1235): Illuminate\\\\Foundation\\\\Console\\\\Kernel->handle(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput), Object(Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput))\n#42 /home/jiminny/artisan(13): Illuminate\\\\Foundation\\\\Application->handleCommand(Object(Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput))\n#43 {main}\n\"} {\"correlation_id\":\"9f4cb09c-7717-4174-b568-a757006779fd\",\"trace_id\":\"67615309-0a8b-4eda-948f-1f885b9bdad4\"}\n\n\nIn Client.php line 573:\n \n The requested resource does not exist \n \n\n[ec2-user@ip-10-30-159-186 ~]$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Build full day activity summary from Screenpipe (node)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-159-186:~ (nc)","depth":2,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ec2-user@ip-10-30-159-186:~","depth":1,"role_description":"text"}]...
|
-8934304454485226437
|
4947246153183442425
|
click
|
accessibility
|
NULL
|
Last login: Tue Apr 21 09:09:33 on ttys012
Poetry Last login: Tue Apr 21 09:09:33 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (ValidationError) when calling the AssumeRole operation: 1 validation error detected: Value '824798648029' at 'tokenCode' failed to satisfy constraint: Member must have length less than or equal to 6
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
nc: missing hostname and port
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
Connection closed by UNKNOWN port 65535
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ vprod
Enter MFA code for arn:aws:iam::438740370364:mfa/[EMAIL]:
Warning: Permanently added 'jiminny-prod-ecs1' (ED25519) to the list of known hosts.
A newer release of "Amazon Linux" is available.
Version 2023.10.20260105:
Version 2023.10.20260120:
Version 2023.10.20260202:
Version 2023.10.20260216:
Version 2023.10.20260302:
Version 2023.10.20260325:
Version 2023.10.20260330:
Version 2023.11.20260406:
Version 2023.11.20260413:
Version 2023.8.20250707:
Version 2023.8.20250715:
Version 2023.8.20250721:
Version 2023.8.20250808:
Version 2023.8.20250818:
Version 2023.8.20250908:
Version 2023.8.20250915:
Version 2023.9.20250929:
Version 2023.9.20251014:
Version 2023.9.20251020:
Version 2023.9.20251027:
Version 2023.9.20251105:
Version 2023.9.20251110:
Version 2023.9.20251117:
Version 2023.9.20251208:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_
~~ \_#####\
~~ \###|
~~ \#/ ___ Amazon Linux 2023 (ECS Optimized)
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
For documentation, visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"
root@4703d23a3a38:/home/jiminny# php artisan crm:sync-team-metadata 711 --sync
[2026-04-21 06:39:44] production.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"crm:sync-team-metadata","memoryBeforeCommandInMb":116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"b3917ecb-2836-4f3a-a8b1-b9551e4c1890","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SocialAccountService] Token retrieved {"socialAccountId":45478,"provider":"salesforce"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"encrypted"} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Tokens not found in cache, decrypting {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting data key {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [EncryptedTokenManager] Decrypting tokens {"social_account_id":45478} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"salesforce","crm_owner":16067,"team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [SyncTeamMetadata] Begin syncing metadata {"provider":"Salesforce","team_name":"Les Mills","team_id":711} {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: Syncing organization... {"correlation_id":"9f4cb09c-7717-4174-b568-a757006779fd","trace_id":"67615309-0a8b-4eda-948f-1f885b9bdad4"}
[2026-04-21 06:39:44] production.INFO: [Salesforce] Sending request {"endpoint":"[URL_WITH_CREDENTIALS] ~]$
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
⌥⌘1
ec2-user@ip-10-30-159-186:~...
|
NULL
|
|
46948
|
987
|
7
|
2026-04-17T10:56:01.187623+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776423361187_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp‹ >0 l4l:Support Daily - in 1h 5 m100% <47APP (-zsh)X4-zshDOCKER• ₴1DEV (docker)• ₴2APP (-zsh)X3-zsh./public/vue-assets/assets/ondemand-DkNR1-pf.js:./public/vue-assets/assets/CrmLink-DKYsnHnx.js./public/vue-assets/assets/liquor-tree-COUefof4.js./public/vue-assets/assets/DealRiskList-BWvQyROv.js:./public/vue-assets/assets/AskAnything-BNRpAA8H.js:./public/vue-assets/assets/lib-CwM9toD2.js./public/vue-assets/assets/AppFormField-Cd83royC.js./public/vue-assets/assets/deal-view-BHTz2Ksy.js:./public/vue-assets/assets/exports-D1lmea40.js../public/vue-assets/assets/playlists-5wFR1ij2.js../public/vue-assets/assets/callScoringTemplates-zeRn40ul.js../public/vue-assets/assets/_copy0bject-USkOnlaQ.js../public/vue-assets/assets/pusher-znYCfz7U.js./public/vue-assets/assets/onboard-D1qld9L0.js./public/vue-assets/assets/StatusBadge-CbqQ5gnA.js./public/vue-assets/assets/kiosk-DSF1ebGq.js./public/vue-assets/assets/preload-helper-DCvhahzG.js../public/vue-assets/assets/deal-insights-LnukdLUQ.js../public/vue-assets/assets/ListView-Bcd0qibH.js:./public/vue-assets/assets/_plugin-vue_export-helper-DD3s5456.js./public/vue-assets/assets/WelcomeLayout-B6wd32HG.js../public/vue-assets/assets/dashboard-C4k4MPim.js:./public/vue-assets/assets/emoji-input-CSq87OVy.js../public/vue-assets/assets/AppButton-D3qMdODr.js../public/vue-assets/assets/sentry-BQx81U9A.js:./public/vue-assets/assets/OrgSettingsLayout-BQgZ11_y.js./public/vue-assets/assets/vuex.esm-bundler-DqfufJ2-.js./public/vue-assets/assets/playback-D_95E_To.js./public/vue-assets/assets/index.module-Bjlhgfdl.js./public/vue-assets/assets/intl-tel-input-BW4mv40Q.js../public/vue-assets/assets/team-insights-NuK2ryxe.js../public/vue-assets/assets/popper-CQwVcrX4.js../public/vue-assets/assets/PhoneField-CwCIoAYm.js./public/vue-assets/assets/live-C1SbBwo3.js../public/vue-assets/assets/video-js-skin.less_vue_type_style_index_0_src_true_lang-BN0485xV.js../public/vue-assets/assets/index-CAouXZsY.js:./public/vue-assets/assets/logged-in-layout-ehXyHVjH.js• ₴8526.88kB27.91kB30.75kB34.39kB39.50kB39.69kB41.91kB43.22kB47.84kB48.28kB55.13kB61.28kB62.98kB63.11kB64.66kB79.60kB82.59kB94.84kB115.71kB117.59 kB120.67kB128.71kB129.28 kB133.44kB164.28kB176.33kB180.40kB198.79kB218.14kB264.94 kВ298.57kB307.13kB343.99kB367.43kB689.63kB825.23 kB1,402.70 kB[plugin builtin:vite-reporter](!) Some chunks are larger than 500 kB after minification. Consider:- Using dynamic import() to code-split the application- Use build.rolldown0ptions.output.codeSplitting to improve chunking: [URL_WITH_CREDENTIALS] 88APP...
|
NULL
|
-8933992730840437920
|
NULL
|
click
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp‹ >0 l4l:Support Daily - in 1h 5 m100% <47APP (-zsh)X4-zshDOCKER• ₴1DEV (docker)• ₴2APP (-zsh)X3-zsh./public/vue-assets/assets/ondemand-DkNR1-pf.js:./public/vue-assets/assets/CrmLink-DKYsnHnx.js./public/vue-assets/assets/liquor-tree-COUefof4.js./public/vue-assets/assets/DealRiskList-BWvQyROv.js:./public/vue-assets/assets/AskAnything-BNRpAA8H.js:./public/vue-assets/assets/lib-CwM9toD2.js./public/vue-assets/assets/AppFormField-Cd83royC.js./public/vue-assets/assets/deal-view-BHTz2Ksy.js:./public/vue-assets/assets/exports-D1lmea40.js../public/vue-assets/assets/playlists-5wFR1ij2.js../public/vue-assets/assets/callScoringTemplates-zeRn40ul.js../public/vue-assets/assets/_copy0bject-USkOnlaQ.js../public/vue-assets/assets/pusher-znYCfz7U.js./public/vue-assets/assets/onboard-D1qld9L0.js./public/vue-assets/assets/StatusBadge-CbqQ5gnA.js./public/vue-assets/assets/kiosk-DSF1ebGq.js./public/vue-assets/assets/preload-helper-DCvhahzG.js../public/vue-assets/assets/deal-insights-LnukdLUQ.js../public/vue-assets/assets/ListView-Bcd0qibH.js:./public/vue-assets/assets/_plugin-vue_export-helper-DD3s5456.js./public/vue-assets/assets/WelcomeLayout-B6wd32HG.js../public/vue-assets/assets/dashboard-C4k4MPim.js:./public/vue-assets/assets/emoji-input-CSq87OVy.js../public/vue-assets/assets/AppButton-D3qMdODr.js../public/vue-assets/assets/sentry-BQx81U9A.js:./public/vue-assets/assets/OrgSettingsLayout-BQgZ11_y.js./public/vue-assets/assets/vuex.esm-bundler-DqfufJ2-.js./public/vue-assets/assets/playback-D_95E_To.js./public/vue-assets/assets/index.module-Bjlhgfdl.js./public/vue-assets/assets/intl-tel-input-BW4mv40Q.js../public/vue-assets/assets/team-insights-NuK2ryxe.js../public/vue-assets/assets/popper-CQwVcrX4.js../public/vue-assets/assets/PhoneField-CwCIoAYm.js./public/vue-assets/assets/live-C1SbBwo3.js../public/vue-assets/assets/video-js-skin.less_vue_type_style_index_0_src_true_lang-BN0485xV.js../public/vue-assets/assets/index-CAouXZsY.js:./public/vue-assets/assets/logged-in-layout-ehXyHVjH.js• ₴8526.88kB27.91kB30.75kB34.39kB39.50kB39.69kB41.91kB43.22kB47.84kB48.28kB55.13kB61.28kB62.98kB63.11kB64.66kB79.60kB82.59kB94.84kB115.71kB117.59 kB120.67kB128.71kB129.28 kB133.44kB164.28kB176.33kB180.40kB198.79kB218.14kB264.94 kВ298.57kB307.13kB343.99kB367.43kB689.63kB825.23 kB1,402.70 kB[plugin builtin:vite-reporter](!) Some chunks are larger than 500 kB after minification. Consider:- Using dynamic import() to code-split the application- Use build.rolldown0ptions.output.codeSplitting to improve chunking: [URL_WITH_CREDENTIALS] 88APP...
|
NULL
|
|
41024
|
873
|
47
|
2026-04-17T05:59:28.628035+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776405568628_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksProfilesToolsWi FirefoxFileEoitViewHistoryBookmarksProfilesToolsWindowHelp@ Not Securehttp://[IP_ADDRESS]:8767/frames_fts/~ Google Geminip! Western Digital Red Plus 3.5 6TB 5400rpm 256MB SAiGeminiPLUSSl I SeneticТвърд диск, Western Digital Red 6TB Plus ( 3.5". 256N* SQLite Web: db.sqlitew Screenpipe DashboardV Welcome to Steam• YoulubeHi LukásWhere should westart?New Tab+ New TabCreate image* Create musicBoost my dayHelp me learnWrite anythingCreate a videoSharper images, better text.Meet Nano Banana 2.Try itAsk Gemini+ °Pre vSummarize pagesqlite-web 0.7.2 db.sqlite frames_ftstable name….._sqlx_migrationsaudio_chunksaudio_tagsaudio_transcriptionsaudio_transcriptions_fts (v)audio_transcriptions_..audio_transcriptions_audio_transcriptions_.elementselements_fts (v)elements_fts_configelements_fts_dataelements_fts_idxframesframes_fts (v)frames_fts_configframes_fts_dataframes_fts_idxmeetingsmemoriesmemories_fts (v)memories_fts_configmemories_fts_datamemories_fts_idxocr_textpipe_executionspipe_scheduler_statesecretsspeaker_embeddingsspeakerssqlite_sequence1aosui_eventsui_events_fts (v)ui_events_fts_configui_events_fts_dataui_events_fts_idxvideo_chunksvision_tagsToggle helper tablesStructureContentQueryExportSQLCREATE VIRTUAL TABLE frames_fts USING fts5 (full_text,app_name,window_name,browser_url,id UNINDEXED,tokenize='unicode61'ColumnsColumnfull_textapp_namewindow_namebrowser_urlIndexesNameData typeColumnsSQLite database browser v0.7.2. powered by Flask and Peewee. © 2026 Charles LeiferlAllow nullUniqueMOA7 1%98 Fi1Ar 8:59:28QueryPrimarv keyActionsread-onlyread-onlyread-onlyread-onlyread-onlySQLDrop?...
|
NULL
|
-8933277770696852160
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksProfilesToolsWi FirefoxFileEoitViewHistoryBookmarksProfilesToolsWindowHelp@ Not Securehttp://[IP_ADDRESS]:8767/frames_fts/~ Google Geminip! Western Digital Red Plus 3.5 6TB 5400rpm 256MB SAiGeminiPLUSSl I SeneticТвърд диск, Western Digital Red 6TB Plus ( 3.5". 256N* SQLite Web: db.sqlitew Screenpipe DashboardV Welcome to Steam• YoulubeHi LukásWhere should westart?New Tab+ New TabCreate image* Create musicBoost my dayHelp me learnWrite anythingCreate a videoSharper images, better text.Meet Nano Banana 2.Try itAsk Gemini+ °Pre vSummarize pagesqlite-web 0.7.2 db.sqlite frames_ftstable name….._sqlx_migrationsaudio_chunksaudio_tagsaudio_transcriptionsaudio_transcriptions_fts (v)audio_transcriptions_..audio_transcriptions_audio_transcriptions_.elementselements_fts (v)elements_fts_configelements_fts_dataelements_fts_idxframesframes_fts (v)frames_fts_configframes_fts_dataframes_fts_idxmeetingsmemoriesmemories_fts (v)memories_fts_configmemories_fts_datamemories_fts_idxocr_textpipe_executionspipe_scheduler_statesecretsspeaker_embeddingsspeakerssqlite_sequence1aosui_eventsui_events_fts (v)ui_events_fts_configui_events_fts_dataui_events_fts_idxvideo_chunksvision_tagsToggle helper tablesStructureContentQueryExportSQLCREATE VIRTUAL TABLE frames_fts USING fts5 (full_text,app_name,window_name,browser_url,id UNINDEXED,tokenize='unicode61'ColumnsColumnfull_textapp_namewindow_namebrowser_urlIndexesNameData typeColumnsSQLite database browser v0.7.2. powered by Flask and Peewee. © 2026 Charles LeiferlAllow nullUniqueMOA7 1%98 Fi1Ar 8:59:28QueryPrimarv keyActionsread-onlyread-onlyread-onlyread-onlyread-onlySQLDrop?...
|
NULL
|
|
25229
|
540
|
61
|
2026-04-15T12:46:03.847390+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776257163847_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpEDHomeDMs..•M +SlackFileEditViewGoHistoryWindowHelpEDHomeDMs..•More+→CSearch Jiminny IncJiminny ...+# general# infra-changes# jiminny-bg# platform-tickets# product _launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesStoyan TanevVes. Galya DimitrovaAneliya Angelova, ...Vasil VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...ii: AppsJira CloudToast# releases8 22+Messages© FilesTjiminny/appBookmarksAddod hu GitHubToday ~CircleCl APP2:18 PMDeployment Successful!Project: appWhen:04/15/202611:18:51Tag:View JobNewGitHub APP 3:28 PM7 new commits pushed to master by nikolay-yankov24b989ee - Enhance SECFIXdocumentation and policiesa3a0a742 - Update SECFIX Slack channelreference in documentation and workflowfiles071c999d - Merge branch 'master' intoimprove-secfix-bot-15-04-2026981e9a1a - Update SECFIX_PROMPT.mdto enhance clarity on upgrade safety andchangelog reviews6e938e53 - Enhance SECFIX workflow withSlack notification optionsShow morejiminny/app| Added by GitHubMessage #releasesAa...• Sprint Review • in 14 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentFirefox GPU HelperFirefox GPU HelperVTDecoderXPCServiceSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)Notion Helper (Renderer)claudeFirefoxCP Isolated Web ContentClaude Helper (Renderer)iTerm2FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (GPU)Mem...2,05 GB1,16 GB962,5 MB955,2 MB835,6 MB796,6 MB793,1 MB547,0 MB544,3 MB538,3 MB516,0 MB459,8 MB447,6 MB441,7 MB438,0 MB402,3 MB387,1 MB386,0 MB372,3 MB346,2 MB328,5 MB326,1 MB307,5 MB301,3 MB271,3 MB235,4 MB223,0 MB220,7 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 15:46:03CPUMemoryDiskThreads3821267485252426301215242426272524231521132715262814EnergyPorts59819 7791257291 20112420 015126251245168185121123123126124121121175328721232161 833123128174PID93892407429748014146644203084236713146738019938994186335480352763583143652430163689848173265481148509103583360519487856138482982653416,00 GB14,19 GB <1,75 GB2,99 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,00 GB2,86 GB6,77 GB...
|
NULL
|
-8932261368077305039
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpEDHomeDMs..•M +SlackFileEditViewGoHistoryWindowHelpEDHomeDMs..•More+→CSearch Jiminny IncJiminny ...+# general# infra-changes# jiminny-bg# platform-tickets# product _launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messagesStoyan TanevVes. Galya DimitrovaAneliya Angelova, ...Vasil VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...ii: AppsJira CloudToast# releases8 22+Messages© FilesTjiminny/appBookmarksAddod hu GitHubToday ~CircleCl APP2:18 PMDeployment Successful!Project: appWhen:04/15/202611:18:51Tag:View JobNewGitHub APP 3:28 PM7 new commits pushed to master by nikolay-yankov24b989ee - Enhance SECFIXdocumentation and policiesa3a0a742 - Update SECFIX Slack channelreference in documentation and workflowfiles071c999d - Merge branch 'master' intoimprove-secfix-bot-15-04-2026981e9a1a - Update SECFIX_PROMPT.mdto enhance clarity on upgrade safety andchangelog reviews6e938e53 - Enhance SECFIX workflow withSlack notification optionsShow morejiminny/app| Added by GitHubMessage #releasesAa...• Sprint Review • in 14 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentFirefox GPU HelperFirefox GPU HelperVTDecoderXPCServiceSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)Notion Helper (Renderer)claudeFirefoxCP Isolated Web ContentClaude Helper (Renderer)iTerm2FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (GPU)Mem...2,05 GB1,16 GB962,5 MB955,2 MB835,6 MB796,6 MB793,1 MB547,0 MB544,3 MB538,3 MB516,0 MB459,8 MB447,6 MB441,7 MB438,0 MB402,3 MB387,1 MB386,0 MB372,3 MB346,2 MB328,5 MB326,1 MB307,5 MB301,3 MB271,3 MB235,4 MB223,0 MB220,7 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 15:46:03CPUMemoryDiskThreads3821267485252426301215242426272524231521132715262814EnergyPorts59819 7791257291 20112420 015126251245168185121123123126124121121175328721232161 833123128174PID93892407429748014146644203084236713146738019938994186335480352763583143652430163689848173265481148509103583360519487856138482982653416,00 GB14,19 GB <1,75 GB2,99 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,00 GB2,86 GB6,77 GB...
|
25228
|
|
41043
|
873
|
57
|
2026-04-17T05:59:53.647227+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776405593647_m2.jpg...
|
Firefox
|
Symfony\Component\Debug\Exception\FatalThrowableEr Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line — Work...
|
True
|
jiminny.sentry.io/issues/6873095751/events/26d2294 jiminny.sentry.io/issues/6873095751/events/26d2294b8bf2410bb5da08e0fd82cdef/...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
New Tab
New Tab
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Insights
Insights
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Collapse
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts
Alerts
Issues
Issues
View Project Details
APP-1DTF
Symfony\Component\Debug\Exception\FatalThrowableError
View events
Events (total)
Users (90d)
Level: Error
League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218
1K
0
Ongoing
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Resolve
Resolve
More resolve options
Archive
Archive
Archive options
Subscribe
Share
More Actions
Priority
Modify issue priority
High
Assignee
Modify issue assignee
Nikolay Nikolov
All Envs
All Envs
90D
90D
Add a search term
Add a search term
Close sidebar
Toggle graph series - Events
Events
482
Toggle graph series - Users
Users
0
release 15% 869519
release
15%
869519
environment 63% staging-mars
environment
63%
staging-mars
laravel_version 56% 12.33.0
laravel_version
56%
12.33.0
handled 100% yes
handled
100%
yes
View all tags
View all tags
Select issue content
Events
Previous Event
Next Event
First
First
First
Latest
Latest
Latest
Recommended
Recommended
Recommended
View More Events
View More Events
Copy as
Copy as
ID: 26d2294b
13 hours ago
JSON
JSON
Highlights
Highlights
Stack Trace
Stack Trace
Trace
Trace
Tags
Tags
Context
Context
php
8.3.30
Linux
6.1.141-155.222.amzn2023.aarch64
872394
872394
production
Collapse Highlights Section
Highlights
Edit
Edit
handled
yes
level
error
transaction
--
url
--
Trace: Trace ID...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.045138888,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.015625,"top":0.05486111,"width":0.11875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.07361111,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.015625,"top":0.083333336,"width":0.11171875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.10208333,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.015625,"top":0.11180556,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line","depth":4,"bounds":{"left":0.0,"top":0.13055556,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line","depth":5,"bounds":{"left":0.015625,"top":0.14027777,"width":0.53398436,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.07890625,"top":0.13680555,"width":0.009375,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.003125,"top":0.16041666,"width":0.08710937,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.003125,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.01640625,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.029296875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.0421875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.05546875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle organization menu","depth":12,"bounds":{"left":0.10117187,"top":0.05347222,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":13,"bounds":{"left":0.09375,"top":0.084027775,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":15,"bounds":{"left":0.10195313,"top":0.114583336,"width":0.012109375,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Explore","depth":13,"bounds":{"left":0.09375,"top":0.13125,"width":0.028515626,"height":0.045138888},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Explore","depth":15,"bounds":{"left":0.10078125,"top":0.1625,"width":0.014453125,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dashboards","depth":13,"bounds":{"left":0.09375,"top":0.17916666,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dashboards","depth":15,"bounds":{"left":0.096875,"top":0.20972222,"width":0.022265624,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":13,"bounds":{"left":0.09375,"top":0.22638889,"width":0.028515626,"height":0.045138888},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":15,"bounds":{"left":0.10039063,"top":0.25694445,"width":0.015234375,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":13,"bounds":{"left":0.09375,"top":0.27847221,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":15,"bounds":{"left":0.1,"top":0.3090278,"width":0.016015625,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Try Business","depth":11,"bounds":{"left":0.10117187,"top":0.88472223,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"What's New","depth":11,"bounds":{"left":0.10117187,"top":0.90902776,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Help","depth":11,"bounds":{"left":0.10117187,"top":0.93333334,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"lukas.kovalik@jiminny.com","depth":11,"bounds":{"left":0.10117187,"top":0.9638889,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Issues","depth":13,"bounds":{"left":0.12890625,"top":0.05486111,"width":0.016796876,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse","depth":13,"bounds":{"left":0.18242188,"top":0.050694443,"width":0.0109375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Feed","depth":15,"bounds":{"left":0.125,"top":0.08125,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed","depth":17,"bounds":{"left":0.1296875,"top":0.088194445,"width":0.0125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Errors & Outages","depth":15,"bounds":{"left":0.125,"top":0.11875,"width":0.06914063,"height":0.024305556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Errors & Outages","depth":17,"bounds":{"left":0.1296875,"top":0.125,"width":0.04296875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Breached Metrics","depth":15,"bounds":{"left":0.125,"top":0.14305556,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Breached Metrics","depth":17,"bounds":{"left":0.1296875,"top":0.15,"width":0.04453125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Warnings","depth":15,"bounds":{"left":0.125,"top":0.16805555,"width":0.06914063,"height":0.024305556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Warnings","depth":17,"bounds":{"left":0.1296875,"top":0.175,"width":0.0234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"User Feedback","depth":15,"bounds":{"left":0.125,"top":0.19236112,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User Feedback","depth":17,"bounds":{"left":0.1296875,"top":0.19930555,"width":0.037890624,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All Views","depth":15,"bounds":{"left":0.125,"top":0.22986111,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All Views","depth":17,"bounds":{"left":0.1296875,"top":0.23680556,"width":0.02265625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Configure","depth":14,"bounds":{"left":0.1296875,"top":0.27222222,"width":0.02578125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Alerts","depth":15,"bounds":{"left":0.125,"top":0.2888889,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Alerts","depth":17,"bounds":{"left":0.1296875,"top":0.29583332,"width":0.015234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":14,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1DTF","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View events","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Events (total)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Users (90d)","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"bounds":{"left":0.20585938,"top":0.0,"width":0.028515626,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218","depth":14,"bounds":{"left":0.20976563,"top":0.0,"width":0.5324219,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1K","depth":13,"bounds":{"left":0.94453126,"top":0.0,"width":0.008203125,"height":0.015277778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"bounds":{"left":0.9800781,"top":0.0,"width":0.005078125,"height":0.015277778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":14,"bounds":{"left":0.20625,"top":0.0,"width":0.021484375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\\Jobs\\AutomatedReports\\SendReportJob::handle","depth":13,"bounds":{"left":0.23554687,"top":0.0,"width":0.28828126,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Quick Fix","depth":14,"bounds":{"left":0.5375,"top":0.0,"width":0.02265625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Resolve","depth":12,"bounds":{"left":0.20625,"top":0.0,"width":0.030078124,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Resolve","depth":14,"bounds":{"left":0.2109375,"top":0.0,"width":0.020703126,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More resolve options","depth":12,"bounds":{"left":0.2359375,"top":0.0,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Archive","depth":12,"bounds":{"left":0.25,"top":0.0,"width":0.0296875,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Archive","depth":14,"bounds":{"left":0.2546875,"top":0.0,"width":0.0203125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Archive options","depth":12,"bounds":{"left":0.27929688,"top":0.0,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Subscribe","depth":12,"bounds":{"left":0.29335937,"top":0.0,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Share","depth":12,"bounds":{"left":0.30742186,"top":0.0,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"More Actions","depth":12,"bounds":{"left":0.3214844,"top":0.0,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Priority","depth":12,"bounds":{"left":0.865625,"top":0.0,"width":0.018359374,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":12,"bounds":{"left":0.88554686,"top":0.0,"width":0.01796875,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":17,"bounds":{"left":0.8953125,"top":0.0,"width":0.010546875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assignee","depth":12,"bounds":{"left":0.9097656,"top":0.0,"width":0.0234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":13,"bounds":{"left":0.93476564,"top":0.0,"width":0.050390624,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":17,"bounds":{"left":0.94453126,"top":0.0,"width":0.0328125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"All Envs","depth":13,"bounds":{"left":0.20625,"top":0.0,"width":0.037109375,"height":0.025},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"All Envs","depth":17,"bounds":{"left":0.2109375,"top":0.0,"width":0.020703126,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"90D","depth":13,"bounds":{"left":0.24296875,"top":0.0,"width":0.026953125,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"90D","depth":17,"bounds":{"left":0.24765626,"top":0.0,"width":0.010546875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Add a search term","depth":16,"bounds":{"left":0.28554687,"top":0.0,"width":0.5582031,"height":0.016666668},"help_text":"","placeholder":"Filter events…","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXComboBox","text":"Add a search term","depth":16,"bounds":{"left":0.28554687,"top":0.0,"width":0.5582031,"height":0.016666668},"help_text":"","placeholder":"Filter events…","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close sidebar","depth":13,"bounds":{"left":0.8535156,"top":0.0,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Toggle graph series - Events","depth":12,"bounds":{"left":0.21132812,"top":0.024305556,"width":0.025,"height":0.030555556},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Events","depth":15,"bounds":{"left":0.21601562,"top":0.027777778,"width":0.015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"482","depth":15,"bounds":{"left":0.21796875,"top":0.04027778,"width":0.01171875,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle graph series - Users","depth":12,"bounds":{"left":0.21132812,"top":0.059027776,"width":0.025,"height":0.030555556},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Users","depth":15,"bounds":{"left":0.2171875,"top":0.06111111,"width":0.01328125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":15,"bounds":{"left":0.221875,"top":0.07361111,"width":0.00390625,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"release 15% 869519","depth":12,"bounds":{"left":0.7175781,"top":0.024305556,"width":0.1375,"height":0.011805556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"release","depth":14,"bounds":{"left":0.7199219,"top":0.025,"width":0.01640625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15%","depth":14,"bounds":{"left":0.8070313,"top":0.025,"width":0.009375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"869519","depth":14,"bounds":{"left":0.8179687,"top":0.025,"width":0.016015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"environment 63% staging-mars","depth":12,"bounds":{"left":0.7175781,"top":0.036805555,"width":0.1375,"height":0.011111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"environment","depth":14,"bounds":{"left":0.7199219,"top":0.0375,"width":0.02890625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"63%","depth":14,"bounds":{"left":0.8070313,"top":0.0375,"width":0.009375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"staging-mars","depth":14,"bounds":{"left":0.8179687,"top":0.0375,"width":0.0296875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"laravel_version 56% 12.33.0","depth":12,"bounds":{"left":0.7175781,"top":0.048611112,"width":0.1375,"height":0.011805556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"laravel_version","depth":14,"bounds":{"left":0.7199219,"top":0.05,"width":0.03515625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"56%","depth":14,"bounds":{"left":0.8070313,"top":0.05,"width":0.009375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12.33.0","depth":14,"bounds":{"left":0.8179687,"top":0.05,"width":0.015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"handled 100% yes","depth":12,"bounds":{"left":0.7175781,"top":0.06111111,"width":0.1375,"height":0.011805556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"handled","depth":14,"bounds":{"left":0.7199219,"top":0.0625,"width":0.018359374,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"100%","depth":14,"bounds":{"left":0.80390626,"top":0.0625,"width":0.0125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yes","depth":14,"bounds":{"left":0.8179687,"top":0.0625,"width":0.007421875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View all tags","depth":12,"bounds":{"left":0.7199219,"top":0.07569444,"width":0.031640626,"height":0.013888889},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"View all tags","depth":13,"bounds":{"left":0.7199219,"top":0.077083334,"width":0.031640626,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Select issue content","depth":13,"bounds":{"left":0.20625,"top":0.10277778,"width":0.033984374,"height":0.022222223},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Events","depth":15,"bounds":{"left":0.2109375,"top":0.10763889,"width":0.020703126,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Previous Event","depth":13,"bounds":{"left":0.6683594,"top":0.104166664,"width":0.0109375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Next Event","depth":13,"bounds":{"left":0.67929685,"top":0.104166664,"width":0.0109375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"First","depth":14,"bounds":{"left":0.6929687,"top":0.104166664,"width":0.016015625,"height":0.019444445},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"First","depth":15,"bounds":{"left":0.6929687,"top":0.10486111,"width":0.016015625,"height":0.019444445},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"First","depth":17,"bounds":{"left":0.69609374,"top":0.10972222,"width":0.009765625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Latest","depth":14,"bounds":{"left":0.71054685,"top":0.104166664,"width":0.0203125,"height":0.019444445},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Latest","depth":15,"bounds":{"left":0.71054685,"top":0.10486111,"width":0.0203125,"height":0.019444445},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Latest","depth":17,"bounds":{"left":0.71367186,"top":0.10972222,"width":0.0140625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Recommended","depth":14,"bounds":{"left":0.7324219,"top":0.104166664,"width":0.0390625,"height":0.019444445},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Recommended","depth":15,"bounds":{"left":0.7324219,"top":0.10486111,"width":0.0390625,"height":0.019444445},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Recommended","depth":17,"bounds":{"left":0.7355469,"top":0.10972222,"width":0.0328125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"View More Events","depth":13,"bounds":{"left":0.77304685,"top":0.104166664,"width":0.04609375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"View More Events","depth":15,"bounds":{"left":0.77617186,"top":0.108333334,"width":0.03984375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy as","depth":13,"bounds":{"left":0.82070315,"top":0.104166664,"width":0.037109375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Copy as","depth":15,"bounds":{"left":0.83085936,"top":0.108333334,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ID: 26d2294b","depth":15,"bounds":{"left":0.21132812,"top":0.1375,"width":0.035546876,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"13 hours ago","depth":15,"bounds":{"left":0.259375,"top":0.1375,"width":0.03203125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JSON","depth":14,"bounds":{"left":0.29726562,"top":0.1375,"width":0.014453125,"height":0.011805556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JSON","depth":15,"bounds":{"left":0.29726562,"top":0.1375,"width":0.014453125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Highlights","depth":17,"bounds":{"left":0.73125,"top":0.13333334,"width":0.028515626,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Highlights","depth":19,"bounds":{"left":0.734375,"top":0.13819444,"width":0.022265624,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Stack Trace","depth":17,"bounds":{"left":0.76054686,"top":0.13333334,"width":0.031640626,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Stack Trace","depth":19,"bounds":{"left":0.7636719,"top":0.13819444,"width":0.025390625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Trace","depth":17,"bounds":{"left":0.79296875,"top":0.13333334,"width":0.018359374,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Trace","depth":19,"bounds":{"left":0.79609376,"top":0.13819444,"width":0.012109375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Tags","depth":17,"bounds":{"left":0.81210935,"top":0.13333334,"width":0.016015625,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Tags","depth":19,"bounds":{"left":0.81523436,"top":0.13819444,"width":0.009765625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Context","depth":17,"bounds":{"left":0.82890624,"top":0.13333334,"width":0.023828125,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Context","depth":19,"bounds":{"left":0.83203125,"top":0.13819444,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"php","depth":16,"bounds":{"left":0.22070312,"top":0.16736111,"width":0.009765625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8.3.30","depth":16,"bounds":{"left":0.2328125,"top":0.16736111,"width":0.01640625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Linux","depth":16,"bounds":{"left":0.26484376,"top":0.16736111,"width":0.0140625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6.1.141-155.222.amzn2023.aarch64","depth":16,"bounds":{"left":0.28125,"top":0.16736111,"width":0.08867188,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"872394","depth":17,"bounds":{"left":0.38476562,"top":0.16736111,"width":0.01953125,"height":0.011111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"872394","depth":18,"bounds":{"left":0.38476562,"top":0.16736111,"width":0.01953125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"production","depth":17,"bounds":{"left":0.41914064,"top":0.16736111,"width":0.027734375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Highlights Section","depth":14,"bounds":{"left":0.21132812,"top":0.19652778,"width":0.61445314,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Highlights","depth":17,"bounds":{"left":0.22148438,"top":0.20277777,"width":0.03125,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit","depth":14,"bounds":{"left":0.82890624,"top":0.19930555,"width":0.022265624,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit","depth":16,"bounds":{"left":0.8390625,"top":0.20416667,"width":0.008984375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"handled","depth":16,"bounds":{"left":0.22148438,"top":0.22847222,"width":0.01953125,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yes","depth":16,"bounds":{"left":0.29375,"top":0.22847222,"width":0.00859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"level","depth":16,"bounds":{"left":0.22148438,"top":0.24375,"width":0.0140625,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"error","depth":16,"bounds":{"left":0.29375,"top":0.24375,"width":0.0140625,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":16,"bounds":{"left":0.22148438,"top":0.25902778,"width":0.030859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":16,"bounds":{"left":0.29375,"top":0.25902778,"width":0.00546875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"url","depth":16,"bounds":{"left":0.5449219,"top":0.22847222,"width":0.00859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":16,"bounds":{"left":0.6171875,"top":0.22847222,"width":0.00546875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trace: Trace ID","depth":16,"bounds":{"left":0.54414064,"top":0.24375,"width":0.0421875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8931857369140819298
|
-7193235535242493230
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
New Tab
New Tab
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Insights
Insights
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Collapse
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts
Alerts
Issues
Issues
View Project Details
APP-1DTF
Symfony\Component\Debug\Exception\FatalThrowableError
View events
Events (total)
Users (90d)
Level: Error
League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218
1K
0
Ongoing
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Resolve
Resolve
More resolve options
Archive
Archive
Archive options
Subscribe
Share
More Actions
Priority
Modify issue priority
High
Assignee
Modify issue assignee
Nikolay Nikolov
All Envs
All Envs
90D
90D
Add a search term
Add a search term
Close sidebar
Toggle graph series - Events
Events
482
Toggle graph series - Users
Users
0
release 15% 869519
release
15%
869519
environment 63% staging-mars
environment
63%
staging-mars
laravel_version 56% 12.33.0
laravel_version
56%
12.33.0
handled 100% yes
handled
100%
yes
View all tags
View all tags
Select issue content
Events
Previous Event
Next Event
First
First
First
Latest
Latest
Latest
Recommended
Recommended
Recommended
View More Events
View More Events
Copy as
Copy as
ID: 26d2294b
13 hours ago
JSON
JSON
Highlights
Highlights
Stack Trace
Stack Trace
Trace
Trace
Tags
Tags
Context
Context
php
8.3.30
Linux
6.1.141-155.222.amzn2023.aarch64
872394
872394
production
Collapse Highlights Section
Highlights
Edit
Edit
handled
yes
level
error
transaction
--
url
--
Trace: Trace ID...
|
41042
|
|
41061
|
873
|
67
|
2026-04-17T06:00:37.131646+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776405637131_m2.jpg...
|
Firefox
|
Symfony\Component\Debug\Exception\FatalThrowableEr Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line — Work...
|
True
|
jiminny.sentry.io/issues/6873095751/events/26d2294 jiminny.sentry.io/issues/6873095751/events/26d2294b8bf2410bb5da08e0fd82cdef/...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
New Tab
New Tab
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Insights
Insights
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Collapse
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts
Alerts
Issues
Issues
View Project Details
APP-1DTF
Symfony\Component\Debug\Exception\FatalThrowableError
View events
Events (total)
Users (90d)
Level: Error
League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218
1K
0
Ongoing
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Resolve
Resolve
More resolve options
Archive
Archive
Archive options
Subscribe
Share
More Actions
Priority
Modify issue priority
High
Assignee
Modify issue assignee
Nikolay Nikolov
All Envs
All Envs
90D
90D
Add a search term
Add a search term
Close sidebar
Toggle graph series - Events
Events
482
Toggle graph series - Users
Users
0
release 15% 869519
release
15%
869519
environment 63% staging-mars
environment
63%
staging-mars
laravel_version 56% 12.33.0
laravel_version
56%
12.33.0
handled 100% yes
handled
100%
yes
View all tags
View all tags
Select issue content
Events
Previous Event
Next Event
First
First
First
Latest
Latest
Latest
Recommended
Recommended
Recommended
View More Events
View More Events
Copy as
Copy as
ID: 26d2294b
13 hours ago
JSON
JSON
Highlights
Highlights
Stack Trace
Stack Trace
Trace
Trace
Tags
Tags
Context
Context
php
8.3.30
Linux
6.1.141-155.222.amzn2023.aarch64
872394
872394
production
Collapse Highlights Section
Highlights
Edit
Edit
handled
yes
level
error
transaction
--
url
--
Trace: Trace ID...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.045138888,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.015625,"top":0.05486111,"width":0.11875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.07361111,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.015625,"top":0.083333336,"width":0.11171875,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.10208333,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.015625,"top":0.11180556,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line","depth":4,"bounds":{"left":0.0,"top":0.13055556,"width":0.09375,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line","depth":5,"bounds":{"left":0.015625,"top":0.14027777,"width":0.53398436,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.07890625,"top":0.13680555,"width":0.009375,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.003125,"top":0.16041666,"width":0.08710937,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.003125,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.01640625,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.029296875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.0421875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.05546875,"top":0.97430557,"width":0.0125,"height":0.022222223},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle organization menu","depth":12,"bounds":{"left":0.10117187,"top":0.05347222,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":13,"bounds":{"left":0.09375,"top":0.084027775,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":15,"bounds":{"left":0.10195313,"top":0.114583336,"width":0.012109375,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Explore","depth":13,"bounds":{"left":0.09375,"top":0.13125,"width":0.028515626,"height":0.045138888},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Explore","depth":15,"bounds":{"left":0.10078125,"top":0.1625,"width":0.014453125,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dashboards","depth":13,"bounds":{"left":0.09375,"top":0.17916666,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dashboards","depth":15,"bounds":{"left":0.096875,"top":0.20972222,"width":0.022265624,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":13,"bounds":{"left":0.09375,"top":0.22638889,"width":0.028515626,"height":0.045138888},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":15,"bounds":{"left":0.10039063,"top":0.25694445,"width":0.015234375,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":13,"bounds":{"left":0.09375,"top":0.27847221,"width":0.028515626,"height":0.044444446},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":15,"bounds":{"left":0.1,"top":0.3090278,"width":0.016015625,"height":0.009027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Try Business","depth":11,"bounds":{"left":0.10117187,"top":0.88472223,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"What's New","depth":11,"bounds":{"left":0.10117187,"top":0.90902776,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Help","depth":11,"bounds":{"left":0.10117187,"top":0.93333334,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"lukas.kovalik@jiminny.com","depth":11,"bounds":{"left":0.10117187,"top":0.9638889,"width":0.0140625,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Issues","depth":13,"bounds":{"left":0.12890625,"top":0.05486111,"width":0.016796876,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse","depth":13,"bounds":{"left":0.18242188,"top":0.050694443,"width":0.0109375,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Feed","depth":15,"bounds":{"left":0.125,"top":0.08125,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed","depth":17,"bounds":{"left":0.1296875,"top":0.088194445,"width":0.0125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Errors & Outages","depth":15,"bounds":{"left":0.125,"top":0.11875,"width":0.06914063,"height":0.024305556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Errors & Outages","depth":17,"bounds":{"left":0.1296875,"top":0.125,"width":0.04296875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Breached Metrics","depth":15,"bounds":{"left":0.125,"top":0.14305556,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Breached Metrics","depth":17,"bounds":{"left":0.1296875,"top":0.15,"width":0.04453125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Warnings","depth":15,"bounds":{"left":0.125,"top":0.16805555,"width":0.06914063,"height":0.024305556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Warnings","depth":17,"bounds":{"left":0.1296875,"top":0.175,"width":0.0234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"User Feedback","depth":15,"bounds":{"left":0.125,"top":0.19236112,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User Feedback","depth":17,"bounds":{"left":0.1296875,"top":0.19930555,"width":0.037890624,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All Views","depth":15,"bounds":{"left":0.125,"top":0.22986111,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All Views","depth":17,"bounds":{"left":0.1296875,"top":0.23680556,"width":0.02265625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Configure","depth":14,"bounds":{"left":0.1296875,"top":0.27222222,"width":0.02578125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Alerts","depth":15,"bounds":{"left":0.125,"top":0.2888889,"width":0.06914063,"height":0.025},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Alerts","depth":17,"bounds":{"left":0.1296875,"top":0.29583332,"width":0.015234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":14,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1DTF","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View events","depth":13,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Events (total)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Users (90d)","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1K","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\\Jobs\\AutomatedReports\\SendReportJob::handle","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Quick Fix","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Resolve","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Resolve","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More resolve options","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Archive","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Archive","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Archive options","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Subscribe","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Share","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"More Actions","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Priority","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assignee","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"All Envs","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"All Envs","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"90D","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"90D","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Add a search term","depth":16,"help_text":"","placeholder":"Filter events…","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXComboBox","text":"Add a search term","depth":16,"help_text":"","placeholder":"Filter events…","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close sidebar","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Toggle graph series - Events","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Events","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"482","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle graph series - Users","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Users","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"release 15% 869519","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"release","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15%","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"869519","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"environment 63% staging-mars","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"environment","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"63%","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"staging-mars","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"laravel_version 56% 12.33.0","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"laravel_version","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"56%","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12.33.0","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"handled 100% yes","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"handled","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"100%","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yes","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View all tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"View all tags","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Select issue content","depth":13,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Events","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Previous Event","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Next Event","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"First","depth":14,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"First","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"First","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Latest","depth":14,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Latest","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Latest","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Recommended","depth":14,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Recommended","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Recommended","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"View More Events","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"View More Events","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy as","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Copy as","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ID: 26d2294b","depth":15,"bounds":{"left":0.21132812,"top":0.05486111,"width":0.035546876,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"13 hours ago","depth":15,"bounds":{"left":0.259375,"top":0.05486111,"width":0.03203125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JSON","depth":14,"bounds":{"left":0.29726562,"top":0.054166667,"width":0.014453125,"height":0.011805556},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JSON","depth":15,"bounds":{"left":0.29726562,"top":0.05486111,"width":0.014453125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Highlights","depth":17,"bounds":{"left":0.73125,"top":0.050694443,"width":0.028515626,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Highlights","depth":19,"bounds":{"left":0.734375,"top":0.055555556,"width":0.022265624,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Stack Trace","depth":17,"bounds":{"left":0.76054686,"top":0.050694443,"width":0.031640626,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Stack Trace","depth":19,"bounds":{"left":0.7636719,"top":0.055555556,"width":0.025390625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Trace","depth":17,"bounds":{"left":0.79296875,"top":0.050694443,"width":0.018359374,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Trace","depth":19,"bounds":{"left":0.79609376,"top":0.055555556,"width":0.012109375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Tags","depth":17,"bounds":{"left":0.81210935,"top":0.050694443,"width":0.016015625,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Tags","depth":19,"bounds":{"left":0.81523436,"top":0.055555556,"width":0.009765625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Context","depth":17,"bounds":{"left":0.82890624,"top":0.050694443,"width":0.023828125,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Context","depth":19,"bounds":{"left":0.83203125,"top":0.055555556,"width":0.017578125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"php","depth":16,"bounds":{"left":0.22070312,"top":0.0,"width":0.009765625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8.3.30","depth":16,"bounds":{"left":0.2328125,"top":0.0,"width":0.01640625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Linux","depth":16,"bounds":{"left":0.26484376,"top":0.0,"width":0.0140625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6.1.141-155.222.amzn2023.aarch64","depth":16,"bounds":{"left":0.28125,"top":0.0,"width":0.08867188,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"872394","depth":17,"bounds":{"left":0.38476562,"top":0.0,"width":0.01953125,"height":0.011111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"872394","depth":18,"bounds":{"left":0.38476562,"top":0.0,"width":0.01953125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"production","depth":17,"bounds":{"left":0.41914064,"top":0.0,"width":0.027734375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Highlights Section","depth":14,"bounds":{"left":0.21132812,"top":0.0,"width":0.61445314,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Highlights","depth":17,"bounds":{"left":0.22148438,"top":0.0,"width":0.03125,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit","depth":14,"bounds":{"left":0.82890624,"top":0.0,"width":0.022265624,"height":0.019444445},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit","depth":16,"bounds":{"left":0.8390625,"top":0.0,"width":0.008984375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"handled","depth":16,"bounds":{"left":0.22148438,"top":0.00625,"width":0.01953125,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yes","depth":16,"bounds":{"left":0.29375,"top":0.00625,"width":0.00859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"level","depth":16,"bounds":{"left":0.22148438,"top":0.021527778,"width":0.0140625,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"error","depth":16,"bounds":{"left":0.29375,"top":0.021527778,"width":0.0140625,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":16,"bounds":{"left":0.22148438,"top":0.036805555,"width":0.030859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":16,"bounds":{"left":0.29375,"top":0.036805555,"width":0.00546875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"url","depth":16,"bounds":{"left":0.5449219,"top":0.00625,"width":0.00859375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":16,"bounds":{"left":0.6171875,"top":0.00625,"width":0.00546875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trace: Trace ID","depth":16,"bounds":{"left":0.54414064,"top":0.021527778,"width":0.0421875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8931857369140819298
|
-7193235535242493230
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
New Tab
New Tab
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Symfony\Component\Debug\Exception\FatalThrowableError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Insights
Insights
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Collapse
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts
Alerts
Issues
Issues
View Project Details
APP-1DTF
Symfony\Component\Debug\Exception\FatalThrowableError
View events
Events (total)
Users (90d)
Level: Error
League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218
1K
0
Ongoing
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Resolve
Resolve
More resolve options
Archive
Archive
Archive options
Subscribe
Share
More Actions
Priority
Modify issue priority
High
Assignee
Modify issue assignee
Nikolay Nikolov
All Envs
All Envs
90D
90D
Add a search term
Add a search term
Close sidebar
Toggle graph series - Events
Events
482
Toggle graph series - Users
Users
0
release 15% 869519
release
15%
869519
environment 63% staging-mars
environment
63%
staging-mars
laravel_version 56% 12.33.0
laravel_version
56%
12.33.0
handled 100% yes
handled
100%
yes
View all tags
View all tags
Select issue content
Events
Previous Event
Next Event
First
First
First
Latest
Latest
Latest
Recommended
Recommended
Recommended
View More Events
View More Events
Copy as
Copy as
ID: 26d2294b
13 hours ago
JSON
JSON
Highlights
Highlights
Stack Trace
Stack Trace
Trace
Trace
Tags
Tags
Context
Context
php
8.3.30
Linux
6.1.141-155.222.amzn2023.aarch64
872394
872394
production
Collapse Highlights Section
Highlights
Edit
Edit
handled
yes
level
error
transaction
--
url
--
Trace: Trace ID...
|
NULL
|
|
44416
|
939
|
13
|
2026-04-17T08:46:59.855115+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776415619855_m1.jpg...
|
PhpStorm
|
faVsco.js – HS_local [jiminny@localhost]
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
"podcast_audio_url"
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
0 results
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
32
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .
$strategyName
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
} else {
return $this->createOpportunity($crmId, $properties, $associations);
}
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['accountId'])) {
return $associations['accountId'];
}
if (empty($associations)) {
return null;
}
// we can't resolve multiple account ids (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
if (isset($this->cachedBusinessProcesses[$pipelineId])) {
return $this->cachedBusinessProcesses[$pipelineId];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$pipelineId] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'contacts_to_add_count' => count($contactsAdded),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
<schema>
Sync Changes
Hide This Notification
Code changed:
Hide
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AutomatedReportsCommandTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AutomatedReportsCommandTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AutomatedReportsCommandTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"\"podcast_audio_url\"","depth":4,"value":"\"podcast_audio_url\"","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"0 results","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"32","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .\n $strategyName\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n } else {\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['accountId'])) {\n return $associations['accountId'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // we can't resolve multiple account ids (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n if (isset($this->cachedBusinessProcesses[$pipelineId])) {\n return $this->cachedBusinessProcesses[$pipelineId];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$pipelineId] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'contacts_to_add_count' => count($contactsAdded),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .\n $strategyName\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n } else {\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['accountId'])) {\n return $associations['accountId'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // we can't resolve multiple account ids (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n if (isset($this->cachedBusinessProcesses[$pipelineId])) {\n return $this->cachedBusinessProcesses[$pipelineId];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$pipelineId] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'contacts_to_add_count' => count($contactsAdded),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"<schema>","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8931681527904655097
|
-8322167677730254492
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
"podcast_audio_url"
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
0 results
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
32
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .
$strategyName
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
} else {
return $this->createOpportunity($crmId, $properties, $associations);
}
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['accountId'])) {
return $associations['accountId'];
}
if (empty($associations)) {
return null;
}
// we can't resolve multiple account ids (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
if (isset($this->cachedBusinessProcesses[$pipelineId])) {
return $this->cachedBusinessProcesses[$pipelineId];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$pipelineId] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'contacts_to_add_count' => count($contactsAdded),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
<schema>
Sync Changes
Hide This Notification
Code changed:
Hide
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
44417
|
940
|
10
|
2026-04-17T08:47:01.978079+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776415621978_m2.jpg...
|
PhpStorm
|
faVsco.js – HS_local [jiminny@localhost]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
"podcast_audio_url"
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
0 results
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
32
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .
$strategyName
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
} else {
return $this->createOpportunity($crmId, $properties, $associations);
}
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['accountId'])) {
return $associations['accountId'];
}
if (empty($associations)) {
return null;
}
// we can't resolve multiple account ids (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
if (isset($this->cachedBusinessProcesses[$pipelineId])) {
return $this->cachedBusinessProcesses[$pipelineId];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$pipelineId] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'contacts_to_add_count' => count($contactsAdded),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
<schema>
Sync Changes
Hide This Notification
Code changed:
Hide
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.78515625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AutomatedReportsCommandTest","depth":6,"bounds":{"left":0.803125,"top":0.017361112,"width":0.09765625,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AutomatedReportsCommandTest'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AutomatedReportsCommandTest'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.12382813,"top":0.17777778,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.13867188,"top":0.17708333,"width":0.00859375,"height":0.015277778},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"\"podcast_audio_url\"","depth":4,"bounds":{"left":0.1515625,"top":0.17708333,"width":0.06367187,"height":0.013888889},"value":"\"podcast_audio_url\"","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.22578125,"top":0.17708333,"width":0.00859375,"height":0.015277778},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2375,"top":0.17708333,"width":0.00859375,"height":0.015277778},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.24765626,"top":0.17708333,"width":0.00859375,"height":0.015277778},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.2578125,"top":0.17708333,"width":0.00859375,"height":0.015277778},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"0 results","depth":4,"bounds":{"left":0.27382812,"top":0.17638889,"width":0.030078124,"height":0.015277778},"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.30390626,"top":0.17569445,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.3140625,"top":0.17569445,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.32421875,"top":0.17569445,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.334375,"top":0.17569445,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.52421874,"top":0.17569445,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"32","depth":4,"bounds":{"left":0.4832031,"top":0.20277777,"width":0.012109375,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.49765626,"top":0.20277777,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.509375,"top":0.20277777,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.52265626,"top":0.2013889,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.53125,"top":0.2013889,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .\n $strategyName\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n } else {\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['accountId'])) {\n return $associations['accountId'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // we can't resolve multiple account ids (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n if (isset($this->cachedBusinessProcesses[$pipelineId])) {\n return $this->cachedBusinessProcesses[$pipelineId];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$pipelineId] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'contacts_to_add_count' => count($contactsAdded),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .\n $strategyName\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n } else {\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['accountId'])) {\n return $associations['accountId'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // we can't resolve multiple account ids (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n if (isset($this->cachedBusinessProcesses[$pipelineId])) {\n return $this->cachedBusinessProcesses[$pipelineId];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$pipelineId] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'contacts_to_add_count' => count($contactsAdded),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.5414063,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.5515625,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.5644531,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.5746094,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.5847656,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.59765625,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.6105469,"top":0.08611111,"width":0.028515626,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.6417969,"top":0.08611111,"width":0.01015625,"height":0.016666668},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.6546875,"top":0.08611111,"width":0.034765624,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"<schema>","depth":4,"bounds":{"left":0.94492185,"top":0.08611111,"width":0.03984375,"height":0.016666668},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.9355469,"top":0.10763889,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.9472656,"top":0.10763889,"width":0.00859375,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.95820314,"top":0.10763889,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.96953124,"top":0.10625,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.978125,"top":0.10625,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8931681527904655097
|
-8322167677730254492
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
"podcast_audio_url"
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
0 results
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
32
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' .
$strategyName
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
} else {
return $this->createOpportunity($crmId, $properties, $associations);
}
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['accountId'])) {
return $associations['accountId'];
}
if (empty($associations)) {
return null;
}
// we can't resolve multiple account ids (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
if (isset($this->cachedBusinessProcesses[$pipelineId])) {
return $this->cachedBusinessProcesses[$pipelineId];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$pipelineId] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'contacts_to_add_count' => count($contactsAdded),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
<schema>
Sync Changes
Hide This Notification
Code changed:
Hide
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
38630
|
787
|
79
|
2026-04-16T13:16:59.738963+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776345419738_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewEDHomeDMsActivityFilesLater..•Mo +SlackFileEditViewEDHomeDMsActivityFilesLater..•More+Jiminny ...w Starred& jiminny-x-integrati...8platform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages0. Nikolay Nikolov. Stoyan TanevG. Vasil Vasilev. Galya DimitrovaNibolav lanovGoHistoryWindowHelp→CSearch Jiminny Inc*& platform-inner-...& 10MessagesP Channel OverviewMore v+create PDF verToday ~ uest_id: 822fa41b-afd3-43a9-a248-ooDue36f3131: (2013, 'Lostconnection to MySQL server during query([Errno 104] Connection reset by peer)"):correlation_id:ae2e38ff-ed04-401e-b77c-1e02e9d788c6 trace_id:f0194348-cece-4ca8-8413-21e32eef1d4f[2026-04-13 01:09:56] app.ERROR: Failed tocreate PDF version for request_id: 822fa41b-afd3-43a9-a248-86b0e36f3131: (2013, 'Lostconnection to MySQL server during query([Errno 104] Connection reset by peer)"):correlation_id:ae2e38ff-ed04-401e-b77c-1e02e9d788c6 trace_id:f0194348-cece-4ca8-8413-21e32eef1d4fecs/jiminny-prophet/fbd19ab3fe8d4775bb936af467904a55някакво connectivity ишу с MySql изглеждаSteliyan Georgiev 12:53 PMно това е само 1 случай2 replies Last reply today at 1:02 PMNewSteliyan Georgiev 4:09 PMМоже ли едно малко ревю на един ПР,който вече го прецизирах с @claude ревюhttps://github.com/jiminny/prophet/pull/479Message & platform-inner-team+Aa@ .••*3>0 lbl-zsh100% <478Thu 16 Apr 16:16:59• $84-zsh85window_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE "%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE '%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE "%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%" OR window_name LIKE '%Boostit DATETIME);...
|
NULL
|
-8931407534015720402
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewEDHomeDMsActivityFilesLater..•Mo +SlackFileEditViewEDHomeDMsActivityFilesLater..•More+Jiminny ...w Starred& jiminny-x-integrati...8platform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messages0. Nikolay Nikolov. Stoyan TanevG. Vasil Vasilev. Galya DimitrovaNibolav lanovGoHistoryWindowHelp→CSearch Jiminny Inc*& platform-inner-...& 10MessagesP Channel OverviewMore v+create PDF verToday ~ uest_id: 822fa41b-afd3-43a9-a248-ooDue36f3131: (2013, 'Lostconnection to MySQL server during query([Errno 104] Connection reset by peer)"):correlation_id:ae2e38ff-ed04-401e-b77c-1e02e9d788c6 trace_id:f0194348-cece-4ca8-8413-21e32eef1d4f[2026-04-13 01:09:56] app.ERROR: Failed tocreate PDF version for request_id: 822fa41b-afd3-43a9-a248-86b0e36f3131: (2013, 'Lostconnection to MySQL server during query([Errno 104] Connection reset by peer)"):correlation_id:ae2e38ff-ed04-401e-b77c-1e02e9d788c6 trace_id:f0194348-cece-4ca8-8413-21e32eef1d4fecs/jiminny-prophet/fbd19ab3fe8d4775bb936af467904a55някакво connectivity ишу с MySql изглеждаSteliyan Georgiev 12:53 PMно това е само 1 случай2 replies Last reply today at 1:02 PMNewSteliyan Georgiev 4:09 PMМоже ли едно малко ревю на един ПР,който вече го прецизирах с @claude ревюhttps://github.com/jiminny/prophet/pull/479Message & platform-inner-team+Aa@ .••*3>0 lbl-zsh100% <478Thu 16 Apr 16:16:59• $84-zsh85window_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE "%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE '%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%' OR window_name LIKE "%Boostwindow_name FROM ocr_text WHERE app_name LIKE "%Safari%" OR window_name LIKE '%Boostit DATETIME);...
|
38628
|
|
65755
|
1468
|
19
|
2026-04-21T13:01:06.101764+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776776466101_m2.jpg...
|
Slack
|
Aneliya Angelova (DM) - Jiminny Inc - 1 new item - Aneliya Angelova (DM) - Jiminny Inc - 1 new item - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
More unreads
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
c-learning-people
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
people-with-copilot-licences
people-with-zoom-phone-licences
platform-team
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Aneliya Angelova
Gabriela Dureva
Todor Stamatov
Petko Kashinski
Vasil Vasilev
Nikolay Nikolov
Galya Dimitrova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Aneliya Angelova
Yesterday at 11:27:34 AM
11:27 AM
направо звънни когато можеш
Lukas Kovalik
Yesterday at 11:35:37 AM
11:35 AM
тука съм
A huddle happened
Yesterday at 11:35:41 AM
11:35 AM
Lukas Kovalik
Yesterday at 1:50:24 PM
1:50 PM
Ани оправих ги и двете само не успах да тествам това със филтър
Yesterday at 1:50:57 PM
1:50
добавя се но нямам activity-та локално да го тествам
Aneliya Angelova
Yesterday at 1:51:10 PM
1:51 PM
Оки
Lukas Kovalik
Yesterday at 1:51:18 PM
1:51 PM
те са със ES и малко тегаво се правят
Aneliya Angelova
Yesterday at 1:51:21 PM
1:51 PM
Аз ще го видя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Jump to date
Aneliya Angelova
Today at 2:15:44 PM
2:15 PM
Здрасти Лукаш
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:15:50 PM
2:15
имаш ли 5 мин
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:15:56 PM
2:15
да видим нещо по репортите
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 2:18:27 PM
2:18 PM
да
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
A huddle happened
Today at 2:30:21 PM
2:30 PM
You and
Aneliya Angelova
were in the huddle for
10m
.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Today at 4:00:31 PM
4:00 PM
Лукаш мисля повече да не тествам. само кажи, когато фикснеш това с тима да го погледна и да качваме на прод
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:00:49 PM
4:00 PM
да сега го оправих само да го претествам
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Today at 4:00:54 PM
4:00 PM
оки
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:00:58 PM
4:00 PM
и ще го кача
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
ч м
ч м
Shift + Return to add a new line
Shift + Return
to add a new line
Todor Stamatov, Direct Message, 1 of 15 suggestions
Aneliya Angelova: оки....
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.0056515955,"top":0.058260176,"width":0.011968086,"height":0.028731046},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.0029920214,"top":0.10055866,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.0066489363,"top":0.13806863,"width":0.009973404,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.0029920214,"top":0.15482841,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.0076462766,"top":0.19233839,"width":0.007978723,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.0029920214,"top":0.20909816,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.004986702,"top":0.24660814,"width":0.012965426,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.0029920214,"top":0.26336792,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.0076462766,"top":0.3008779,"width":0.0076462766,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.0029920214,"top":0.31763768,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.00731383,"top":0.35514766,"width":0.008643617,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.0029920214,"top":0.3719074,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.006981383,"top":0.4094174,"width":0.008976064,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"More unreads","depth":17,"bounds":{"left":0.038896278,"top":0.096568234,"width":0.041888297,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Unreads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"c-learning-people","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"infra-changes","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"people-with-copilot-licences","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"people-with-zoom-phone-licences","depth":23,"bounds":{"left":0.042220745,"top":0.09177973,"width":0.045877658,"height":0.007980846},"role_description":"text"},{"role":"AXStaticText","text":"platform-team","depth":23,"bounds":{"left":0.042220745,"top":0.10774142,"width":0.03125,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.042220745,"top":0.1300878,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.042220745,"top":0.15243416,"width":0.03856383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.042220745,"top":0.17478053,"width":0.01662234,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.042220745,"top":0.1971269,"width":0.018284574,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.042220745,"top":0.21947326,"width":0.016954787,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.042220745,"top":0.24181964,"width":0.024268618,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.042220745,"top":0.264166,"width":0.04488032,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.042220745,"top":0.31683958,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Gabriela Dureva","depth":23,"bounds":{"left":0.042220745,"top":0.33918595,"width":0.03523936,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Todor Stamatov","depth":23,"bounds":{"left":0.042220745,"top":0.36153233,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.042220745,"top":0.38387868,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.042220745,"top":0.40622506,"width":0.026263298,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":23,"bounds":{"left":0.042220745,"top":0.42857143,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.042220745,"top":0.4509178,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.042220745,"top":0.47326416,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tomov","depth":23,"bounds":{"left":0.042220745,"top":0.49561054,"width":0.030585106,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.042220745,"top":0.5179569,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.07945479,"top":0.5179569,"width":0.0063164895,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.08211436,"top":0.5179569,"width":0.014295213,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.09607713,"top":0.5355148,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.09607713,"top":0.5355148,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"bounds":{"left":0.042220745,"top":0.5403033,"width":0.028922873,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.042220745,"top":0.56264967,"width":0.031914894,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Ves","depth":23,"bounds":{"left":0.042220745,"top":0.584996,"width":0.0076462766,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.042220745,"top":0.63766956,"width":0.011968086,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.042220745,"top":0.66001594,"width":0.021609042,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.10206117,"top":0.09177973,"width":0.030585106,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.111369684,"top":0.10055866,"width":0.01861702,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Add canvas","depth":18,"bounds":{"left":0.13397606,"top":0.09177973,"width":0.033909574,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add canvas","depth":20,"bounds":{"left":0.14328457,"top":0.10055866,"width":0.021941489,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.16921543,"top":0.09177973,"width":0.020944148,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.17852394,"top":0.10055866,"width":0.008976064,"height":0.012769354},"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.19115691,"top":0.09177973,"width":0.010970744,"height":0.030327214},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.015625,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.0076462766,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.096409574,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.14660904,"top":0.12689546,"width":0.032579787,"height":0.022346368},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:27:34 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:27 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"направо звънни когато можеш","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:35:37 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:35 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"тука съм","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"A huddle happened","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 11:35:41 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:35 AM","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:50:24 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:50 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Ани оправих ги и двете само не успах да тествам това със филтър","depth":25,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:50:57 PM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:50","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"добавя се но нямам activity-та локално да го тествам","depth":25,"role_description":"text"},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:51:10 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:51 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Оки","depth":25,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.11801862,"top":0.11572227,"width":0.030917553,"height":0.005586592},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.14860372,"top":0.11572227,"width":0.0029920214,"height":0.003990423},"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:51:18 PM","depth":24,"bounds":{"left":0.1512633,"top":0.11572227,"width":0.015292553,"height":0.0031923384},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:51 PM","depth":25,"bounds":{"left":0.1512633,"top":0.11572227,"width":0.015292553,"height":0.0031923384},"role_description":"text"},{"role":"AXStaticText","text":"те са със ES и малко тегаво се правят","depth":25,"bounds":{"left":0.11801862,"top":0.12290503,"width":0.08577128,"height":0.014365523},"role_description":"text"},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.11801862,"top":0.1452514,"width":0.038896278,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.15658244,"top":0.14684756,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Yesterday at 1:51:21 PM","depth":24,"bounds":{"left":0.15924202,"top":0.14924182,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:51 PM","depth":25,"bounds":{"left":0.15924202,"top":0.14924182,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Аз ще го видя","depth":25,"bounds":{"left":0.11801862,"top":0.16440542,"width":0.031914894,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.13168396,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.13168396,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.13168396,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.13168396,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.13168396,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.13168396,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.13168396,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.13168396,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.15026596,"top":0.19473264,"width":0.025265958,"height":0.022346368},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.11801862,"top":0.22585794,"width":0.038896278,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.15658244,"top":0.22745411,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 2:15:44 PM","depth":24,"bounds":{"left":0.15924202,"top":0.22984837,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:15 PM","depth":25,"bounds":{"left":0.15924202,"top":0.22984837,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Здрасти Лукаш","depth":25,"bounds":{"left":0.11801862,"top":0.24501197,"width":0.03557181,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.2122905,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.2122905,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.2122905,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.2122905,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.2122905,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.2122905,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.2122905,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.2122905,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 2:15:50 PM","depth":25,"bounds":{"left":0.107380316,"top":0.27134877,"width":0.007978723,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:15","depth":26,"bounds":{"left":0.107380316,"top":0.27134877,"width":0.007978723,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"имаш ли 5 мин","depth":25,"bounds":{"left":0.11801862,"top":0.26895452,"width":0.034574468,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.2442139,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.2442139,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.2442139,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.2442139,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.2442139,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.2442139,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.2442139,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.2442139,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 2:15:56 PM","depth":25,"bounds":{"left":0.107380316,"top":0.2952913,"width":0.007978723,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:15","depth":26,"bounds":{"left":0.107380316,"top":0.2952913,"width":0.007978723,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"да видим нещо по репортите","depth":25,"bounds":{"left":0.11801862,"top":0.29289705,"width":0.06781915,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.26815644,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.26815644,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.26815644,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.26815644,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.26815644,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.26815644,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.26815644,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.26815644,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.11801862,"top":0.31524342,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.14860372,"top":0.31683958,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 2:18:27 PM","depth":24,"bounds":{"left":0.1512633,"top":0.31923383,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:18 PM","depth":25,"bounds":{"left":0.1512633,"top":0.31923383,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"да","depth":25,"bounds":{"left":0.11801862,"top":0.33439744,"width":0.0056515955,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.30167598,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.30167598,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.30167598,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.30167598,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.30167598,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.30167598,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.30167598,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.30167598,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"A huddle happened","depth":24,"bounds":{"left":0.11801862,"top":0.35834,"width":0.043218084,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.1612367,"top":0.35834,"width":0.0026595744,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 2:30:21 PM","depth":24,"bounds":{"left":0.16389628,"top":0.36073422,"width":0.014960106,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:30 PM","depth":25,"bounds":{"left":0.16389628,"top":0.36073422,"width":0.014960106,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"You and","depth":24,"bounds":{"left":0.11801862,"top":0.37589785,"width":0.01861702,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.13630319,"top":0.37589785,"width":0.037898935,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"were in the huddle for","depth":24,"bounds":{"left":0.11801862,"top":0.37589785,"width":0.098071806,"height":0.031923383},"role_description":"text"},{"role":"AXStaticText","text":"10m","depth":24,"bounds":{"left":0.12533244,"top":0.3934557,"width":0.009973404,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":".","depth":24,"bounds":{"left":0.13530585,"top":0.3934557,"width":0.0013297872,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.34317636,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.34317636,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.34317636,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.34317636,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.34317636,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.34317636,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.34317636,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.34317636,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.11801862,"top":0.41580206,"width":0.038896278,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.15658244,"top":0.41739824,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 4:00:31 PM","depth":24,"bounds":{"left":0.15924202,"top":0.4197925,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:00 PM","depth":25,"bounds":{"left":0.15924202,"top":0.4197925,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Лукаш мисля повече да не тествам. само кажи, когато фикснеш това с тима да го погледна и да качваме на прод","depth":25,"bounds":{"left":0.11801862,"top":0.4349561,"width":0.09474734,"height":0.049481247},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.40223464,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.40223464,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.40223464,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.40223464,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.40223464,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.40223464,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.40223464,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.40223464,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.11801862,"top":0.4924182,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.14860372,"top":0.49401435,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 4:00:49 PM","depth":24,"bounds":{"left":0.1512633,"top":0.4964086,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:00 PM","depth":25,"bounds":{"left":0.1512633,"top":0.4964086,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"да сега го оправих само да го претествам","depth":25,"bounds":{"left":0.11801862,"top":0.51157224,"width":0.095744684,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.47885075,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.47885075,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.47885075,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.47885075,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.47885075,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.47885075,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.47885075,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.47885075,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova","depth":24,"bounds":{"left":0.11801862,"top":0.5339186,"width":0.038896278,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.15658244,"top":0.5355148,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 4:00:54 PM","depth":24,"bounds":{"left":0.15924202,"top":0.53790903,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:00 PM","depth":25,"bounds":{"left":0.15924202,"top":0.53790903,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"оки","depth":25,"bounds":{"left":0.11801862,"top":0.55307263,"width":0.00831117,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.5203512,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.5203512,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.5203512,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.5203512,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.5203512,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.5203512,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.5203512,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.5203512,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.11801862,"top":0.575419,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.14860372,"top":0.57701516,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 4:00:58 PM","depth":24,"bounds":{"left":0.1512633,"top":0.5794094,"width":0.015292553,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:00 PM","depth":25,"bounds":{"left":0.1512633,"top":0.5794094,"width":0.015292553,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"и ще го кача","depth":25,"bounds":{"left":0.11801862,"top":0.594573,"width":0.028590426,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.13730054,"top":0.56185156,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.14793883,"top":0.56185156,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.15857713,"top":0.56185156,"width":0.010638298,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.16921543,"top":0.56185156,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.17985372,"top":0.56185156,"width":0.010638298,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.22340426,"top":0.56185156,"width":0.0003324468,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.22340426,"top":0.56185156,"width":0.0003324468,"height":0.025538707},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.22340426,"top":0.56185156,"width":0.0003324468,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"ч м","depth":23,"bounds":{"left":0.10372341,"top":0.6272945,"width":0.118351065,"height":0.030327214},"value":"ч м","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ч м","depth":25,"bounds":{"left":0.10771277,"top":0.63527536,"width":0.00731383,"height":0.014365523},"role_description":"text"},{"role":"AXButton","text":"Shift + Return to add a new line","depth":20,"bounds":{"left":0.17121011,"top":0.6935355,"width":0.048537236,"height":0.012769354},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Shift + Return","depth":21,"bounds":{"left":0.17121011,"top":0.6943336,"width":0.021609042,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"to add a new line","depth":21,"bounds":{"left":0.1924867,"top":0.6943336,"width":0.027260639,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"Todor Stamatov, Direct Message, 1 of 15 suggestions","depth":11,"bounds":{"left":0.0,"top":0.7126895,"width":0.026263298,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova: оки.","depth":11,"bounds":{"left":0.0,"top":0.7126895,"width":0.020944148,"height":0.0007980846},"role_description":"text"}]...
|
-8931336715214237753
|
-1424943060430437256
|
visual_change
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
More unreads
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
c-learning-people
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
people-with-copilot-licences
people-with-zoom-phone-licences
platform-team
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Aneliya Angelova
Gabriela Dureva
Todor Stamatov
Petko Kashinski
Vasil Vasilev
Nikolay Nikolov
Galya Dimitrova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Aneliya Angelova
Yesterday at 11:27:34 AM
11:27 AM
направо звънни когато можеш
Lukas Kovalik
Yesterday at 11:35:37 AM
11:35 AM
тука съм
A huddle happened
Yesterday at 11:35:41 AM
11:35 AM
Lukas Kovalik
Yesterday at 1:50:24 PM
1:50 PM
Ани оправих ги и двете само не успах да тествам това със филтър
Yesterday at 1:50:57 PM
1:50
добавя се но нямам activity-та локално да го тествам
Aneliya Angelova
Yesterday at 1:51:10 PM
1:51 PM
Оки
Lukas Kovalik
Yesterday at 1:51:18 PM
1:51 PM
те са със ES и малко тегаво се правят
Aneliya Angelova
Yesterday at 1:51:21 PM
1:51 PM
Аз ще го видя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Jump to date
Aneliya Angelova
Today at 2:15:44 PM
2:15 PM
Здрасти Лукаш
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:15:50 PM
2:15
имаш ли 5 мин
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:15:56 PM
2:15
да видим нещо по репортите
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 2:18:27 PM
2:18 PM
да
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
A huddle happened
Today at 2:30:21 PM
2:30 PM
You and
Aneliya Angelova
were in the huddle for
10m
.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Today at 4:00:31 PM
4:00 PM
Лукаш мисля повече да не тествам. само кажи, когато фикснеш това с тима да го погледна и да качваме на прод
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:00:49 PM
4:00 PM
да сега го оправих само да го претествам
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Aneliya Angelova
Today at 4:00:54 PM
4:00 PM
оки
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:00:58 PM
4:00 PM
и ще го кача
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
ч м
ч м
Shift + Return to add a new line
Shift + Return
to add a new line
Todor Stamatov, Direct Message, 1 of 15 suggestions
Aneliya Angelova: оки.
ActivityMoreSlackcalVIewJiminny ...uDeon# ? More unreads# platform-tickets# product_launches# random# release‹# support# thank-yous# the_people_of_jimi…^ Direct messagesP. Aneliya Angelova. Gabriela Dureva%: Todor Stamatov& Petko Kashinski€. Vasil VasilevP. Nikolay NikolovGalva DimitrovaA. Stefka Stoyanova8. Stoyan Tomov3 Aneliva Angelova…2. Stoyan TanevC. Nikolay IvanovF Vec#: Apps® ToastG Jira CloudV A PRODA console [PROD]A console_1 [PROD]LDI PROD I> AOA> A QAIA QAI PRODV & STAGING& console STAGING& console STAGiNGduranus STAGINGI→ Extensions>MScratchesMistonWindow• MessagesO n 70%щ 8 Tu21Apr 16:01:05• - app.dev.jiminny.com/onboarur Filesfor 10mlhe huddleМ сAмоа да готествами ше го кача(UY-20372) Al Reports > Empty palProiect Phoenix - Figma8 Project Phoenix - FigmaJiminny MCP Connector - ProductM Jiminny Mail8 Jiminny0) Pioelines - jiminnylapp(SRD-6793) Les Mills activity type:Search results: calendar I.liminnvNew Ta:z Edit - Calendar - Engineering - Co+ AaUpdate your informationGENERAIITIMEZONEEurope/Sofia (UTC +03:00)I ANGUIAGES SPOKEN DURING CAII SDEFAULT SPOKEN I ANCHINCEEnglish (United States)If the language isn't detected we'll default to this ond© Add languageCONNECI/SYNCSEITINGS:Import Calendar Meetings*G Sign in with GoogleLet'c Get Startedl —* doqnam leam scean* @return Collectionpublic function getReportsByTeam(Tereturn AutomatedReport::where* Get all report results for a soi* Gparam AutomatedRenort Srenorti...
|
NULL
|
|
28992
|
596
|
1
|
2026-04-15T14:28:06.639721+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776263286639_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
914515107271520203585/185Imperial Age--Elite Longb 914515107271520203585/185Imperial Age--Elite Longbowman Created-Click to select this military unit.5 Magnus Olafsson: 36480/36480NV1 kovaliklukas: 34064/340648 Almish Yiltawar: 26810/26810IVONRajyapala: 23614/236140 1NV6 LÁsz16 I: 12344/12344€Z Maximilian of Habsbung: 6531/6531 W IV4 Louis VI: 6184/61843 Huagcám: 5966/5966 IV...
|
NULL
|
-8931105744862857548
|
NULL
|
click
|
ocr
|
NULL
|
914515107271520203585/185Imperial Age--Elite Longb 914515107271520203585/185Imperial Age--Elite Longbowman Created-Click to select this military unit.5 Magnus Olafsson: 36480/36480NV1 kovaliklukas: 34064/340648 Almish Yiltawar: 26810/26810IVONRajyapala: 23614/236140 1NV6 LÁsz16 I: 12344/12344€Z Maximilian of Habsbung: 6531/6531 W IV4 Louis VI: 6184/61843 Huagcám: 5966/5966 IV...
|
NULL
|
|
75196
|
1873
|
6
|
2026-04-23T10:43:24.488246+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-23/1776 /Users/lukas/.screenpipe/data/data/2026-04-23/1776941004488_m1.jpg...
|
PhpStorm
|
faVsco.js – AutomatedReportsRepository.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20157-AJ-report-not-se Project: faVsco.js, menu
JY-20157-AJ-report-not-send-notification, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active Ask Jiminny reports whose expiry date has passed.
*
* @return Collection<AutomatedReport>
*/
public function getExpiredActiveAskJiminnyReports(): Collection
{
return AutomatedReport::where('status', true)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->whereNotNull('expires_at')
->where('expires_at', '<', now()->toDateString())
->get();
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function findLatestDefaultOrFailedResult(AutomatedReport $report): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
->latest()
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where(fn (Builder $q) => $this->applyUserAccessScope($q, $user))
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
// ->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
public function countAllUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
// ->whereNotNull('sent_at')
->whereHas('report', fn (Builder $q) => $this->applyUserAccessScope($q, $user))
->count();
}
/**
* Restrict a query on the automated_reports table to reports the given user is allowed to see.
*
* Matches the customer-facing audience:
* - explicit user recipients (recipients.users)
* - members of any of the report's groups (Ask Jiminny reports)
*/
private function applyUserAccessScope(Builder $query, User $user): void
{
$userId = $user->getId();
$groupId = $user->getGroupId();
$query
->where('automated_reports.team_id', $user->getTeamId())
->where(function (Builder $q) use ($userId, $groupId): void {
$q->whereJsonContains('automated_reports.recipients->users', $userId);
if ($groupId !== null) {
$q->orWhere(function (Builder $sub) use ($groupId): void {
$sub->where('automated_reports.type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->whereJsonContains('automated_reports.groups', $groupId);
});
}
});
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
21
1
17
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id
where u.team_id = 1;
SELECT * FROM social_accounts WHERE sociable_id = 1635;
SELECT * FROM users WHERE id = 1635;
select * from teams where id = 1;
select * from users where team_id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;
SELECT * FROM automated_reports where id = 71;
SELECT * FROM automated_report_results where report_id = 71;
UPDATE automated_reports set playbook_categories = NULL where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
SELECT `automated_report_results`.* FROM `automated_report_results`
INNER JOIN `automated_reports`
ON `automated_report_results`.`report_id` = `automated_reports`.`id`
WHERE 1=1
AND `automated_report_results`.`generated_at` IS NOT NULL
# AND `automated_report_results`.`sent_at` IS NOT NULL
AND `automated_reports`.`team_id` = 1
AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$."users"')
;
SELECT * FROM automated_reports where id = 67;
SELECT * FROM automated_reports where id = 42;
SELECT * FROM users WHERE id = 143; # group 28
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01';
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
select * from leads;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20157-AJ-report-not-send-notification, menu","depth":5,"help_text":"Git Branch: JY-20157-AJ-report-not-send-notification","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AutomatedReportsCommandTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AutomatedReportsCommandTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AutomatedReportsCommandTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"5","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active Ask Jiminny reports whose expiry date has passed.\n *\n * @return Collection<AutomatedReport>\n */\n public function getExpiredActiveAskJiminnyReports(): Collection\n {\n return AutomatedReport::where('status', true)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->whereNotNull('expires_at')\n ->where('expires_at', '<', now()->toDateString())\n ->get();\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function findLatestDefaultOrFailedResult(AutomatedReport $report): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n ->latest()\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where(fn (Builder $q) => $this->applyUserAccessScope($q, $user))\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n// ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n public function countAllUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n// ->whereNotNull('sent_at')\n ->whereHas('report', fn (Builder $q) => $this->applyUserAccessScope($q, $user))\n ->count();\n }\n\n /**\n * Restrict a query on the automated_reports table to reports the given user is allowed to see.\n *\n * Matches the customer-facing audience:\n * - explicit user recipients (recipients.users)\n * - members of any of the report's groups (Ask Jiminny reports)\n */\n private function applyUserAccessScope(Builder $query, User $user): void\n {\n $userId = $user->getId();\n $groupId = $user->getGroupId();\n\n $query\n ->where('automated_reports.team_id', $user->getTeamId())\n ->where(function (Builder $q) use ($userId, $groupId): void {\n $q->whereJsonContains('automated_reports.recipients->users', $userId);\n\n if ($groupId !== null) {\n $q->orWhere(function (Builder $sub) use ($groupId): void {\n $sub->where('automated_reports.type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->whereJsonContains('automated_reports.groups', $groupId);\n });\n }\n });\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active Ask Jiminny reports whose expiry date has passed.\n *\n * @return Collection<AutomatedReport>\n */\n public function getExpiredActiveAskJiminnyReports(): Collection\n {\n return AutomatedReport::where('status', true)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->whereNotNull('expires_at')\n ->where('expires_at', '<', now()->toDateString())\n ->get();\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function findLatestDefaultOrFailedResult(AutomatedReport $report): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n ->latest()\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where(fn (Builder $q) => $this->applyUserAccessScope($q, $user))\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n// ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n public function countAllUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n// ->whereNotNull('sent_at')\n ->whereHas('report', fn (Builder $q) => $this->applyUserAccessScope($q, $user))\n ->count();\n }\n\n /**\n * Restrict a query on the automated_reports table to reports the given user is allowed to see.\n *\n * Matches the customer-facing audience:\n * - explicit user recipients (recipients.users)\n * - members of any of the report's groups (Ask Jiminny reports)\n */\n private function applyUserAccessScope(Builder $query, User $user): void\n {\n $userId = $user->getId();\n $groupId = $user->getGroupId();\n\n $query\n ->where('automated_reports.team_id', $user->getTeamId())\n ->where(function (Builder $q) use ($userId, $groupId): void {\n $q->whereJsonContains('automated_reports.recipients->users', $userId);\n\n if ($groupId !== null) {\n $q->orWhere(function (Builder $sub) use ($groupId): void {\n $sub->where('automated_reports.type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->whereJsonContains('automated_reports.groups', $groupId);\n });\n }\n });\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"21","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8930591850780739440
|
-7004754253361834427
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20157-AJ-report-not-se Project: faVsco.js, menu
JY-20157-AJ-report-not-send-notification, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active Ask Jiminny reports whose expiry date has passed.
*
* @return Collection<AutomatedReport>
*/
public function getExpiredActiveAskJiminnyReports(): Collection
{
return AutomatedReport::where('status', true)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->whereNotNull('expires_at')
->where('expires_at', '<', now()->toDateString())
->get();
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function findLatestDefaultOrFailedResult(AutomatedReport $report): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
->latest()
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where(fn (Builder $q) => $this->applyUserAccessScope($q, $user))
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
// ->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
public function countAllUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
// ->whereNotNull('sent_at')
->whereHas('report', fn (Builder $q) => $this->applyUserAccessScope($q, $user))
->count();
}
/**
* Restrict a query on the automated_reports table to reports the given user is allowed to see.
*
* Matches the customer-facing audience:
* - explicit user recipients (recipients.users)
* - members of any of the report's groups (Ask Jiminny reports)
*/
private function applyUserAccessScope(Builder $query, User $user): void
{
$userId = $user->getId();
$groupId = $user->getGroupId();
$query
->where('automated_reports.team_id', $user->getTeamId())
->where(function (Builder $q) use ($userId, $groupId): void {
$q->whereJsonContains('automated_reports.recipients->users', $userId);
if ($groupId !== null) {
$q->orWhere(function (Builder $sub) use ($groupId): void {
$sub->where('automated_reports.type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->whereJsonContains('automated_reports.groups', $groupId);
});
}
});
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
21
1
17
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id
where u.team_id = 1;
SELECT * FROM social_accounts WHERE sociable_id = 1635;
SELECT * FROM users WHERE id = 1635;
select * from teams where id = 1;
select * from users where team_id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;
SELECT * FROM automated_reports where id = 71;
SELECT * FROM automated_report_results where report_id = 71;
UPDATE automated_reports set playbook_categories = NULL where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
SELECT `automated_report_results`.* FROM `automated_report_results`
INNER JOIN `automated_reports`
ON `automated_report_results`.`report_id` = `automated_reports`.`id`
WHERE 1=1
AND `automated_report_results`.`generated_at` IS NOT NULL
# AND `automated_report_results`.`sent_at` IS NOT NULL
AND `automated_reports`.`team_id` = 1
AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$."users"')
;
SELECT * FROM automated_reports where id = 67;
SELECT * FROM automated_reports where id = 42;
SELECT * FROM users WHERE id = 143; # group 28
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01';
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
select * from leads;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
23609
|
509
|
57
|
2026-04-15T11:27:34.363815+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776252454363_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
19783620192612590/110Imperial Age--Warning: You ar 19783620192612590/110Imperial Age--Warning: You are being attacked byPlayer 7 Basil the Macedonian!!!--Click to select this military unit.8 Ashikaga Takauji: 19239/19239Anccu Hualloc: 17698/176987 Basil the Macedonian: 17486/174861 kovaliklukas: 13381/133813 Pird Jaguar: 5087/5087 €4 Siddhraj Jaisingh: 4252/42525 Monorius: 4037/4037NVIVIVIV...
|
NULL
|
-8930193360085030965
|
NULL
|
click
|
ocr
|
NULL
|
19783620192612590/110Imperial Age--Warning: You ar 19783620192612590/110Imperial Age--Warning: You are being attacked byPlayer 7 Basil the Macedonian!!!--Click to select this military unit.8 Ashikaga Takauji: 19239/19239Anccu Hualloc: 17698/176987 Basil the Macedonian: 17486/174861 kovaliklukas: 13381/133813 Pird Jaguar: 5087/5087 €4 Siddhraj Jaisingh: 4252/42525 Monorius: 4037/4037NVIVIVIV...
|
23607
|
|
51720
|
1119
|
61
|
2026-04-20T06:19:31.365732+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776665971365_m2.jpg...
|
Firefox
|
Screenpipe — Archive — Personal
|
True
|
http://192.168.0.242:8766
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Stantek
stantek.com
DXP4800PLUS-B5F8
Статус на пор Stantek
stantek.com
DXP4800PLUS-B5F8
Статус на поръчка в stantek.com - [EMAIL] - Gmail
Stantek
Stantek
Close tab
Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com
Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com
| Senetic
| Senetic
Stantek
Stantek
| Senetic
| Senetic
Твърд диск, Western Digital Red 6TB Plus ( 3.5", 256MB, 5400
Твърд диск, Western Digital Red 6TB Plus ( 3.5", 256MB, 5400
SQLite Web: db.sqlite
SQLite Web: db.sqlite
Screenpipe — Archive
Screenpipe — Archive
Problem loading page
Problem loading page
Welcome to Steam
Welcome to Steam
(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube
(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube
New Tab
New Tab
Today's Deals
Today's Deals
New Tab
New Tab
Shameless • HBO Max
Shameless • HBO Max
GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub
GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub
install screenpipe - screenpipe docs
install screenpipe - screenpipe docs
New Tab
New Tab
Notion
Notion
Screenpipe — Archive
Screenpipe — Archive
Close tab
SQLite Web: db.sqlite
SQLite Web: db.sqlite
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 3037.7MB]
Screenpipe
[archive.db · 3037.7MB]
Activity
Search
Audio
Work Report
AI Summary
Date
16
/
04
/
2026
Calendar
JY 20543
Search
Source
App
Date
16
/
04
/
2026
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
Comma-separated. Show only results from these apps.
Skip apps
Comma-separated. Hide results from these apps.
FTS tip: single words work best · "exact phrase" · term1 OR term2 · Click any result to expand
36 results
▶ video
20:21
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 2 new items -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
20:21
Screen
...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
18:14
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
18:09
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
18:09
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
17:47
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:47
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
17:47
Screen
...reactionLukas KovalikздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:46
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
17:46
Screen
...01 PMздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:46
Screen
...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
15:31
Screen
...Your day was dominated by
JY
-
20543
(UserPilot tracking for Ask Jiminny reports),with code review on 3 PRs and monitoring related pipeline runs.? for shortcuts
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
Back Work Work Edit profile Other profiles Other profiles Personal New profile Copy this profile Manage profiles Jira Service-Desk - Queues - Platform team - Service space - Jira
JY
-
20543
add AJ..
… (click to expand)
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
...Monitor Get data breach alerts Monitor Get data breach alerts Jira Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app CircleCI Sentry Jiminny...
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
Jira Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inbox (1,565) -
EMAIL
- Jiminny Mail New...
▶ video
15:21
Screen
Slack
/ Jira Cloud (DM) - Jiminny Inc - 2 new items - Slac
...Dimitrova updated the description of a Story you are assigned to
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Backlog Type: Story SackFileEditViewHistoryWindowHelpS
… (click to expand)
▶ video
14:17
Screen
Firefox
/ Jira — Work
jiminny.atlassian.net/jira/software/c/projects/JY/boards/37
Jira
JY
-20692
Issue with reconnecting Zoho - Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inb
… (click to expand)
▶ video
14:15
Screen
Firefox
/ [JY-20692] Issue with reconnecting Zoho - Jira — W
jiminny.atlassian.net/browse/JY-20692
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY
-20692
Issue with reconnecting Zoho - Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny...
▶ video...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Stantek","depth":4,"bounds":{"left":0.11768617,"top":0.102553874,"width":0.01412899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"stantek.com","depth":4,"bounds":{"left":0.11768617,"top":0.11332801,"width":0.02144282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.05501995,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Статус на поръчка в stantek.com - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.056848403,"top":0.0518755,"width":0.05501995,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Stantek","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Stantek","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.013297873,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.10139628,"top":0.10215483,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.26263297,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"| Senetic","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"| Senetic","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Stantek","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Stantek","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.013297873,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"| Senetic","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"| Senetic","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Твърд диск, Western Digital Red 6TB Plus ( 3.5\", 256MB, 5400","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Твърд диск, Western Digital Red 6TB Plus ( 3.5\", 256MB, 5400","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.10987367,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SQLite Web: db.sqlite","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SQLite Web: db.sqlite","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.03756649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.037898935,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Problem loading page","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Problem loading page","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.037898935,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Welcome to Steam","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Welcome to Steam","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.032579787,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.16323139,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Today's Deals","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today's Deals","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.024102394,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.5203512,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.53152436,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"bounds":{"left":0.0,"top":0.55307263,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"bounds":{"left":0.013297873,"top":0.5642458,"width":0.03873005,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub","depth":4,"bounds":{"left":0.0,"top":0.5857941,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub","depth":5,"bounds":{"left":0.013297873,"top":0.5969673,"width":0.22556517,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"install screenpipe - screenpipe docs","depth":4,"bounds":{"left":0.0,"top":0.61851555,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"install screenpipe - screenpipe docs","depth":5,"bounds":{"left":0.013297873,"top":0.62968874,"width":0.0631649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.651237,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.6624102,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Notion","depth":4,"bounds":{"left":0.0,"top":0.6839585,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Notion","depth":5,"bounds":{"left":0.013297873,"top":0.69513166,"width":0.011469414,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.0,"top":0.71668,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.013297873,"top":0.7278532,"width":0.037898935,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.10139628,"top":0.7238627,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SQLite Web: db.sqlite","depth":4,"bounds":{"left":0.0,"top":0.74940145,"width":0.113696806,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SQLite Web: db.sqlite","depth":5,"bounds":{"left":0.013297873,"top":0.76057464,"width":0.03756649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.78371906,"width":0.108211435,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe [archive.db · 3037.7MB]","depth":7,"bounds":{"left":0.12034574,"top":0.061452515,"width":0.06499335,"height":0.017956903},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"bounds":{"left":0.12034574,"top":0.06304868,"width":0.027759308,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[archive.db · 3037.7MB]","depth":9,"bounds":{"left":0.14943483,"top":0.06703911,"width":0.035904255,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"bounds":{"left":0.18999335,"top":0.059856344,"width":0.024933511,"height":0.0207502},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"bounds":{"left":0.21559176,"top":0.059856344,"width":0.023603724,"height":0.0207502},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"bounds":{"left":0.23986037,"top":0.059856344,"width":0.021110373,"height":0.0207502},"help_text":"No audio data in this database","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"bounds":{"left":0.26163563,"top":0.059856344,"width":0.034906916,"height":0.0207502},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"bounds":{"left":0.29720744,"top":0.059856344,"width":0.034242023,"height":0.0207502},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"bounds":{"left":0.93849736,"top":0.0650439,"width":0.008144947,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16","depth":9,"bounds":{"left":0.9552859,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.96110374,"top":0.06464485,"width":0.0023271276,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"bounds":{"left":0.9644282,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.970246,"top":0.06464485,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"bounds":{"left":0.9737367,"top":0.06464485,"width":0.009474734,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"bounds":{"left":0.98454124,"top":0.0650439,"width":0.0051529254,"height":0.010774142},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"JY 20543","depth":8,"bounds":{"left":0.35239363,"top":0.11412609,"width":0.38131648,"height":0.025538707},"value":"JY 20543","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":8,"bounds":{"left":0.73636967,"top":0.11412609,"width":0.024933511,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Source","depth":9,"bounds":{"left":0.35239363,"top":0.15403032,"width":0.012300532,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App","depth":9,"bounds":{"left":0.4401596,"top":0.15403032,"width":0.006981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Date","depth":9,"bounds":{"left":0.49900267,"top":0.15403032,"width":0.008144947,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16","depth":10,"bounds":{"left":0.51379657,"top":0.15363128,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"bounds":{"left":0.51961434,"top":0.15363128,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":10,"bounds":{"left":0.523105,"top":0.15363128,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"bounds":{"left":0.5287567,"top":0.15363128,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":10,"bounds":{"left":0.53224736,"top":0.15363128,"width":0.009640957,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":9,"bounds":{"left":0.54305184,"top":0.15403032,"width":0.005319149,"height":0.010774142},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(blank = all dates)","depth":9,"bounds":{"left":0.55452126,"top":0.15442938,"width":0.028756648,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"From","depth":9,"bounds":{"left":0.5859375,"top":0.15403032,"width":0.008976064,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.6015625,"top":0.15363128,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"bounds":{"left":0.6072141,"top":0.15363128,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.6107048,"top":0.15363128,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To","depth":9,"bounds":{"left":0.63015294,"top":0.15403032,"width":0.004155585,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.6409575,"top":0.15363128,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"bounds":{"left":0.64660907,"top":0.15363128,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.65009975,"top":0.15363128,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Only apps","depth":9,"bounds":{"left":0.35239363,"top":0.18316041,"width":0.017453458,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Comma-separated. Show only results from these apps.","depth":8,"bounds":{"left":0.37250665,"top":0.17557861,"width":0.06648936,"height":0.025538707},"help_text":"","placeholder":"Slack, Firefox… (blank = all)","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip apps","depth":9,"bounds":{"left":0.44431517,"top":0.18316041,"width":0.017121011,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Comma-separated. Hide results from these apps.","depth":8,"bounds":{"left":0.46409574,"top":0.17557861,"width":0.06648936,"height":0.025538707},"help_text":"","placeholder":"Finder, System Preferences…","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"FTS tip: single words work best · \"exact phrase\" · term1 OR term2 · Click any result to expand","depth":9,"bounds":{"left":0.35239363,"top":0.20710295,"width":0.16206782,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"36 results","depth":10,"bounds":{"left":0.3537234,"top":0.2601756,"width":0.017453458,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.3048683,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20:21","depth":11,"bounds":{"left":0.3899601,"top":0.28850758,"width":0.009640957,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":0.29010376,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":12,"bounds":{"left":0.41572472,"top":0.28850758,"width":0.010139627,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Galya Dimitrova (DM) - Jiminny Inc - 2 new items -","depth":11,"bounds":{"left":0.4270279,"top":0.28850758,"width":0.08992686,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Та ще трябва да се добави още един и да се добави и в кода","depth":11,"bounds":{"left":0.3899601,"top":0.30606544,"width":0.13314494,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5234375,"top":0.30606544,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.52892286,"top":0.30606544,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.53125,"top":0.30606544,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":11,"bounds":{"left":0.54488033,"top":0.30606544,"width":0.046875,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.59208775,"top":0.30606544,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.59757316,"top":0.30606544,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.59990025,"top":0.30606544,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking Status: Closed Type: Story Assignee...","depth":11,"bounds":{"left":0.6136968,"top":0.30606544,"width":0.12367021,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.3719074,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20:21","depth":11,"bounds":{"left":0.3899601,"top":0.35554668,"width":0.009640957,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":0.35714287,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3899601,"top":0.37310454,"width":0.18916224,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5794548,"top":0.37310454,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.58494014,"top":0.37310454,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.5872673,"top":0.37310454,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.3899601,"top":0.37310454,"width":0.3543883,"height":0.028332002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.4425379,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18:14","depth":11,"bounds":{"left":0.3899601,"top":0.42617717,"width":0.00930851,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40259308,"top":0.42777336,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3899601,"top":0.44373503,"width":0.19365026,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.58394283,"top":0.44373503,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.5894282,"top":0.44373503,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.59175533,"top":0.44373503,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.3899601,"top":0.44373503,"width":0.35754654,"height":0.028332002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18:09","depth":11,"bounds":{"left":0.3567154,"top":0.49680766,"width":0.009807181,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.3698471,"top":0.49840382,"width":0.010305851,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3567154,"top":0.5143655,"width":0.19365026,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.55069816,"top":0.5143655,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.5561835,"top":0.5143655,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.55851066,"top":0.5143655,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.57214093,"top":0.5143655,"width":0.16605718,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.56823623,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18:09","depth":11,"bounds":{"left":0.3899601,"top":0.5518755,"width":0.009807181,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40309176,"top":0.5534717,"width":0.010305851,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":12,"bounds":{"left":0.41605717,"top":0.5518755,"width":0.010139627,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -","depth":11,"bounds":{"left":0.42719415,"top":0.5518755,"width":0.08759973,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Та ще трябва да се добави още един и да се добави и в кода","depth":11,"bounds":{"left":0.3899601,"top":0.56943333,"width":0.13314494,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5234375,"top":0.56943333,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.52892286,"top":0.56943333,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.53125,"top":0.56943333,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":11,"bounds":{"left":0.54488033,"top":0.56943333,"width":0.046875,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.59208775,"top":0.56943333,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.59757316,"top":0.56943333,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.59990025,"top":0.56943333,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking Status: Closed Type: Story Assignee...","depth":11,"bounds":{"left":0.6136968,"top":0.56943333,"width":0.12367021,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:47","depth":11,"bounds":{"left":0.3567154,"top":0.6189146,"width":0.00930851,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.3693484,"top":0.62051076,"width":0.010305851,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3567154,"top":0.63647246,"width":0.19365026,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.55069816,"top":0.63647246,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.5561835,"top":0.63647246,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.55851066,"top":0.63647246,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.57214093,"top":0.63647246,"width":0.16605718,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.6903432,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:47","depth":11,"bounds":{"left":0.3899601,"top":0.67398244,"width":0.00930851,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40259308,"top":0.6755786,"width":0.010305851,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":12,"bounds":{"left":0.41555852,"top":0.67398244,"width":0.010139627,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -","depth":11,"bounds":{"left":0.42669547,"top":0.67398244,"width":0.08759973,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Та ще трябва да се добави още един и да се добави и в кода","depth":11,"bounds":{"left":0.3899601,"top":0.6915403,"width":0.13314494,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5234375,"top":0.6915403,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.52892286,"top":0.6915403,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.53125,"top":0.6915403,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":11,"bounds":{"left":0.54488033,"top":0.6915403,"width":0.046875,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.59208775,"top":0.6915403,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.59757316,"top":0.6915403,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.59990025,"top":0.6915403,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking Status: Closed Type: Story Assignee...","depth":11,"bounds":{"left":0.6136968,"top":0.6915403,"width":0.12367021,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.7573823,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:47","depth":11,"bounds":{"left":0.3899601,"top":0.7410216,"width":0.00930851,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40259308,"top":0.7426177,"width":0.010305851,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...reactionLukas KovalikздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3899601,"top":0.75857943,"width":0.2122673,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.60255986,"top":0.75857943,"width":0.004986702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.607879,"top":0.75857943,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.6102061,"top":0.75857943,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.3899601,"top":0.75857943,"width":0.36519283,"height":0.028332002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.82801276,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:46","depth":11,"bounds":{"left":0.3899601,"top":0.81165206,"width":0.009640957,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":0.8132482,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":12,"bounds":{"left":0.41572472,"top":0.81165206,"width":0.010139627,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -","depth":11,"bounds":{"left":0.4270279,"top":0.81165206,"width":0.08759973,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Та ще трябва да се добави още един и да се добави и в кода","depth":11,"bounds":{"left":0.3899601,"top":0.8292099,"width":0.13314494,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5234375,"top":0.8292099,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.52892286,"top":0.8292099,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.53125,"top":0.8292099,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":11,"bounds":{"left":0.54488033,"top":0.8292099,"width":0.046875,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.59208775,"top":0.8292099,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.59757316,"top":0.8292099,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.59990025,"top":0.8292099,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking Status: Closed Type: Story Assignee...","depth":11,"bounds":{"left":0.6136968,"top":0.8292099,"width":0.12367021,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.8950519,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:46","depth":11,"bounds":{"left":0.3899601,"top":0.87869114,"width":0.009640957,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":0.8802873,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...01 PMздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3899601,"top":0.896249,"width":0.18085106,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5711436,"top":0.896249,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.576629,"top":0.896249,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.5789561,"top":0.896249,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.3899601,"top":0.896249,"width":0.36070478,"height":0.028332002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":0.9656824,"width":0.012300532,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:46","depth":11,"bounds":{"left":0.3899601,"top":0.9493216,"width":0.009640957,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":0.9509178,"width":0.010139627,"height":0.008778931},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/","depth":11,"bounds":{"left":0.3899601,"top":0.9668795,"width":0.18916224,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.5794548,"top":0.9668795,"width":0.0051529254,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.58494014,"top":0.9668795,"width":0.0019946808,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.5872673,"top":0.9668795,"width":0.013297873,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...","depth":11,"bounds":{"left":0.3899601,"top":0.9668795,"width":0.35305852,"height":0.028332002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.36552528,"top":1.0,"width":0.012300532,"height":-0.03631282},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:31","depth":11,"bounds":{"left":0.3899601,"top":1.0,"width":0.009142287,"height":-0.019952059},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40242687,"top":1.0,"width":0.010139627,"height":-0.021548271},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Your day was dominated by","depth":11,"bounds":{"left":0.3899601,"top":1.0,"width":0.059840426,"height":-0.03750992},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"bounds":{"left":0.45013297,"top":1.0,"width":0.004986702,"height":-0.03750992},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"bounds":{"left":0.4554521,"top":1.0,"width":0.0019946808,"height":-0.03750992},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"bounds":{"left":0.45777926,"top":1.0,"width":0.013464096,"height":-0.03750992},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(UserPilot tracking for Ask Jiminny reports),with code review on 3 PRs and monitoring related pipeline runs.? for shortcuts","depth":11,"bounds":{"left":0.4715758,"top":1.0,"width":0.24617687,"height":-0.03750992},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:29","depth":11,"bounds":{"left":0.3899601,"top":1.0,"width":0.009640957,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.40292552,"top":1.0,"width":0.010305851,"height":-0.0885874},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.41589096,"top":1.0,"width":0.012799202,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Work — Mozilla Firefox","depth":11,"bounds":{"left":0.4296875,"top":1.0,"width":0.04155585,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Back Work Work Edit profile Other profiles Other profiles Personal New profile Copy this profile Manage profiles Jira Service-Desk - Queues - Platform team - Service space - Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"add AJ..","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:29","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Work — Mozilla Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Monitor Get data breach alerts Monitor Get data breach alerts Jira Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app CircleCI Sentry Jiminny...","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:29","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Work — Mozilla Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jira Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inbox (1,565) -","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"EMAIL","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"- Jiminny Mail New...","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:21","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Jira Cloud (DM) - Jiminny Inc - 2 new items - Slac","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...Dimitrova updated the description of a Story you are assigned to","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AJ Reports > Tracking Status: Backlog Type: Story SackFileEditViewHistoryWindowHelpS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:17","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ Jira — Work","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"jiminny.atlassian.net/jira/software/c/projects/JY/boards/37","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-20692","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue with reconnecting Zoho - Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inb","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:15","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ [JY-20692] Issue with reconnecting Zoho - Jira — W","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"jiminny.atlassian.net/browse/JY-20692","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-20692","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue with reconnecting Zoho - Jira","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20543","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny...","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8930097729759511681
|
8551611671295900747
|
visual_change
|
accessibility
|
NULL
|
Stantek
stantek.com
DXP4800PLUS-B5F8
Статус на пор Stantek
stantek.com
DXP4800PLUS-B5F8
Статус на поръчка в stantek.com - [EMAIL] - Gmail
Stantek
Stantek
Close tab
Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com
Western Digital Red Plus 3.5 6TB 5400rpm 256MB SATA3 (WD60EFPX) от 241,72 € (472,76 лв.) Вътрешен хард диск Western Digital - Pazaruvaj.com
| Senetic
| Senetic
Stantek
Stantek
| Senetic
| Senetic
Твърд диск, Western Digital Red 6TB Plus ( 3.5", 256MB, 5400
Твърд диск, Western Digital Red 6TB Plus ( 3.5", 256MB, 5400
SQLite Web: db.sqlite
SQLite Web: db.sqlite
Screenpipe — Archive
Screenpipe — Archive
Problem loading page
Problem loading page
Welcome to Steam
Welcome to Steam
(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube
(118) Neil deGrasse Tyson Confronts Andy Weir on the Science of Project Hail Mary - YouTube
New Tab
New Tab
Today's Deals
Today's Deals
New Tab
New Tab
Shameless • HBO Max
Shameless • HBO Max
GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub
GitHub - screenpipe/screenpipe: Run agents that work for you based on what you do. AI finally knows what you are doing · GitHub
install screenpipe - screenpipe docs
install screenpipe - screenpipe docs
New Tab
New Tab
Notion
Notion
Screenpipe — Archive
Screenpipe — Archive
Close tab
SQLite Web: db.sqlite
SQLite Web: db.sqlite
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 3037.7MB]
Screenpipe
[archive.db · 3037.7MB]
Activity
Search
Audio
Work Report
AI Summary
Date
16
/
04
/
2026
Calendar
JY 20543
Search
Source
App
Date
16
/
04
/
2026
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
Comma-separated. Show only results from these apps.
Skip apps
Comma-separated. Hide results from these apps.
FTS tip: single words work best · "exact phrase" · term1 OR term2 · Click any result to expand
36 results
▶ video
20:21
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 2 new items -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
20:21
Screen
...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
18:14
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
18:09
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
18:09
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
17:47
Screen
...го видяGalya Dimitrova5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:47
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
17:47
Screen
...reactionLukas KovalikздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:46
Screen
Slack
/ Galya Dimitrova (DM) - Jiminny Inc - 1 new item -
...Та ще трябва да се добави още един и да се добави и в кода
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Closed Type: Story Assignee...
▶ video
17:46
Screen
...01 PMздрастиW:Galya D.нещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
17:46
Screen
...видяGalya Dimitrova 5:34 PMнещо за като се върнеш -https://jiminny.atlassian.net/browse/
JY
-
20543
-тук трябваше да има отделен евент за AJReport и отделен за Ехес Report. А...
▶ video
15:31
Screen
...Your day was dominated by
JY
-
20543
(UserPilot tracking for Ask Jiminny reports),with code review on 3 PRs and monitoring related pipeline runs.? for shortcuts
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
Back Work Work Edit profile Other profiles Other profiles Personal New profile Copy this profile Manage profiles Jira Service-Desk - Queues - Platform team - Service space - Jira
JY
-
20543
add AJ..
… (click to expand)
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
...Monitor Get data breach alerts Monitor Get data breach alerts Jira Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app CircleCI Sentry Jiminny...
▶ video
15:29
Screen
Firefox
/ Work — Mozilla Firefox
Jira Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inbox (1,565) -
EMAIL
- Jiminny Mail New...
▶ video
15:21
Screen
Slack
/ Jira Cloud (DM) - Jiminny Inc - 2 new items - Slac
...Dimitrova updated the description of a Story you are assigned to
JY
-
20543
AJ Reports > Tracking
JY
-
20543
AJ Reports > Tracking Status: Backlog Type: Story SackFileEditViewHistoryWindowHelpS
… (click to expand)
▶ video
14:17
Screen
Firefox
/ Jira — Work
jiminny.atlassian.net/jira/software/c/projects/JY/boards/37
Jira
JY
-20692
Issue with reconnecting Zoho - Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app Pipelines - jiminny/app Feed — jiminny — Sentry Inb
… (click to expand)
▶ video
14:15
Screen
Firefox
/ [JY-20692] Issue with reconnecting Zoho - Jira — W
jiminny.atlassian.net/browse/JY-20692
Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY
-20692
Issue with reconnecting Zoho - Jira
JY
-
20543
add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny...
▶ video...
|
51718
|
|
9759
|
186
|
59
|
2026-04-14T07:50:10.259897+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776153010259_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpSupport Daily - in 4 h 10 m100% C4Tue 14 Apr 10:50:10•DOCKER• 881DEV (-zsh)282APP (-zsh)*3ec2-user@ip-10-30-93-249:-ec2-user@ip-10-30-... 24885-zsh86-zshO x7* Unable to acce...O 88DriversBroadcastingCacheDatabaseLogsMailQueueSessionpusherredismysqlerrorlogsessqsredisStoragepublic/storageNOT LINKEDSentryEnabledEnvironmentLaravel SDKVersionPHP SDK VersionReleaseSample Rate ErrorsSample Rate Performance MonitoringSample Rate ProfilingSend Default PIIYESstaging4.13.04.13.0869720100%NOT SETNOT SETDISABLEDroot@fee51d2e1f17:/home/jiminny#phpartisanautomated-reports[2026-04-14 07:48:51] staging.INF0: [automated-reports]Started{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb""trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]staging.INFO: [automated-reports]Checking conditions {"isMonday":false,"isFirstDay0fMonth":false, "currentMonth":4, "isQuarterlyMonth": true}id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb", "trace_id" : "bfe6b131-e3ad-4cfc-8954-5fblecfded81"}{"correlation_[2026-04-14 07:48:51] staging.INFO: [automated-reports] Processing daily reports{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb","trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]c-8954-5fb1ecfded81"}staging. INF0: [automated-reports] Found 2 daily reports to process{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb", "trace_id":"bfe6b131-e3ad-4cf[2026-04-14 07:48:51]staging.INFO: [automated-reports] Dispatching Generate Reportjob for report {"reportUuid": "fa7417aa-538e-49ab-8827-77235637a6f9", "teamId" :1, "frequency" : "daily", "type": "ask_jiminny"} {"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb"',"trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]staging.INFO: [automated-reports]Dispatching Generate Reportjob for report {"reportUuid":"63e6d70b-b7cb-4dfa-8443-53453e6c4054"daily", "type": "ask_jiminny"} {"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb"',"trace_id": "bfe6b131-e3ad-4cfc-8954-5fblecfded81"}"teamId" :1, "frequency":[2026-04-14 07:48:51] staging.INFO: [automated-reports] Completed{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb""trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}root@fee51d2e1f17:/home/jiminny#|...
|
NULL
|
-8929862578972121414
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpSupport Daily - in 4 h 10 m100% C4Tue 14 Apr 10:50:10•DOCKER• 881DEV (-zsh)282APP (-zsh)*3ec2-user@ip-10-30-93-249:-ec2-user@ip-10-30-... 24885-zsh86-zshO x7* Unable to acce...O 88DriversBroadcastingCacheDatabaseLogsMailQueueSessionpusherredismysqlerrorlogsessqsredisStoragepublic/storageNOT LINKEDSentryEnabledEnvironmentLaravel SDKVersionPHP SDK VersionReleaseSample Rate ErrorsSample Rate Performance MonitoringSample Rate ProfilingSend Default PIIYESstaging4.13.04.13.0869720100%NOT SETNOT SETDISABLEDroot@fee51d2e1f17:/home/jiminny#phpartisanautomated-reports[2026-04-14 07:48:51] staging.INF0: [automated-reports]Started{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb""trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]staging.INFO: [automated-reports]Checking conditions {"isMonday":false,"isFirstDay0fMonth":false, "currentMonth":4, "isQuarterlyMonth": true}id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb", "trace_id" : "bfe6b131-e3ad-4cfc-8954-5fblecfded81"}{"correlation_[2026-04-14 07:48:51] staging.INFO: [automated-reports] Processing daily reports{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb","trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]c-8954-5fb1ecfded81"}staging. INF0: [automated-reports] Found 2 daily reports to process{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb", "trace_id":"bfe6b131-e3ad-4cf[2026-04-14 07:48:51]staging.INFO: [automated-reports] Dispatching Generate Reportjob for report {"reportUuid": "fa7417aa-538e-49ab-8827-77235637a6f9", "teamId" :1, "frequency" : "daily", "type": "ask_jiminny"} {"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb"',"trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}[2026-04-14 07:48:51]staging.INFO: [automated-reports]Dispatching Generate Reportjob for report {"reportUuid":"63e6d70b-b7cb-4dfa-8443-53453e6c4054"daily", "type": "ask_jiminny"} {"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb"',"trace_id": "bfe6b131-e3ad-4cfc-8954-5fblecfded81"}"teamId" :1, "frequency":[2026-04-14 07:48:51] staging.INFO: [automated-reports] Completed{"correlation_id":"4c37ea47-eebd-4122-8c35-9d6b9d707beb""trace_id":"bfe6b131-e3ad-4cfc-8954-5fblecfded81"}root@fee51d2e1f17:/home/jiminny#|...
|
NULL
|
|
8632
|
167
|
28
|
2026-04-14T06:57:21.905574+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776149841905_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksPlatform Sprint FirefoxFileEoitViewHistoryBookmarksPlatform Sprint 1 Q2 - Platform Tea@ Jy 19798 evaluation for ai activity t(8 Jiminnyg Ask Jiminny test report - 8 Apr 20)M Inbox (1,540) - lukas.kovalik@j+ New labProfilesToolsWindowHelp1dll.eooele.com nalluo tinoox~ Google Geminisocc ce Cdcseciie3.Run: Executes the evaluation viaasyncio.run(run_evaluation(...)),which orchestrates the collection,endpoint calling, and result scoringoeses=MailChatMeetare there soem issueswith this PRShow thinking vYes, there are several issues and code smellsin this Pull Request, ranging from performancebottlenecks to architectural anti-patterns.Here is a breakdown of the most notableissues, categorized by impact:Performance & Async Anti-Patterns• Sequential Requests Defeating Async(Lines 86-106): Inside_collect_from_es, the code loopsthrough raw_samples and await sasession.post request for each sampleone by one. This means the script waitsfor one HTTP request to finish beforestarting the next, completely defeatingthe purpose of using aiohttp forasynchronous concurrency.• Fix: Collect these coroutines into alist and use asyncio.gather ()(ideally wrapped in anasyncio.Semaphore to avoidoverwhelming the endpoint) to run• Enter a prompt for GeminiPro vYour Jiminny chats aren't used to improve our models. Gemini is Alane can make mistakes, Inciualne aoout peodleYour privacy & GeminiSummarize pageM GmailComposeInboxStarred1,540onoozeeSentDraftsCategoriesPurchasesv MoreLabelsApp emailsGithubappextensionvuejs9.449215IvOlesSharedSentryUtilities100,15%Q Ask Gmail_ * Veselin .. sonarqub. 5• # steliyan., sonarqub. 3• & Datadog• # Google 2• # Datadog•# Datadog• # The Jiminny Team_ * Nikolay .. sonarqub. 4• # Datadog• * steliya.. sonarqu. 6• & steliyan., sonarqub. 21• * The Jiminny Team• * ilian-j... sonarqu. 7• & steliya.. claude[. 34• * noreply@salesforce..• # Google 2._ * The Jiminny Team• * Datadog• * Veselin .. sonarqub. 3• * github-actions[bot]• & Twilio_ * stellyan. .. Nikolay 16• * Atlassian• # Atlassian• # Salesforce• # Datadog* Veselin .. sonarqub. 3Enable desktop notifications for Jiminny Mail.OK No thankshhl| Daily - Platform • 8m leftA100% C8 • Tue 14 Apr 9:57:21*O JIMINNY1-50 of 25,263[jiminny/infrastructure] JY-20627 Increas cpu resources to default and processing-4 workers (PR #729) - Increase max task count on processing-4 to 40 Increase max ta...[jiminny/prophet] JY-20674: panorama pdf add header section (PR #467) - You can view, comment on, or merge this pull request online at: https:/github.com/jiminny/proph…..Your Weekly Digest from Datadog - The Weekly Datadog Digest for Jiminny, Inc. Here's what happened in Datadog since April 06. Metric Alerts 8 Total Events 8 Alerts Recover...Security alert - New sign-in to your account [EMAIL] We noticed a new sign-in to your Google Account. If this was you, you don't need to do anything. If not, .Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 10. Metric Alerts 5 Total Events 5 Alerts Recovered [Recovered] E...Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 09. Metric Alerts 4 Total Events 4 Alerts Recovered [Recovered] D...Your Ask Jiminny test report report is ready - Hi there, Your latest Ask Jiminny Report has been generated and is now available. Report details: Name: Ask Jiminny test report Peri....Por Ask Jiminny tes...[jiminny/prophet] Jy 19798 evaluation for ai activity types (PR #468) - You can view, comment on, or merge this pull request online at: [URL_WITH_CREDENTIALS] - Reply to this email directly, view i...[jiminny/prophet] JY020575: panorama reports absolute links (PR #466) - You can view, comment on, or merge this pull request online at: [URL_WITH_CREDENTIALS] pushed 1 commit. 44d1cad Update swagger-ui to v5.32.2 — View it on GitHu...Your Twilio account has been funded - We charged the Jiminny (Production) Credit Card (**** **** **** 6609) $4965.78 to bring the balance to -$217.51. Visit the Twilio Payme...[jiminny/prophet] JY-19982: Allow multiple LLM evals with one command run (PR #464) - eg python src/eval/eval-ask-anything-chat.py \ --steps run validate evaluate expo...YOur API oken s about to expire - Auassian ou Ap noken sabonco exore a ukas Kovalk YOUAPROKen Wun aoelfest aolexolesae4026-04-070000004UCOAVAre you our Rovo Competition winner!? - Votes are in! Here are your top Rovo demos Top ways real teams are using Rovo Al We asked how your teams are using Rovo Al in ...ATTENTION: Update to Communications for Certificate Rotations - Product & Service Notification What's changing? Salesforce is updating our communication policy regard...Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 06. Metric Alerts 3 Total Events 3 Alerts Recovered [Recovered] D...[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - You can view, comment on, or merge this pull request online at: https://github.com/jimi...Lukas Kovalik, here is your weekly update for 7 Apr - Your weekly update Space updates Check on 3 work items without updates for 28 days JY-20584 [BE] Change search report...9.33 AM8:55 AM1:37AMApr 11Apr 11Apr 10Apr 10Apr 9Apr9Apr 9Apr9Apr 9Apr 9Apr 9Apr 9Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 7Apr 7Apr 7Apr 7...
|
NULL
|
-8929639708441075266
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEoitViewHistoryBookmarksPlatform Sprint FirefoxFileEoitViewHistoryBookmarksPlatform Sprint 1 Q2 - Platform Tea@ Jy 19798 evaluation for ai activity t(8 Jiminnyg Ask Jiminny test report - 8 Apr 20)M Inbox (1,540) - lukas.kovalik@j+ New labProfilesToolsWindowHelp1dll.eooele.com nalluo tinoox~ Google Geminisocc ce Cdcseciie3.Run: Executes the evaluation viaasyncio.run(run_evaluation(...)),which orchestrates the collection,endpoint calling, and result scoringoeses=MailChatMeetare there soem issueswith this PRShow thinking vYes, there are several issues and code smellsin this Pull Request, ranging from performancebottlenecks to architectural anti-patterns.Here is a breakdown of the most notableissues, categorized by impact:Performance & Async Anti-Patterns• Sequential Requests Defeating Async(Lines 86-106): Inside_collect_from_es, the code loopsthrough raw_samples and await sasession.post request for each sampleone by one. This means the script waitsfor one HTTP request to finish beforestarting the next, completely defeatingthe purpose of using aiohttp forasynchronous concurrency.• Fix: Collect these coroutines into alist and use asyncio.gather ()(ideally wrapped in anasyncio.Semaphore to avoidoverwhelming the endpoint) to run• Enter a prompt for GeminiPro vYour Jiminny chats aren't used to improve our models. Gemini is Alane can make mistakes, Inciualne aoout peodleYour privacy & GeminiSummarize pageM GmailComposeInboxStarred1,540onoozeeSentDraftsCategoriesPurchasesv MoreLabelsApp emailsGithubappextensionvuejs9.449215IvOlesSharedSentryUtilities100,15%Q Ask Gmail_ * Veselin .. sonarqub. 5• # steliyan., sonarqub. 3• & Datadog• # Google 2• # Datadog•# Datadog• # The Jiminny Team_ * Nikolay .. sonarqub. 4• # Datadog• * steliya.. sonarqu. 6• & steliyan., sonarqub. 21• * The Jiminny Team• * ilian-j... sonarqu. 7• & steliya.. claude[. 34• * noreply@salesforce..• # Google 2._ * The Jiminny Team• * Datadog• * Veselin .. sonarqub. 3• * github-actions[bot]• & Twilio_ * stellyan. .. Nikolay 16• * Atlassian• # Atlassian• # Salesforce• # Datadog* Veselin .. sonarqub. 3Enable desktop notifications for Jiminny Mail.OK No thankshhl| Daily - Platform • 8m leftA100% C8 • Tue 14 Apr 9:57:21*O JIMINNY1-50 of 25,263[jiminny/infrastructure] JY-20627 Increas cpu resources to default and processing-4 workers (PR #729) - Increase max task count on processing-4 to 40 Increase max ta...[jiminny/prophet] JY-20674: panorama pdf add header section (PR #467) - You can view, comment on, or merge this pull request online at: https:/github.com/jiminny/proph…..Your Weekly Digest from Datadog - The Weekly Datadog Digest for Jiminny, Inc. Here's what happened in Datadog since April 06. Metric Alerts 8 Total Events 8 Alerts Recover...Security alert - New sign-in to your account [EMAIL] We noticed a new sign-in to your Google Account. If this was you, you don't need to do anything. If not, .Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 10. Metric Alerts 5 Total Events 5 Alerts Recovered [Recovered] E...Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 09. Metric Alerts 4 Total Events 4 Alerts Recovered [Recovered] D...Your Ask Jiminny test report report is ready - Hi there, Your latest Ask Jiminny Report has been generated and is now available. Report details: Name: Ask Jiminny test report Peri....Por Ask Jiminny tes...[jiminny/prophet] Jy 19798 evaluation for ai activity types (PR #468) - You can view, comment on, or merge this pull request online at: [URL_WITH_CREDENTIALS] - Reply to this email directly, view i...[jiminny/prophet] JY020575: panorama reports absolute links (PR #466) - You can view, comment on, or merge this pull request online at: [URL_WITH_CREDENTIALS] pushed 1 commit. 44d1cad Update swagger-ui to v5.32.2 — View it on GitHu...Your Twilio account has been funded - We charged the Jiminny (Production) Credit Card (**** **** **** 6609) $4965.78 to bring the balance to -$217.51. Visit the Twilio Payme...[jiminny/prophet] JY-19982: Allow multiple LLM evals with one command run (PR #464) - eg python src/eval/eval-ask-anything-chat.py \ --steps run validate evaluate expo...YOur API oken s about to expire - Auassian ou Ap noken sabonco exore a ukas Kovalk YOUAPROKen Wun aoelfest aolexolesae4026-04-070000004UCOAVAre you our Rovo Competition winner!? - Votes are in! Here are your top Rovo demos Top ways real teams are using Rovo Al We asked how your teams are using Rovo Al in ...ATTENTION: Update to Communications for Certificate Rotations - Product & Service Notification What's changing? Salesforce is updating our communication policy regard...Your Daily Digest from Datadog - The Daily Digest for Jiminny, Inc. Here's what happened in Datadog on April 06. Metric Alerts 3 Total Events 3 Alerts Recovered [Recovered] D...[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - You can view, comment on, or merge this pull request online at: https://github.com/jimi...Lukas Kovalik, here is your weekly update for 7 Apr - Your weekly update Space updates Check on 3 work items without updates for 28 days JY-20584 [BE] Change search report...9.33 AM8:55 AM1:37AMApr 11Apr 11Apr 10Apr 10Apr 9Apr9Apr 9Apr9Apr 9Apr 9Apr 9Apr 9Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 8Apr 7Apr 7Apr 7Apr 7...
|
NULL
|
|
33913
|
684
|
36
|
2026-04-16T08:13:55.094807+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776327235094_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
ClaudeFileEditViewWindowHelp=app.staging.jiminny.c ClaudeFileEditViewWindowHelp=app.staging.jiminny.com/connect/zohocrm7 Jiminny x Shiji - Reconnecting theZ For you - Confluence® Lukas Kovalik - Time Offu Product Growth Plattorm Userpilou Userpilottix(security): composer depender8 JiminnyNew Taba Jiminny© Google1 ntegrationAccessor Memorane sJiminny • Membrane+ New TabJIMINNYJY-18909-automated-reports-ask-iiminny = 871913Account discIt looks like your Zoho CRM accouPlease re-connectcon Sign in with0000, Chat := </>+ New chat5 Projectse Customize80 ArtifactsFinneeBulgarian citizenship application processDawarich location tracking pro ectLinux SQLite Ul for NASClaude API 500 internal server errorScreenpipe query capabilities and usageeGPU compatibility with Mac mini and StiUnderstanding OpenRouter API gatewayScreenpipe 14-day retention explainedReddit homepage feed overviewDocker containar not viciale in concoleDIA browser RAM configurationscreenpipe company oackgroundDSK bank Bulgarla secure investing explaBuilding a comprehensive personal homeImporting Google Timeline data to OwntrChromecast remote volume buttons notScreenpipe free version guideSat-nocterl Maltarnativas to calidesScreenpipe database query setupRunning screenpipe for freeMac stualo network switeh setupClaude extension in Vivaldi browserUpdated to 1.2773.0ke aunchto aooyRelaunch.Ukas KovalikC40MOjSupport Daily • in 3h 47 mA100% [45.8 • Thu 16 Apr 11:13:54* Hey there, LukasHow can I help you today?+Sonnet 4.68 WriteOrLearn* codeLife stuff. rrem Drive...
|
NULL
|
-8929526356134517766
|
NULL
|
visual_change
|
ocr
|
NULL
|
ClaudeFileEditViewWindowHelp=app.staging.jiminny.c ClaudeFileEditViewWindowHelp=app.staging.jiminny.com/connect/zohocrm7 Jiminny x Shiji - Reconnecting theZ For you - Confluence® Lukas Kovalik - Time Offu Product Growth Plattorm Userpilou Userpilottix(security): composer depender8 JiminnyNew Taba Jiminny© Google1 ntegrationAccessor Memorane sJiminny • Membrane+ New TabJIMINNYJY-18909-automated-reports-ask-iiminny = 871913Account discIt looks like your Zoho CRM accouPlease re-connectcon Sign in with0000, Chat := </>+ New chat5 Projectse Customize80 ArtifactsFinneeBulgarian citizenship application processDawarich location tracking pro ectLinux SQLite Ul for NASClaude API 500 internal server errorScreenpipe query capabilities and usageeGPU compatibility with Mac mini and StiUnderstanding OpenRouter API gatewayScreenpipe 14-day retention explainedReddit homepage feed overviewDocker containar not viciale in concoleDIA browser RAM configurationscreenpipe company oackgroundDSK bank Bulgarla secure investing explaBuilding a comprehensive personal homeImporting Google Timeline data to OwntrChromecast remote volume buttons notScreenpipe free version guideSat-nocterl Maltarnativas to calidesScreenpipe database query setupRunning screenpipe for freeMac stualo network switeh setupClaude extension in Vivaldi browserUpdated to 1.2773.0ke aunchto aooyRelaunch.Ukas KovalikC40MOjSupport Daily • in 3h 47 mA100% [45.8 • Thu 16 Apr 11:13:54* Hey there, LukasHow can I help you today?+Sonnet 4.68 WriteOrLearn* codeLife stuff. rrem Drive...
|
NULL
|
|
15257
|
342
|
13
|
2026-04-14T14:33:35.835718+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776177215835_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfiles→CTools FirefoxFileEditViewHistoryBookmarksProfiles→CToolsWindowHelpmeet.google.com/bdj-nvho-brg Retro - Platform • 42 m left100% <78 • Tue 14 Apr 17:33:35dilminny.com32:43005Aneliya AngelovaNikolay YankovSteliyan GeorgievNikolay IvanovLukas Kovalik5:33 PM | Retro - PlatformSộ3...
|
NULL
|
-8929262378406010814
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfiles→CTools FirefoxFileEditViewHistoryBookmarksProfiles→CToolsWindowHelpmeet.google.com/bdj-nvho-brg Retro - Platform • 42 m left100% <78 • Tue 14 Apr 17:33:35dilminny.com32:43005Aneliya AngelovaNikolay YankovSteliyan GeorgievNikolay IvanovLukas Kovalik5:33 PM | Retro - PlatformSộ3...
|
15256
|
|
58411
|
1256
|
12
|
2026-04-20T12:45:54.811254+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776689154811_m1.jpg...
|
PhpStorm
|
PhpStorm
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksToolsWindowHelp FirefoxFileEditViewHistoryBookmarksToolsWindowHelpmeet.google.com/cxs-eips-npt?authuser=0Nikolay Nikolov (Presenting, annotating)100% 18• Mon 20 Apr 15:45:547PhpStormProject vImportContactButch.phpImportOpportunityßutch.phpSyncContact.phpService TraitsOpportunitySyncTrait.php 20.04.26,© SyncOrmEntities Trait. php 20.04.26SyncFieids Trait.php 23.03.26, 10.50© WetteCrmTrait,.php 20.04.26, M:16, 2:> E UtisSyncOrmEntiies Trait.phpService.phpSymcAccount.php© SyncProfieOpportunities.phpDSyncOpportunities.Job.phpOpportunitySyncTralt.phptrait SyncCrnEntitiesTraitpublic function inportContactBatchByIds(array Scralds): arraySallContacts = [):© ButchSyncCollector.php 20.04.28, 14.36© BatchSyncRedisService.php 23.03.26© Cient.php 23.03.28, 10.59, 29.58 kв© CiosedDealStagesService.php 23.03.21© DealFieidsService.php 23.03.26,10.59.© DecorateActiViky.php 23.03.20, 10.59, 3© FieldDeffnitions.php 23.03.26, 10-59, 3.2FieidTypeConverter.php 23.03.20, 10.51® HubspotClentihterface.php 23.03.26© HubspotTokenManager.php 23.03.26,© PayioadBullder.php 23.03.26, 10:50, 23.GRemoteOrmObjectManipulator.php 23ResponseNormalze.php 23.03.20, 103© Service php 20.043© SyncFieidAction.php 23.03.26, 10.59,13© SyncRelatedActivityManager.php 20.g©WebhookSyncBatchProcessor.php agU SyncHubspotObjectsTest.testHandleWthN.y y Test Resuitv 1 test passed 1 test total, 24ms/opt/honebrew/Cellar/php/8.3.4/bin/phpTesting started at 11:54 ...PHPUnit 11.5.55 by Sebastian Bergnann aPHP 8.3.4Tine: 00:00.298, Menory: 109.50 MBforeach (array_chunk(Scraids,Mngthe self::BATCH_SIZE) as Schunk) 4try &Scontacts « Sthis->client->getContactsByIds(Schunk, Sfields):foreach (Scontacts as ScontactData) (SallContacts(] • ScontactDato;} catch (\Throwable $e) 41/ @t000 what witt happen if this exception is thrownSthis->logger-saarning(*[* • Sthis-›getDisplaykane -*Batch contact fetch f*error* = Se->getMessageo,D:Sfetchedids • array_nap( calbacke 'Stcval', array_column(SallContacts, columnkey: "1d")):SnotFoundids = array_valves(array_diff(array_nap(caliback'Atcval", Screids), Sfetchedid1f (l enpty(SnotFoundids)) {Sthis->logger->info(*['- Sthis->getDisplayNaneO*) Contact CRM IDs not found in"teanid' a Sthis->tean->getidO."notFoundCount" > |count (SnotFoundids),"notFoundids" = SnotFoundIds,"requestedCount" = (count(Scraids),"fetchedCount' *> |count(SallContacts),There was 1 PHPUnit test runner warningOapp › app › Services › Crm › Hubspot › ServiceTraits › ® SyncOrmEntilies Trait php > ® SyncCrnmerspooeoomb Sormou SorcenPHP. 8.3Mon 20 Apr 16:46U SyncHubspotObjectsTest.testHandlSyncedAt~vuranoomelcaooeSalesforce Batch Con+0 .mSalesforce bulk syncs use batch processing (Redis ProcessSatesorcthtmaroweeSingle record syncs remain unchangedOther providers (HubSpot, etc.) remain unchanged (still one-by-18Aneliya AngelovaStefka Stoyanova09Explored 2 flles and searched function syncOpportunities >Answer: Batching in syncOpportunities ()ProviderDetalls0 phpforeach (SsyncStrategy-»fetchOpportunities(...) as ShsOpporSbufferll - ShsOpportunity?11 (count(Sbuffer) › self::BATOH PROCESS_SIZE) € 11 €SsyncCount += Sthis-sprocessOpportunityBatch(SbutfeAXCHONTROL+ •CodeClaude Opus 4.52 othersNikolay NikolovSymfonyLF UTF-8G 4 spaces3:45 PM | [Platform] Refinement ®Lukas Kovalik44:06...
|
NULL
|
-8928993155479918954
|
NULL
|
click
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksToolsWindowHelp FirefoxFileEditViewHistoryBookmarksToolsWindowHelpmeet.google.com/cxs-eips-npt?authuser=0Nikolay Nikolov (Presenting, annotating)100% 18• Mon 20 Apr 15:45:547PhpStormProject vImportContactButch.phpImportOpportunityßutch.phpSyncContact.phpService TraitsOpportunitySyncTrait.php 20.04.26,© SyncOrmEntities Trait. php 20.04.26SyncFieids Trait.php 23.03.26, 10.50© WetteCrmTrait,.php 20.04.26, M:16, 2:> E UtisSyncOrmEntiies Trait.phpService.phpSymcAccount.php© SyncProfieOpportunities.phpDSyncOpportunities.Job.phpOpportunitySyncTralt.phptrait SyncCrnEntitiesTraitpublic function inportContactBatchByIds(array Scralds): arraySallContacts = [):© ButchSyncCollector.php 20.04.28, 14.36© BatchSyncRedisService.php 23.03.26© Cient.php 23.03.28, 10.59, 29.58 kв© CiosedDealStagesService.php 23.03.21© DealFieidsService.php 23.03.26,10.59.© DecorateActiViky.php 23.03.20, 10.59, 3© FieldDeffnitions.php 23.03.26, 10-59, 3.2FieidTypeConverter.php 23.03.20, 10.51® HubspotClentihterface.php 23.03.26© HubspotTokenManager.php 23.03.26,© PayioadBullder.php 23.03.26, 10:50, 23.GRemoteOrmObjectManipulator.php 23ResponseNormalze.php 23.03.20, 103© Service php 20.043© SyncFieidAction.php 23.03.26, 10.59,13© SyncRelatedActivityManager.php 20.g©WebhookSyncBatchProcessor.php agU SyncHubspotObjectsTest.testHandleWthN.y y Test Resuitv 1 test passed 1 test total, 24ms/opt/honebrew/Cellar/php/8.3.4/bin/phpTesting started at 11:54 ...PHPUnit 11.5.55 by Sebastian Bergnann aPHP 8.3.4Tine: 00:00.298, Menory: 109.50 MBforeach (array_chunk(Scraids,Mngthe self::BATCH_SIZE) as Schunk) 4try &Scontacts « Sthis->client->getContactsByIds(Schunk, Sfields):foreach (Scontacts as ScontactData) (SallContacts(] • ScontactDato;} catch (\Throwable $e) 41/ @t000 what witt happen if this exception is thrownSthis->logger-saarning(*[* • Sthis-›getDisplaykane -*Batch contact fetch f*error* = Se->getMessageo,D:Sfetchedids • array_nap( calbacke 'Stcval', array_column(SallContacts, columnkey: "1d")):SnotFoundids = array_valves(array_diff(array_nap(caliback'Atcval", Screids), Sfetchedid1f (l enpty(SnotFoundids)) {Sthis->logger->info(*['- Sthis->getDisplayNaneO*) Contact CRM IDs not found in"teanid' a Sthis->tean->getidO."notFoundCount" > |count (SnotFoundids),"notFoundids" = SnotFoundIds,"requestedCount" = (count(Scraids),"fetchedCount' *> |count(SallContacts),There was 1 PHPUnit test runner warningOapp › app › Services › Crm › Hubspot › ServiceTraits › ® SyncOrmEntilies Trait php > ® SyncCrnmerspooeoomb Sormou SorcenPHP. 8.3Mon 20 Apr 16:46U SyncHubspotObjectsTest.testHandlSyncedAt~vuranoomelcaooeSalesforce Batch Con+0 .mSalesforce bulk syncs use batch processing (Redis ProcessSatesorcthtmaroweeSingle record syncs remain unchangedOther providers (HubSpot, etc.) remain unchanged (still one-by-18Aneliya AngelovaStefka Stoyanova09Explored 2 flles and searched function syncOpportunities >Answer: Batching in syncOpportunities ()ProviderDetalls0 phpforeach (SsyncStrategy-»fetchOpportunities(...) as ShsOpporSbufferll - ShsOpportunity?11 (count(Sbuffer) › self::BATOH PROCESS_SIZE) € 11 €SsyncCount += Sthis-sprocessOpportunityBatch(SbutfeAXCHONTROL+ •CodeClaude Opus 4.52 othersNikolay NikolovSymfonyLF UTF-8G 4 spaces3:45 PM | [Platform] Refinement ®Lukas Kovalik44:06...
|
58409
|
|
8675
|
166
|
33
|
2026-04-14T06:59:21.245798+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776149961245_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DiaFilelEditViewTabsBookmarksHistoryExtensionsWind DiaFilelEditViewTabsBookmarksHistoryExtensionsWindowHelpmeet.google.com / Daily - PlatformNikolay Yankov (Presenting)jminay / app&‹> Code11 Pull requestsActionsAll workfiowsAPP DeploymentClaude Security Helper|Database MigrationsDependabot UpdatesRelease EnvironmentStart-Stop Environment[include) Start/Stop testing environme...Mandoecien8 CachesA Deployments• Attestations|EB Runners@ Usage metrics@ Performance metricsC SRD-677T7 (SRO-67С зy 19798Service-oDe Foet, AnvE SSHEl DutadogActionsCD WikiSecurity and qualityk Insights@ Settings|Fix Dependabot issuessecfix.yml33 workflow runsThis workflow has a workflow_dispatch event trigger.• Fix Dependabot issuesFix Dependabot issues 842: Manually run by pikolay-yankorO Refactor secfix scripts for improved parsing and handling of coveredl...it $1171as pushed by nikolay-yankovRefactor Slack notification handling in secfix scripts and workflowPu wpenosootweewe00OSe PWROOFTRONTaraos• Fix Dependabot issuesmu vepchos0otn3n con Monanh by magen• Fix Dependabot issuesFix Dependabot istues R38: Manually run by pikolay-yankoyFix Dependabot issuesFix Dependabot issues #37: Manually run by nikolay-yankor• Fix Dependabot issuesFix Dependabot issues #36: Manually run by pikolay-yankov• Fix Dependabot issues• COstI CHO Actions :autonate-dependabot-issue_autonate-dependabot-issue.autonate-dependabot-issue_autonate-dependabot-issue.autonate-dependabot-issue_9:59 AM Daily - PlatformC Ct: Depe• Actions s• DependelD TиsksInsights & Coachin.• Dev- UXQ Type ([] to searchQ Fiter workdiow runsEvent-Status -BranchActor -H wOrmowSelect branch |Tagshutspot-webhooks-bckpfa-planet-migrationsfa-fontamesome-download-issuesfeature(JY-19120-chorus-retryfeature(JY-16492-office-add-inSeatureT-10400© 4m 236Daily - Platform • 6 m leftO Far Depeue 14 Apr 9:59EA ooownrtStefka StoyanovaSteliyan GeorgievAneliya Angelova13:5688 • Tue 14 Apr 9:59:21ChatNikolay YankovNikolay IvanovLukas Kovalik...
|
NULL
|
-8928779894947133075
|
NULL
|
visual_change
|
ocr
|
NULL
|
DiaFilelEditViewTabsBookmarksHistoryExtensionsWind DiaFilelEditViewTabsBookmarksHistoryExtensionsWindowHelpmeet.google.com / Daily - PlatformNikolay Yankov (Presenting)jminay / app&‹> Code11 Pull requestsActionsAll workfiowsAPP DeploymentClaude Security Helper|Database MigrationsDependabot UpdatesRelease EnvironmentStart-Stop Environment[include) Start/Stop testing environme...Mandoecien8 CachesA Deployments• Attestations|EB Runners@ Usage metrics@ Performance metricsC SRD-677T7 (SRO-67С зy 19798Service-oDe Foet, AnvE SSHEl DutadogActionsCD WikiSecurity and qualityk Insights@ Settings|Fix Dependabot issuessecfix.yml33 workflow runsThis workflow has a workflow_dispatch event trigger.• Fix Dependabot issuesFix Dependabot issues 842: Manually run by pikolay-yankorO Refactor secfix scripts for improved parsing and handling of coveredl...it $1171as pushed by nikolay-yankovRefactor Slack notification handling in secfix scripts and workflowPu wpenosootweewe00OSe PWROOFTRONTaraos• Fix Dependabot issuesmu vepchos0otn3n con Monanh by magen• Fix Dependabot issuesFix Dependabot istues R38: Manually run by pikolay-yankoyFix Dependabot issuesFix Dependabot issues #37: Manually run by nikolay-yankor• Fix Dependabot issuesFix Dependabot issues #36: Manually run by pikolay-yankov• Fix Dependabot issues• COstI CHO Actions :autonate-dependabot-issue_autonate-dependabot-issue.autonate-dependabot-issue_autonate-dependabot-issue.autonate-dependabot-issue_9:59 AM Daily - PlatformC Ct: Depe• Actions s• DependelD TиsksInsights & Coachin.• Dev- UXQ Type ([] to searchQ Fiter workdiow runsEvent-Status -BranchActor -H wOrmowSelect branch |Tagshutspot-webhooks-bckpfa-planet-migrationsfa-fontamesome-download-issuesfeature(JY-19120-chorus-retryfeature(JY-16492-office-add-inSeatureT-10400© 4m 236Daily - Platform • 6 m leftO Far Depeue 14 Apr 9:59EA ooownrtStefka StoyanovaSteliyan GeorgievAneliya Angelova13:5688 • Tue 14 Apr 9:59:21ChatNikolay YankovNikolay IvanovLukas Kovalik...
|
NULL
|