|
25079
|
539
|
2
|
2026-04-15T12:41:28.507631+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776256888507_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
3325912524/30toCastle AgeLouis VI advanced to the 3325912524/30toCastle AgeLouis VI advanced to the Feudal Age.Laszló I advanced to the Feudal Age.Rajyapala advanced to the Heudal A ge.Magnus Olafsson advanced to theFeudal Age.Click a villager to gather food from thisforage bush.Lumber Camp7P 1/8kovalfklukas (Britons))800/8003 Huascár: 931/9312 Rajyapala: 888/8885 Magnus Olafsson: 874/8744 Louis VI: 856/8561 kovaliklukas: 813/8138 Almish Yiltawar: 809/8096 László I: 809/8097 Maximilian of Habsburg: 742/742...
|
NULL
|
8454099112391223082
|
NULL
|
click
|
ocr
|
NULL
|
3325912524/30toCastle AgeLouis VI advanced to the 3325912524/30toCastle AgeLouis VI advanced to the Feudal Age.Laszló I advanced to the Feudal Age.Rajyapala advanced to the Heudal A ge.Magnus Olafsson advanced to theFeudal Age.Click a villager to gather food from thisforage bush.Lumber Camp7P 1/8kovalfklukas (Britons))800/8003 Huascár: 931/9312 Rajyapala: 888/8885 Magnus Olafsson: 874/8744 Louis VI: 856/8561 kovaliklukas: 813/8138 Almish Yiltawar: 809/8096 László I: 809/8097 Maximilian of Habsburg: 742/742...
|
NULL
|
|
56800
|
1226
|
49
|
2026-04-20T11:30:17.885662+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776684617885_m2.jpg...
|
Firefox
|
Firefox
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rireroxcalVIewHistorybookmarksProtlles1OOISWindowH rireroxcalVIewHistorybookmarksProtlles1OOISWindowHelpiminny.sentry.io/issues/?environment=production-eu&environment=production&project=82419&query=is%3Aunresolved&referrer=issue-list&sort=date&statsPeriod=1hRookmarksFeedAdd bookmark( Jy 19798 evaluation for ai activity09 appvproduction-eu, productionv1H v( JY-20553 | Improve crm-sync delàlx bookmarks loolda,Errors & Outages(SRD-6793) Les Mills activity typeSprint Board• SRD QueueBreached Metricohttps:/fiminny.sentry.io/issues/?environment=production-eu&environment=proGithub• Jiminny\Exceptions|SocialAccountTokenInvalidExLocation( JY-20698 handle failed field sync8 Jiminny DEVwarnings(• JY-20692 change confirmation p.Ask liminnv Renorts bv nikolav-vankov . ...08*Bookmarks ToollbarAPP-1ET5 /app/S0 Circle CITags(JY-20543) AJ Reports > Trackina& PROD USIAll ViewsJ Staginginvitdtion emall. [EMAIL] wnlle cuGR APP-18AN |/app/Http/Controllers/Auth/SocialController.pSeparate taas with commas(JY-18909] (Part2) Automated repUse tags to organize and search for bookmarks from the address barconnoureD Other Bookmarks• SevenShores.Hubsoor Exceotions.BadReduestiKevwordAsk Jiminny Reports by nikolay-yalssage":"Activity type portalld=6017093 name=First partner meeting does no...# New Talle keyword to open bookmarks directly Trom the address oatSevenShores\Hubspot\Exceptions\BadRequestu Product Growth Plattorm UserpiCancelessade":"Invalid inout JSON on line 1, column 15: Cannot deserialize value of...@)fix(security): composer depender• Jiminny\Exceptions\EmailActivityImportExceptionEmail Import Failed for Inboxzmall ID: 121604485: Error: Call to a member tunction error on nul.) Pipelines - jiminny/ape• Jiminny\Component\Transcription\TranscriptionProcessor\Gladia\Exceptions\InvalidTranslationResponseException) Feed - jiminny - SentryCP APP-1CGE8 JiminnWY-20692) Issue with reconnecti• Jiminny\Exceptions\HttpBadRequestWithErrorReasonExceptiorIAl Last Call Summary: data value too large: Call ParticipantsJosh Meyrick / Customer Contact / Lifescience Dynamics Limited - customer (decision maker for renewal/cancellation)Olivia Chu / New POC / Lifes..te App.15KR | Jann/Sorvicos/Crm/Calocforco/Client nhn in Jiminnv) Sorvicoc|Crm| Salocforcol Client«ronuoct(JY-20692 change confirmation pal(JY-206921 Issue with reconnecti• Jiminnv\Component\ ProphetAi\ Exceptions\ ProphetExceptionUnexnedtedkserice.ercorserver ercorai2os/llawosa//0roohet aiminoy.ew/cwm/GeaVextrac @ierEvalves.resuiteclnaso/4catewavaime=ouiaresnonsexahml>Kheadilless0/4catewayaume-oviz/atleslheam(SRD-67871 Issue with reconnect(*) Jiminny MCP Connector - ProductClactinal Gucontionl DocnoncoCvcontinr1I_docl[40014236]: document missina findex: activities]CP APP-1D64 app/CompoPartialUpdater.pho in Jiminny Component \ES\ElasticSearchDocumentPartialUodater:update-7 fJY-206761 Notify the user if a PiProject Phoenix - Figma• Symfony\Component\Debug\Exception\FatalThrowableError1Jiminny\DTO\mportCall\ Call:setCalleeNumber®: Argument #1 (ScalleeNumber) must be of type string, null aiven, called in /home/iiminny/app/Services/Activity/CloudTalk/CallDenormalizer.php on line 44CP APP-1FK5|/app/DTO/IrortCall/Call.php in Jiminny\DTO\ImportCall\Call::setCalleeNumber | A Quick Fix() Pipelines - jiminny/ap'Jiminny\Models\Ai\AiScorecardRuleRun::getAiScorecardRule0: Return value must be of type Jiminny \Models\Ai\AiScorecardRule, null returnedrecardRule | ^ Quick FixLSOLSTATSI220001-Intearitv.constraint violation:1042 Dunlicate.entra/1-0002a000009BXisMAC: forkevlleads orm conficuration id crm nrovider id_uniauel (ConneationumvsalHost-fiminavedh-nradicLast Seenl11s ado59s agd5min agc6min agoZmin adolZmin adoRmin ago11min ago14min ago14min adol16min aqc20min agoAge6mobmolkmal10mol1wkGmalTrendOnaoinaOngoinglaal24h 1H1r26T. 12Events100% LzMon 20 Apr 14:30:17Save ASUsersAssigneePriorityail ~al val v•l vuil val val vail vB ~Оv.O v•l v...
|
NULL
|
8454081999215316543
|
NULL
|
click
|
ocr
|
NULL
|
rireroxcalVIewHistorybookmarksProtlles1OOISWindowH rireroxcalVIewHistorybookmarksProtlles1OOISWindowHelpiminny.sentry.io/issues/?environment=production-eu&environment=production&project=82419&query=is%3Aunresolved&referrer=issue-list&sort=date&statsPeriod=1hRookmarksFeedAdd bookmark( Jy 19798 evaluation for ai activity09 appvproduction-eu, productionv1H v( JY-20553 | Improve crm-sync delàlx bookmarks loolda,Errors & Outages(SRD-6793) Les Mills activity typeSprint Board• SRD QueueBreached Metricohttps:/fiminny.sentry.io/issues/?environment=production-eu&environment=proGithub• Jiminny\Exceptions|SocialAccountTokenInvalidExLocation( JY-20698 handle failed field sync8 Jiminny DEVwarnings(• JY-20692 change confirmation p.Ask liminnv Renorts bv nikolav-vankov . ...08*Bookmarks ToollbarAPP-1ET5 /app/S0 Circle CITags(JY-20543) AJ Reports > Trackina& PROD USIAll ViewsJ Staginginvitdtion emall. [EMAIL] wnlle cuGR APP-18AN |/app/Http/Controllers/Auth/SocialController.pSeparate taas with commas(JY-18909] (Part2) Automated repUse tags to organize and search for bookmarks from the address barconnoureD Other Bookmarks• SevenShores.Hubsoor Exceotions.BadReduestiKevwordAsk Jiminny Reports by nikolay-yalssage":"Activity type portalld=6017093 name=First partner meeting does no...# New Talle keyword to open bookmarks directly Trom the address oatSevenShores\Hubspot\Exceptions\BadRequestu Product Growth Plattorm UserpiCancelessade":"Invalid inout JSON on line 1, column 15: Cannot deserialize value of...@)fix(security): composer depender• Jiminny\Exceptions\EmailActivityImportExceptionEmail Import Failed for Inboxzmall ID: 121604485: Error: Call to a member tunction error on nul.) Pipelines - jiminny/ape• Jiminny\Component\Transcription\TranscriptionProcessor\Gladia\Exceptions\InvalidTranslationResponseException) Feed - jiminny - SentryCP APP-1CGE8 JiminnWY-20692) Issue with reconnecti• Jiminny\Exceptions\HttpBadRequestWithErrorReasonExceptiorIAl Last Call Summary: data value too large: Call ParticipantsJosh Meyrick / Customer Contact / Lifescience Dynamics Limited - customer (decision maker for renewal/cancellation)Olivia Chu / New POC / Lifes..te App.15KR | Jann/Sorvicos/Crm/Calocforco/Client nhn in Jiminnv) Sorvicoc|Crm| Salocforcol Client«ronuoct(JY-20692 change confirmation pal(JY-206921 Issue with reconnecti• Jiminnv\Component\ ProphetAi\ Exceptions\ ProphetExceptionUnexnedtedkserice.ercorserver ercorai2os/llawosa//0roohet aiminoy.ew/cwm/GeaVextrac @ierEvalves.resuiteclnaso/4catewavaime=ouiaresnonsexahml>Kheadilless0/4catewayaume-oviz/atleslheam(SRD-67871 Issue with reconnect(*) Jiminny MCP Connector - ProductClactinal Gucontionl DocnoncoCvcontinr1I_docl[40014236]: document missina findex: activities]CP APP-1D64 app/CompoPartialUpdater.pho in Jiminny Component \ES\ElasticSearchDocumentPartialUodater:update-7 fJY-206761 Notify the user if a PiProject Phoenix - Figma• Symfony\Component\Debug\Exception\FatalThrowableError1Jiminny\DTO\mportCall\ Call:setCalleeNumber®: Argument #1 (ScalleeNumber) must be of type string, null aiven, called in /home/iiminny/app/Services/Activity/CloudTalk/CallDenormalizer.php on line 44CP APP-1FK5|/app/DTO/IrortCall/Call.php in Jiminny\DTO\ImportCall\Call::setCalleeNumber | A Quick Fix() Pipelines - jiminny/ap'Jiminny\Models\Ai\AiScorecardRuleRun::getAiScorecardRule0: Return value must be of type Jiminny \Models\Ai\AiScorecardRule, null returnedrecardRule | ^ Quick FixLSOLSTATSI220001-Intearitv.constraint violation:1042 Dunlicate.entra/1-0002a000009BXisMAC: forkevlleads orm conficuration id crm nrovider id_uniauel (ConneationumvsalHost-fiminavedh-nradicLast Seenl11s ado59s agd5min agc6min agoZmin adolZmin adoRmin ago11min ago14min ago14min adol16min aqc20min agoAge6mobmolkmal10mol1wkGmalTrendOnaoinaOngoinglaal24h 1H1r26T. 12Events100% LzMon 20 Apr 14:30:17Save ASUsersAssigneePriorityail ~al val v•l vuil val val vail vB ~Оv.O v•l v...
|
56798
|
|
53838
|
1163
|
64
|
2026-04-20T08:30:04.493553+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673804493_m2.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
FV faVsco.js?9 masterProledey© Opportunity.php© Pa FV faVsco.js?9 masterProledey© Opportunity.php© Participant.php© Partner.php© Permission.phpC Phonenumber.ongc) Playoacklneme.ono© Playbook.phpC) Playbookcategorv.php© Playlist.phpC) RateLimit.php© Region.phpC) Role.php@ RoleChangeEvent.phpc) ScoveGrouo.ono© Session.php(C) SlackBot.oho(C) SocialAccount.oho(C) Stade oho© Task.phpC Team.php© TeamAiContext.php© TeamDomain.php© TeamFeature.php© TeamSettings.php© TextRelay.php© Track.php© TranscriptionModel.php© TranscriptionModelLocale.php© TranscriptionProvider.phpc User.php© UserSettings.php© Vocabulary.phpc) VocabularyPronunciation.php© VoiceAccess.php(c)VolceconsentPrefix.onoNotitications• → Observers> O Policiesv Providers@ ActivitvServiceProvider.ohn@ AniServiceProvider.nhn@ AnnServiceProvider.nhnC) AuthServiceProvider.nhn@ RroadcastServiceProvider.ohn© CalendarServiceProvider.php@ CreateParticipantsServiceProvide(C) CrmServiceProvider.nhn© EncryptionServiceProvider.php(c CvontCorvicoDrovidor nhnl© HubspotJournalServiceProvider.p© HubspotWebhookServiceProvideA limC) AooServiceProvider.ongC) AutomatedReport.phonamespace Jiminny Models;liminnu Models VIsenamethod stringl] getRoles() laratrust's annotation* @property int $id* @property mixed Suuidx ocopent scring snamex olooent surind semalt* doroperty string null ssecondary emaz* doroperty string null spassword•doroperty string null sohoto pachiGoropertu bool Suses two factor authl•doropertu strinolnuur sauthu 10Gpropertu strinalnulz scountru code• doropertu int.nulz Sregion 1di• doropertu strinalnulz ssecondaru phone• Aoropertu strinalnull Scaller id• coronentu int nuu sion title 1di• Aoronentu strinalnull Stwo facton reset code• Goronertu int Steam id• Gorobertu intlnull Sarounidi* Goronertu strinalnull Stimezone* Oproperty string $language* Annonentu ctrinalnull Cconfononco numhon* @property stringlnull $conference_pin* @property string|null $conference_slug* Apropenty string Sconference join preference* Annonentu bool Sconfonenco ¿oin nomindon* doropertu scring sconterence recoraannounce* Apropentu int $conference record preference* doroperty int sconference banawidch* opropertu int sconference start weocamMON ZU AOr 11:30:04service.pnpkouteservicerrovider.ong© Partner.php© User.php XC) Reportcontroller.pnp©syncuserrllotcompanyListener.gA67 X1 X7outright wrong! Also, we don't support using the $team argument.Security patch review and testing guidanceYour custom trant• onlv nandles ranszent okenpublic function token(): ?Transientloken// hardcoded to Transientloken onlypublic function tokenCan(string $scope): boolpublic function withAccessToken(TransientToken $accessToken): staticThe risk with rassport 13.6 13.7.XPassport's upstream HasApiTokens trait likely changedits token return type orwithaccesstokeno signaureinte oumo. you cusiom aluoins Transientlokeneverywhere — if Passport 13.7.x now expects Token TransientToken (or introduced a newcontract/interrace for the access token), your trait sllently ignores that and could cause typeerrors at runtime.Check immediatelv:# What does Passport's own HasApilokens expect now?cat vendor/laravel/passport/src/HasApiTokens.php# Diff it against your custom traitvendor/laravel/passport/src/HasApiTokens.phpapp/Traits/HasApiTokens.phpAuso check ie contacutererences:bashcat vendor/laravel/passport/src/Contracts/OAuthenticatable.phpBoth User and Partner models implement Authenticatable and use vour custom trait —co it the intertace chanœed hoth are aftectediWhat to look for in the diff: any change to the return type of token , the parameter type ofwathAccesstokeno.or1t Passnort now exnecis loken the tull Hloduent moce in naceswhere you re only handling TransientToken. That's the one gap this custom trait creates thatthe version bumb coule exboseReplv…CannotAhClaude ic Aland can make mictakes Plasce double-check recnoncac)...
|
NULL
|
8453702838127829712
|
NULL
|
click
|
ocr
|
NULL
|
FV faVsco.js?9 masterProledey© Opportunity.php© Pa FV faVsco.js?9 masterProledey© Opportunity.php© Participant.php© Partner.php© Permission.phpC Phonenumber.ongc) Playoacklneme.ono© Playbook.phpC) Playbookcategorv.php© Playlist.phpC) RateLimit.php© Region.phpC) Role.php@ RoleChangeEvent.phpc) ScoveGrouo.ono© Session.php(C) SlackBot.oho(C) SocialAccount.oho(C) Stade oho© Task.phpC Team.php© TeamAiContext.php© TeamDomain.php© TeamFeature.php© TeamSettings.php© TextRelay.php© Track.php© TranscriptionModel.php© TranscriptionModelLocale.php© TranscriptionProvider.phpc User.php© UserSettings.php© Vocabulary.phpc) VocabularyPronunciation.php© VoiceAccess.php(c)VolceconsentPrefix.onoNotitications• → Observers> O Policiesv Providers@ ActivitvServiceProvider.ohn@ AniServiceProvider.nhn@ AnnServiceProvider.nhnC) AuthServiceProvider.nhn@ RroadcastServiceProvider.ohn© CalendarServiceProvider.php@ CreateParticipantsServiceProvide(C) CrmServiceProvider.nhn© EncryptionServiceProvider.php(c CvontCorvicoDrovidor nhnl© HubspotJournalServiceProvider.p© HubspotWebhookServiceProvideA limC) AooServiceProvider.ongC) AutomatedReport.phonamespace Jiminny Models;liminnu Models VIsenamethod stringl] getRoles() laratrust's annotation* @property int $id* @property mixed Suuidx ocopent scring snamex olooent surind semalt* doroperty string null ssecondary emaz* doroperty string null spassword•doroperty string null sohoto pachiGoropertu bool Suses two factor authl•doropertu strinolnuur sauthu 10Gpropertu strinalnulz scountru code• doropertu int.nulz Sregion 1di• doropertu strinalnulz ssecondaru phone• Aoropertu strinalnull Scaller id• coronentu int nuu sion title 1di• Aoronentu strinalnull Stwo facton reset code• Goronertu int Steam id• Gorobertu intlnull Sarounidi* Goronertu strinalnull Stimezone* Oproperty string $language* Annonentu ctrinalnull Cconfononco numhon* @property stringlnull $conference_pin* @property string|null $conference_slug* Apropenty string Sconference join preference* Annonentu bool Sconfonenco ¿oin nomindon* doropertu scring sconterence recoraannounce* Apropentu int $conference record preference* doroperty int sconference banawidch* opropertu int sconference start weocamMON ZU AOr 11:30:04service.pnpkouteservicerrovider.ong© Partner.php© User.php XC) Reportcontroller.pnp©syncuserrllotcompanyListener.gA67 X1 X7outright wrong! Also, we don't support using the $team argument.Security patch review and testing guidanceYour custom trant• onlv nandles ranszent okenpublic function token(): ?Transientloken// hardcoded to Transientloken onlypublic function tokenCan(string $scope): boolpublic function withAccessToken(TransientToken $accessToken): staticThe risk with rassport 13.6 13.7.XPassport's upstream HasApiTokens trait likely changedits token return type orwithaccesstokeno signaureinte oumo. you cusiom aluoins Transientlokeneverywhere — if Passport 13.7.x now expects Token TransientToken (or introduced a newcontract/interrace for the access token), your trait sllently ignores that and could cause typeerrors at runtime.Check immediatelv:# What does Passport's own HasApilokens expect now?cat vendor/laravel/passport/src/HasApiTokens.php# Diff it against your custom traitvendor/laravel/passport/src/HasApiTokens.phpapp/Traits/HasApiTokens.phpAuso check ie contacutererences:bashcat vendor/laravel/passport/src/Contracts/OAuthenticatable.phpBoth User and Partner models implement Authenticatable and use vour custom trait —co it the intertace chanœed hoth are aftectediWhat to look for in the diff: any change to the return type of token , the parameter type ofwathAccesstokeno.or1t Passnort now exnecis loken the tull Hloduent moce in naceswhere you re only handling TransientToken. That's the one gap this custom trait creates thatthe version bumb coule exboseReplv…CannotAhClaude ic Aland can make mictakes Plasce double-check recnoncac)...
|
53836
|
|
72329
|
1763
|
2
|
2026-04-22T15:35:25.164887+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872125164_m2.jpg...
|
Firefox
|
Jiminny MCP Connector - Product - Confluence — Wor Jiminny MCP Connector - Product - Confluence — Work...
|
True
|
jiminny.atlassian.net/wiki/spaces/PROD/pages/37282 jiminny.atlassian.net/wiki/spaces/PROD/pages/3728244737/Jiminny+MCP+Connector...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] Graham . I made the product related changes in the table and for the rest I left them as a note in the Technical section for the team to look at when they start looking at this. I wonder about your points related to GDPR. Currently multiple customers are using the Customer API/zapier to feed this data to AI and BI tools. They are also manually exporting transcripts and other information from the platform and feeding it to AI tools. I don’t get how MCP is so much different that all of these and why it will introduce new data processors (which are already being utilised) and would require any changes to the consent provided by participants.
You said
Jiminny MCP Connector
Epic
Link to Epik in Jira
Document status
DRAFT
Objective
Enable customers to connect Jiminny data to external AI tools (Claude, OpenAI, Gemini) so it can be used as part of their broader knowledge base and workflows.
Position Jiminny as a data layer for AI-driven revenue workflows, not just a standalone product.
👤 Target user
Revenue teams using AI tools (Sales, CS, RevOps)
Companies already experimenting with Claude / OpenAI
Mid-market & Enterprise customers with multiple data sources (CRM, docs, CI tools, Support tools etc)
🤕 Pain point or problem
Jiminny data is locked in the platform
AI tools lack access to high-value conversation context
Customers must manually export/copy transcripts
No easy way to combine calls with CRM + docs + other info - using the Jiminny API is not suitable for non technical sales people
Peer pressure as almost all competitors have this
💥 Impact and benefits
For customers
Better AI outputs using real customer conversations
Ability to build automated workflows across tools
For Jiminny
Increased product stickiness (embedded in workflows)
Competitive parity with Gong / Avoma etc.
💡 Solution ideas
Build an AI Knowledge Connector (MCP-based) that:
Exposes Jiminny data (calls, transcripts, metadata) to AI tools
Provides structured insights (summaries, action items, scoring etc.)
Supports deal-level context
Allows integration into customer-owned AI stacks (Claude + Zapier, etc.)
Success metrics
List the key goals and how you will measure success. Include both qualitative and quantitative metrics (e.g., user adoption, retention rate, revenue targets).
Goal
Metric
Increase stickiness by ensuring Jiminny is embedded in the customer’s workflows
% of customers connecting external AI tools
Number of MCP/API calls per customer - and which ones are being used the most
Decrease the manual copying of transcripts
decrease by X %
User interaction and design
Simple setup flow:
Generate API key / connect MCP
Clear instructions for Claude / Zapier setup
Provide:
Example prompts for Claude
Pre-built workflow templates for Zapier
Clear documentation - with use cases
👉 Focus: usable by non-technical users
Detailed Requirements
List the functional and non-functional requirements. Prioritize them (e.g., High, Medium, Low) and add notes for clarification.
Requirement
Importance
Notes
Allow customers to connect Jiminny to their AI tools (e.g. Claude, OpenAI)
HIGH
Provide MCP endpoint so customers can easily integrate Jiminny into their AI stack
Allow customers to access call data through AI tools
HIGH
Expose Jiminny data:
list calls (filter by date, user, account, deal)
get call
get transcript (speaker-separated)
get call metadata
search calls (keyword + semantic)
Support filtering by:
account / contact/ lead / deal
jiminny user
date range
Allow customers to search and query calls using AI tools
HIGH
Support keyword and semantic search across conversations
Provide structured insights so customers can generate better outputs
HIGH
For each call, expose:
Summary
Action items
Key points
Activity type
Notes
Call Score
CRM information
Allow customers to understand deal status across multiple calls/emails
HIGH
For each deal expose:
calls/meetings/emails
Identified risks
contacts related to the deal with their job title
linked account details
all CRM field information that we have in DI + fields used for CRM filling
example - get_deal_summary
request -
{
"tool": "get_deal_summary",
"arguments": {
"deal_name": "ACME"
}
}
responce:
{
"deal_name": "ACME",
"stage": "Negotiation",
"recent_activity": [
"Demo call on 2026-04-01",
"Pricing discussion on 2026-04-03"
],
"risks": [
"Pricing concerns",
"Security review pending"
], "next_steps": [
"Send follow-up to VP Sales",
"Share security documentation"
]
}
Ensure the AI can easily understand the schema of the data coming from Jiminny
HIGH
Models perform much better when tools have:
clear names
rich descriptions
predictable schemas
Provide clear, actionable error states for customers when MCP connections fail
HIGH
Error messages should guide agents toward solutions with specific suggestions and next steps.
Expired or revoked key — “Error: Authentication failed. The API key used to access Jiminny has been revoked or has expired. Please ask your Jiminny admin to generate a new API key in Settings > Organization > General and reconnect the MCP server.”
Rate limit hit — “Error: Rate limit exceeded. Too many requests have been made to the Jiminny MCP server in a short period. Please wait 60 seconds before retrying.”
Permissions mismatch — if a user tries to access data outside their team visibility settings - “Error: Access denied. The requested call (call_id: [X]) is outside your team's visibility settings in Jiminny. Only calls within your permitted scope are accessible.”
Trying to access private meeting - “Error: Access denied. This meeting has been marked as private by the host and cannot be accessed through the MCP connector. Try requesting a different call or ask the meeting host to change the visibility settings in Jiminny.”
Downgraded/Capture account — if a customer's plan drops below Scale tier or the Customer is on Capture in the first place - “Error: MCP access unavailable. The Jiminny MCP connector is available on the Scale plan and above. Your account does not currently have an active Scale subscription.”
Jiminny-side outage — “Error:Jiminny is temporarily unavailable (status 503). This is not a data or permissions issue — please retry in a few minutes.”
No data found - “Error:No calls found matching your criteria. Try adjusting your filters — for example, widening the date range, removing the account filter, or checking the rep name is spelled correctly in Jiminny.”
Allow customers to securely control who and what data is accessible externally
HIGH
Ensure MCP only exposes data user has access to - based on team visibility settings. This means that if a user is not allow to access calls/deals in Jiminny UI then they shouldn’t be able to access those through the MCP as well.
Private meetings shouldn’t be exposed via MCP
HIGH
When a meetings is set to Private then the information about it shouldn’t be exposed through the MCP.
Ensure Jiminny data can be combined with other sources (e.g. CRM, docs) in AI workflows
HIGH
Ensure data is structured to be easily combined with:
CRM (accounts, deals)
external docs
Use consistent identifiers:
account IDs
deal IDs
MCP is available only for Scale tier and above
HIGH
Customers who are on Capture tier should be able to access any of their data through MCP.
This should also cover the scenario when a customer has been on Scale but then downgrades to Capture - their MCP access should stop working.
Provide visibility into how external AI tools access Jiminny data
HIGH
Audit logs:
what data was accessed by which external system when
identity - who made the request
specific queries/filters used
failed access attempts (especially cross-visibility-boundary attempts)
Admins should be able to access the logs from the org settings.We can start with a csv export before building a specific page for it.
example from Atlassian -
Provide customers with example prompts to get started quickly
HIGH
MCP prompts are explicitly defined as prompt templates that clients can discover and call with arguments.
See examples in table below.
Expose Jiminny as a Connector in Claude
medium
Competitors like Fathom are listed as Connectors in Claude. This will make it easier for customers to find us and to connect Jiminny
Provide customers with example workflows to get started quickly
medium
A workflow is usually multiple steps, maybe multiple tools, still focused on one outcome.
See examples in table below.
Allow customers to use predefined Jiminny skills for common workflows
medium
Anthropic describes Skills as folders that include instructions, scripts, and resources that Claude can load when relevant, and as a way to teach Claude repeatable workflows, preferences, and domain expertise once instead of re-explaining them every time. Skills - a reusable package of behavior that can include prompts, instructions, resources, and sometimes scripts/tools for a broader job.
Claude skills - https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf?hsLang=en&utm_source=chatgpt.com
See examples in table below.
Jiminny UI widget for OpenAI
medium
The reason to have this is to make certain Jiminny use cases much easier than pure chat.
Instead of ChatGPT only replying with text like “Here are the last 5 ACME calls,” it could also show a visual Jiminny card or mini-app inside the chat. That widget could list calls, show a deal summary, let the user filter by rep/date/account, open a transcript section, or save a snippet—while the conversation continues in normal chat alongside it.
For Jiminny, the best widget use cases are the ones where users need to browse or compare rather than ask one-off questions. A strong example is deal review: the user asks ChatGPT, “What is the status of the ACME deal?” ChatGPT calls your Jiminny MCP tools, and the widget shows a compact deal view with recent calls, risks, next steps, stakeholders, and links to transcripts/snippets. The chat can still summarize the answer in words, but the widget gives a clearer, scannable interface.
Another good Jiminny widget use case is call search and exploration. A text answer can say “I found 12 calls mentioning pricing objections,” but a widget could show a sortable list with date, rep, account, score, and objection count, then let the user click into one call to see the exact excerpt or jump to a transcript section.
Allow customers to run long-running analyses asynchronously and retrieve progress/results
low
Some requests/questions require analysis of Hugh volumes of data. For those, it may be better to:
start the job
let it run in the background
return a status like “in progress”
let the client come back for the result later
For example - User asks in Claude:
“Analyse all calls from this quarter and tell me the top 5 objections by segment.”
That might require:
searching lots of calls
pulling many summaries/transcripts
aggregating results
Instead of making Claude wait 45+ seconds, Jiminny could:
create an analysis job
return: job_id = 123, status = running
We need this in order to support:
large-scale analysis
multi-call aggregation across lots of data
playlist generation across many calls
heavy recap/report generation
Creating a snippet through the MCP
low
Create a shareable snippet from a call recording by specifying a time range. Useful for highlighting key moments — objection handling, pricing discussions, competitive mentions — and sharing them with your team.
example request:
{
"tool": "create_snippet",
"arguments": {
"call_id": "call_123",
"start_time": "00:18:24",
"end_time": "00:19:10",
"title": "Pricing objection"
}
}
example response:
{
"snippet_id": "snip_987",
"title": "Pricing objection",
"share_url": "https://app.jiminny.com/snippets/snip_987"
}
Ability to add recordings or snippets to a playlist
low
Allow customers to create libraries of calls automatically. They can use those for onboarding or other purposes
Allow AI tools to read reusable Jiminny resources
low
fathom
Resources are useful for data that should be read consistently rather than recomputed every time. In Jiminny terms, that could be:
current deal snapshot
account summary
weekly rep recap
approved talk tracks / objection handling guidance
curated playlists or snippet libraries
This is useful because an AI can consume these directly as context, instead of repeatedly stitching together many tool calls.
Ability to write coaching notes in Jiminny through MCP
low
What we want to do for prompts/worflows and skills
Capability
Type
User value / job to be done
Example Jiminny use case
Inputs
Steps performed
Output
Draft follow-up email
Prompt
Help reps quickly create tailored follow-ups after calls
Use the latest customer call to draft an email with recap and next steps
Call ID
optional tone
optional recipient type
Retrieve call summary and action items from Jiminny.
Pull key points, commitments, and next steps.
Apply the chosen tone and structure.
Draft the email in a consistent format.
Customer-ready follow-up email draft
Summarise call
Prompt
Help users quickly extract the most important points from a conversation
Generate a concise summary of one call for internal or external use
Call ID
optional summary style
optional audience
Retrieve transcript, metadata, and structured insights.
Identify key topics, decisions, risks, and next steps.
Format output for the chosen audience.
Short or structured call summary with actions and risks
Generate deal recap
Prompt
Help reps and managers get a fast overview of a deal
Summarise the current state of a deal based on recent calls and linked CRM context
Deal ID or account name
optional date range
Retrieve calls and meetings linked to the deal.
Pull deal metadata and CRM-linked context.
Identify recent changes, blockers, risks, and next steps.
Summarise into a concise recap.
Deal recap with status, blockers, risks, and recommended next steps
Prepare weekly recap
Prompt
Help managers or reps review what changed over a time period
Weekly recap of calls, themes, and actions for one rep, team, or account
Rep ID
team ID or account ID
time period
Retrieve relevant calls and summaries for the selected time period.
Aggregate themes, action items, and changes.
Highlight notable risks, opportunities, and follow-ups.
Weekly recap with top themes, risks, opportunities, and actions
Prepare deal review
Workflow
Help reps and managers review deal status using multiple sources of context
Review a deal before pipeline review or forecast meeting
Deal ID
optional date range
Retrieve all recent calls, emails, and meetings tied to the deal.
Pull structured call summaries, score, action items, and key points.
Pull linked CRM context such as stage, contacts, and account details.
Aggregate open risks, unresolved objections, stakeholder gaps, and next steps.
Format into a review-ready structure.
Deal review document with current status, risks, stakeholders, blockers, and next steps
Weekly team recap
Workflow
Help managers monitor activity and risk across a group of reps or accounts
End-of-week team summary for sales leadership
Team ID
date range
Retrieve calls and structured insights across the team.
Group by rep, account, or deal.
Identify recurring themes, major risks, strong calls, and missed follow-ups.
Highlight calls or deals that need attention.
Team-level recap with patterns, key risks, notable wins, and action areas
Objection analysis across calls
Workflow
Help teams identify patterns across multiple conversations
Analyse pricing or competitor objections across recent calls
Account ID
deal ID
rep ID
keyword/topic
date range
Search calls matching the topic or keyword.
Retrieve summaries, transcripts, and snippets where relevant.
Identify recurring objections and how they were handled.
Assess whether objections were resolved or remain open.
Summarise patterns and examples.
Objection analysis with themes, frequency, examples, and suggested follow-up actions
Build onboarding playlist
Workflow
Help enablement teams curate useful learning content faster
Build a playlist of strong discovery, demo, or pricing calls for new hires
Topic
call type
rep/team filter
optional time period
Search for calls matching the selected criteria.
Rank or filter calls based on score, topics, or key moments.
Identify useful snippets or full recordings.
Add selected calls/snippets into a playlist structure.
Generate short descriptions for each item.
Curated onboarding playlist with selected calls/snippets and descriptions
Deal Inspection Skill
Skill
Give users a consistent, opinionated way to assess a deal
Claude reviews a deal using a repeatable Jiminny methodology
Deal ID or account name
optional review scope
Determine whether the request is suitable for a deal inspection.
Retrieve relevant calls, summaries, CRM context, stakeholders, and risks.
Apply a standard Jiminny review framework to assess deal health.
Look for missing next steps, unresolved objections, stakeholder gaps, and warning signs.
Present findings in a consistent structure with recommended actions.
Structured deal inspection with health assessment, red flags, and recommendations
Manager Coaching Skill
Skill
Help managers review calls consistently and identify coaching moments
Analyse a rep’s call and surface strengths, gaps, and examples for coaching
Call ID
optional rep ID
optional coaching focus
Retrieve transcript, score, summary, and key moments from the call.
Evaluate the conversation against a coaching framework.
Identify what went well and where the rep could improve.
Suggest moments to clip as snippets.
Recommend coaching actions or playlist additions.
Coaching review with strengths, gaps, snippet suggestions, and recommended coaching actions
CSM / QBR Prep Skill
Skill
Help CS or AM teams prepare structured customer reviews from conversations
Generate an account review or QBR-style summary from recent customer interactions
Account ID, optional time period
Retrieve all recent calls, emails, and account-linked context.
Aggregate themes, requests, blockers, sentiment shifts, and opportunities.
Apply a repeatable account review structure.
Summarise outcomes, open issues, and suggested next steps.
Structured QBR/account review summary with themes, risks, opportunities, and actions
Snippet Builder Skill
Skill
Help users consistently capture and label useful moments from calls
Identify useful moments in a call and convert them into reusable snippets
Call ID, optional focus area such as pricing, objection, competitor, discovery
Retrieve transcript, recording timeline, and call insights.
Detect moments matching the requested focus area.
Propose snippet start/end times and titles.
Tag snippets by type or theme.
Optionally save them or add them to a playlist.
One or more proposed or saved snippets with title, timing, and tags
💡 Technical details
Auth model needs specifying. Are API keys scoped per user, per team, or per Jiminny instance? If a key is generated by an admin, does it inherit their visibility level, or provide org-wide? Are permissions evaluated at query time or frozen at key creation? Needs to be query-time, otherwise permission changes won't propagate.
Key lifecycle management is missing. No mention of rotation, expiry, or revocation. A departed employee's active key is a data leak. Need: revocation, optional expiry, alerts on stale keys, and consider whether keys should be tied to service accounts rather than personal users.
Rate limiting should be HIGH. A compromised key or misconfigured automation could bulk-export an entire customer's call history. Need per-key rate limits and anomaly detection on unusual access patterns.
Open Questions
Track unresolved issues or decisions that need to be made. Update as answers become available.
Question
Answer
Date Answered
Competitor research
Competitor
MCP Availability
Core Capabilities
Advanced Capabilities
Positioning
Key Strength
Key Weakness
Gong
✅ Mature MCP
List/search calls
Get transcripts
get Call metadata
Deal intelligence
Scorecards, analytics
CRM context
Enterprise data layer
Deep data + ecosystem integrations
Limited opinionated AI workflows
Avoma...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"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":"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.28125,"top":0.09497207,"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.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"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.2945479,"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.28125,"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.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"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","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"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":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"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":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"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":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"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":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"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":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"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":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"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":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"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":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.46209097,"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-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"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":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"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":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"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":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"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":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"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":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6528332,"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.2840758,"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":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"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.30618352,"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.31732047,"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.32845744,"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":"AXButton","text":"AI Chat settings","depth":7,"bounds":{"left":0.4659242,"top":0.055067837,"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":"AXButton","text":"Close","depth":7,"bounds":{"left":0.47789228,"top":0.055067837,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.47523272,"top":0.103751,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"bounds":{"left":0.3648604,"top":0.103751,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"bounds":{"left":0.44730717,"top":0.103751,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"bounds":{"left":0.46060506,"top":0.103751,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"bounds":{"left":0.36053857,"top":0.14764565,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"bounds":{"left":0.36053857,"top":0.15003991,"width":0.1200133,"height":0.025538707},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"bounds":{"left":0.3834774,"top":0.18355946,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"bounds":{"left":0.39810506,"top":0.18355946,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said Jiminny MCP Connector Epic Link to Epik in Jira Document status DRAFT Objective Enable customers to connect Jiminny data to external AI tools (Claude, OpenAI, Gemini) so it can be used as part of their broader knowledge base and workflows. Position Jiminny as a data layer for AI-driven revenue workflows, not just a standalone product. 👤 Target user Revenue teams using AI tools (Sales, CS, RevOps) Companies already experimenting with Claude / OpenAI Mid-market & Enterprise customers with multiple data sources (CRM, docs, CI tools, Support tools etc) 🤕 Pain point or problem Jiminny data is locked in the platform AI tools lack access to high-value conversation context Customers must manually export/copy transcripts No easy way to combine calls with CRM + docs + other info - using the Jiminny API is not suitable for non technical sales people Peer pressure as almost all competitors have this 💥 Impact and benefits For customers Better AI outputs using real customer conversations Ability to build automated workflows across tools For Jiminny Increased product stickiness (embedded in workflows) Competitive parity with Gong / Avoma etc. 💡 Solution ideas Build an AI Knowledge Connector (MCP-based) that: Exposes Jiminny data (calls, transcripts, metadata) to AI tools Provides structured insights (summaries, action items, scoring etc.) Supports deal-level context Allows integration into customer-owned AI stacks (Claude + Zapier, etc.) Success metrics List the key goals and how you will measure success. Include both qualitative and quantitative metrics (e.g., user adoption, retention rate, revenue targets). Goal Metric Increase stickiness by ensuring Jiminny is embedded in the customer’s workflows % of customers connecting external AI tools Number of MCP/API calls per customer - and which ones are being used the most Decrease the manual copying of transcripts decrease by X % User interaction and design Simple setup flow: Generate API key / connect MCP Clear instructions for Claude / Zapier setup Provide: Example prompts for Claude Pre-built workflow templates for Zapier Clear documentation - with use cases 👉 Focus: usable by non-technical users Detailed Requirements List the functional and non-functional requirements. Prioritize them (e.g., High, Medium, Low) and add notes for clarification. Requirement Importance Notes Allow customers to connect Jiminny to their AI tools (e.g. Claude, OpenAI) HIGH Provide MCP endpoint so customers can easily integrate Jiminny into their AI stack Allow customers to access call data through AI tools HIGH Expose Jiminny data: list calls (filter by date, user, account, deal) get call get transcript (speaker-separated) get call metadata search calls (keyword + semantic) Support filtering by: account / contact/ lead / deal jiminny user date range Allow customers to search and query calls using AI tools HIGH Support keyword and semantic search across conversations Provide structured insights so customers can generate better outputs HIGH For each call, expose: Summary Action items Key points Activity type Notes Call Score CRM information Allow customers to understand deal status across multiple calls/emails HIGH For each deal expose: calls/meetings/emails Identified risks contacts related to the deal with their job title linked account details all CRM field information that we have in DI + fields used for CRM filling example - get_deal_summary request - { \"tool\": \"get_deal_summary\", \"arguments\": { \"deal_name\": \"ACME\" } } responce: { \"deal_name\": \"ACME\", \"stage\": \"Negotiation\", \"recent_activity\": [ \"Demo call on 2026-04-01\", \"Pricing discussion on 2026-04-03\" ], \"risks\": [ \"Pricing concerns\", \"Security review pending\" ], \"next_steps\": [ \"Send follow-up to VP Sales\", \"Share security documentation\" ] } Ensure the AI can easily understand the schema of the data coming from Jiminny HIGH Models perform much better when tools have: clear names rich descriptions predictable schemas Provide clear, actionable error states for customers when MCP connections fail HIGH Error messages should guide agents toward solutions with specific suggestions and next steps. Expired or revoked key — “Error: Authentication failed. The API key used to access Jiminny has been revoked or has expired. Please ask your Jiminny admin to generate a new API key in Settings > Organization > General and reconnect the MCP server.” Rate limit hit — “Error: Rate limit exceeded. Too many requests have been made to the Jiminny MCP server in a short period. Please wait 60 seconds before retrying.” Permissions mismatch — if a user tries to access data outside their team visibility settings - “Error: Access denied. The requested call (call_id: [X]) is outside your team's visibility settings in Jiminny. Only calls within your permitted scope are accessible.” Trying to access private meeting - “Error: Access denied. This meeting has been marked as private by the host and cannot be accessed through the MCP connector. Try requesting a different call or ask the meeting host to change the visibility settings in Jiminny.” Downgraded/Capture account — if a customer's plan drops below Scale tier or the Customer is on Capture in the first place - “Error: MCP access unavailable. The Jiminny MCP connector is available on the Scale plan and above. Your account does not currently have an active Scale subscription.” Jiminny-side outage — “Error:Jiminny is temporarily unavailable (status 503). This is not a data or permissions issue — please retry in a few minutes.” No data found - “Error:No calls found matching your criteria. Try adjusting your filters — for example, widening the date range, removing the account filter, or checking the rep name is spelled correctly in Jiminny.” Allow customers to securely control who and what data is accessible externally HIGH Ensure MCP only exposes data user has access to - based on team visibility settings. This means that if a user is not allow to access calls/deals in Jiminny UI then they shouldn’t be able to access those through the MCP as well. Private meetings shouldn’t be exposed via MCP HIGH When a meetings is set to Private then the information about it shouldn’t be exposed through the MCP. Ensure Jiminny data can be combined with other sources (e.g. CRM, docs) in AI workflows HIGH Ensure data is structured to be easily combined with: CRM (accounts, deals) external docs Use consistent identifiers: account IDs deal IDs MCP is available only for Scale tier and above HIGH Customers who are on Capture tier should be able to access any of their data through MCP. This should also cover the scenario when a customer has been on Scale but then downgrades to Capture - their MCP access should stop working. Provide visibility into how external AI tools access Jiminny data HIGH Audit logs: what data was accessed by which external system when identity - who made the request specific queries/filters used failed access attempts (especially cross-visibility-boundary attempts) Admins should be able to access the logs from the org settings.We can start with a csv export before building a specific page for it. example from Atlassian - Provide customers with example prompts to get started quickly HIGH MCP prompts are explicitly defined as prompt templates that clients can discover and call with arguments. See examples in table below. Expose Jiminny as a Connector in Claude medium Competitors like Fathom are listed as Connectors in Claude. This will make it easier for customers to find us and to connect Jiminny Provide customers with example workflows to get started quickly medium A workflow is usually multiple steps, maybe multiple tools, still focused on one outcome. See examples in table below. Allow customers to use predefined Jiminny skills for common workflows medium Anthropic describes Skills as folders that include instructions, scripts, and resources that Claude can load when relevant, and as a way to teach Claude repeatable workflows, preferences, and domain expertise once instead of re-explaining them every time. Skills - a reusable package of behavior that can include prompts, instructions, resources, and sometimes scripts/tools for a broader job. Claude skills - https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf?hsLang=en&utm_source=chatgpt.com See examples in table below. Jiminny UI widget for OpenAI medium The reason to have this is to make certain Jiminny use cases much easier than pure chat. Instead of ChatGPT only replying with text like “Here are the last 5 ACME calls,” it could also show a visual Jiminny card or mini-app inside the chat. That widget could list calls, show a deal summary, let the user filter by rep/date/account, open a transcript section, or save a snippet—while the conversation continues in normal chat alongside it. For Jiminny, the best widget use cases are the ones where users need to browse or compare rather than ask one-off questions. A strong example is deal review: the user asks ChatGPT, “What is the status of the ACME deal?” ChatGPT calls your Jiminny MCP tools, and the widget shows a compact deal view with recent calls, risks, next steps, stakeholders, and links to transcripts/snippets. The chat can still summarize the answer in words, but the widget gives a clearer, scannable interface. Another good Jiminny widget use case is call search and exploration. A text answer can say “I found 12 calls mentioning pricing objections,” but a widget could show a sortable list with date, rep, account, score, and objection count, then let the user click into one call to see the exact excerpt or jump to a transcript section. Allow customers to run long-running analyses asynchronously and retrieve progress/results low Some requests/questions require analysis of Hugh volumes of data. For those, it may be better to: start the job let it run in the background return a status like “in progress” let the client come back for the result later For example - User asks in Claude: “Analyse all calls from this quarter and tell me the top 5 objections by segment.” That might require: searching lots of calls pulling many summaries/transcripts aggregating results Instead of making Claude wait 45+ seconds, Jiminny could: create an analysis job return: job_id = 123, status = running We need this in order to support: large-scale analysis multi-call aggregation across lots of data playlist generation across many calls heavy recap/report generation Creating a snippet through the MCP low Create a shareable snippet from a call recording by specifying a time range. Useful for highlighting key moments — objection handling, pricing discussions, competitive mentions — and sharing them with your team. example request: { \"tool\": \"create_snippet\", \"arguments\": { \"call_id\": \"call_123\", \"start_time\": \"00:18:24\", \"end_time\": \"00:19:10\", \"title\": \"Pricing objection\" } } example response: { \"snippet_id\": \"snip_987\", \"title\": \"Pricing objection\", \"share_url\": \"https://app.jiminny.com/snippets/snip_987\" } Ability to add recordings or snippets to a playlist low Allow customers to create libraries of calls automatically. They can use those for onboarding or other purposes Allow AI tools to read reusable Jiminny resources low fathom Resources are useful for data that should be read consistently rather than recomputed every time. In Jiminny terms, that could be: current deal snapshot account summary weekly rep recap approved talk tracks / objection handling guidance curated playlists or snippet libraries This is useful because an AI can consume these directly as context, instead of repeatedly stitching together many tool calls. Ability to write coaching notes in Jiminny through MCP low What we want to do for prompts/worflows and skills Capability Type User value / job to be done Example Jiminny use case Inputs Steps performed Output Draft follow-up email Prompt Help reps quickly create tailored follow-ups after calls Use the latest customer call to draft an email with recap and next steps Call ID optional tone optional recipient type Retrieve call summary and action items from Jiminny. Pull key points, commitments, and next steps. Apply the chosen tone and structure. Draft the email in a consistent format. Customer-ready follow-up email draft Summarise call Prompt Help users quickly extract the most important points from a conversation Generate a concise summary of one call for internal or external use Call ID optional summary style optional audience Retrieve transcript, metadata, and structured insights. Identify key topics, decisions, risks, and next steps. Format output for the chosen audience. Short or structured call summary with actions and risks Generate deal recap Prompt Help reps and managers get a fast overview of a deal Summarise the current state of a deal based on recent calls and linked CRM context Deal ID or account name optional date range Retrieve calls and meetings linked to the deal. Pull deal metadata and CRM-linked context. Identify recent changes, blockers, risks, and next steps. Summarise into a concise recap. Deal recap with status, blockers, risks, and recommended next steps Prepare weekly recap Prompt Help managers or reps review what changed over a time period Weekly recap of calls, themes, and actions for one rep, team, or account Rep ID team ID or account ID time period Retrieve relevant calls and summaries for the selected time period. Aggregate themes, action items, and changes. Highlight notable risks, opportunities, and follow-ups. Weekly recap with top themes, risks, opportunities, and actions Prepare deal review Workflow Help reps and managers review deal status using multiple sources of context Review a deal before pipeline review or forecast meeting Deal ID optional date range Retrieve all recent calls, emails, and meetings tied to the deal. Pull structured call summaries, score, action items, and key points. Pull linked CRM context such as stage, contacts, and account details. Aggregate open risks, unresolved objections, stakeholder gaps, and next steps. Format into a review-ready structure. Deal review document with current status, risks, stakeholders, blockers, and next steps Weekly team recap Workflow Help managers monitor activity and risk across a group of reps or accounts End-of-week team summary for sales leadership Team ID date range Retrieve calls and structured insights across the team. Group by rep, account, or deal. Identify recurring themes, major risks, strong calls, and missed follow-ups. Highlight calls or deals that need attention. Team-level recap with patterns, key risks, notable wins, and action areas Objection analysis across calls Workflow Help teams identify patterns across multiple conversations Analyse pricing or competitor objections across recent calls Account ID deal ID rep ID keyword/topic date range Search calls matching the topic or keyword. Retrieve summaries, transcripts, and snippets where relevant. Identify recurring objections and how they were handled. Assess whether objections were resolved or remain open. Summarise patterns and examples. Objection analysis with themes, frequency, examples, and suggested follow-up actions Build onboarding playlist Workflow Help enablement teams curate useful learning content faster Build a playlist of strong discovery, demo, or pricing calls for new hires Topic call type rep/team filter optional time period Search for calls matching the selected criteria. Rank or filter calls based on score, topics, or key moments. Identify useful snippets or full recordings. Add selected calls/snippets into a playlist structure. Generate short descriptions for each item. Curated onboarding playlist with selected calls/snippets and descriptions Deal Inspection Skill Skill Give users a consistent, opinionated way to assess a deal Claude reviews a deal using a repeatable Jiminny methodology Deal ID or account name optional review scope Determine whether the request is suitable for a deal inspection. Retrieve relevant calls, summaries, CRM context, stakeholders, and risks. Apply a standard Jiminny review framework to assess deal health. Look for missing next steps, unresolved objections, stakeholder gaps, and warning signs. Present findings in a consistent structure with recommended actions. Structured deal inspection with health assessment, red flags, and recommendations Manager Coaching Skill Skill Help managers review calls consistently and identify coaching moments Analyse a rep’s call and surface strengths, gaps, and examples for coaching Call ID optional rep ID optional coaching focus Retrieve transcript, score, summary, and key moments from the call. Evaluate the conversation against a coaching framework. Identify what went well and where the rep could improve. Suggest moments to clip as snippets. Recommend coaching actions or playlist additions. Coaching review with strengths, gaps, snippet suggestions, and recommended coaching actions CSM / QBR Prep Skill Skill Help CS or AM teams prepare structured customer reviews from conversations Generate an account review or QBR-style summary from recent customer interactions Account ID, optional time period Retrieve all recent calls, emails, and account-linked context. Aggregate themes, requests, blockers, sentiment shifts, and opportunities. Apply a repeatable account review structure. Summarise outcomes, open issues, and suggested next steps. Structured QBR/account review summary with themes, risks, opportunities, and actions Snippet Builder Skill Skill Help users consistently capture and label useful moments from calls Identify useful moments in a call and convert them into reusable snippets Call ID, optional focus area such as pricing, objection, competitor, discovery Retrieve transcript, recording timeline, and call insights. Detect moments matching the requested focus area. Propose snippet start/end times and titles. Tag snippets by type or theme. Optionally save them or add them to a playlist. One or more proposed or saved snippets with title, timing, and tags 💡 Technical details Auth model needs specifying. Are API keys scoped per user, per team, or per Jiminny instance? If a key is generated by an admin, does it inherit their visibility level, or provide org-wide? Are permissions evaluated at query time or frozen at key creation? Needs to be query-time, otherwise permission changes won't propagate. Key lifecycle management is missing. No mention of rotation, expiry, or revocation. A departed employee's active key is a data leak. Need: revocation, optional expiry, alerts on stale keys, and consider whether keys should be tied to service accounts rather than personal users. Rate limiting should be HIGH. A compromised key or misconfigured automation could bulk-export an entire customer's call history. Need per-key rate limits and anomaly detection on unusual access patterns. Open Questions Track unresolved issues or decisions that need to be made. Update as answers become available. Question Answer Date Answered Competitor research Competitor MCP Availability Core Capabilities Advanced Capabilities Positioning Key Strength Key Weakness Gong ✅ Mature MCP List/search calls Get transcripts get Call metadata Deal intelligence Scorecards, analytics CRM context Enterprise data layer Deep data + ecosystem integrations Limited opinionated AI workflows Avoma ✅ Mature MCP list_meetings get_meeting get_transcript key topics Deal fields/Deal level analysis Coaching/Scoring CRM context pushing insights into Notion / Confluence AI-ready meeting intelligence Strongest “outputs” layer Mostly pull-based interactions Fathom ✅ MCP list/search meetings get transcript get summary/action items Team/org context Webhooks (event-based triggers) get_weekly_recap aggregated action items across meetings creating webhooks directly from the MCP server Lightweight meeting data access Includes summaries + actions Limited analytics depth Grain ✅ Basic MCP get meetings download transcripts Notes Deals Scorecards Data access utility Simple + accessible Low sophistication, sometimes browser-based Outreach ⚠️ MCP (workflow-focused) Search sequences Emails Meetings (Kaia) account / prospect / opportunity lookups Workflow automation Multi-system orchestration Revenue workflow engine End-to-end GTM workflows Less depth in conversation data Attention ⚠️ Emerging MCP Meeting data Transcripts CRM-linked context AI insights Sales assistant workflows create snippets AI sales assistant + CRM Strong CRM linkage Less focus on external knowledge layer Planhat - Related content Ask Jiminny Anything on Call level Galya Dimitrova Hubspot app Galya Dimitrova Product Vision & Strategy Galya Dimitrova Automated CRM Filling Simona Georgieva (Deactivated) Competitive analysis Galya Dimitrova AI agent ideas Steliyan Georgiev Comments James Graham 9 Apr A few areas around Security & Compliance that need more depth before this moves beyond draft: Auth model needs specifying. Are API keys scoped per user, per team, or per Jiminny instance? If a key is generated by an admin, does it inherit their visibility level, or provide org-wide? Are permissions evaluated at query time or frozen at key creation? Needs to be query-time, otherwise permission changes won't propagate. Team visibility enforcement should be its own HIGH requirement. The current note under access control (\"ensure MCP only exposes data user has access to\") is doing too much work as a single line. Every MCP tool response (especially search_calls and deal-level aggregations) must be filtered through the same visibility engine as the UI. Semantic search is the riskiest here; it could surface results across team boundaries if not properly scoped. No data minimisation or scoping controls. We're exposing transcripts, CRM fields, contact details with job titles, deal context - significant PII and commercial data leaving the platform. Can customers configure which data types are exposed? Can transcripts be PII-stripped before they leave Jiminny? Given we position GDPR consent as a differentiator, we should be thinking about this. GDPR downstream processing is unaddressed. Piping transcripts to OpenAI/Gemini introduces new data processors. Customers need to acknowledge responsibility for downstream processing during setup. We should also consider whether call participants' recording consent covers onward sharing to third-party AI - it almost certainly doesn't by default. This is one for me to pick up. Key lifecycle management is missing. No mention of rotation, expiry, or revocation. A departed employee's active key is a data leak. Need: revocation, optional expiry, alerts on stale keys, and consider whether keys should be tied to service accounts rather than personal users. Rate limiting should be HIGH. A compromised key or misconfigured automation could bulk-export an entire customer's call history. Need per-key rate limits and anomaly detection on unusual access patterns. Audit logs should go deeper. Current spec (what data, which system, when) is a start. Add: identity behind the key, specific queries/filters used, and failed access attempts (especially cross-visibility-boundary attempts). Enterprise compliance teams will expect this. Downgrade handling. Doc says Scale tier and above, but doesn't say what happens on downgrade. Keys should auto-deactivate. Happy to help draft a dedicated Security & Compliance section if useful. Galya Dimitrova 15 Apr Thanks for the input @James Graham . I made the product related changes in the table and for the rest I left them as a note in the Technical section for the team to look at when they start looking at this. I wonder about your points related to GDPR. Currently multiple customers are using the Customer API/zapier to feed this data to AI and BI tools. They are also manually exporting transcripts and other information from the platform and feeding it to AI tools. I don’t get how MCP is so much different that all of these and why it will introduce new data processors (which are already being utilised) and would require any changes to the consent provided by participants.","depth":21,"bounds":{"left":0.41805187,"top":0.19313647,"width":0.051861703,"height":0.11173184},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"bounds":{"left":0.36053857,"top":0.19553073,"width":0.019946808,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jiminny MCP Connector","depth":23,"bounds":{"left":0.41805187,"top":0.1963288,"width":0.03125,"height":0.038707104},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Epic","depth":23,"bounds":{"left":0.41805187,"top":0.30806065,"width":0.010305851,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Link to Epik in Jira","depth":23,"bounds":{"left":0.41805187,"top":0.33040702,"width":0.043218084,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Document status","depth":23,"bounds":{"left":0.41805187,"top":0.3527534,"width":0.04105718,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DRAFT","depth":23,"bounds":{"left":0.41805187,"top":0.37509975,"width":0.016289894,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Objective","depth":23,"bounds":{"left":0.41805187,"top":0.39744613,"width":0.024268618,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Enable customers to connect Jiminny data to external AI tools (Claude, OpenAI, Gemini) so it can be used as part of their broader knowledge base and workflows.","depth":23,"bounds":{"left":0.41805187,"top":0.4197925,"width":0.051529255,"height":0.17278531},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Position Jiminny as a data layer for AI-driven revenue workflows, not just a standalone product.","depth":23,"bounds":{"left":0.41805187,"top":0.59856343,"width":0.049700797,"height":0.10574621},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"👤 Target user","depth":23,"bounds":{"left":0.41805187,"top":0.75458896,"width":0.033909574,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Revenue teams using AI tools (Sales, CS, RevOps)","depth":23,"bounds":{"left":0.41805187,"top":0.7773344,"width":0.051030584,"height":0.061053474},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Companies already experimenting with Claude / OpenAI","depth":23,"bounds":{"left":0.41805187,"top":0.8443735,"width":0.04637633,"height":0.061053474},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Mid-market & Enterprise customers with multiple data sources (CRM, docs, CI tools, Support tools etc)","depth":23,"bounds":{"left":0.41805187,"top":0.9114126,"width":0.051363032,"height":0.0885874},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🤕 Pain point or problem","depth":23,"bounds":{"left":0.41805187,"top":1.0,"width":0.03706782,"height":-0.0897845},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jiminny data is locked in the platform","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AI tools lack access to high-value conversation context","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Customers must manually export/copy transcripts","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No easy way to combine calls with CRM + docs + other info - using the Jiminny API is not suitable for non technical sales people","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Peer pressure as almost all competitors have this","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💥 Impact and benefits","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For customers","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Better AI outputs using real customer conversations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ability to build automated workflows across tools","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For Jiminny","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Increased product stickiness (embedded in workflows)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Competitive parity with Gong / Avoma etc.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💡 Solution ideas","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build an AI Knowledge Connector (MCP-based) that:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Exposes Jiminny data (calls, transcripts, metadata) to AI tools","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provides structured insights (summaries, action items, scoring etc.)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Supports deal-level context","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allows integration into customer-owned AI stacks (Claude + Zapier, etc.)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Success metrics","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"List the key goals and how you will measure success. Include both qualitative and quantitative metrics (e.g., user adoption, retention rate, revenue targets).","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Goal","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Metric","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Increase stickiness by ensuring Jiminny is embedded in the customer’s workflows","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"% of customers connecting external AI tools","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Number of MCP/API calls per customer - and which ones are being used the most","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Decrease the manual copying of transcripts","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"decrease by X %","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"User interaction and design","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Simple setup flow:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate API key / connect MCP","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Clear instructions for Claude / Zapier setup","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Example prompts for Claude","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pre-built workflow templates for Zapier","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Clear documentation - with use cases","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"👉 Focus: usable by non-technical users","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Detailed Requirements","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"List the functional and non-functional requirements. Prioritize them (e.g., High, Medium, Low) and add notes for clarification.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Requirement","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Importance","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Notes","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to connect Jiminny to their AI tools (e.g. Claude, OpenAI)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide MCP endpoint so customers can easily integrate Jiminny into their AI stack","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to access call data through AI tools","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Expose Jiminny data:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list calls (filter by date, user, account, deal)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"get call","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"get transcript (speaker-separated)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"get call metadata","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search calls (keyword + semantic)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support filtering by:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"account / contact/ lead / deal","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"jiminny user","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"date range","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to search and query calls using AI tools","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support keyword and semantic search across conversations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide structured insights so customers can generate better outputs","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For each call, expose:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summary","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Action items","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Key points","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity type","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Notes","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Call Score","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CRM information","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to understand deal status across multiple calls/emails","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For each deal expose:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calls/meetings/emails","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identified risks","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"contacts related to the deal with their job title","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"linked account details","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"all CRM field information that we have in DI + fields used for CRM filling","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"example - get_deal_summary","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"request -","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"tool\": \"get_deal_summary\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"arguments\": {","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"deal_name\": \"ACME\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"responce:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"deal_name\": \"ACME\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"stage\": \"Negotiation\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"recent_activity\": [","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Demo call on 2026-04-01\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Pricing discussion on 2026-04-03\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"risks\": [","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Pricing concerns\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Security review pending\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"], \"next_steps\": [","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Send follow-up to VP Sales\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Share security documentation\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"]","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure the AI can easily understand the schema of the data coming from Jiminny","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Models perform much better when tools have:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"clear names","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rich descriptions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"predictable schemas","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide clear, actionable error states for customers when MCP connections fail","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Error messages should guide agents toward solutions with specific suggestions and next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Expired or revoked key — “Error: Authentication failed. The API key used to access Jiminny has been revoked or has expired. Please ask your Jiminny admin to generate a new API key in Settings > Organization > General and reconnect the MCP server.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limit hit — “Error: Rate limit exceeded. Too many requests have been made to the Jiminny MCP server in a short period. Please wait 60 seconds before retrying.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Permissions mismatch — if a user tries to access data outside their team visibility settings - “Error: Access denied. The requested call (call_id: [X]) is outside your team's visibility settings in Jiminny. Only calls within your permitted scope are accessible.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trying to access private meeting - “Error: Access denied. This meeting has been marked as private by the host and cannot be accessed through the MCP connector. Try requesting a different call or ask the meeting host to change the visibility settings in Jiminny.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Downgraded/Capture account — if a customer's plan drops below Scale tier or the Customer is on Capture in the first place - “Error: MCP access unavailable. The Jiminny MCP connector is available on the Scale plan and above. Your account does not currently have an active Scale subscription.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jiminny-side outage — “Error:Jiminny is temporarily unavailable (status 503). This is not a data or permissions issue — please retry in a few minutes.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No data found - “Error:No calls found matching your criteria. Try adjusting your filters — for example, widening the date range, removing the account filter, or checking the rep name is spelled correctly in Jiminny.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to securely control who and what data is accessible externally","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure MCP only exposes data user has access to - based on team visibility settings. This means that if a user is not allow to access calls/deals in Jiminny UI then they shouldn’t be able to access those through the MCP as well.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Private meetings shouldn’t be exposed via MCP","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"When a meetings is set to Private then the information about it shouldn’t be exposed through the MCP.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Jiminny data can be combined with other sources (e.g. CRM, docs) in AI workflows","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure data is structured to be easily combined with:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CRM (accounts, deals)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"external docs","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use consistent identifiers:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"account IDs","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"deal IDs","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP is available only for Scale tier and above","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Customers who are on Capture tier should be able to access any of their data through MCP.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This should also cover the scenario when a customer has been on Scale but then downgrades to Capture - their MCP access should stop working.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide visibility into how external AI tools access Jiminny data","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Audit logs:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"what data was accessed by which external system when","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"identity - who made the request","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"specific queries/filters used","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"failed access attempts (especially cross-visibility-boundary attempts)","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Admins should be able to access the logs from the org settings.We can start with a csv export before building a specific page for it.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"example from Atlassian -","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide customers with example prompts to get started quickly","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"HIGH","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP prompts are explicitly defined as prompt templates that clients can discover and call with arguments.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See examples in table below.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Expose Jiminny as a Connector in Claude","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"medium","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Competitors like Fathom are listed as Connectors in Claude. This will make it easier for customers to find us and to connect Jiminny","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide customers with example workflows to get started quickly","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"medium","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A workflow is usually multiple steps, maybe multiple tools, still focused on one outcome.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See examples in table below.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to use predefined Jiminny skills for common workflows","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"medium","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Anthropic describes Skills as folders that include instructions, scripts, and resources that Claude can load when relevant, and as a way to teach Claude repeatable workflows, preferences, and domain expertise once instead of re-explaining them every time. Skills - a reusable package of behavior that can include prompts, instructions, resources, and sometimes scripts/tools for a broader job.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude skills - https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf?hsLang=en&utm_source=chatgpt.com","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See examples in table below.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jiminny UI widget for OpenAI","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"medium","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The reason to have this is to make certain Jiminny use cases much easier than pure chat.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Instead of ChatGPT only replying with text like “Here are the last 5 ACME calls,” it could also show a visual Jiminny card or mini-app inside the chat. That widget could list calls, show a deal summary, let the user filter by rep/date/account, open a transcript section, or save a snippet—while the conversation continues in normal chat alongside it.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For Jiminny, the best widget use cases are the ones where users need to browse or compare rather than ask one-off questions. A strong example is deal review: the user asks ChatGPT, “What is the status of the ACME deal?” ChatGPT calls your Jiminny MCP tools, and the widget shows a compact deal view with recent calls, risks, next steps, stakeholders, and links to transcripts/snippets. The chat can still summarize the answer in words, but the widget gives a clearer, scannable interface.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Another good Jiminny widget use case is call search and exploration. A text answer can say “I found 12 calls mentioning pricing objections,” but a widget could show a sortable list with date, rep, account, score, and objection count, then let the user click into one call to see the exact excerpt or jump to a transcript section.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to run long-running analyses asynchronously and retrieve progress/results","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"low","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Some requests/questions require analysis of Hugh volumes of data. For those, it may be better to:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"start the job","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"let it run in the background","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return a status like “in progress”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"let the client come back for the result later","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For example - User asks in Claude:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"“Analyse all calls from this quarter and tell me the top 5 objections by segment.”","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"That might require:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"searching lots of calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"pulling many summaries/transcripts","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"aggregating results","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Instead of making Claude wait 45+ seconds, Jiminny could:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"create an analysis job","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return: job_id = 123, status = running","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"We need this in order to support:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"large-scale analysis","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"multi-call aggregation across lots of data","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"playlist generation across many calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"heavy recap/report generation","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Creating a snippet through the MCP","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"low","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Create a shareable snippet from a call recording by specifying a time range. Useful for highlighting key moments — objection handling, pricing discussions, competitive mentions — and sharing them with your team.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"example request:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"tool\": \"create_snippet\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"arguments\": {","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"call_id\": \"call_123\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"start_time\": \"00:18:24\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"end_time\": \"00:19:10\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"title\": \"Pricing objection\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"example response:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"snippet_id\": \"snip_987\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"title\": \"Pricing objection\",","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"share_url\": \"https://app.jiminny.com/snippets/snip_987\"","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ability to add recordings or snippets to a playlist","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"low","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow customers to create libraries of calls automatically. They can use those for onboarding or other purposes","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allow AI tools to read reusable Jiminny resources","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"low","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fathom","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resources are useful for data that should be read consistently rather than recomputed every time. In Jiminny terms, that could be:","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"current deal snapshot","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"account summary","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"weekly rep recap","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"approved talk tracks / objection handling guidance","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"curated playlists or snippet libraries","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This is useful because an AI can consume these directly as context, instead of repeatedly stitching together many tool calls.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ability to write coaching notes in Jiminny through MCP","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"low","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"What we want to do for prompts/worflows and skills","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Capability","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"User value / job to be done","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Example Jiminny use case","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Inputs","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Steps performed","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Output","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Draft follow-up email","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prompt","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help reps quickly create tailored follow-ups after calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use the latest customer call to draft an email with recap and next steps","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Call ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional tone","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional recipient type","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve call summary and action items from Jiminny.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull key points, commitments, and next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Apply the chosen tone and structure.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Draft the email in a consistent format.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Customer-ready follow-up email draft","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summarise call","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prompt","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help users quickly extract the most important points from a conversation","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a concise summary of one call for internal or external use","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Call ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional summary style","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional audience","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve transcript, metadata, and structured insights.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify key topics, decisions, risks, and next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Format output for the chosen audience.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Short or structured call summary with actions and risks","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate deal recap","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prompt","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help reps and managers get a fast overview of a deal","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summarise the current state of a deal based on recent calls and linked CRM context","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal ID or account name","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional date range","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve calls and meetings linked to the deal.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull deal metadata and CRM-linked context.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify recent changes, blockers, risks, and next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summarise into a concise recap.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal recap with status, blockers, risks, and recommended next steps","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prepare weekly recap","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prompt","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help managers or reps review what changed over a time period","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Weekly recap of calls, themes, and actions for one rep, team, or account","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rep ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"team ID or account ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"time period","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve relevant calls and summaries for the selected time period.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Aggregate themes, action items, and changes.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Highlight notable risks, opportunities, and follow-ups.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Weekly recap with top themes, risks, opportunities, and actions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prepare deal review","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Workflow","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help reps and managers review deal status using multiple sources of context","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Review a deal before pipeline review or forecast meeting","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional date range","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve all recent calls, emails, and meetings tied to the deal.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull structured call summaries, score, action items, and key points.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull linked CRM context such as stage, contacts, and account details.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Aggregate open risks, unresolved objections, stakeholder gaps, and next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Format into a review-ready structure.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal review document with current status, risks, stakeholders, blockers, and next steps","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Weekly team recap","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Workflow","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help managers monitor activity and risk across a group of reps or accounts","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"End-of-week team summary for sales leadership","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Team ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"date range","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve calls and structured insights across the team.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Group by rep, account, or deal.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify recurring themes, major risks, strong calls, and missed follow-ups.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Highlight calls or deals that need attention.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Team-level recap with patterns, key risks, notable wins, and action areas","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Objection analysis across calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Workflow","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help teams identify patterns across multiple conversations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Analyse pricing or competitor objections across recent calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Account ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"deal ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rep ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"keyword/topic","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"date range","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search calls matching the topic or keyword.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve summaries, transcripts, and snippets where relevant.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify recurring objections and how they were handled.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assess whether objections were resolved or remain open.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summarise patterns and examples.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Objection analysis with themes, frequency, examples, and suggested follow-up actions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build onboarding playlist","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Workflow","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help enablement teams curate useful learning content faster","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build a playlist of strong discovery, demo, or pricing calls for new hires","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Topic","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"call type","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rep/team filter","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional time period","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search for calls matching the selected criteria.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rank or filter calls based on score, topics, or key moments.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify useful snippets or full recordings.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add selected calls/snippets into a playlist structure.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate short descriptions for each item.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Curated onboarding playlist with selected calls/snippets and descriptions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal Inspection Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Give users a consistent, opinionated way to assess a deal","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude reviews a deal using a repeatable Jiminny methodology","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal ID or account name","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional review scope","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Determine whether the request is suitable for a deal inspection.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve relevant calls, summaries, CRM context, stakeholders, and risks.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Apply a standard Jiminny review framework to assess deal health.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Look for missing next steps, unresolved objections, stakeholder gaps, and warning signs.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Present findings in a consistent structure with recommended actions.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Structured deal inspection with health assessment, red flags, and recommendations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Manager Coaching Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help managers review calls consistently and identify coaching moments","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Analyse a rep’s call and surface strengths, gaps, and examples for coaching","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Call ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional rep ID","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"optional coaching focus","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve transcript, score, summary, and key moments from the call.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Evaluate the conversation against a coaching framework.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify what went well and where the rep could improve.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Suggest moments to clip as snippets.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recommend coaching actions or playlist additions.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Coaching review with strengths, gaps, snippet suggestions, and recommended coaching actions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CSM / QBR Prep Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help CS or AM teams prepare structured customer reviews from conversations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate an account review or QBR-style summary from recent customer interactions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Account ID, optional time period","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve all recent calls, emails, and account-linked context.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Aggregate themes, requests, blockers, sentiment shifts, and opportunities.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Apply a repeatable account review structure.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Summarise outcomes, open issues, and suggested next steps.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Structured QBR/account review summary with themes, risks, opportunities, and actions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Snippet Builder Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skill","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Help users consistently capture and label useful moments from calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Identify useful moments in a call and convert them into reusable snippets","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Call ID, optional focus area such as pricing, objection, competitor, discovery","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Retrieve transcript, recording timeline, and call insights.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Detect moments matching the requested focus area.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Propose snippet start/end times and titles.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tag snippets by type or theme.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Optionally save them or add them to a playlist.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"One or more proposed or saved snippets with title, timing, and tags","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💡 Technical details","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Auth model needs specifying. Are API keys scoped per user, per team, or per Jiminny instance? If a key is generated by an admin, does it inherit their visibility level, or provide org-wide? Are permissions evaluated at query time or frozen at key creation? Needs to be query-time, otherwise permission changes won't propagate.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Key lifecycle management is missing. No mention of rotation, expiry, or revocation. A departed employee's active key is a data leak. Need: revocation, optional expiry, alerts on stale keys, and consider whether keys should be tied to service accounts rather than personal users.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting should be HIGH. A compromised key or misconfigured automation could bulk-export an entire customer's call history. Need per-key rate limits and anomaly detection on unusual access patterns.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open Questions","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Track unresolved issues or decisions that need to be made. Update as answers become available.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Question","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Answer","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Date Answered","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Competitor research","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Competitor","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Availability","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Core Capabilities","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Advanced Capabilities","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Positioning","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Key Strength","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Key Weakness","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gong","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"✅ Mature MCP","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"List/search calls","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Get transcripts","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"get Call metadata","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deal intelligence","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Scorecards, analytics","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CRM context","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Enterprise data layer","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Deep data + ecosystem integrations","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Limited opinionated AI workflows","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Avoma","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8453513129422736784
|
-2099241113185791399
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] Graham . I made the product related changes in the table and for the rest I left them as a note in the Technical section for the team to look at when they start looking at this. I wonder about your points related to GDPR. Currently multiple customers are using the Customer API/zapier to feed this data to AI and BI tools. They are also manually exporting transcripts and other information from the platform and feeding it to AI tools. I don’t get how MCP is so much different that all of these and why it will introduce new data processors (which are already being utilised) and would require any changes to the consent provided by participants.
You said
Jiminny MCP Connector
Epic
Link to Epik in Jira
Document status
DRAFT
Objective
Enable customers to connect Jiminny data to external AI tools (Claude, OpenAI, Gemini) so it can be used as part of their broader knowledge base and workflows.
Position Jiminny as a data layer for AI-driven revenue workflows, not just a standalone product.
👤 Target user
Revenue teams using AI tools (Sales, CS, RevOps)
Companies already experimenting with Claude / OpenAI
Mid-market & Enterprise customers with multiple data sources (CRM, docs, CI tools, Support tools etc)
🤕 Pain point or problem
Jiminny data is locked in the platform
AI tools lack access to high-value conversation context
Customers must manually export/copy transcripts
No easy way to combine calls with CRM + docs + other info - using the Jiminny API is not suitable for non technical sales people
Peer pressure as almost all competitors have this
💥 Impact and benefits
For customers
Better AI outputs using real customer conversations
Ability to build automated workflows across tools
For Jiminny
Increased product stickiness (embedded in workflows)
Competitive parity with Gong / Avoma etc.
💡 Solution ideas
Build an AI Knowledge Connector (MCP-based) that:
Exposes Jiminny data (calls, transcripts, metadata) to AI tools
Provides structured insights (summaries, action items, scoring etc.)
Supports deal-level context
Allows integration into customer-owned AI stacks (Claude + Zapier, etc.)
Success metrics
List the key goals and how you will measure success. Include both qualitative and quantitative metrics (e.g., user adoption, retention rate, revenue targets).
Goal
Metric
Increase stickiness by ensuring Jiminny is embedded in the customer’s workflows
% of customers connecting external AI tools
Number of MCP/API calls per customer - and which ones are being used the most
Decrease the manual copying of transcripts
decrease by X %
User interaction and design
Simple setup flow:
Generate API key / connect MCP
Clear instructions for Claude / Zapier setup
Provide:
Example prompts for Claude
Pre-built workflow templates for Zapier
Clear documentation - with use cases
👉 Focus: usable by non-technical users
Detailed Requirements
List the functional and non-functional requirements. Prioritize them (e.g., High, Medium, Low) and add notes for clarification.
Requirement
Importance
Notes
Allow customers to connect Jiminny to their AI tools (e.g. Claude, OpenAI)
HIGH
Provide MCP endpoint so customers can easily integrate Jiminny into their AI stack
Allow customers to access call data through AI tools
HIGH
Expose Jiminny data:
list calls (filter by date, user, account, deal)
get call
get transcript (speaker-separated)
get call metadata
search calls (keyword + semantic)
Support filtering by:
account / contact/ lead / deal
jiminny user
date range
Allow customers to search and query calls using AI tools
HIGH
Support keyword and semantic search across conversations
Provide structured insights so customers can generate better outputs
HIGH
For each call, expose:
Summary
Action items
Key points
Activity type
Notes
Call Score
CRM information
Allow customers to understand deal status across multiple calls/emails
HIGH
For each deal expose:
calls/meetings/emails
Identified risks
contacts related to the deal with their job title
linked account details
all CRM field information that we have in DI + fields used for CRM filling
example - get_deal_summary
request -
{
"tool": "get_deal_summary",
"arguments": {
"deal_name": "ACME"
}
}
responce:
{
"deal_name": "ACME",
"stage": "Negotiation",
"recent_activity": [
"Demo call on 2026-04-01",
"Pricing discussion on 2026-04-03"
],
"risks": [
"Pricing concerns",
"Security review pending"
], "next_steps": [
"Send follow-up to VP Sales",
"Share security documentation"
]
}
Ensure the AI can easily understand the schema of the data coming from Jiminny
HIGH
Models perform much better when tools have:
clear names
rich descriptions
predictable schemas
Provide clear, actionable error states for customers when MCP connections fail
HIGH
Error messages should guide agents toward solutions with specific suggestions and next steps.
Expired or revoked key — “Error: Authentication failed. The API key used to access Jiminny has been revoked or has expired. Please ask your Jiminny admin to generate a new API key in Settings > Organization > General and reconnect the MCP server.”
Rate limit hit — “Error: Rate limit exceeded. Too many requests have been made to the Jiminny MCP server in a short period. Please wait 60 seconds before retrying.”
Permissions mismatch — if a user tries to access data outside their team visibility settings - “Error: Access denied. The requested call (call_id: [X]) is outside your team's visibility settings in Jiminny. Only calls within your permitted scope are accessible.”
Trying to access private meeting - “Error: Access denied. This meeting has been marked as private by the host and cannot be accessed through the MCP connector. Try requesting a different call or ask the meeting host to change the visibility settings in Jiminny.”
Downgraded/Capture account — if a customer's plan drops below Scale tier or the Customer is on Capture in the first place - “Error: MCP access unavailable. The Jiminny MCP connector is available on the Scale plan and above. Your account does not currently have an active Scale subscription.”
Jiminny-side outage — “Error:Jiminny is temporarily unavailable (status 503). This is not a data or permissions issue — please retry in a few minutes.”
No data found - “Error:No calls found matching your criteria. Try adjusting your filters — for example, widening the date range, removing the account filter, or checking the rep name is spelled correctly in Jiminny.”
Allow customers to securely control who and what data is accessible externally
HIGH
Ensure MCP only exposes data user has access to - based on team visibility settings. This means that if a user is not allow to access calls/deals in Jiminny UI then they shouldn’t be able to access those through the MCP as well.
Private meetings shouldn’t be exposed via MCP
HIGH
When a meetings is set to Private then the information about it shouldn’t be exposed through the MCP.
Ensure Jiminny data can be combined with other sources (e.g. CRM, docs) in AI workflows
HIGH
Ensure data is structured to be easily combined with:
CRM (accounts, deals)
external docs
Use consistent identifiers:
account IDs
deal IDs
MCP is available only for Scale tier and above
HIGH
Customers who are on Capture tier should be able to access any of their data through MCP.
This should also cover the scenario when a customer has been on Scale but then downgrades to Capture - their MCP access should stop working.
Provide visibility into how external AI tools access Jiminny data
HIGH
Audit logs:
what data was accessed by which external system when
identity - who made the request
specific queries/filters used
failed access attempts (especially cross-visibility-boundary attempts)
Admins should be able to access the logs from the org settings.We can start with a csv export before building a specific page for it.
example from Atlassian -
Provide customers with example prompts to get started quickly
HIGH
MCP prompts are explicitly defined as prompt templates that clients can discover and call with arguments.
See examples in table below.
Expose Jiminny as a Connector in Claude
medium
Competitors like Fathom are listed as Connectors in Claude. This will make it easier for customers to find us and to connect Jiminny
Provide customers with example workflows to get started quickly
medium
A workflow is usually multiple steps, maybe multiple tools, still focused on one outcome.
See examples in table below.
Allow customers to use predefined Jiminny skills for common workflows
medium
Anthropic describes Skills as folders that include instructions, scripts, and resources that Claude can load when relevant, and as a way to teach Claude repeatable workflows, preferences, and domain expertise once instead of re-explaining them every time. Skills - a reusable package of behavior that can include prompts, instructions, resources, and sometimes scripts/tools for a broader job.
Claude skills - https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf?hsLang=en&utm_source=chatgpt.com
See examples in table below.
Jiminny UI widget for OpenAI
medium
The reason to have this is to make certain Jiminny use cases much easier than pure chat.
Instead of ChatGPT only replying with text like “Here are the last 5 ACME calls,” it could also show a visual Jiminny card or mini-app inside the chat. That widget could list calls, show a deal summary, let the user filter by rep/date/account, open a transcript section, or save a snippet—while the conversation continues in normal chat alongside it.
For Jiminny, the best widget use cases are the ones where users need to browse or compare rather than ask one-off questions. A strong example is deal review: the user asks ChatGPT, “What is the status of the ACME deal?” ChatGPT calls your Jiminny MCP tools, and the widget shows a compact deal view with recent calls, risks, next steps, stakeholders, and links to transcripts/snippets. The chat can still summarize the answer in words, but the widget gives a clearer, scannable interface.
Another good Jiminny widget use case is call search and exploration. A text answer can say “I found 12 calls mentioning pricing objections,” but a widget could show a sortable list with date, rep, account, score, and objection count, then let the user click into one call to see the exact excerpt or jump to a transcript section.
Allow customers to run long-running analyses asynchronously and retrieve progress/results
low
Some requests/questions require analysis of Hugh volumes of data. For those, it may be better to:
start the job
let it run in the background
return a status like “in progress”
let the client come back for the result later
For example - User asks in Claude:
“Analyse all calls from this quarter and tell me the top 5 objections by segment.”
That might require:
searching lots of calls
pulling many summaries/transcripts
aggregating results
Instead of making Claude wait 45+ seconds, Jiminny could:
create an analysis job
return: job_id = 123, status = running
We need this in order to support:
large-scale analysis
multi-call aggregation across lots of data
playlist generation across many calls
heavy recap/report generation
Creating a snippet through the MCP
low
Create a shareable snippet from a call recording by specifying a time range. Useful for highlighting key moments — objection handling, pricing discussions, competitive mentions — and sharing them with your team.
example request:
{
"tool": "create_snippet",
"arguments": {
"call_id": "call_123",
"start_time": "00:18:24",
"end_time": "00:19:10",
"title": "Pricing objection"
}
}
example response:
{
"snippet_id": "snip_987",
"title": "Pricing objection",
"share_url": "https://app.jiminny.com/snippets/snip_987"
}
Ability to add recordings or snippets to a playlist
low
Allow customers to create libraries of calls automatically. They can use those for onboarding or other purposes
Allow AI tools to read reusable Jiminny resources
low
fathom
Resources are useful for data that should be read consistently rather than recomputed every time. In Jiminny terms, that could be:
current deal snapshot
account summary
weekly rep recap
approved talk tracks / objection handling guidance
curated playlists or snippet libraries
This is useful because an AI can consume these directly as context, instead of repeatedly stitching together many tool calls.
Ability to write coaching notes in Jiminny through MCP
low
What we want to do for prompts/worflows and skills
Capability
Type
User value / job to be done
Example Jiminny use case
Inputs
Steps performed
Output
Draft follow-up email
Prompt
Help reps quickly create tailored follow-ups after calls
Use the latest customer call to draft an email with recap and next steps
Call ID
optional tone
optional recipient type
Retrieve call summary and action items from Jiminny.
Pull key points, commitments, and next steps.
Apply the chosen tone and structure.
Draft the email in a consistent format.
Customer-ready follow-up email draft
Summarise call
Prompt
Help users quickly extract the most important points from a conversation
Generate a concise summary of one call for internal or external use
Call ID
optional summary style
optional audience
Retrieve transcript, metadata, and structured insights.
Identify key topics, decisions, risks, and next steps.
Format output for the chosen audience.
Short or structured call summary with actions and risks
Generate deal recap
Prompt
Help reps and managers get a fast overview of a deal
Summarise the current state of a deal based on recent calls and linked CRM context
Deal ID or account name
optional date range
Retrieve calls and meetings linked to the deal.
Pull deal metadata and CRM-linked context.
Identify recent changes, blockers, risks, and next steps.
Summarise into a concise recap.
Deal recap with status, blockers, risks, and recommended next steps
Prepare weekly recap
Prompt
Help managers or reps review what changed over a time period
Weekly recap of calls, themes, and actions for one rep, team, or account
Rep ID
team ID or account ID
time period
Retrieve relevant calls and summaries for the selected time period.
Aggregate themes, action items, and changes.
Highlight notable risks, opportunities, and follow-ups.
Weekly recap with top themes, risks, opportunities, and actions
Prepare deal review
Workflow
Help reps and managers review deal status using multiple sources of context
Review a deal before pipeline review or forecast meeting
Deal ID
optional date range
Retrieve all recent calls, emails, and meetings tied to the deal.
Pull structured call summaries, score, action items, and key points.
Pull linked CRM context such as stage, contacts, and account details.
Aggregate open risks, unresolved objections, stakeholder gaps, and next steps.
Format into a review-ready structure.
Deal review document with current status, risks, stakeholders, blockers, and next steps
Weekly team recap
Workflow
Help managers monitor activity and risk across a group of reps or accounts
End-of-week team summary for sales leadership
Team ID
date range
Retrieve calls and structured insights across the team.
Group by rep, account, or deal.
Identify recurring themes, major risks, strong calls, and missed follow-ups.
Highlight calls or deals that need attention.
Team-level recap with patterns, key risks, notable wins, and action areas
Objection analysis across calls
Workflow
Help teams identify patterns across multiple conversations
Analyse pricing or competitor objections across recent calls
Account ID
deal ID
rep ID
keyword/topic
date range
Search calls matching the topic or keyword.
Retrieve summaries, transcripts, and snippets where relevant.
Identify recurring objections and how they were handled.
Assess whether objections were resolved or remain open.
Summarise patterns and examples.
Objection analysis with themes, frequency, examples, and suggested follow-up actions
Build onboarding playlist
Workflow
Help enablement teams curate useful learning content faster
Build a playlist of strong discovery, demo, or pricing calls for new hires
Topic
call type
rep/team filter
optional time period
Search for calls matching the selected criteria.
Rank or filter calls based on score, topics, or key moments.
Identify useful snippets or full recordings.
Add selected calls/snippets into a playlist structure.
Generate short descriptions for each item.
Curated onboarding playlist with selected calls/snippets and descriptions
Deal Inspection Skill
Skill
Give users a consistent, opinionated way to assess a deal
Claude reviews a deal using a repeatable Jiminny methodology
Deal ID or account name
optional review scope
Determine whether the request is suitable for a deal inspection.
Retrieve relevant calls, summaries, CRM context, stakeholders, and risks.
Apply a standard Jiminny review framework to assess deal health.
Look for missing next steps, unresolved objections, stakeholder gaps, and warning signs.
Present findings in a consistent structure with recommended actions.
Structured deal inspection with health assessment, red flags, and recommendations
Manager Coaching Skill
Skill
Help managers review calls consistently and identify coaching moments
Analyse a rep’s call and surface strengths, gaps, and examples for coaching
Call ID
optional rep ID
optional coaching focus
Retrieve transcript, score, summary, and key moments from the call.
Evaluate the conversation against a coaching framework.
Identify what went well and where the rep could improve.
Suggest moments to clip as snippets.
Recommend coaching actions or playlist additions.
Coaching review with strengths, gaps, snippet suggestions, and recommended coaching actions
CSM / QBR Prep Skill
Skill
Help CS or AM teams prepare structured customer reviews from conversations
Generate an account review or QBR-style summary from recent customer interactions
Account ID, optional time period
Retrieve all recent calls, emails, and account-linked context.
Aggregate themes, requests, blockers, sentiment shifts, and opportunities.
Apply a repeatable account review structure.
Summarise outcomes, open issues, and suggested next steps.
Structured QBR/account review summary with themes, risks, opportunities, and actions
Snippet Builder Skill
Skill
Help users consistently capture and label useful moments from calls
Identify useful moments in a call and convert them into reusable snippets
Call ID, optional focus area such as pricing, objection, competitor, discovery
Retrieve transcript, recording timeline, and call insights.
Detect moments matching the requested focus area.
Propose snippet start/end times and titles.
Tag snippets by type or theme.
Optionally save them or add them to a playlist.
One or more proposed or saved snippets with title, timing, and tags
💡 Technical details
Auth model needs specifying. Are API keys scoped per user, per team, or per Jiminny instance? If a key is generated by an admin, does it inherit their visibility level, or provide org-wide? Are permissions evaluated at query time or frozen at key creation? Needs to be query-time, otherwise permission changes won't propagate.
Key lifecycle management is missing. No mention of rotation, expiry, or revocation. A departed employee's active key is a data leak. Need: revocation, optional expiry, alerts on stale keys, and consider whether keys should be tied to service accounts rather than personal users.
Rate limiting should be HIGH. A compromised key or misconfigured automation could bulk-export an entire customer's call history. Need per-key rate limits and anomaly detection on unusual access patterns.
Open Questions
Track unresolved issues or decisions that need to be made. Update as answers become available.
Question
Answer
Date Answered
Competitor research
Competitor
MCP Availability
Core Capabilities
Advanced Capabilities
Positioning
Key Strength
Key Weakness
Gong
✅ Mature MCP
List/search calls
Get transcripts
get Call metadata
Deal intelligence
Scorecards, analytics
CRM context
Enterprise data layer
Deep data + ecosystem integrations
Limited opinionated AI workflows
Avoma...
|
72315
|
|
47246
|
996
|
23
|
2026-04-17T11:16:40.314409+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776424600314_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewHistoryWindowHelpQ Search Jiminny SlackFileEditViewHistoryWindowHelpQ Search Jiminny IncJiminny ...ThreadsDMs= Unreadse Threads6 Huddles* Drafts & sent8 DirectoriesAchivityEh External connectionsFiles# Starred8 jiminny-x-integrati...A platform-inner-teamMoreohannes# ai-chapter# alerts# backendconflicion-clnid# curiosity lab# engineering# frontendi# general# infra-changes# jiminny-bg# platform-tickets# product_launchesac random# releases# support# thank-yous# the people of jimi...•- Direct messagese Nikolav Nikolov(3 Aneliya Angelova, .... Galya Dimitrova8. Stoyan TanevC. Vasil Vasilev. Nikolay Ivanov®. Aneliya Angelovae VesR. Steliyan Georgieva: Apps# Jira CloudToastGoogle Cale…..3hles8 Download allLinking your zono chn aecountLinking your Zoho CRM accountMembrane Al Assistant APP 1 hour ago• Thanks for the follow-up! Let me address both of your questions:1. Missing disconnected field in API responseYou're right to point this out. Looking at your API response, I can see it only has (connected) and not |disconnected . Let meescalate this back to the engineering team to clarify which endpoints include both fields and which ones only haveconnected . This may differ between endpoints.2. Hiding "Connect via Membrane" optionThe "Connect via Membrane" (Auth Proxy) option appeared when you upgraded to connector v3.0.3. If you want to hide thisoption and only show "OAuth 2.0" to your users, you can disable the auth-proxy option in your integration settings.Let me get back to you shortly on the disconnected field question.Membrane Al Assistant APP 13 minutes ago* I've investigated the code and found the issue! You're absolutely right - the disconnected field is missing from the GET/integrations/:key endpoint response.What's happening:The backward compatibility logic that adds disconnected = ! connected is only applied when you call GET/connections/:id directly. When the connection is nested in the integration response (from [GET /integrations/zohocrm),it bypasses this logic and only returns connected.Workaround for now:Instead of getting the connection from GET /integrations/zohocrm, you can:• Use (GET /connections/: connectionId directly - this endpoint includes both (connected and disconnected fields• Or, compute it yourself: [disconnected = ! connectedHiding "Connect via Membrane":To disable the auth-proxy option in your Zoho CRM integration settings, you can configure which auth options to show invournieranon scrines nune consoleIm escalaune ne missine ascomecrerelessue lome encneeihe eam oix iacross alll eneponis. Woule elunelworkaround work for vou in the meantime?10 external people are from MembraneReply...Also send to @ jiminny-x-integration-appYou're up to date# engineeringllan Kyuchukov and vesllian Kyuchukov Today at 10:28 AMWe have a broken loop of syncing Stage changes for two clients, which results in non-stop requests to Prophet (which costsmoney).Has there been any changes to the logic?[jiminny@localhost]sole [EU1C scratch_1.json© CrmEntityRepository.phpV connect.vuefi crm_configurations (EU]V Onboard.vue x21X9A VrationApp = async function () {p = new IntegrationAppClient(fdLueawait integrationAppetails.name)nGffalse,nhecclons. tause.connection.disconnected === true || connection.connected === false) {ith your CRM could not be established",= await axios.post("/api/v1/integration-app-connect");ata && saveRequest. data,success === true) *ood refresh the page here *reload();aveRequest.data.message);(normalizeError(error));ionAppConnection = async function O) {...};token only if the CRM is requiredppConnection();> 0liblj Support Daily • in 44 mAAutomatedRenortsCommandTest100% 145Fri 17 Apr 14:16:39CascadeAutomated Report RetrDebugging OpportunitUpdate Connection Loconnect.vue tront-end/src/components/connecnothing is there"cant see log'sThe console is full of CSP warnings and errors but none of your [IntegrationApp] logs. This means intedrat1onApponcL1ck Is never belno called at all — the burton click isn't reachine that tunction.Check:1. Is the button actually calling integrationApp0nClick? - the click handler might be bound to adifferent method or the component re-rendered2. Is the frontend bundle rebuilt? — you may be running a stale build that doesn't include your changesSearched.intecrationAoo@nClickin tront-enc/src/cents/connect/connect.vue (2)The binding looks correct. The most likely issue is a stale build - your changes aren't compiled yet. Add aquick test: put a console.log before the IntegrationAppClient instantiation that's impossible to miss:Reao connecrvue ÷158-142• connect.vueNow after saving, hard refresh the browser ( Cmd+Shift+R ) to bust the cache. If you still don't see [IntegraLlonAdo intecracionAppuncllck called arter cllckine tne ourion, tne dev server nash't olckea ue tnechanges or the click event isn't reaching this component (e.g. another element is intercepting it).Ask anything (284L)+ <> Code Claude Sonnet 4.6Current versiontry {const saveRequest = await axios.post("/api/v1/integration-app-connect",if (connection && connection.disconnected !== true && connection.connected !== false) €o merenceW Winasurt leams( 2 spaces...
|
NULL
|
8453437778786315651
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackFileEditViewHistoryWindowHelpQ Search Jiminny SlackFileEditViewHistoryWindowHelpQ Search Jiminny IncJiminny ...ThreadsDMs= Unreadse Threads6 Huddles* Drafts & sent8 DirectoriesAchivityEh External connectionsFiles# Starred8 jiminny-x-integrati...A platform-inner-teamMoreohannes# ai-chapter# alerts# backendconflicion-clnid# curiosity lab# engineering# frontendi# general# infra-changes# jiminny-bg# platform-tickets# product_launchesac random# releases# support# thank-yous# the people of jimi...•- Direct messagese Nikolav Nikolov(3 Aneliya Angelova, .... Galya Dimitrova8. Stoyan TanevC. Vasil Vasilev. Nikolay Ivanov®. Aneliya Angelovae VesR. Steliyan Georgieva: Apps# Jira CloudToastGoogle Cale…..3hles8 Download allLinking your zono chn aecountLinking your Zoho CRM accountMembrane Al Assistant APP 1 hour ago• Thanks for the follow-up! Let me address both of your questions:1. Missing disconnected field in API responseYou're right to point this out. Looking at your API response, I can see it only has (connected) and not |disconnected . Let meescalate this back to the engineering team to clarify which endpoints include both fields and which ones only haveconnected . This may differ between endpoints.2. Hiding "Connect via Membrane" optionThe "Connect via Membrane" (Auth Proxy) option appeared when you upgraded to connector v3.0.3. If you want to hide thisoption and only show "OAuth 2.0" to your users, you can disable the auth-proxy option in your integration settings.Let me get back to you shortly on the disconnected field question.Membrane Al Assistant APP 13 minutes ago* I've investigated the code and found the issue! You're absolutely right - the disconnected field is missing from the GET/integrations/:key endpoint response.What's happening:The backward compatibility logic that adds disconnected = ! connected is only applied when you call GET/connections/:id directly. When the connection is nested in the integration response (from [GET /integrations/zohocrm),it bypasses this logic and only returns connected.Workaround for now:Instead of getting the connection from GET /integrations/zohocrm, you can:• Use (GET /connections/: connectionId directly - this endpoint includes both (connected and disconnected fields• Or, compute it yourself: [disconnected = ! connectedHiding "Connect via Membrane":To disable the auth-proxy option in your Zoho CRM integration settings, you can configure which auth options to show invournieranon scrines nune consoleIm escalaune ne missine ascomecrerelessue lome encneeihe eam oix iacross alll eneponis. Woule elunelworkaround work for vou in the meantime?10 external people are from MembraneReply...Also send to @ jiminny-x-integration-appYou're up to date# engineeringllan Kyuchukov and vesllian Kyuchukov Today at 10:28 AMWe have a broken loop of syncing Stage changes for two clients, which results in non-stop requests to Prophet (which costsmoney).Has there been any changes to the logic?[jiminny@localhost]sole [EU1C scratch_1.json© CrmEntityRepository.phpV connect.vuefi crm_configurations (EU]V Onboard.vue x21X9A VrationApp = async function () {p = new IntegrationAppClient(fdLueawait integrationAppetails.name)nGffalse,nhecclons. tause.connection.disconnected === true || connection.connected === false) {ith your CRM could not be established",= await axios.post("/api/v1/integration-app-connect");ata && saveRequest. data,success === true) *ood refresh the page here *reload();aveRequest.data.message);(normalizeError(error));ionAppConnection = async function O) {...};token only if the CRM is requiredppConnection();> 0liblj Support Daily • in 44 mAAutomatedRenortsCommandTest100% 145Fri 17 Apr 14:16:39CascadeAutomated Report RetrDebugging OpportunitUpdate Connection Loconnect.vue tront-end/src/components/connecnothing is there"cant see log'sThe console is full of CSP warnings and errors but none of your [IntegrationApp] logs. This means intedrat1onApponcL1ck Is never belno called at all — the burton click isn't reachine that tunction.Check:1. Is the button actually calling integrationApp0nClick? - the click handler might be bound to adifferent method or the component re-rendered2. Is the frontend bundle rebuilt? — you may be running a stale build that doesn't include your changesSearched.intecrationAoo@nClickin tront-enc/src/cents/connect/connect.vue (2)The binding looks correct. The most likely issue is a stale build - your changes aren't compiled yet. Add aquick test: put a console.log before the IntegrationAppClient instantiation that's impossible to miss:Reao connecrvue ÷158-142• connect.vueNow after saving, hard refresh the browser ( Cmd+Shift+R ) to bust the cache. If you still don't see [IntegraLlonAdo intecracionAppuncllck called arter cllckine tne ourion, tne dev server nash't olckea ue tnechanges or the click event isn't reaching this component (e.g. another element is intercepting it).Ask anything (284L)+ <> Code Claude Sonnet 4.6Current versiontry {const saveRequest = await axios.post("/api/v1/integration-app-connect",if (connection && connection.disconnected !== true && connection.connected !== false) €o merenceW Winasurt leams( 2 spaces...
|
NULL
|
|
71294
|
1694
|
28
|
2026-04-22T12:22:15.413174+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776860535413_m1.jpg...
|
PhpStorm
|
faVsco.js – DealService.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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
9
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\DealInsights;
use Carbon\CarbonInterface;
use Illuminate\Support\Collection;
use Jiminny\Component\AiAutomation\Services\ManualCrmFillingEligibilityChecker;
use Jiminny\Component\DealInsights\Activity\ActivityAggregatorInterface;
use Jiminny\Component\DealRisks\DealRisksServiceInterface;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Http\Serializers\JsonSerializer;
use Jiminny\Http\Transformers\DealStageTransformer;
use Jiminny\Http\Transformers\LayoutTransformer;
use Jiminny\Jobs\Crm\SetupLayout;
use Jiminny\Jobs\JobDispatcher;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Inbox;
use Jiminny\Models\InboxEmail;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\User;
use Jiminny\Repositories\CrmTemplateRunRepository;
use Jiminny\Services\Mail\InboxServiceInterface;
use League\Fractal\Manager;
use League\Fractal\Resource\Item;
class DealService implements DealServiceInterface
{
/**
* DealService constructor.
*/
public function __construct(
private readonly ActivityAggregatorInterface $activityAggregator,
private readonly InboxServiceInterface $inboxService,
private readonly DealRisksServiceInterface $dealRisksService,
private readonly CrmServiceInterface $crmService,
private readonly DealsServiceRepositories $dealsServiceRepositories,
private readonly PerformanceMonitor $monitor,
private readonly DealStageTransformer $dealStageTransformer,
private readonly CrmTemplateRunRepository $crmTemplateRunRepository,
private readonly ManualCrmFillingEligibilityChecker $manualCrmFillingEligibilityChecker,
) {
}
public function getDealInsightsLayout(Configuration $config): ?Layout
{
$layout = $this->dealsServiceRepositories->findDealInsightLayoutByCrmConfig($config);
if (! $layout) {
$this->createDealInsightLayout($config);
}
return $layout;
}
private function createDealInsightLayout(Configuration $config)
{
$jobDispatcher = app(JobDispatcher::class);
$jobDispatcher->dispatch(new SetupLayout($config, null, Layout::TYPE_DEAL_INSIGHTS));
}
public function getDecoratedDeals(Models\User $executedBy, CriteriaInterface $criteria, array $crmColumns): array
{
$this->monitor->enable($executedBy);
$deals = $this->dealsServiceRepositories->getDeals($criteria);
$this->monitor->addStep('get deals');
return $this->decorateDeals($deals, $executedBy, $crmColumns);
}
public function getDecoratedDeal(Models\User $executedBy, int $id, array $crmColumns): ?array
{
$this->monitor->enable($executedBy);
$deal = $this->dealsServiceRepositories->getDeal($executedBy->getTeam(), $id);
if (empty($deal)) {
return null;
}
$this->monitor->addStep('get deal');
$decoratedDeal = $this->decorateDeals($deal, $executedBy, $crmColumns, decorateWithCrmData: true)[0] ?? null;
if ($decoratedDeal !== null) {
$decoratedDeal['stages'] = $this->getHydratedStages($executedBy->getTeam()->getCrmConfiguration());
}
return $decoratedDeal;
}
private function getHydratedStages(Configuration $configuration): array
{
$stages = $this->dealsServiceRepositories->getConfigurationStages($configuration);
return $stages->map(function (Models\Stage $stage): array {
return $this->dealStageTransformer->transform($stage);
})->toArray();
}
private function decorateDeals(
array $deals,
Models\User $executedBy,
array $crmColumns,
bool $decorateWithCrmData = false,
): array {
$followedOpportunityIds = new Collection();
$dealRisks = [];
$opportunityIdsWithPendingCrmTemplateRuns = [];
$crmConfiguration = $executedBy->getTeam()->getCrmConfiguration();
if (! empty($deals)) {
/** Aggregate activities */
$deals = $this->decorateWithActivities($deals);
$this->monitor->addStep('get decorated activities');
/** Decorate with comments statistics */
$deals = $this->decorateWithCommentsStatistics($executedBy, $deals);
$this->monitor->addStep('get comments');
/** Decorate with crm layout columns */
$deals = $this->decorateWithLayoutColumns($executedBy, $deals, $crmColumns);
$this->monitor->addStep('get layout columns');
$followedOpportunityIds = $this->dealsServiceRepositories->getFollowedOpportunityIds(
$executedBy,
array_keys($deals)
);
$this->monitor->addStep('get followed opportunity ids');
$syncStatuses = $this->getEmailStatus($deals);
$this->monitor->addStep('get email status');
$dealRisks = $this->dealRisksService->getDealRisks($executedBy, array_keys($deals));
$this->monitor->addStep('get deal risks');
$opportunityIdsWithPendingCrmTemplateRuns = $this->crmTemplateRunRepository
->getOpportunityIdsWithPendingCrmTemplateRuns();
}
foreach ($deals as $oppId => $data) {
/** add followed flag */
$deals[$oppId]['is_followed'] = $followedOpportunityIds->contains($oppId);
/** add email sync status */
if (isset($syncStatuses[$data['owner']['id']])) {
$deals[$oppId]['emailSyncStatus'] = $syncStatuses[$data['owner']['id']];
} else {
$deals[$oppId]['emailSyncStatus'] = [
'sync_enabled' => false,
'last_sync' => null,
'unprocessed_emails' => null,
];
}
if ($decorateWithCrmData) {
$crmProviderKey = Providers::getCrmIntegrationSlug($crmConfiguration);
$deals[$oppId]['crmType'] = $crmProviderKey;
$deals[$oppId]['crmName'] = Providers::getProviderDisplayName($crmProviderKey);
$deals[$oppId]['dealStageName'] = $this->resolveStage(
isClosed: $data['isClosed'],
isWon: $data['isWon'],
);
}
/** add deal risks data */
if (array_key_exists($oppId, $dealRisks)) {
$deals[$oppId]['dealRisks'] = $dealRisks[$oppId];
}
/** add hasPendingCrmTemplateRuns flag */
if (
in_array($oppId, $opportunityIdsWithPendingCrmTemplateRuns) &&
$this->manualCrmFillingEligibilityChecker->isEligibleForOpportunity($executedBy, $data['owner']['id'])
) {
$deals[$oppId]['hasPendingCrmTemplateRuns'] = true;
}
/** wipe unnecessary data */
unset($deals[$oppId]['owner']['id']);
}
$this->monitor->log('getDecoratedDeals');
return array_values($deals);
}
private function decorateWithActivities(array $deals): array
{
$aggregatedActivities = $this->activityAggregator->getAggregatedActivities(array_keys($deals));
foreach ($aggregatedActivities as $opportunityId => $data) {
$deals[$opportunityId]['activities'] = $data;
}
return $deals;
}
private function getEmailStatus(array $deals): array
{
$ownerIds = array_unique(array_map(function (array $v) {
return $v['owner']['id'];
}, $deals));
return $this->fetchEmailSyncStatus($ownerIds);
}
private function decorateWithCommentsStatistics(Models\User $user, array $deals): array
{
$opportunityIds = array_keys($deals);
$commentStats = $this->dealsServiceRepositories->getCommentStatistics($user, $opportunityIds);
foreach ($commentStats as $opportunityId => $stats) {
$deals[$opportunityId]['commentsStats'] = $stats;
}
return $deals;
}
private function decorateWithLayoutColumns(Models\User $user, array $deals, array $crmData): array
{
$fields = $this->getFieldsFromLayout($crmData);
$opportunityIds = array_keys($deals);
$dealsCrmFieldData = $this->getCrmFieldData($user, $opportunityIds);
return $this->buildDealColumns($deals, $fields, $dealsCrmFieldData);
}
public function getStageTotals(CriteriaInterface $criteria): array
{
$result = [];
$crmConfig = $criteria->getContext()->getTeam()->getCrmConfiguration();
$defaultCurrency = $crmConfig->getDefaultCurrency();
foreach (Criteria::listStages() as $stage) {
$stageCriteria = (new Criteria(
$criteria->getContext(),
$stage,
$criteria->getPeriod(),
$criteria->getSearchColumn(),
))
->setUsers($criteria->getUsers())
->setTeams($criteria->getTeams())
->setPipelines($criteria->getPipelines())
->setDealStages($criteria->getDealStages())
->setDealTypes($criteria->getDealTypes())
->setDealName($criteria->getDealName());
if ($crmConfig->hasDefaultCurrencyFieldSet()) {
$totals = $this->dealsServiceRepositories->getTotalsInDefaultCurrency($stageCriteria);
$result[$stage] = [
'total' => \formatOpportunityValue((float) $totals['total'], $defaultCurrency),
'count' => $totals['count'],
'mixedCurrency' => false,
'additional' => [],
];
continue;
}
$totals = $this->dealsServiceRepositories->getTotals($stageCriteria, $defaultCurrency);
usort($totals, function ($t1, $t2) {
return $t1['count'] <=> $t2['count'];
});
$primaryTotal = array_reduce($totals, function (?array $carry, array $v) use ($defaultCurrency): ?array {
return $v['currency'] === $defaultCurrency ? $v : $carry;
}) ?? [
'count' => 0,
'total' => \formatOpportunityValue(0, $defaultCurrency),
'currency' => $defaultCurrency,
];
$result[$stage] = [
'total' => \formatOpportunityValue((float) $primaryTotal['total'], $primaryTotal['currency']),
'count' => $primaryTotal['count'],
'mixedCurrency' => (bool) (count($totals) > 1),
'additional' => [],
];
foreach ($totals as $total) {
if ($total['currency'] === $defaultCurrency) {
continue;
}
$result[$stage]['additional'][] = [
'total' => \formatOpportunityValue((float) $total['total'], $total['currency']),
'count' => $total['count'],
];
}
}
return $result;
}
public function getDailyActivities(CriteriaInterface $criteria): array
{
$resultData = [];
$data = $this->dealsServiceRepositories->getDealActivities($criteria);
/** @var Activity $activity */
foreach ($data as $activity) {
$organizer = $activity->getUser();
$type = $activity->getType();
$activityData = [
'organizer' => [
'name' => $organizer->getName(),
'photoUrl' => $organizer->getPhotoUrl(),
'job' => [
'name' => $organizer->getJobTitle()->getName(),
],
],
'id' => $activity->getUuid(),
'type' => $type,
'title' => $activity->getTitle(),
'actualEndTimeForHumans' => $activity->getActualEndTime()?->diffForHumans(
syntax: ['parts' => 1, 'options' => CarbonInterface::ROUND],
),
'actualEndTime' => $activity->getActualEndTime()?->toIso8601String(),
'date' => $activity->getActualEndTime()?->toIso8601String(),
'crmUrl' => $this->getCrmUrl($activity),
'isRecorded' => $activity->getTracksWithTelephonyCountAttribute() > 0,
'participants' => $this->getParticipants($activity),
];
if (in_array($type, [Activity::TYPE_SMS_INBOUND, Activity::TYPE_SMS_OUTBOUND])) {
$activityData['message'] = $activity->getDescription();
} elseif (in_array($type, [Activity::TYPE_EMAIL_INBOUND, Activity::TYPE_EMAIL_OUTBOUND])) {
$activityData['description'] = $activity->getDescription();
}
$resultData[] = $activityData;
}
return $resultData;
}
private function getCrmUrl(Activity $activity): ?string
{
if (! $activity->hasCrmProviderId()) {
return null;
}
if (! $activity->hasCrmConfiguration() ||
$activity->getCrm()->getProviderName() !== Configuration::PROVIDER_SALESFORCE
) {
return null;
}
return $activity->getCrm()->getBaseUrl() . '/' . $activity->getCrmProviderId();
}
private function getParticipants(Activity $activity): array
{
$participants = [];
/** @var Participant $participant */
foreach ($activity->getParticipants() as $participant) {
$participantData = [
'id' => $participant->getUuid(),
'name' => $participant->getName(),
'email' => $participant->getEmailAddress(),
'phone' => $participant->getPhoneNumber(),
'role' => $participant->getRole(),
];
if ($participant->hasUser()) {
$user = $participant->getUser();
$participantData['user'] = [
'id' => $user->getUuid(),
'photoUrl' => $user->getPhotoUrl(),
'job' => [
'name' => $user->getJobTitle()->getName(),
],
];
}
$participants[] = $participantData;
}
return $participants;
}
public function getStages(CriteriaInterface $criteria): array
{
return $this->dealsServiceRepositories->getStages($criteria);
}
public function getCrmFieldData(User $user, array $opportunityIds): array
{
$crmFieldNames = $this->crmService->getDealInsightsLayoutFieldNames($user);
$dealsCrmFieldData = [];
$crmConfig = $user->getTeam()->getCrmId();
if (! empty($opportunityIds)) {
$crmData = $this->dealsServiceRepositories->getCrmFieldData($crmFieldNames, $crmConfig, $opportunityIds);
foreach ($crmData as $item) {
$dealsCrmFieldData[$item['dealId']][$item['field_name']] = $item['value'];
}
}
return $dealsCrmFieldData;
}
public function updateDeal(User $user, Opportunity $opportunity, array $params): ?Opportunity
{
return $this->crmService->updateDeal($user, $opportunity, $params);
}
private function getFieldsFromLayout(array $layoutData): array
{
$fields = [];
foreach ($layoutData['entities'] as $entity) {
$fieldCrmId = $entity['field']['fieldName'];
$fields[$entity['field']['id']] = [
'fieldName' => $fieldCrmId,
'fieldType' => $entity['field']['type'],
];
if (! empty($entity['field']['isStageField'])) {
$fields[$entity['field']['id']]['isStageField'] = true;
}
}
return $fields;
}
private function buildDealColumns($deals, $fields, $dealsCrmFieldData): array
{
if (empty($deals)) {
return [];
}
foreach ($deals as $oppId => &$deal) {
$opportunity = $this->dealsServiceRepositories->findOpportunity($oppId);
foreach ($fields as $uuid => $field) {
$fieldName = $field['fieldName'];
$value = $dealsCrmFieldData[$oppId][$fieldName] ?? '';
if ($field['fieldType'] === Field::TYPE_CURRENCY) {
$currency = $this->getDealCurrency($opportunity, $fieldName);
$deal['crm_data'][$uuid] = $this->buildCurrencyColumn($value, $currency, $fieldName);
} elseif (! empty($field['isStageField'])) {
$currentPipelineId = $deal['currentPipelineId'];
$stageUpdatedAt = $opportunity->getLastStageUpdate();
$deal['crm_data'][$uuid] = $this->buildStageColumn(
$fieldName,
$value,
$stageUpdatedAt,
$currentPipelineId
);
} else {
$deal['crm_data'][$uuid] = [
'label' => $fieldName,
'value' => $value,
];
}
}
unset($deal['rawValue'], $deal['currentStageUpdatedAt'], $deal['currentPipelineId']);
}
return $deals;
}
private function buildCurrencyColumn(string $value, string $currency, string $fieldName): array
{
return [
'rawValue' => [
'amount' => (int) $value,
'currency' => $currency,
],
'label' => $fieldName,
'value' => formatOpportunityValue(
(float) $value,
$currency,
2
),
];
}
private function buildStageColumn(
string $fieldName,
string $value,
string $stageUpdatedAt,
?int $currentPipelineId
): array {
return [
'label' => $fieldName,
'value' => $value,
'enteredAt' => $stageUpdatedAt,
// to be decided if FE needs it
'pipelineId' => $currentPipelineId,
];
}
private function getDealCurrency(Opportunity $opportunity, string $fieldName): string
{
$config = $opportunity->getCrmConfiguration();
// this case should not happen in practice
if ($config === null) {
return $opportunity->currency_code ?? Opportunity::DEFAULT_CURRENCY;
}
$defaultCurrency = $config->getDefaultCurrency();
if ($this->isDefaultCurrencyField($config, $fieldName) || $this->isHomeCurrencyField($fieldName)) {
return $defaultCurrency;
}
return $opportunity->currency_code ?? $defaultCurrency;
}
private function isHomeCurrencyField(string $fieldName): bool
{
return str_ends_with($fieldName, '_in_home_currency');
}
public function getPipelineData(Configuration $crm): array
{
return $this->dealsServiceRepositories->getPipelineData($crm);
}
public function getCrmColumns(User $user): array
{
$config = $user->getTeam()->getCrmConfiguration();
$layout = $this->getDealInsightsLayout($config);
if (! $layout) {
return [];
}
$fractal = new Manager();
$fractal->setSerializer(new JsonSerializer());
$fractal->parseIncludes([
'entities.field.options',
]);
$resource = new Item($layout, (new LayoutTransformer($user->crmProfile)));
$layoutData = $fractal->createData($resource)->toArray();
return $this->hydrateStagesData($layoutData, $config);
}
private function hydrateStagesData($data, $config)
{
$pipelines = $this->getPipelineData($config);
$providerName = $config->getProviderName();
$stageFieldName = Field::STAGE_TYPE_FIELDS[$providerName] ?? null;
foreach ($data['entities'] as &$entity) {
if ($stageFieldName !== null && $entity['field']['fieldName'] === $stageFieldName) {
$entity['field']['isStageField'] = true;
$entity['field']['pipelines'] = $pipelines;
} else {
$entity['field']['isStageField'] = false;
}
}
return $data;
}
public function isDefaultCurrencyField(Configuration $config, string $fieldName): bool
{
$defaultCurrencyField = $config->getDefaultCurrencyField();
if ($defaultCurrencyField instanceof Field) {
return $fieldName === $defaultCurrencyField->getCrmProviderId();
}
return false;
}
private function fetchEmailSyncStatus(array $userIds): array
{
/** @var User[] $users */
$users = $this->dealsServiceRepositories->getUsersWithInboxByUserIds($userIds);
$result = [];
foreach ($users as $user) {
$inbox = $user->getInbox();
$isEnabled = $this->inboxService->isSyncEnabled($user);
$lastSync = null;
if ($isEnabled && $inbox instanceof Inbox && $inbox->getLastSyncedAt() !== null) {
$lastSync = $inbox->getLastSyncedAt()->format(\DATE_ATOM);
}
$result[$user->getId()] = [
'sync_enabled' => $isEnabled,
'last_sync' => $lastSync,
'unprocessed_emails' => $inbox?->emails()
->whereNotIn('status', [InboxEmail::STATUS_DISCARDED, InboxEmail::STATUS_PROCESSED])
->count(),
];
}
return $result;
}
public function resolveStage(bool $isClosed, bool $isWon): string
{
if (! $isClosed) {
return CriteriaInterface::OPEN_DEAL_LABEL;
}
return $isWon
? CriteriaInterface::CLOSED_WON_DEAL_LABEL
: CriteriaInterface::CLOSED_LOST_DEAL_LABEL;
}
}
A
1
Select All
17009
17009
17009
42ec35c8-7a66-3dff-b558-9c75866ecd68
42ec35c8-7a66-3dff-b558-9c75866ecd68
<null>
Galya Dimitrova
Galya Dimitrova
<null>
[EMAIL]
[EMAIL]
<null>
<null>
<null>
<null>
1
1
17009
<null>
<null>
<null>
<null>
<null>
<null>
/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg
/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg
<null>
0
0
17009
<null>
<null>
<null>
BG
BG
<null>
<null>
<null>
17009
[PHONE]
[PHONE]
<null>
<null>
<null>
<null>
<null>
<null>
<null>
7341
7341
17009
<null>
<null>
<null>
1
1
17009
2868
2868
17009
Europe/Sofia
Europe/Sofia
<null>
en_US
en_US
<null>
<null>
<null>
<null>
<null>
<null>
<null>
galyadimitrova
galyadimitrova
<null>
on-demand
on-demand
<null>
1
1
17009
on
on
<null>
0
0
17009
[PHONE]
[PHONE]
<null>
<null>
3
3
17009
1
1
17009
1
1
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
<null>
<null>
17009
email
email
<null>
0
0
17009
1
1
17009
never
never
<null>
never
never
<null>
1
1
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
2026-04-21 21:00:47
2026-04-21 21:00:47
<null>
2023-08-08 06:56:37
2023-08-08 06:56:37
<null>
2026-04-21 21:00:47
2026-04-21 21:00:47
<null>
id = 17009
Editor
1 row
Reload Page
Table Result Auto Refresh
Cancel Running Statements
Add Row
Delete Rows
Revert Selected
Preview Pending Changes
Submit
Tx: Auto
DDL
Find on Current Page
Table Result Local Filter
Record View...
|
[{"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":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","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":"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":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"5","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\\Component\\DealInsights;\n\nuse Carbon\\CarbonInterface;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\AiAutomation\\Services\\ManualCrmFillingEligibilityChecker;\nuse Jiminny\\Component\\DealInsights\\Activity\\ActivityAggregatorInterface;\nuse Jiminny\\Component\\DealRisks\\DealRisksServiceInterface;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Http\\Serializers\\JsonSerializer;\nuse Jiminny\\Http\\Transformers\\DealStageTransformer;\nuse Jiminny\\Http\\Transformers\\LayoutTransformer;\nuse Jiminny\\Jobs\\Crm\\SetupLayout;\nuse Jiminny\\Jobs\\JobDispatcher;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Inbox;\nuse Jiminny\\Models\\InboxEmail;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Participant;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\CrmTemplateRunRepository;\nuse Jiminny\\Services\\Mail\\InboxServiceInterface;\nuse League\\Fractal\\Manager;\nuse League\\Fractal\\Resource\\Item;\n\nclass DealService implements DealServiceInterface\n{\n /**\n * DealService constructor.\n */\n public function __construct(\n private readonly ActivityAggregatorInterface $activityAggregator,\n private readonly InboxServiceInterface $inboxService,\n private readonly DealRisksServiceInterface $dealRisksService,\n private readonly CrmServiceInterface $crmService,\n private readonly DealsServiceRepositories $dealsServiceRepositories,\n private readonly PerformanceMonitor $monitor,\n private readonly DealStageTransformer $dealStageTransformer,\n private readonly CrmTemplateRunRepository $crmTemplateRunRepository,\n private readonly ManualCrmFillingEligibilityChecker $manualCrmFillingEligibilityChecker,\n ) {\n }\n\n public function getDealInsightsLayout(Configuration $config): ?Layout\n {\n $layout = $this->dealsServiceRepositories->findDealInsightLayoutByCrmConfig($config);\n\n if (! $layout) {\n $this->createDealInsightLayout($config);\n }\n\n return $layout;\n }\n\n private function createDealInsightLayout(Configuration $config)\n {\n $jobDispatcher = app(JobDispatcher::class);\n $jobDispatcher->dispatch(new SetupLayout($config, null, Layout::TYPE_DEAL_INSIGHTS));\n }\n\n public function getDecoratedDeals(Models\\User $executedBy, CriteriaInterface $criteria, array $crmColumns): array\n {\n $this->monitor->enable($executedBy);\n\n $deals = $this->dealsServiceRepositories->getDeals($criteria);\n $this->monitor->addStep('get deals');\n\n return $this->decorateDeals($deals, $executedBy, $crmColumns);\n }\n\n public function getDecoratedDeal(Models\\User $executedBy, int $id, array $crmColumns): ?array\n {\n $this->monitor->enable($executedBy);\n\n $deal = $this->dealsServiceRepositories->getDeal($executedBy->getTeam(), $id);\n if (empty($deal)) {\n return null;\n }\n $this->monitor->addStep('get deal');\n\n $decoratedDeal = $this->decorateDeals($deal, $executedBy, $crmColumns, decorateWithCrmData: true)[0] ?? null;\n if ($decoratedDeal !== null) {\n $decoratedDeal['stages'] = $this->getHydratedStages($executedBy->getTeam()->getCrmConfiguration());\n }\n\n return $decoratedDeal;\n }\n\n private function getHydratedStages(Configuration $configuration): array\n {\n $stages = $this->dealsServiceRepositories->getConfigurationStages($configuration);\n\n return $stages->map(function (Models\\Stage $stage): array {\n return $this->dealStageTransformer->transform($stage);\n })->toArray();\n }\n\n private function decorateDeals(\n array $deals,\n Models\\User $executedBy,\n array $crmColumns,\n bool $decorateWithCrmData = false,\n ): array {\n $followedOpportunityIds = new Collection();\n $dealRisks = [];\n $opportunityIdsWithPendingCrmTemplateRuns = [];\n $crmConfiguration = $executedBy->getTeam()->getCrmConfiguration();\n\n if (! empty($deals)) {\n /** Aggregate activities */\n $deals = $this->decorateWithActivities($deals);\n $this->monitor->addStep('get decorated activities');\n\n /** Decorate with comments statistics */\n $deals = $this->decorateWithCommentsStatistics($executedBy, $deals);\n $this->monitor->addStep('get comments');\n\n /** Decorate with crm layout columns */\n $deals = $this->decorateWithLayoutColumns($executedBy, $deals, $crmColumns);\n $this->monitor->addStep('get layout columns');\n\n $followedOpportunityIds = $this->dealsServiceRepositories->getFollowedOpportunityIds(\n $executedBy,\n array_keys($deals)\n );\n $this->monitor->addStep('get followed opportunity ids');\n\n $syncStatuses = $this->getEmailStatus($deals);\n $this->monitor->addStep('get email status');\n\n $dealRisks = $this->dealRisksService->getDealRisks($executedBy, array_keys($deals));\n $this->monitor->addStep('get deal risks');\n\n $opportunityIdsWithPendingCrmTemplateRuns = $this->crmTemplateRunRepository\n ->getOpportunityIdsWithPendingCrmTemplateRuns();\n }\n\n foreach ($deals as $oppId => $data) {\n /** add followed flag */\n $deals[$oppId]['is_followed'] = $followedOpportunityIds->contains($oppId);\n\n /** add email sync status */\n if (isset($syncStatuses[$data['owner']['id']])) {\n $deals[$oppId]['emailSyncStatus'] = $syncStatuses[$data['owner']['id']];\n } else {\n $deals[$oppId]['emailSyncStatus'] = [\n 'sync_enabled' => false,\n 'last_sync' => null,\n 'unprocessed_emails' => null,\n ];\n }\n\n if ($decorateWithCrmData) {\n $crmProviderKey = Providers::getCrmIntegrationSlug($crmConfiguration);\n $deals[$oppId]['crmType'] = $crmProviderKey;\n $deals[$oppId]['crmName'] = Providers::getProviderDisplayName($crmProviderKey);\n $deals[$oppId]['dealStageName'] = $this->resolveStage(\n isClosed: $data['isClosed'],\n isWon: $data['isWon'],\n );\n }\n\n /** add deal risks data */\n if (array_key_exists($oppId, $dealRisks)) {\n $deals[$oppId]['dealRisks'] = $dealRisks[$oppId];\n }\n\n /** add hasPendingCrmTemplateRuns flag */\n if (\n in_array($oppId, $opportunityIdsWithPendingCrmTemplateRuns) &&\n $this->manualCrmFillingEligibilityChecker->isEligibleForOpportunity($executedBy, $data['owner']['id'])\n ) {\n $deals[$oppId]['hasPendingCrmTemplateRuns'] = true;\n }\n\n /** wipe unnecessary data */\n unset($deals[$oppId]['owner']['id']);\n }\n\n $this->monitor->log('getDecoratedDeals');\n\n return array_values($deals);\n }\n\n private function decorateWithActivities(array $deals): array\n {\n $aggregatedActivities = $this->activityAggregator->getAggregatedActivities(array_keys($deals));\n\n foreach ($aggregatedActivities as $opportunityId => $data) {\n $deals[$opportunityId]['activities'] = $data;\n }\n\n return $deals;\n }\n\n private function getEmailStatus(array $deals): array\n {\n $ownerIds = array_unique(array_map(function (array $v) {\n return $v['owner']['id'];\n }, $deals));\n\n return $this->fetchEmailSyncStatus($ownerIds);\n }\n\n private function decorateWithCommentsStatistics(Models\\User $user, array $deals): array\n {\n $opportunityIds = array_keys($deals);\n $commentStats = $this->dealsServiceRepositories->getCommentStatistics($user, $opportunityIds);\n foreach ($commentStats as $opportunityId => $stats) {\n $deals[$opportunityId]['commentsStats'] = $stats;\n }\n\n return $deals;\n }\n\n private function decorateWithLayoutColumns(Models\\User $user, array $deals, array $crmData): array\n {\n $fields = $this->getFieldsFromLayout($crmData);\n\n $opportunityIds = array_keys($deals);\n $dealsCrmFieldData = $this->getCrmFieldData($user, $opportunityIds);\n\n return $this->buildDealColumns($deals, $fields, $dealsCrmFieldData);\n }\n\n public function getStageTotals(CriteriaInterface $criteria): array\n {\n $result = [];\n\n $crmConfig = $criteria->getContext()->getTeam()->getCrmConfiguration();\n $defaultCurrency = $crmConfig->getDefaultCurrency();\n\n foreach (Criteria::listStages() as $stage) {\n $stageCriteria = (new Criteria(\n $criteria->getContext(),\n $stage,\n $criteria->getPeriod(),\n $criteria->getSearchColumn(),\n ))\n ->setUsers($criteria->getUsers())\n ->setTeams($criteria->getTeams())\n ->setPipelines($criteria->getPipelines())\n ->setDealStages($criteria->getDealStages())\n ->setDealTypes($criteria->getDealTypes())\n ->setDealName($criteria->getDealName());\n\n if ($crmConfig->hasDefaultCurrencyFieldSet()) {\n $totals = $this->dealsServiceRepositories->getTotalsInDefaultCurrency($stageCriteria);\n\n $result[$stage] = [\n 'total' => \\formatOpportunityValue((float) $totals['total'], $defaultCurrency),\n 'count' => $totals['count'],\n 'mixedCurrency' => false,\n 'additional' => [],\n ];\n\n continue;\n }\n\n $totals = $this->dealsServiceRepositories->getTotals($stageCriteria, $defaultCurrency);\n\n usort($totals, function ($t1, $t2) {\n return $t1['count'] <=> $t2['count'];\n });\n\n $primaryTotal = array_reduce($totals, function (?array $carry, array $v) use ($defaultCurrency): ?array {\n return $v['currency'] === $defaultCurrency ? $v : $carry;\n }) ?? [\n 'count' => 0,\n 'total' => \\formatOpportunityValue(0, $defaultCurrency),\n 'currency' => $defaultCurrency,\n ];\n\n $result[$stage] = [\n 'total' => \\formatOpportunityValue((float) $primaryTotal['total'], $primaryTotal['currency']),\n 'count' => $primaryTotal['count'],\n 'mixedCurrency' => (bool) (count($totals) > 1),\n 'additional' => [],\n ];\n\n foreach ($totals as $total) {\n if ($total['currency'] === $defaultCurrency) {\n continue;\n }\n\n $result[$stage]['additional'][] = [\n 'total' => \\formatOpportunityValue((float) $total['total'], $total['currency']),\n 'count' => $total['count'],\n ];\n }\n }\n\n return $result;\n }\n\n public function getDailyActivities(CriteriaInterface $criteria): array\n {\n $resultData = [];\n $data = $this->dealsServiceRepositories->getDealActivities($criteria);\n\n /** @var Activity $activity */\n foreach ($data as $activity) {\n $organizer = $activity->getUser();\n $type = $activity->getType();\n\n $activityData = [\n 'organizer' => [\n 'name' => $organizer->getName(),\n 'photoUrl' => $organizer->getPhotoUrl(),\n 'job' => [\n 'name' => $organizer->getJobTitle()->getName(),\n ],\n ],\n\n 'id' => $activity->getUuid(),\n 'type' => $type,\n 'title' => $activity->getTitle(),\n\n 'actualEndTimeForHumans' => $activity->getActualEndTime()?->diffForHumans(\n syntax: ['parts' => 1, 'options' => CarbonInterface::ROUND],\n ),\n 'actualEndTime' => $activity->getActualEndTime()?->toIso8601String(),\n 'date' => $activity->getActualEndTime()?->toIso8601String(),\n 'crmUrl' => $this->getCrmUrl($activity),\n 'isRecorded' => $activity->getTracksWithTelephonyCountAttribute() > 0,\n\n 'participants' => $this->getParticipants($activity),\n ];\n\n if (in_array($type, [Activity::TYPE_SMS_INBOUND, Activity::TYPE_SMS_OUTBOUND])) {\n $activityData['message'] = $activity->getDescription();\n } elseif (in_array($type, [Activity::TYPE_EMAIL_INBOUND, Activity::TYPE_EMAIL_OUTBOUND])) {\n $activityData['description'] = $activity->getDescription();\n }\n\n $resultData[] = $activityData;\n }\n\n return $resultData;\n }\n\n private function getCrmUrl(Activity $activity): ?string\n {\n if (! $activity->hasCrmProviderId()) {\n return null;\n }\n\n if (! $activity->hasCrmConfiguration() ||\n $activity->getCrm()->getProviderName() !== Configuration::PROVIDER_SALESFORCE\n ) {\n return null;\n }\n\n return $activity->getCrm()->getBaseUrl() . '/' . $activity->getCrmProviderId();\n }\n\n private function getParticipants(Activity $activity): array\n {\n $participants = [];\n\n /** @var Participant $participant */\n foreach ($activity->getParticipants() as $participant) {\n $participantData = [\n 'id' => $participant->getUuid(),\n 'name' => $participant->getName(),\n 'email' => $participant->getEmailAddress(),\n 'phone' => $participant->getPhoneNumber(),\n 'role' => $participant->getRole(),\n ];\n\n if ($participant->hasUser()) {\n $user = $participant->getUser();\n $participantData['user'] = [\n 'id' => $user->getUuid(),\n 'photoUrl' => $user->getPhotoUrl(),\n 'job' => [\n 'name' => $user->getJobTitle()->getName(),\n ],\n ];\n }\n\n $participants[] = $participantData;\n }\n\n return $participants;\n }\n\n public function getStages(CriteriaInterface $criteria): array\n {\n return $this->dealsServiceRepositories->getStages($criteria);\n }\n\n public function getCrmFieldData(User $user, array $opportunityIds): array\n {\n $crmFieldNames = $this->crmService->getDealInsightsLayoutFieldNames($user);\n\n $dealsCrmFieldData = [];\n\n $crmConfig = $user->getTeam()->getCrmId();\n if (! empty($opportunityIds)) {\n $crmData = $this->dealsServiceRepositories->getCrmFieldData($crmFieldNames, $crmConfig, $opportunityIds);\n\n foreach ($crmData as $item) {\n $dealsCrmFieldData[$item['dealId']][$item['field_name']] = $item['value'];\n }\n }\n\n return $dealsCrmFieldData;\n }\n\n public function updateDeal(User $user, Opportunity $opportunity, array $params): ?Opportunity\n {\n return $this->crmService->updateDeal($user, $opportunity, $params);\n }\n\n private function getFieldsFromLayout(array $layoutData): array\n {\n $fields = [];\n\n foreach ($layoutData['entities'] as $entity) {\n $fieldCrmId = $entity['field']['fieldName'];\n\n $fields[$entity['field']['id']] = [\n 'fieldName' => $fieldCrmId,\n 'fieldType' => $entity['field']['type'],\n ];\n\n if (! empty($entity['field']['isStageField'])) {\n $fields[$entity['field']['id']]['isStageField'] = true;\n }\n }\n\n return $fields;\n }\n\n private function buildDealColumns($deals, $fields, $dealsCrmFieldData): array\n {\n if (empty($deals)) {\n return [];\n }\n\n foreach ($deals as $oppId => &$deal) {\n $opportunity = $this->dealsServiceRepositories->findOpportunity($oppId);\n\n foreach ($fields as $uuid => $field) {\n $fieldName = $field['fieldName'];\n $value = $dealsCrmFieldData[$oppId][$fieldName] ?? '';\n if ($field['fieldType'] === Field::TYPE_CURRENCY) {\n $currency = $this->getDealCurrency($opportunity, $fieldName);\n $deal['crm_data'][$uuid] = $this->buildCurrencyColumn($value, $currency, $fieldName);\n } elseif (! empty($field['isStageField'])) {\n $currentPipelineId = $deal['currentPipelineId'];\n $stageUpdatedAt = $opportunity->getLastStageUpdate();\n $deal['crm_data'][$uuid] = $this->buildStageColumn(\n $fieldName,\n $value,\n $stageUpdatedAt,\n $currentPipelineId\n );\n } else {\n $deal['crm_data'][$uuid] = [\n 'label' => $fieldName,\n 'value' => $value,\n ];\n }\n }\n\n unset($deal['rawValue'], $deal['currentStageUpdatedAt'], $deal['currentPipelineId']);\n }\n\n return $deals;\n }\n\n private function buildCurrencyColumn(string $value, string $currency, string $fieldName): array\n {\n return [\n 'rawValue' => [\n 'amount' => (int) $value,\n 'currency' => $currency,\n ],\n 'label' => $fieldName,\n 'value' => formatOpportunityValue(\n (float) $value,\n $currency,\n 2\n ),\n ];\n }\n\n private function buildStageColumn(\n string $fieldName,\n string $value,\n string $stageUpdatedAt,\n ?int $currentPipelineId\n ): array {\n return [\n 'label' => $fieldName,\n 'value' => $value,\n 'enteredAt' => $stageUpdatedAt,\n // to be decided if FE needs it\n 'pipelineId' => $currentPipelineId,\n ];\n }\n\n private function getDealCurrency(Opportunity $opportunity, string $fieldName): string\n {\n $config = $opportunity->getCrmConfiguration();\n\n // this case should not happen in practice\n if ($config === null) {\n return $opportunity->currency_code ?? Opportunity::DEFAULT_CURRENCY;\n }\n\n $defaultCurrency = $config->getDefaultCurrency();\n\n if ($this->isDefaultCurrencyField($config, $fieldName) || $this->isHomeCurrencyField($fieldName)) {\n return $defaultCurrency;\n }\n\n return $opportunity->currency_code ?? $defaultCurrency;\n }\n\n private function isHomeCurrencyField(string $fieldName): bool\n {\n return str_ends_with($fieldName, '_in_home_currency');\n }\n\n public function getPipelineData(Configuration $crm): array\n {\n return $this->dealsServiceRepositories->getPipelineData($crm);\n }\n\n public function getCrmColumns(User $user): array\n {\n $config = $user->getTeam()->getCrmConfiguration();\n $layout = $this->getDealInsightsLayout($config);\n if (! $layout) {\n return [];\n }\n\n $fractal = new Manager();\n $fractal->setSerializer(new JsonSerializer());\n $fractal->parseIncludes([\n 'entities.field.options',\n ]);\n\n $resource = new Item($layout, (new LayoutTransformer($user->crmProfile)));\n $layoutData = $fractal->createData($resource)->toArray();\n\n return $this->hydrateStagesData($layoutData, $config);\n }\n\n private function hydrateStagesData($data, $config)\n {\n $pipelines = $this->getPipelineData($config);\n $providerName = $config->getProviderName();\n $stageFieldName = Field::STAGE_TYPE_FIELDS[$providerName] ?? null;\n\n foreach ($data['entities'] as &$entity) {\n if ($stageFieldName !== null && $entity['field']['fieldName'] === $stageFieldName) {\n $entity['field']['isStageField'] = true;\n $entity['field']['pipelines'] = $pipelines;\n } else {\n $entity['field']['isStageField'] = false;\n }\n }\n\n return $data;\n }\n\n public function isDefaultCurrencyField(Configuration $config, string $fieldName): bool\n {\n $defaultCurrencyField = $config->getDefaultCurrencyField();\n\n if ($defaultCurrencyField instanceof Field) {\n return $fieldName === $defaultCurrencyField->getCrmProviderId();\n }\n\n return false;\n }\n\n private function fetchEmailSyncStatus(array $userIds): array\n {\n /** @var User[] $users */\n $users = $this->dealsServiceRepositories->getUsersWithInboxByUserIds($userIds);\n\n $result = [];\n foreach ($users as $user) {\n $inbox = $user->getInbox();\n\n $isEnabled = $this->inboxService->isSyncEnabled($user);\n $lastSync = null;\n if ($isEnabled && $inbox instanceof Inbox && $inbox->getLastSyncedAt() !== null) {\n $lastSync = $inbox->getLastSyncedAt()->format(\\DATE_ATOM);\n }\n\n $result[$user->getId()] = [\n 'sync_enabled' => $isEnabled,\n 'last_sync' => $lastSync,\n 'unprocessed_emails' => $inbox?->emails()\n ->whereNotIn('status', [InboxEmail::STATUS_DISCARDED, InboxEmail::STATUS_PROCESSED])\n ->count(),\n ];\n }\n\n return $result;\n }\n\n public function resolveStage(bool $isClosed, bool $isWon): string\n {\n if (! $isClosed) {\n return CriteriaInterface::OPEN_DEAL_LABEL;\n }\n\n return $isWon\n ? CriteriaInterface::CLOSED_WON_DEAL_LABEL\n : CriteriaInterface::CLOSED_LOST_DEAL_LABEL;\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\DealInsights;\n\nuse Carbon\\CarbonInterface;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\AiAutomation\\Services\\ManualCrmFillingEligibilityChecker;\nuse Jiminny\\Component\\DealInsights\\Activity\\ActivityAggregatorInterface;\nuse Jiminny\\Component\\DealRisks\\DealRisksServiceInterface;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Http\\Serializers\\JsonSerializer;\nuse Jiminny\\Http\\Transformers\\DealStageTransformer;\nuse Jiminny\\Http\\Transformers\\LayoutTransformer;\nuse Jiminny\\Jobs\\Crm\\SetupLayout;\nuse Jiminny\\Jobs\\JobDispatcher;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Inbox;\nuse Jiminny\\Models\\InboxEmail;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Participant;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\CrmTemplateRunRepository;\nuse Jiminny\\Services\\Mail\\InboxServiceInterface;\nuse League\\Fractal\\Manager;\nuse League\\Fractal\\Resource\\Item;\n\nclass DealService implements DealServiceInterface\n{\n /**\n * DealService constructor.\n */\n public function __construct(\n private readonly ActivityAggregatorInterface $activityAggregator,\n private readonly InboxServiceInterface $inboxService,\n private readonly DealRisksServiceInterface $dealRisksService,\n private readonly CrmServiceInterface $crmService,\n private readonly DealsServiceRepositories $dealsServiceRepositories,\n private readonly PerformanceMonitor $monitor,\n private readonly DealStageTransformer $dealStageTransformer,\n private readonly CrmTemplateRunRepository $crmTemplateRunRepository,\n private readonly ManualCrmFillingEligibilityChecker $manualCrmFillingEligibilityChecker,\n ) {\n }\n\n public function getDealInsightsLayout(Configuration $config): ?Layout\n {\n $layout = $this->dealsServiceRepositories->findDealInsightLayoutByCrmConfig($config);\n\n if (! $layout) {\n $this->createDealInsightLayout($config);\n }\n\n return $layout;\n }\n\n private function createDealInsightLayout(Configuration $config)\n {\n $jobDispatcher = app(JobDispatcher::class);\n $jobDispatcher->dispatch(new SetupLayout($config, null, Layout::TYPE_DEAL_INSIGHTS));\n }\n\n public function getDecoratedDeals(Models\\User $executedBy, CriteriaInterface $criteria, array $crmColumns): array\n {\n $this->monitor->enable($executedBy);\n\n $deals = $this->dealsServiceRepositories->getDeals($criteria);\n $this->monitor->addStep('get deals');\n\n return $this->decorateDeals($deals, $executedBy, $crmColumns);\n }\n\n public function getDecoratedDeal(Models\\User $executedBy, int $id, array $crmColumns): ?array\n {\n $this->monitor->enable($executedBy);\n\n $deal = $this->dealsServiceRepositories->getDeal($executedBy->getTeam(), $id);\n if (empty($deal)) {\n return null;\n }\n $this->monitor->addStep('get deal');\n\n $decoratedDeal = $this->decorateDeals($deal, $executedBy, $crmColumns, decorateWithCrmData: true)[0] ?? null;\n if ($decoratedDeal !== null) {\n $decoratedDeal['stages'] = $this->getHydratedStages($executedBy->getTeam()->getCrmConfiguration());\n }\n\n return $decoratedDeal;\n }\n\n private function getHydratedStages(Configuration $configuration): array\n {\n $stages = $this->dealsServiceRepositories->getConfigurationStages($configuration);\n\n return $stages->map(function (Models\\Stage $stage): array {\n return $this->dealStageTransformer->transform($stage);\n })->toArray();\n }\n\n private function decorateDeals(\n array $deals,\n Models\\User $executedBy,\n array $crmColumns,\n bool $decorateWithCrmData = false,\n ): array {\n $followedOpportunityIds = new Collection();\n $dealRisks = [];\n $opportunityIdsWithPendingCrmTemplateRuns = [];\n $crmConfiguration = $executedBy->getTeam()->getCrmConfiguration();\n\n if (! empty($deals)) {\n /** Aggregate activities */\n $deals = $this->decorateWithActivities($deals);\n $this->monitor->addStep('get decorated activities');\n\n /** Decorate with comments statistics */\n $deals = $this->decorateWithCommentsStatistics($executedBy, $deals);\n $this->monitor->addStep('get comments');\n\n /** Decorate with crm layout columns */\n $deals = $this->decorateWithLayoutColumns($executedBy, $deals, $crmColumns);\n $this->monitor->addStep('get layout columns');\n\n $followedOpportunityIds = $this->dealsServiceRepositories->getFollowedOpportunityIds(\n $executedBy,\n array_keys($deals)\n );\n $this->monitor->addStep('get followed opportunity ids');\n\n $syncStatuses = $this->getEmailStatus($deals);\n $this->monitor->addStep('get email status');\n\n $dealRisks = $this->dealRisksService->getDealRisks($executedBy, array_keys($deals));\n $this->monitor->addStep('get deal risks');\n\n $opportunityIdsWithPendingCrmTemplateRuns = $this->crmTemplateRunRepository\n ->getOpportunityIdsWithPendingCrmTemplateRuns();\n }\n\n foreach ($deals as $oppId => $data) {\n /** add followed flag */\n $deals[$oppId]['is_followed'] = $followedOpportunityIds->contains($oppId);\n\n /** add email sync status */\n if (isset($syncStatuses[$data['owner']['id']])) {\n $deals[$oppId]['emailSyncStatus'] = $syncStatuses[$data['owner']['id']];\n } else {\n $deals[$oppId]['emailSyncStatus'] = [\n 'sync_enabled' => false,\n 'last_sync' => null,\n 'unprocessed_emails' => null,\n ];\n }\n\n if ($decorateWithCrmData) {\n $crmProviderKey = Providers::getCrmIntegrationSlug($crmConfiguration);\n $deals[$oppId]['crmType'] = $crmProviderKey;\n $deals[$oppId]['crmName'] = Providers::getProviderDisplayName($crmProviderKey);\n $deals[$oppId]['dealStageName'] = $this->resolveStage(\n isClosed: $data['isClosed'],\n isWon: $data['isWon'],\n );\n }\n\n /** add deal risks data */\n if (array_key_exists($oppId, $dealRisks)) {\n $deals[$oppId]['dealRisks'] = $dealRisks[$oppId];\n }\n\n /** add hasPendingCrmTemplateRuns flag */\n if (\n in_array($oppId, $opportunityIdsWithPendingCrmTemplateRuns) &&\n $this->manualCrmFillingEligibilityChecker->isEligibleForOpportunity($executedBy, $data['owner']['id'])\n ) {\n $deals[$oppId]['hasPendingCrmTemplateRuns'] = true;\n }\n\n /** wipe unnecessary data */\n unset($deals[$oppId]['owner']['id']);\n }\n\n $this->monitor->log('getDecoratedDeals');\n\n return array_values($deals);\n }\n\n private function decorateWithActivities(array $deals): array\n {\n $aggregatedActivities = $this->activityAggregator->getAggregatedActivities(array_keys($deals));\n\n foreach ($aggregatedActivities as $opportunityId => $data) {\n $deals[$opportunityId]['activities'] = $data;\n }\n\n return $deals;\n }\n\n private function getEmailStatus(array $deals): array\n {\n $ownerIds = array_unique(array_map(function (array $v) {\n return $v['owner']['id'];\n }, $deals));\n\n return $this->fetchEmailSyncStatus($ownerIds);\n }\n\n private function decorateWithCommentsStatistics(Models\\User $user, array $deals): array\n {\n $opportunityIds = array_keys($deals);\n $commentStats = $this->dealsServiceRepositories->getCommentStatistics($user, $opportunityIds);\n foreach ($commentStats as $opportunityId => $stats) {\n $deals[$opportunityId]['commentsStats'] = $stats;\n }\n\n return $deals;\n }\n\n private function decorateWithLayoutColumns(Models\\User $user, array $deals, array $crmData): array\n {\n $fields = $this->getFieldsFromLayout($crmData);\n\n $opportunityIds = array_keys($deals);\n $dealsCrmFieldData = $this->getCrmFieldData($user, $opportunityIds);\n\n return $this->buildDealColumns($deals, $fields, $dealsCrmFieldData);\n }\n\n public function getStageTotals(CriteriaInterface $criteria): array\n {\n $result = [];\n\n $crmConfig = $criteria->getContext()->getTeam()->getCrmConfiguration();\n $defaultCurrency = $crmConfig->getDefaultCurrency();\n\n foreach (Criteria::listStages() as $stage) {\n $stageCriteria = (new Criteria(\n $criteria->getContext(),\n $stage,\n $criteria->getPeriod(),\n $criteria->getSearchColumn(),\n ))\n ->setUsers($criteria->getUsers())\n ->setTeams($criteria->getTeams())\n ->setPipelines($criteria->getPipelines())\n ->setDealStages($criteria->getDealStages())\n ->setDealTypes($criteria->getDealTypes())\n ->setDealName($criteria->getDealName());\n\n if ($crmConfig->hasDefaultCurrencyFieldSet()) {\n $totals = $this->dealsServiceRepositories->getTotalsInDefaultCurrency($stageCriteria);\n\n $result[$stage] = [\n 'total' => \\formatOpportunityValue((float) $totals['total'], $defaultCurrency),\n 'count' => $totals['count'],\n 'mixedCurrency' => false,\n 'additional' => [],\n ];\n\n continue;\n }\n\n $totals = $this->dealsServiceRepositories->getTotals($stageCriteria, $defaultCurrency);\n\n usort($totals, function ($t1, $t2) {\n return $t1['count'] <=> $t2['count'];\n });\n\n $primaryTotal = array_reduce($totals, function (?array $carry, array $v) use ($defaultCurrency): ?array {\n return $v['currency'] === $defaultCurrency ? $v : $carry;\n }) ?? [\n 'count' => 0,\n 'total' => \\formatOpportunityValue(0, $defaultCurrency),\n 'currency' => $defaultCurrency,\n ];\n\n $result[$stage] = [\n 'total' => \\formatOpportunityValue((float) $primaryTotal['total'], $primaryTotal['currency']),\n 'count' => $primaryTotal['count'],\n 'mixedCurrency' => (bool) (count($totals) > 1),\n 'additional' => [],\n ];\n\n foreach ($totals as $total) {\n if ($total['currency'] === $defaultCurrency) {\n continue;\n }\n\n $result[$stage]['additional'][] = [\n 'total' => \\formatOpportunityValue((float) $total['total'], $total['currency']),\n 'count' => $total['count'],\n ];\n }\n }\n\n return $result;\n }\n\n public function getDailyActivities(CriteriaInterface $criteria): array\n {\n $resultData = [];\n $data = $this->dealsServiceRepositories->getDealActivities($criteria);\n\n /** @var Activity $activity */\n foreach ($data as $activity) {\n $organizer = $activity->getUser();\n $type = $activity->getType();\n\n $activityData = [\n 'organizer' => [\n 'name' => $organizer->getName(),\n 'photoUrl' => $organizer->getPhotoUrl(),\n 'job' => [\n 'name' => $organizer->getJobTitle()->getName(),\n ],\n ],\n\n 'id' => $activity->getUuid(),\n 'type' => $type,\n 'title' => $activity->getTitle(),\n\n 'actualEndTimeForHumans' => $activity->getActualEndTime()?->diffForHumans(\n syntax: ['parts' => 1, 'options' => CarbonInterface::ROUND],\n ),\n 'actualEndTime' => $activity->getActualEndTime()?->toIso8601String(),\n 'date' => $activity->getActualEndTime()?->toIso8601String(),\n 'crmUrl' => $this->getCrmUrl($activity),\n 'isRecorded' => $activity->getTracksWithTelephonyCountAttribute() > 0,\n\n 'participants' => $this->getParticipants($activity),\n ];\n\n if (in_array($type, [Activity::TYPE_SMS_INBOUND, Activity::TYPE_SMS_OUTBOUND])) {\n $activityData['message'] = $activity->getDescription();\n } elseif (in_array($type, [Activity::TYPE_EMAIL_INBOUND, Activity::TYPE_EMAIL_OUTBOUND])) {\n $activityData['description'] = $activity->getDescription();\n }\n\n $resultData[] = $activityData;\n }\n\n return $resultData;\n }\n\n private function getCrmUrl(Activity $activity): ?string\n {\n if (! $activity->hasCrmProviderId()) {\n return null;\n }\n\n if (! $activity->hasCrmConfiguration() ||\n $activity->getCrm()->getProviderName() !== Configuration::PROVIDER_SALESFORCE\n ) {\n return null;\n }\n\n return $activity->getCrm()->getBaseUrl() . '/' . $activity->getCrmProviderId();\n }\n\n private function getParticipants(Activity $activity): array\n {\n $participants = [];\n\n /** @var Participant $participant */\n foreach ($activity->getParticipants() as $participant) {\n $participantData = [\n 'id' => $participant->getUuid(),\n 'name' => $participant->getName(),\n 'email' => $participant->getEmailAddress(),\n 'phone' => $participant->getPhoneNumber(),\n 'role' => $participant->getRole(),\n ];\n\n if ($participant->hasUser()) {\n $user = $participant->getUser();\n $participantData['user'] = [\n 'id' => $user->getUuid(),\n 'photoUrl' => $user->getPhotoUrl(),\n 'job' => [\n 'name' => $user->getJobTitle()->getName(),\n ],\n ];\n }\n\n $participants[] = $participantData;\n }\n\n return $participants;\n }\n\n public function getStages(CriteriaInterface $criteria): array\n {\n return $this->dealsServiceRepositories->getStages($criteria);\n }\n\n public function getCrmFieldData(User $user, array $opportunityIds): array\n {\n $crmFieldNames = $this->crmService->getDealInsightsLayoutFieldNames($user);\n\n $dealsCrmFieldData = [];\n\n $crmConfig = $user->getTeam()->getCrmId();\n if (! empty($opportunityIds)) {\n $crmData = $this->dealsServiceRepositories->getCrmFieldData($crmFieldNames, $crmConfig, $opportunityIds);\n\n foreach ($crmData as $item) {\n $dealsCrmFieldData[$item['dealId']][$item['field_name']] = $item['value'];\n }\n }\n\n return $dealsCrmFieldData;\n }\n\n public function updateDeal(User $user, Opportunity $opportunity, array $params): ?Opportunity\n {\n return $this->crmService->updateDeal($user, $opportunity, $params);\n }\n\n private function getFieldsFromLayout(array $layoutData): array\n {\n $fields = [];\n\n foreach ($layoutData['entities'] as $entity) {\n $fieldCrmId = $entity['field']['fieldName'];\n\n $fields[$entity['field']['id']] = [\n 'fieldName' => $fieldCrmId,\n 'fieldType' => $entity['field']['type'],\n ];\n\n if (! empty($entity['field']['isStageField'])) {\n $fields[$entity['field']['id']]['isStageField'] = true;\n }\n }\n\n return $fields;\n }\n\n private function buildDealColumns($deals, $fields, $dealsCrmFieldData): array\n {\n if (empty($deals)) {\n return [];\n }\n\n foreach ($deals as $oppId => &$deal) {\n $opportunity = $this->dealsServiceRepositories->findOpportunity($oppId);\n\n foreach ($fields as $uuid => $field) {\n $fieldName = $field['fieldName'];\n $value = $dealsCrmFieldData[$oppId][$fieldName] ?? '';\n if ($field['fieldType'] === Field::TYPE_CURRENCY) {\n $currency = $this->getDealCurrency($opportunity, $fieldName);\n $deal['crm_data'][$uuid] = $this->buildCurrencyColumn($value, $currency, $fieldName);\n } elseif (! empty($field['isStageField'])) {\n $currentPipelineId = $deal['currentPipelineId'];\n $stageUpdatedAt = $opportunity->getLastStageUpdate();\n $deal['crm_data'][$uuid] = $this->buildStageColumn(\n $fieldName,\n $value,\n $stageUpdatedAt,\n $currentPipelineId\n );\n } else {\n $deal['crm_data'][$uuid] = [\n 'label' => $fieldName,\n 'value' => $value,\n ];\n }\n }\n\n unset($deal['rawValue'], $deal['currentStageUpdatedAt'], $deal['currentPipelineId']);\n }\n\n return $deals;\n }\n\n private function buildCurrencyColumn(string $value, string $currency, string $fieldName): array\n {\n return [\n 'rawValue' => [\n 'amount' => (int) $value,\n 'currency' => $currency,\n ],\n 'label' => $fieldName,\n 'value' => formatOpportunityValue(\n (float) $value,\n $currency,\n 2\n ),\n ];\n }\n\n private function buildStageColumn(\n string $fieldName,\n string $value,\n string $stageUpdatedAt,\n ?int $currentPipelineId\n ): array {\n return [\n 'label' => $fieldName,\n 'value' => $value,\n 'enteredAt' => $stageUpdatedAt,\n // to be decided if FE needs it\n 'pipelineId' => $currentPipelineId,\n ];\n }\n\n private function getDealCurrency(Opportunity $opportunity, string $fieldName): string\n {\n $config = $opportunity->getCrmConfiguration();\n\n // this case should not happen in practice\n if ($config === null) {\n return $opportunity->currency_code ?? Opportunity::DEFAULT_CURRENCY;\n }\n\n $defaultCurrency = $config->getDefaultCurrency();\n\n if ($this->isDefaultCurrencyField($config, $fieldName) || $this->isHomeCurrencyField($fieldName)) {\n return $defaultCurrency;\n }\n\n return $opportunity->currency_code ?? $defaultCurrency;\n }\n\n private function isHomeCurrencyField(string $fieldName): bool\n {\n return str_ends_with($fieldName, '_in_home_currency');\n }\n\n public function getPipelineData(Configuration $crm): array\n {\n return $this->dealsServiceRepositories->getPipelineData($crm);\n }\n\n public function getCrmColumns(User $user): array\n {\n $config = $user->getTeam()->getCrmConfiguration();\n $layout = $this->getDealInsightsLayout($config);\n if (! $layout) {\n return [];\n }\n\n $fractal = new Manager();\n $fractal->setSerializer(new JsonSerializer());\n $fractal->parseIncludes([\n 'entities.field.options',\n ]);\n\n $resource = new Item($layout, (new LayoutTransformer($user->crmProfile)));\n $layoutData = $fractal->createData($resource)->toArray();\n\n return $this->hydrateStagesData($layoutData, $config);\n }\n\n private function hydrateStagesData($data, $config)\n {\n $pipelines = $this->getPipelineData($config);\n $providerName = $config->getProviderName();\n $stageFieldName = Field::STAGE_TYPE_FIELDS[$providerName] ?? null;\n\n foreach ($data['entities'] as &$entity) {\n if ($stageFieldName !== null && $entity['field']['fieldName'] === $stageFieldName) {\n $entity['field']['isStageField'] = true;\n $entity['field']['pipelines'] = $pipelines;\n } else {\n $entity['field']['isStageField'] = false;\n }\n }\n\n return $data;\n }\n\n public function isDefaultCurrencyField(Configuration $config, string $fieldName): bool\n {\n $defaultCurrencyField = $config->getDefaultCurrencyField();\n\n if ($defaultCurrencyField instanceof Field) {\n return $fieldName === $defaultCurrencyField->getCrmProviderId();\n }\n\n return false;\n }\n\n private function fetchEmailSyncStatus(array $userIds): array\n {\n /** @var User[] $users */\n $users = $this->dealsServiceRepositories->getUsersWithInboxByUserIds($userIds);\n\n $result = [];\n foreach ($users as $user) {\n $inbox = $user->getInbox();\n\n $isEnabled = $this->inboxService->isSyncEnabled($user);\n $lastSync = null;\n if ($isEnabled && $inbox instanceof Inbox && $inbox->getLastSyncedAt() !== null) {\n $lastSync = $inbox->getLastSyncedAt()->format(\\DATE_ATOM);\n }\n\n $result[$user->getId()] = [\n 'sync_enabled' => $isEnabled,\n 'last_sync' => $lastSync,\n 'unprocessed_emails' => $inbox?->emails()\n ->whereNotIn('status', [InboxEmail::STATUS_DISCARDED, InboxEmail::STATUS_PROCESSED])\n ->count(),\n ];\n }\n\n return $result;\n }\n\n public function resolveStage(bool $isClosed, bool $isWon): string\n {\n if (! $isClosed) {\n return CriteriaInterface::OPEN_DEAL_LABEL;\n }\n\n return $isWon\n ? CriteriaInterface::CLOSED_WON_DEAL_LABEL\n : CriteriaInterface::CLOSED_LOST_DEAL_LABEL;\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"A","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":5,"bounds":{"left":0.0,"top":0.0,"width":0.008333334,"height":0.03},"role_description":"text"},{"role":"AXButton","text":"Select All","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"17009","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"17009","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"42ec35c8-7a66-3dff-b558-9c75866ecd68","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"42ec35c8-7a66-3dff-b558-9c75866ecd68","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"Galya Dimitrova","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"galya.dimitrova@jiminny.com","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"galya.dimitrova@jiminny.com","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"BG","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"BG","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"+359899722322","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"+359899722322","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"7341","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"7341","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"2868","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"2868","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"Europe/Sofia","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"Europe/Sofia","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"en_US","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"en_US","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"galyadimitrova","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"galyadimitrova","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"on-demand","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"on-demand","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"on","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"on","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"+447862140378","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"+447862140378","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"3","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"3","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.0,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.007777778,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.007777778,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"<null>","depth":6,"bounds":{"left":1.0,"top":0.037777778,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"<null>","depth":7,"bounds":{"left":1.0,"top":0.037777778,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"email","depth":6,"bounds":{"left":1.0,"top":0.067777775,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"email","depth":7,"bounds":{"left":1.0,"top":0.067777775,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.09777778,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.09777778,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"bounds":{"left":1.0,"top":0.12777779,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"bounds":{"left":1.0,"top":0.12777779,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"never","depth":6,"bounds":{"left":1.0,"top":0.15777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"never","depth":7,"bounds":{"left":1.0,"top":0.15777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"never","depth":6,"bounds":{"left":1.0,"top":0.18777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"never","depth":7,"bounds":{"left":1.0,"top":0.18777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"1","depth":6,"bounds":{"left":1.0,"top":0.21777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"1","depth":7,"bounds":{"left":1.0,"top":0.21777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.24777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.24777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.2777778,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.2777778,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.3077778,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.3077778,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"0","depth":6,"bounds":{"left":1.0,"top":0.33777776,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"0","depth":7,"bounds":{"left":1.0,"top":0.33777776,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"17009","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"2026-04-21 21:00:47","depth":6,"bounds":{"left":1.0,"top":0.36777776,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"2026-04-21 21:00:47","depth":7,"bounds":{"left":1.0,"top":0.36777776,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"2023-08-08 06:56:37","depth":6,"bounds":{"left":1.0,"top":0.39777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"2023-08-08 06:56:37","depth":7,"bounds":{"left":1.0,"top":0.39777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"2026-04-21 21:00:47","depth":6,"bounds":{"left":1.0,"top":0.42777777,"width":-0.032638907,"height":0.028888889},"role_description":"cell"},{"role":"AXStaticText","text":"2026-04-21 21:00:47","depth":7,"bounds":{"left":1.0,"top":0.42777777,"width":-0.032638907,"height":0.028888889},"role_description":"text"},{"role":"AXTextArea","text":"<null>","depth":8,"bounds":{"left":0.0,"top":0.0,"width":0.5048611,"height":0.024444444},"value":"<null>","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"id = 17009","depth":4,"value":"id = 17009","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Editor","depth":4,"role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"1 row","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reload Page","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Table Result Auto Refresh","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":"Add Row","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Delete Rows","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Revert Selected","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Preview Pending Changes","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Submit","depth":4,"role_description":"button","is_enabled":false,"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":"DDL","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Find on Current Page","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Table Result Local Filter","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Record View","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8453092909366198584
|
1903368746819516687
|
visual_change
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
9
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Component\DealInsights;
use Carbon\CarbonInterface;
use Illuminate\Support\Collection;
use Jiminny\Component\AiAutomation\Services\ManualCrmFillingEligibilityChecker;
use Jiminny\Component\DealInsights\Activity\ActivityAggregatorInterface;
use Jiminny\Component\DealRisks\DealRisksServiceInterface;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Http\Serializers\JsonSerializer;
use Jiminny\Http\Transformers\DealStageTransformer;
use Jiminny\Http\Transformers\LayoutTransformer;
use Jiminny\Jobs\Crm\SetupLayout;
use Jiminny\Jobs\JobDispatcher;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Inbox;
use Jiminny\Models\InboxEmail;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\User;
use Jiminny\Repositories\CrmTemplateRunRepository;
use Jiminny\Services\Mail\InboxServiceInterface;
use League\Fractal\Manager;
use League\Fractal\Resource\Item;
class DealService implements DealServiceInterface
{
/**
* DealService constructor.
*/
public function __construct(
private readonly ActivityAggregatorInterface $activityAggregator,
private readonly InboxServiceInterface $inboxService,
private readonly DealRisksServiceInterface $dealRisksService,
private readonly CrmServiceInterface $crmService,
private readonly DealsServiceRepositories $dealsServiceRepositories,
private readonly PerformanceMonitor $monitor,
private readonly DealStageTransformer $dealStageTransformer,
private readonly CrmTemplateRunRepository $crmTemplateRunRepository,
private readonly ManualCrmFillingEligibilityChecker $manualCrmFillingEligibilityChecker,
) {
}
public function getDealInsightsLayout(Configuration $config): ?Layout
{
$layout = $this->dealsServiceRepositories->findDealInsightLayoutByCrmConfig($config);
if (! $layout) {
$this->createDealInsightLayout($config);
}
return $layout;
}
private function createDealInsightLayout(Configuration $config)
{
$jobDispatcher = app(JobDispatcher::class);
$jobDispatcher->dispatch(new SetupLayout($config, null, Layout::TYPE_DEAL_INSIGHTS));
}
public function getDecoratedDeals(Models\User $executedBy, CriteriaInterface $criteria, array $crmColumns): array
{
$this->monitor->enable($executedBy);
$deals = $this->dealsServiceRepositories->getDeals($criteria);
$this->monitor->addStep('get deals');
return $this->decorateDeals($deals, $executedBy, $crmColumns);
}
public function getDecoratedDeal(Models\User $executedBy, int $id, array $crmColumns): ?array
{
$this->monitor->enable($executedBy);
$deal = $this->dealsServiceRepositories->getDeal($executedBy->getTeam(), $id);
if (empty($deal)) {
return null;
}
$this->monitor->addStep('get deal');
$decoratedDeal = $this->decorateDeals($deal, $executedBy, $crmColumns, decorateWithCrmData: true)[0] ?? null;
if ($decoratedDeal !== null) {
$decoratedDeal['stages'] = $this->getHydratedStages($executedBy->getTeam()->getCrmConfiguration());
}
return $decoratedDeal;
}
private function getHydratedStages(Configuration $configuration): array
{
$stages = $this->dealsServiceRepositories->getConfigurationStages($configuration);
return $stages->map(function (Models\Stage $stage): array {
return $this->dealStageTransformer->transform($stage);
})->toArray();
}
private function decorateDeals(
array $deals,
Models\User $executedBy,
array $crmColumns,
bool $decorateWithCrmData = false,
): array {
$followedOpportunityIds = new Collection();
$dealRisks = [];
$opportunityIdsWithPendingCrmTemplateRuns = [];
$crmConfiguration = $executedBy->getTeam()->getCrmConfiguration();
if (! empty($deals)) {
/** Aggregate activities */
$deals = $this->decorateWithActivities($deals);
$this->monitor->addStep('get decorated activities');
/** Decorate with comments statistics */
$deals = $this->decorateWithCommentsStatistics($executedBy, $deals);
$this->monitor->addStep('get comments');
/** Decorate with crm layout columns */
$deals = $this->decorateWithLayoutColumns($executedBy, $deals, $crmColumns);
$this->monitor->addStep('get layout columns');
$followedOpportunityIds = $this->dealsServiceRepositories->getFollowedOpportunityIds(
$executedBy,
array_keys($deals)
);
$this->monitor->addStep('get followed opportunity ids');
$syncStatuses = $this->getEmailStatus($deals);
$this->monitor->addStep('get email status');
$dealRisks = $this->dealRisksService->getDealRisks($executedBy, array_keys($deals));
$this->monitor->addStep('get deal risks');
$opportunityIdsWithPendingCrmTemplateRuns = $this->crmTemplateRunRepository
->getOpportunityIdsWithPendingCrmTemplateRuns();
}
foreach ($deals as $oppId => $data) {
/** add followed flag */
$deals[$oppId]['is_followed'] = $followedOpportunityIds->contains($oppId);
/** add email sync status */
if (isset($syncStatuses[$data['owner']['id']])) {
$deals[$oppId]['emailSyncStatus'] = $syncStatuses[$data['owner']['id']];
} else {
$deals[$oppId]['emailSyncStatus'] = [
'sync_enabled' => false,
'last_sync' => null,
'unprocessed_emails' => null,
];
}
if ($decorateWithCrmData) {
$crmProviderKey = Providers::getCrmIntegrationSlug($crmConfiguration);
$deals[$oppId]['crmType'] = $crmProviderKey;
$deals[$oppId]['crmName'] = Providers::getProviderDisplayName($crmProviderKey);
$deals[$oppId]['dealStageName'] = $this->resolveStage(
isClosed: $data['isClosed'],
isWon: $data['isWon'],
);
}
/** add deal risks data */
if (array_key_exists($oppId, $dealRisks)) {
$deals[$oppId]['dealRisks'] = $dealRisks[$oppId];
}
/** add hasPendingCrmTemplateRuns flag */
if (
in_array($oppId, $opportunityIdsWithPendingCrmTemplateRuns) &&
$this->manualCrmFillingEligibilityChecker->isEligibleForOpportunity($executedBy, $data['owner']['id'])
) {
$deals[$oppId]['hasPendingCrmTemplateRuns'] = true;
}
/** wipe unnecessary data */
unset($deals[$oppId]['owner']['id']);
}
$this->monitor->log('getDecoratedDeals');
return array_values($deals);
}
private function decorateWithActivities(array $deals): array
{
$aggregatedActivities = $this->activityAggregator->getAggregatedActivities(array_keys($deals));
foreach ($aggregatedActivities as $opportunityId => $data) {
$deals[$opportunityId]['activities'] = $data;
}
return $deals;
}
private function getEmailStatus(array $deals): array
{
$ownerIds = array_unique(array_map(function (array $v) {
return $v['owner']['id'];
}, $deals));
return $this->fetchEmailSyncStatus($ownerIds);
}
private function decorateWithCommentsStatistics(Models\User $user, array $deals): array
{
$opportunityIds = array_keys($deals);
$commentStats = $this->dealsServiceRepositories->getCommentStatistics($user, $opportunityIds);
foreach ($commentStats as $opportunityId => $stats) {
$deals[$opportunityId]['commentsStats'] = $stats;
}
return $deals;
}
private function decorateWithLayoutColumns(Models\User $user, array $deals, array $crmData): array
{
$fields = $this->getFieldsFromLayout($crmData);
$opportunityIds = array_keys($deals);
$dealsCrmFieldData = $this->getCrmFieldData($user, $opportunityIds);
return $this->buildDealColumns($deals, $fields, $dealsCrmFieldData);
}
public function getStageTotals(CriteriaInterface $criteria): array
{
$result = [];
$crmConfig = $criteria->getContext()->getTeam()->getCrmConfiguration();
$defaultCurrency = $crmConfig->getDefaultCurrency();
foreach (Criteria::listStages() as $stage) {
$stageCriteria = (new Criteria(
$criteria->getContext(),
$stage,
$criteria->getPeriod(),
$criteria->getSearchColumn(),
))
->setUsers($criteria->getUsers())
->setTeams($criteria->getTeams())
->setPipelines($criteria->getPipelines())
->setDealStages($criteria->getDealStages())
->setDealTypes($criteria->getDealTypes())
->setDealName($criteria->getDealName());
if ($crmConfig->hasDefaultCurrencyFieldSet()) {
$totals = $this->dealsServiceRepositories->getTotalsInDefaultCurrency($stageCriteria);
$result[$stage] = [
'total' => \formatOpportunityValue((float) $totals['total'], $defaultCurrency),
'count' => $totals['count'],
'mixedCurrency' => false,
'additional' => [],
];
continue;
}
$totals = $this->dealsServiceRepositories->getTotals($stageCriteria, $defaultCurrency);
usort($totals, function ($t1, $t2) {
return $t1['count'] <=> $t2['count'];
});
$primaryTotal = array_reduce($totals, function (?array $carry, array $v) use ($defaultCurrency): ?array {
return $v['currency'] === $defaultCurrency ? $v : $carry;
}) ?? [
'count' => 0,
'total' => \formatOpportunityValue(0, $defaultCurrency),
'currency' => $defaultCurrency,
];
$result[$stage] = [
'total' => \formatOpportunityValue((float) $primaryTotal['total'], $primaryTotal['currency']),
'count' => $primaryTotal['count'],
'mixedCurrency' => (bool) (count($totals) > 1),
'additional' => [],
];
foreach ($totals as $total) {
if ($total['currency'] === $defaultCurrency) {
continue;
}
$result[$stage]['additional'][] = [
'total' => \formatOpportunityValue((float) $total['total'], $total['currency']),
'count' => $total['count'],
];
}
}
return $result;
}
public function getDailyActivities(CriteriaInterface $criteria): array
{
$resultData = [];
$data = $this->dealsServiceRepositories->getDealActivities($criteria);
/** @var Activity $activity */
foreach ($data as $activity) {
$organizer = $activity->getUser();
$type = $activity->getType();
$activityData = [
'organizer' => [
'name' => $organizer->getName(),
'photoUrl' => $organizer->getPhotoUrl(),
'job' => [
'name' => $organizer->getJobTitle()->getName(),
],
],
'id' => $activity->getUuid(),
'type' => $type,
'title' => $activity->getTitle(),
'actualEndTimeForHumans' => $activity->getActualEndTime()?->diffForHumans(
syntax: ['parts' => 1, 'options' => CarbonInterface::ROUND],
),
'actualEndTime' => $activity->getActualEndTime()?->toIso8601String(),
'date' => $activity->getActualEndTime()?->toIso8601String(),
'crmUrl' => $this->getCrmUrl($activity),
'isRecorded' => $activity->getTracksWithTelephonyCountAttribute() > 0,
'participants' => $this->getParticipants($activity),
];
if (in_array($type, [Activity::TYPE_SMS_INBOUND, Activity::TYPE_SMS_OUTBOUND])) {
$activityData['message'] = $activity->getDescription();
} elseif (in_array($type, [Activity::TYPE_EMAIL_INBOUND, Activity::TYPE_EMAIL_OUTBOUND])) {
$activityData['description'] = $activity->getDescription();
}
$resultData[] = $activityData;
}
return $resultData;
}
private function getCrmUrl(Activity $activity): ?string
{
if (! $activity->hasCrmProviderId()) {
return null;
}
if (! $activity->hasCrmConfiguration() ||
$activity->getCrm()->getProviderName() !== Configuration::PROVIDER_SALESFORCE
) {
return null;
}
return $activity->getCrm()->getBaseUrl() . '/' . $activity->getCrmProviderId();
}
private function getParticipants(Activity $activity): array
{
$participants = [];
/** @var Participant $participant */
foreach ($activity->getParticipants() as $participant) {
$participantData = [
'id' => $participant->getUuid(),
'name' => $participant->getName(),
'email' => $participant->getEmailAddress(),
'phone' => $participant->getPhoneNumber(),
'role' => $participant->getRole(),
];
if ($participant->hasUser()) {
$user = $participant->getUser();
$participantData['user'] = [
'id' => $user->getUuid(),
'photoUrl' => $user->getPhotoUrl(),
'job' => [
'name' => $user->getJobTitle()->getName(),
],
];
}
$participants[] = $participantData;
}
return $participants;
}
public function getStages(CriteriaInterface $criteria): array
{
return $this->dealsServiceRepositories->getStages($criteria);
}
public function getCrmFieldData(User $user, array $opportunityIds): array
{
$crmFieldNames = $this->crmService->getDealInsightsLayoutFieldNames($user);
$dealsCrmFieldData = [];
$crmConfig = $user->getTeam()->getCrmId();
if (! empty($opportunityIds)) {
$crmData = $this->dealsServiceRepositories->getCrmFieldData($crmFieldNames, $crmConfig, $opportunityIds);
foreach ($crmData as $item) {
$dealsCrmFieldData[$item['dealId']][$item['field_name']] = $item['value'];
}
}
return $dealsCrmFieldData;
}
public function updateDeal(User $user, Opportunity $opportunity, array $params): ?Opportunity
{
return $this->crmService->updateDeal($user, $opportunity, $params);
}
private function getFieldsFromLayout(array $layoutData): array
{
$fields = [];
foreach ($layoutData['entities'] as $entity) {
$fieldCrmId = $entity['field']['fieldName'];
$fields[$entity['field']['id']] = [
'fieldName' => $fieldCrmId,
'fieldType' => $entity['field']['type'],
];
if (! empty($entity['field']['isStageField'])) {
$fields[$entity['field']['id']]['isStageField'] = true;
}
}
return $fields;
}
private function buildDealColumns($deals, $fields, $dealsCrmFieldData): array
{
if (empty($deals)) {
return [];
}
foreach ($deals as $oppId => &$deal) {
$opportunity = $this->dealsServiceRepositories->findOpportunity($oppId);
foreach ($fields as $uuid => $field) {
$fieldName = $field['fieldName'];
$value = $dealsCrmFieldData[$oppId][$fieldName] ?? '';
if ($field['fieldType'] === Field::TYPE_CURRENCY) {
$currency = $this->getDealCurrency($opportunity, $fieldName);
$deal['crm_data'][$uuid] = $this->buildCurrencyColumn($value, $currency, $fieldName);
} elseif (! empty($field['isStageField'])) {
$currentPipelineId = $deal['currentPipelineId'];
$stageUpdatedAt = $opportunity->getLastStageUpdate();
$deal['crm_data'][$uuid] = $this->buildStageColumn(
$fieldName,
$value,
$stageUpdatedAt,
$currentPipelineId
);
} else {
$deal['crm_data'][$uuid] = [
'label' => $fieldName,
'value' => $value,
];
}
}
unset($deal['rawValue'], $deal['currentStageUpdatedAt'], $deal['currentPipelineId']);
}
return $deals;
}
private function buildCurrencyColumn(string $value, string $currency, string $fieldName): array
{
return [
'rawValue' => [
'amount' => (int) $value,
'currency' => $currency,
],
'label' => $fieldName,
'value' => formatOpportunityValue(
(float) $value,
$currency,
2
),
];
}
private function buildStageColumn(
string $fieldName,
string $value,
string $stageUpdatedAt,
?int $currentPipelineId
): array {
return [
'label' => $fieldName,
'value' => $value,
'enteredAt' => $stageUpdatedAt,
// to be decided if FE needs it
'pipelineId' => $currentPipelineId,
];
}
private function getDealCurrency(Opportunity $opportunity, string $fieldName): string
{
$config = $opportunity->getCrmConfiguration();
// this case should not happen in practice
if ($config === null) {
return $opportunity->currency_code ?? Opportunity::DEFAULT_CURRENCY;
}
$defaultCurrency = $config->getDefaultCurrency();
if ($this->isDefaultCurrencyField($config, $fieldName) || $this->isHomeCurrencyField($fieldName)) {
return $defaultCurrency;
}
return $opportunity->currency_code ?? $defaultCurrency;
}
private function isHomeCurrencyField(string $fieldName): bool
{
return str_ends_with($fieldName, '_in_home_currency');
}
public function getPipelineData(Configuration $crm): array
{
return $this->dealsServiceRepositories->getPipelineData($crm);
}
public function getCrmColumns(User $user): array
{
$config = $user->getTeam()->getCrmConfiguration();
$layout = $this->getDealInsightsLayout($config);
if (! $layout) {
return [];
}
$fractal = new Manager();
$fractal->setSerializer(new JsonSerializer());
$fractal->parseIncludes([
'entities.field.options',
]);
$resource = new Item($layout, (new LayoutTransformer($user->crmProfile)));
$layoutData = $fractal->createData($resource)->toArray();
return $this->hydrateStagesData($layoutData, $config);
}
private function hydrateStagesData($data, $config)
{
$pipelines = $this->getPipelineData($config);
$providerName = $config->getProviderName();
$stageFieldName = Field::STAGE_TYPE_FIELDS[$providerName] ?? null;
foreach ($data['entities'] as &$entity) {
if ($stageFieldName !== null && $entity['field']['fieldName'] === $stageFieldName) {
$entity['field']['isStageField'] = true;
$entity['field']['pipelines'] = $pipelines;
} else {
$entity['field']['isStageField'] = false;
}
}
return $data;
}
public function isDefaultCurrencyField(Configuration $config, string $fieldName): bool
{
$defaultCurrencyField = $config->getDefaultCurrencyField();
if ($defaultCurrencyField instanceof Field) {
return $fieldName === $defaultCurrencyField->getCrmProviderId();
}
return false;
}
private function fetchEmailSyncStatus(array $userIds): array
{
/** @var User[] $users */
$users = $this->dealsServiceRepositories->getUsersWithInboxByUserIds($userIds);
$result = [];
foreach ($users as $user) {
$inbox = $user->getInbox();
$isEnabled = $this->inboxService->isSyncEnabled($user);
$lastSync = null;
if ($isEnabled && $inbox instanceof Inbox && $inbox->getLastSyncedAt() !== null) {
$lastSync = $inbox->getLastSyncedAt()->format(\DATE_ATOM);
}
$result[$user->getId()] = [
'sync_enabled' => $isEnabled,
'last_sync' => $lastSync,
'unprocessed_emails' => $inbox?->emails()
->whereNotIn('status', [InboxEmail::STATUS_DISCARDED, InboxEmail::STATUS_PROCESSED])
->count(),
];
}
return $result;
}
public function resolveStage(bool $isClosed, bool $isWon): string
{
if (! $isClosed) {
return CriteriaInterface::OPEN_DEAL_LABEL;
}
return $isWon
? CriteriaInterface::CLOSED_WON_DEAL_LABEL
: CriteriaInterface::CLOSED_LOST_DEAL_LABEL;
}
}
A
1
Select All
17009
17009
17009
42ec35c8-7a66-3dff-b558-9c75866ecd68
42ec35c8-7a66-3dff-b558-9c75866ecd68
<null>
Galya Dimitrova
Galya Dimitrova
<null>
[EMAIL]
[EMAIL]
<null>
<null>
<null>
<null>
1
1
17009
<null>
<null>
<null>
<null>
<null>
<null>
/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg
/5f0f4810-7e77-4086-8f69-93429ae4d70b/avatars/LuhbAIJTol7ULglNYZz1HQ7FBKgLS09FdeBgrUd4.jpg
<null>
0
0
17009
<null>
<null>
<null>
BG
BG
<null>
<null>
<null>
17009
[PHONE]
[PHONE]
<null>
<null>
<null>
<null>
<null>
<null>
<null>
7341
7341
17009
<null>
<null>
<null>
1
1
17009
2868
2868
17009
Europe/Sofia
Europe/Sofia
<null>
en_US
en_US
<null>
<null>
<null>
<null>
<null>
<null>
<null>
galyadimitrova
galyadimitrova
<null>
on-demand
on-demand
<null>
1
1
17009
on
on
<null>
0
0
17009
[PHONE]
[PHONE]
<null>
<null>
3
3
17009
1
1
17009
1
1
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
<null>
<null>
17009
email
email
<null>
0
0
17009
1
1
17009
never
never
<null>
never
never
<null>
1
1
17009
0
0
17009
0
0
17009
0
0
17009
0
0
17009
2026-04-21 21:00:47
2026-04-21 21:00:47
<null>
2023-08-08 06:56:37
2023-08-08 06:56:37
<null>
2026-04-21 21:00:47
2026-04-21 21:00:47
<null>
id = 17009
Editor
1 row
Reload Page
Table Result Auto Refresh
Cancel Running Statements
Add Row
Delete Rows
Revert Selected
Preview Pending Changes
Submit
Tx: Auto
DDL
Find on Current Page
Table Result Local Filter
Record View...
|
71292
|
|
44153
|
933
|
76
|
2026-04-17T08:34:27.536850+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776414867536_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+FirefoxFileEditViewHistoryBookmarksProfilesToolsW +FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp→meet.google.com/xpx-omah-rknllian Kyuchukov (Presenting, annotating)BraveViewHistoryHelp40reowrir oha ohutoeoeCloudWatch Ius-east-CloudWatch |us-east-2@ DEV Jiminmy© PROO Jminelhttps//us-east-2.console.aws.amazon.com/cloudwatch/home?regionsus-east-2#logsV2:logs-insights53FqueryDetallS3D-(en…PROD EU JiminnyQ My PRs• Assigned• To Review@ Jminny Prophet W.3 Pipelines - jminey- JRAOpenAl Platform83 Confluence(7 Service-Desk - Qu.Sentry@ AWS|aws[Option+s) ©4United States (Ohio) •Logs Insights › _GeneralLoas insights otyZ Query generatorQ Fields• Saved and sample queries* Query commands|Run queryCancel© Completed. Query executed for 28 log groups.Update saved querySchedule queryLogs (932)Patterns (4)VisualizationLogs (932)E Share resultsAdd to dashboard‹ →0 kl# Support Daily - in 3h 26 m100% <478• Fri 17 Apr 11:34:276• Q 8• Fri17 Apr 11:34[J All BookmarksAPREVIYINVasil Vasilevllian KyuchukovShowing 932 of 932 records matched O168,877 records (39.2 MB) scanned in 2.6s @ 65,153 records/s (15.1 MB/s)Q Filter toble results (cose insensitive)#1ogPlogGroupIdPlogStreomMogStreanidenessoge2026-04-17784:25:01.[CREDIT_CARD]:worker-delayed21088021-0oca-4500-01ca-206588456017worker-delayed/worker-delayed/87eo6Be294e9420726ed8e7213a5eefO E27080621-06ca-43bd-bfca-2c65aa436b17::1d671767366c4541061ea65462Se16đ28e9216211a16a0462569666a63863e12::1776394443691|(2026-04-17 04:25:00) production.INFO: [RunActivityAlAnalysisListener) Opportunity triggered Al Analysis (*contextObjectId":19862190, "ContextObjectType":"opportunity" ,"CraTenplateFieldIds":(142,202, 143, 144, 203, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,1581, "trigger1d": 19862190, "trigperType":"opportunity") ("correlation_1d":"574c2bf8-94f0-43fb-8c8b-C071c17212a5*,"trace_1d":*8ba33eb9-3d23-4287-aa48-78e023ec3837*)|1776399900077';'code": 588, "response'": *'Internal Server Error*) ("correlation.ld": +61325321-f23C-49C6-9e70-96365c980617*, - troce.(d": "8ba33469-3623-4287-0o48-78823ec3837*)") ("correlation_id":*61325321-f23c-49c6-9e70-9636Sc9806f7", "troce_id": "8ba33eb9-3623-4287-0048-78e823ec3837*)®Coudshul0 2026, Amazon Web Services, Inc, or its affilates.AhvasyMihail Mihaylo)Nikolay NikolovCookie preferencesSetmnthot2024-116.56.pngLukas Kovalik11:34 AM Daily - Processing...
|
NULL
|
8452550066788359827
|
NULL
|
click
|
ocr
|
NULL
|
+FirefoxFileEditViewHistoryBookmarksProfilesToolsW +FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp→meet.google.com/xpx-omah-rknllian Kyuchukov (Presenting, annotating)BraveViewHistoryHelp40reowrir oha ohutoeoeCloudWatch Ius-east-CloudWatch |us-east-2@ DEV Jiminmy© PROO Jminelhttps//us-east-2.console.aws.amazon.com/cloudwatch/home?regionsus-east-2#logsV2:logs-insights53FqueryDetallS3D-(en…PROD EU JiminnyQ My PRs• Assigned• To Review@ Jminny Prophet W.3 Pipelines - jminey- JRAOpenAl Platform83 Confluence(7 Service-Desk - Qu.Sentry@ AWS|aws[Option+s) ©4United States (Ohio) •Logs Insights › _GeneralLoas insights otyZ Query generatorQ Fields• Saved and sample queries* Query commands|Run queryCancel© Completed. Query executed for 28 log groups.Update saved querySchedule queryLogs (932)Patterns (4)VisualizationLogs (932)E Share resultsAdd to dashboard‹ →0 kl# Support Daily - in 3h 26 m100% <478• Fri 17 Apr 11:34:276• Q 8• Fri17 Apr 11:34[J All BookmarksAPREVIYINVasil Vasilevllian KyuchukovShowing 932 of 932 records matched O168,877 records (39.2 MB) scanned in 2.6s @ 65,153 records/s (15.1 MB/s)Q Filter toble results (cose insensitive)#1ogPlogGroupIdPlogStreomMogStreanidenessoge2026-04-17784:25:01.[CREDIT_CARD]:worker-delayed21088021-0oca-4500-01ca-206588456017worker-delayed/worker-delayed/87eo6Be294e9420726ed8e7213a5eefO E27080621-06ca-43bd-bfca-2c65aa436b17::1d671767366c4541061ea65462Se16đ28e9216211a16a0462569666a63863e12::1776394443691|(2026-04-17 04:25:00) production.INFO: [RunActivityAlAnalysisListener) Opportunity triggered Al Analysis (*contextObjectId":19862190, "ContextObjectType":"opportunity" ,"CraTenplateFieldIds":(142,202, 143, 144, 203, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,1581, "trigger1d": 19862190, "trigperType":"opportunity") ("correlation_1d":"574c2bf8-94f0-43fb-8c8b-C071c17212a5*,"trace_1d":*8ba33eb9-3d23-4287-aa48-78e023ec3837*)|1776399900077';'code": 588, "response'": *'Internal Server Error*) ("correlation.ld": +61325321-f23C-49C6-9e70-96365c980617*, - troce.(d": "8ba33469-3623-4287-0o48-78823ec3837*)") ("correlation_id":*61325321-f23c-49c6-9e70-9636Sc9806f7", "troce_id": "8ba33eb9-3623-4287-0048-78e823ec3837*)®Coudshul0 2026, Amazon Web Services, Inc, or its affilates.AhvasyMihail Mihaylo)Nikolay NikolovCookie preferencesSetmnthot2024-116.56.pngLukas Kovalik11:34 AM Daily - Processing...
|
NULL
|
|
10527
|
209
|
54
|
2026-04-14T08:46:42.469382+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776156402469_m2.jpg...
|
Firefox
|
Jiminny — Work
|
True
|
app.staging.jiminny.com/ai-reports/manage
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
JY-20543 add AJ reports User pilot tracking by Lak JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
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
Close tab
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
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
CloudWatch | us-east-2
CloudWatch | us-east-2
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said why I can't see speaker data on meemt in firefox. ho wto set it up
You said
why I can't see speaker data on meemt in firefox. ho wto set it up
Listen
Show more options
Show thinking
Gemini said
Gemini said
Dealing with missing features right when you need them is incredibly frustrating. Assuming "meemt" means Google Meet, the reason you can't see your speaker data comes down to how Firefox interacts with Google's platform compared to Chrome.
Since "speaker data" can mean a couple of different things in a meeting, here are the two most likely causes for your issue and exactly how to get things working.
1. You Need "Speaker Notes" for Google Slides
1. You Need "Speaker Notes" for Google Slides
The Reality:
Google Meet has a native feature that lets you see your presentation's speaker notes right inside the video call interface.
However, this relies on a specific "Present a Tab" technology built exclusively for Google Chrome. Firefox handles screen sharing differently, so that native integration simply won't load.
View source details for citation from Google Workspace Updates. Opens side panel.
How to set it up (The Firefox Workaround):
You can still present and read your notes in Firefox by manually managing your windows.
Open your Google Slides presentation in a standard Firefox window.
Click the dropdown arrow next to the
Slideshow
button in the top right corner.
Select
Presenter view
to pop your speaker notes out into a separate, smaller window.
View source details for citation from Skywork. Opens side panel.
Join your Google Meet in a different Firefox window.
Click
Present now
and choose the
Window
option.
Select the window displaying your main slides (do not select your separate speaker notes window).
Resize your windows on your monitor so you can comfortably read the notes window while keeping an eye on the Meet window.
2. You Need "Speaker Labels" or Transcripts
2. You Need "Speaker Labels" or Transcripts
The Reality:
If you are trying to use a third-party AI note-taker (like Otter.ai, Tactiq, or tl;dv) to capture transcriptions and see who is speaking, Firefox is likely the roadblock. Firefox has strict privacy guardrails that prevent extensions from capturing internal browser audio easily, so most developers only build these tools for Chrome.
How to set it up:
Turn on built-in captions:
Google Meet has its own live captions that natively identify who is speaking, even in Firefox. Click the
CC
button at the bottom of your Meet screen to toggle them on.
Search for a Firefox add-on:
Check the Mozilla Add-ons store to see if your preferred tool actually has a supported Firefox version (for example, Fellow.ai offers one).
View source details for citation from Fellow.ai. Opens side panel.
Switch browsers temporarily:
If your specific transcription tool is explicitly Chrome-only, you will unfortunately need to join that specific meeting using a Chromium-based browser like Chrome, Edge, or Brave to capture the data.
Using Meet's built-in closed captions or the manual Presenter view workaround will get your speaker data back on track without forcing you to completely abandon Firefox.
Sources
Sources
I men in dia (arc) I can see my headphones in both microphone and speakers
I men in dia (arc) I can see my headphones in both microphone and speakers
Open upload file menu
Tools
Open mode picker
Pro
Send message
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
JY-18909-automated-reports-ask-jiminny ■ 869720
28
28
Ask Jiminny Reports
Ask Jiminny Reports
Create
Report name
Prompt Prompt
Prompt
Prompt
Saved search Saved search
Saved search
Saved search
All statuses All statuses
All statuses
All statuses
Clear all
NAME
FREQUENCY
SHARED
EXPIRING
ACTIONS
Test 2
Daily
28/03/2026
Test 5
Daily
18/04/2026
Test 6
Daily
19/04/2026
You are currently impersonating Nikolay Yankov
Edit...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"bounds":{"left":0.00234375,"top":0.045138888,"width":0.0890625,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","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":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.015625,"top":0.09236111,"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.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":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.12083333,"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.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":"Configure SSH access to multiple environment - Engineering - Confluence","depth":5,"bounds":{"left":0.015625,"top":0.14930555,"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.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":"Console Home | Console Home | us-east-2","depth":5,"bounds":{"left":0.015625,"top":0.17777778,"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.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":"SecurityGroup | EC2 | us-east-2","depth":5,"bounds":{"left":0.015625,"top":0.20625,"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.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":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.23472223,"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.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":"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.26319444,"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.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 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet","depth":5,"bounds":{"left":0.015625,"top":0.29166666,"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.31041667,"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":"Jiminny","depth":5,"bounds":{"left":0.015625,"top":0.3201389,"width":0.015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.07890625,"top":0.31666666,"width":0.009375,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf","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":"Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf","depth":5,"bounds":{"left":0.015625,"top":0.34861112,"width":0.1640625,"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.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":"Service-Desk - Queues - Platform team - Service space - Jira","depth":5,"bounds":{"left":0.015625,"top":0.37708333,"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.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":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":5,"bounds":{"left":0.015625,"top":0.40555555,"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.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":"Configure SSH access to multiple environment - Engineering - Confluence","depth":5,"bounds":{"left":0.015625,"top":0.4340278,"width":0.1515625,"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.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":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.015625,"top":0.4625,"width":0.0484375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.003125,"top":0.4826389,"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":"Close 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":"AXButton","text":"AI Chat settings","depth":7,"bounds":{"left":0.2171875,"top":0.047916666,"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":"Close","depth":7,"bounds":{"left":0.23125,"top":0.047916666,"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":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.228125,"top":0.090277776,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"bounds":{"left":0.0984375,"top":0.090277776,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"bounds":{"left":0.1953125,"top":0.090277776,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"bounds":{"left":0.2109375,"top":0.090277776,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"bounds":{"left":0.09335937,"top":0.12847222,"width":0.000390625,"height":0.00069444446},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"bounds":{"left":0.09335937,"top":0.13055556,"width":0.14101562,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"bounds":{"left":0.1203125,"top":0.15972222,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"bounds":{"left":0.1375,"top":0.15972222,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said why I can't see speaker data on meemt in firefox. ho wto set it up","depth":21,"bounds":{"left":0.1609375,"top":0.16805555,"width":0.072265625,"height":0.058333334},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"bounds":{"left":0.09335937,"top":0.1701389,"width":0.0234375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"why I can't see speaker data on meemt in firefox. ho wto set it up","depth":23,"bounds":{"left":0.1609375,"top":0.17083333,"width":0.07070313,"height":0.05347222},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"bounds":{"left":0.22382812,"top":0.25416666,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"bounds":{"left":0.22382812,"top":0.24930556,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"bounds":{"left":0.11953125,"top":0.25625,"width":0.036328126,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"bounds":{"left":0.11679687,"top":0.2923611,"width":0.000390625,"height":0.00069444446},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"bounds":{"left":0.11679687,"top":0.29375,"width":0.048046876,"height":0.016666668},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Dealing with missing features right when you need them is incredibly frustrating. Assuming \"meemt\" means Google Meet, the reason you can't see your speaker data comes down to how Firefox interacts with Google's platform compared to Chrome.","depth":24,"bounds":{"left":0.10390625,"top":0.30069444,"width":0.13046876,"height":0.10486111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Since \"speaker data\" can mean a couple of different things in a meeting, here are the two most likely causes for your issue and exactly how to get things working.","depth":24,"bounds":{"left":0.10390625,"top":0.4201389,"width":0.13125,"height":0.06875},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1. You Need \"Speaker Notes\" for Google Slides","depth":23,"bounds":{"left":0.10390625,"top":0.52152777,"width":0.13242188,"height":0.033333335},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1. You Need \"Speaker Notes\" for Google Slides","depth":24,"bounds":{"left":0.10390625,"top":0.5229167,"width":0.12070312,"height":0.03125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The Reality:","depth":24,"bounds":{"left":0.10390625,"top":0.5625,"width":0.036328126,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Google Meet has a native feature that lets you see your presentation's speaker notes right inside the video call interface.","depth":24,"bounds":{"left":0.10390625,"top":0.5625,"width":0.13242188,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"However, this relies on a specific \"Present a Tab\" technology built exclusively for Google Chrome. Firefox handles screen sharing differently, so that native integration simply won't load.","depth":24,"bounds":{"left":0.10390625,"top":0.5986111,"width":0.12539062,"height":0.10486111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"View source details for citation from Google Workspace Updates. Opens side panel.","depth":24,"bounds":{"left":0.13710937,"top":0.68958336,"width":0.01015625,"height":0.013888889},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to set it up (The Firefox Workaround):","depth":24,"bounds":{"left":0.10390625,"top":0.71805555,"width":0.12851563,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You can still present and read your notes in Firefox by manually managing your windows.","depth":24,"bounds":{"left":0.10390625,"top":0.7361111,"width":0.12617187,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open your Google Slides presentation in a standard Firefox window.","depth":26,"bounds":{"left":0.11796875,"top":0.7777778,"width":0.115625,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Click the dropdown arrow next to the","depth":26,"bounds":{"left":0.11796875,"top":0.8194444,"width":0.10703125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slideshow","depth":26,"bounds":{"left":0.11796875,"top":0.8375,"width":0.03125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"button in the top right corner.","depth":26,"bounds":{"left":0.14921875,"top":0.8375,"width":0.08515625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Select","depth":26,"bounds":{"left":0.11796875,"top":0.8611111,"width":0.01953125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Presenter view","depth":26,"bounds":{"left":0.1375,"top":0.8611111,"width":0.0453125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to pop your speaker notes out into a separate, smaller window.","depth":26,"bounds":{"left":0.11796875,"top":0.8611111,"width":0.10078125,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"View source details for citation from Skywork. Opens side panel.","depth":26,"bounds":{"left":0.16523437,"top":0.8979167,"width":0.01015625,"height":0.013888889},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Join your Google Meet in a different Firefox window.","depth":26,"bounds":{"left":0.11796875,"top":0.92083335,"width":0.103125,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Click","depth":26,"bounds":{"left":0.11796875,"top":0.9625,"width":0.015234375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Present now","depth":26,"bounds":{"left":0.13320312,"top":0.9625,"width":0.037890624,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and choose the","depth":26,"bounds":{"left":0.17109375,"top":0.9625,"width":0.047265626,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Window","depth":26,"bounds":{"left":0.11796875,"top":0.98055553,"width":0.02421875,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"option.","depth":26,"bounds":{"left":0.1421875,"top":0.98055553,"width":0.02109375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Select the window displaying your main slides (do not select your separate speaker notes window).","depth":26,"bounds":{"left":0.11796875,"top":1.0,"width":0.11328125,"height":-0.0041667223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resize your windows on your monitor so you can comfortably read the notes window while keeping an eye on the Meet window.","depth":26,"bounds":{"left":0.11796875,"top":1.0,"width":0.11835937,"height":-0.06388891},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"2. You Need \"Speaker Labels\" or Transcripts","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2. You Need \"Speaker Labels\" or Transcripts","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The Reality:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If you are trying to use a third-party AI note-taker (like Otter.ai, Tactiq, or tl;dv) to capture transcriptions and see who is speaking, Firefox is likely the roadblock. Firefox has strict privacy guardrails that prevent extensions from capturing internal browser audio easily, so most developers only build these tools for Chrome.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"How to set it up:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Turn on built-in captions:","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Google Meet has its own live captions that natively identify who is speaking, even in Firefox. Click the","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CC","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"button at the bottom of your Meet screen to toggle them on.","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search for a Firefox add-on:","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check the Mozilla Add-ons store to see if your preferred tool actually has a supported Firefox version (for example, Fellow.ai offers one).","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"View source details for citation from Fellow.ai. Opens side panel.","depth":26,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Switch browsers temporarily:","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your specific transcription tool is explicitly Chrome-only, you will unfortunately need to join that specific meeting using a Chromium-based browser like Chrome, Edge, or Brave to capture the data.","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Using Meet's built-in closed captions or the manual Presenter view workaround will get your speaker data back on track without forcing you to completely abandon Firefox.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Sources","depth":23,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sources","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextArea","text":"I men in dia (arc) I can see my headphones in both microphone and speakers","depth":20,"bounds":{"left":0.109375,"top":0.8020833,"width":0.125,"height":0.05},"value":"I men in dia (arc) I can see my headphones in both microphone and speakers","help_text":"","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"I men in dia (arc) I can see my headphones in both microphone and speakers","depth":22,"bounds":{"left":0.109375,"top":0.8034722,"width":0.10625,"height":0.047916666},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open upload file menu","depth":20,"bounds":{"left":0.1046875,"top":0.86527777,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tools","depth":18,"bounds":{"left":0.1234375,"top":0.86527777,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open mode picker","depth":20,"bounds":{"left":0.190625,"top":0.8645833,"width":0.03046875,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pro","depth":23,"bounds":{"left":0.196875,"top":0.87222224,"width":0.00859375,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Send message","depth":19,"bounds":{"left":0.22265625,"top":0.86388886,"width":0.01640625,"height":0.029166667},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.","depth":17,"bounds":{"left":0.10039063,"top":0.9097222,"width":0.14296874,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Your privacy & Gemini Opens in a new window","depth":17,"bounds":{"left":0.1484375,"top":0.93194443,"width":0.046875,"height":0.011111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your privacy & Gemini","depth":18,"bounds":{"left":0.1484375,"top":0.93194443,"width":0.046875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Opens in a new window","depth":19,"bounds":{"left":0.09335937,"top":0.93125,"width":0.05078125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Summarize page","depth":7,"bounds":{"left":0.1,"top":0.96319443,"width":0.06289063,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summarize page","depth":9,"bounds":{"left":0.10664062,"top":0.9673611,"width":0.049609374,"height":0.013888889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY-18909-automated-reports-ask-jiminny ■ 869720","depth":9,"bounds":{"left":0.25390625,"top":0.9875,"width":0.11796875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"28","depth":12,"bounds":{"left":0.25625,"top":0.925,"width":0.01875,"height":0.030555556},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"28","depth":14,"bounds":{"left":0.26601562,"top":0.9284722,"width":0.00546875,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Ask Jiminny Reports","depth":13,"bounds":{"left":0.2875,"top":0.060416665,"width":0.07070313,"height":0.017361112},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ask Jiminny Reports","depth":14,"bounds":{"left":0.2875,"top":0.060416665,"width":0.07070313,"height":0.017361112},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create","depth":13,"bounds":{"left":0.9632813,"top":0.05625,"width":0.02734375,"height":0.025},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Report name","depth":16,"bounds":{"left":0.30273438,"top":0.09513889,"width":0.06796875,"height":0.017361112},"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Prompt Prompt","depth":13,"bounds":{"left":0.39414063,"top":0.09513889,"width":0.0859375,"height":0.017361112},"value":"Prompt Prompt","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Prompt","depth":14,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Prompt","depth":15,"bounds":{"left":0.39414063,"top":0.09861111,"width":0.0171875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Saved search Saved search","depth":13,"bounds":{"left":0.48945314,"top":0.09513889,"width":0.0859375,"height":0.017361112},"value":"Saved search Saved search","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Saved search","depth":14,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Saved search","depth":15,"bounds":{"left":0.48945314,"top":0.09861111,"width":0.0296875,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"All statuses All statuses","depth":13,"bounds":{"left":0.5847656,"top":0.09513889,"width":0.0703125,"height":0.017361112},"value":"All statuses All statuses","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"All statuses","depth":14,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All statuses","depth":15,"bounds":{"left":0.5847656,"top":0.09861111,"width":0.026171874,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear all","depth":13,"bounds":{"left":0.659375,"top":0.09791667,"width":0.030078124,"height":0.013888889},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"NAME","depth":16,"bounds":{"left":0.28710938,"top":0.14375,"width":0.015234375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FREQUENCY","depth":16,"bounds":{"left":0.52382815,"top":0.14375,"width":0.030859375,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SHARED","depth":16,"bounds":{"left":0.6421875,"top":0.14375,"width":0.020703126,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"EXPIRING","depth":16,"bounds":{"left":0.76054686,"top":0.14375,"width":0.023828125,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIONS","depth":16,"bounds":{"left":0.87890625,"top":0.14375,"width":0.02265625,"height":0.011111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test 2","depth":17,"bounds":{"left":0.28710938,"top":0.18055555,"width":0.013671875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Daily","depth":17,"bounds":{"left":0.52382815,"top":0.18055555,"width":0.012109375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"28/03/2026","depth":17,"bounds":{"left":0.76054686,"top":0.18055555,"width":0.028515626,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test 5","depth":17,"bounds":{"left":0.28710938,"top":0.21388888,"width":0.013671875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Daily","depth":17,"bounds":{"left":0.52382815,"top":0.21388888,"width":0.012109375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18/04/2026","depth":17,"bounds":{"left":0.76054686,"top":0.21388888,"width":0.028515626,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test 6","depth":17,"bounds":{"left":0.28710938,"top":0.24722221,"width":0.013671875,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Daily","depth":17,"bounds":{"left":0.52382815,"top":0.24722221,"width":0.012109375,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"19/04/2026","depth":17,"bounds":{"left":0.76054686,"top":0.24722221,"width":0.028515626,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You are currently impersonating Nikolay Yankov","depth":11,"bounds":{"left":0.56210935,"top":0.046527777,"width":0.11679687,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit","depth":9,"bounds":{"left":0.90351564,"top":0.22083333,"width":0.009765625,"height":0.011805556},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8452332372817257088
|
3543506763338871886
|
visual_change
|
accessibility
|
NULL
|
JY-20543 add AJ reports User pilot tracking by Lak JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
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
Close tab
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
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
CloudWatch | us-east-2
CloudWatch | us-east-2
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said why I can't see speaker data on meemt in firefox. ho wto set it up
You said
why I can't see speaker data on meemt in firefox. ho wto set it up
Listen
Show more options
Show thinking
Gemini said
Gemini said
Dealing with missing features right when you need them is incredibly frustrating. Assuming "meemt" means Google Meet, the reason you can't see your speaker data comes down to how Firefox interacts with Google's platform compared to Chrome.
Since "speaker data" can mean a couple of different things in a meeting, here are the two most likely causes for your issue and exactly how to get things working.
1. You Need "Speaker Notes" for Google Slides
1. You Need "Speaker Notes" for Google Slides
The Reality:
Google Meet has a native feature that lets you see your presentation's speaker notes right inside the video call interface.
However, this relies on a specific "Present a Tab" technology built exclusively for Google Chrome. Firefox handles screen sharing differently, so that native integration simply won't load.
View source details for citation from Google Workspace Updates. Opens side panel.
How to set it up (The Firefox Workaround):
You can still present and read your notes in Firefox by manually managing your windows.
Open your Google Slides presentation in a standard Firefox window.
Click the dropdown arrow next to the
Slideshow
button in the top right corner.
Select
Presenter view
to pop your speaker notes out into a separate, smaller window.
View source details for citation from Skywork. Opens side panel.
Join your Google Meet in a different Firefox window.
Click
Present now
and choose the
Window
option.
Select the window displaying your main slides (do not select your separate speaker notes window).
Resize your windows on your monitor so you can comfortably read the notes window while keeping an eye on the Meet window.
2. You Need "Speaker Labels" or Transcripts
2. You Need "Speaker Labels" or Transcripts
The Reality:
If you are trying to use a third-party AI note-taker (like Otter.ai, Tactiq, or tl;dv) to capture transcriptions and see who is speaking, Firefox is likely the roadblock. Firefox has strict privacy guardrails that prevent extensions from capturing internal browser audio easily, so most developers only build these tools for Chrome.
How to set it up:
Turn on built-in captions:
Google Meet has its own live captions that natively identify who is speaking, even in Firefox. Click the
CC
button at the bottom of your Meet screen to toggle them on.
Search for a Firefox add-on:
Check the Mozilla Add-ons store to see if your preferred tool actually has a supported Firefox version (for example, Fellow.ai offers one).
View source details for citation from Fellow.ai. Opens side panel.
Switch browsers temporarily:
If your specific transcription tool is explicitly Chrome-only, you will unfortunately need to join that specific meeting using a Chromium-based browser like Chrome, Edge, or Brave to capture the data.
Using Meet's built-in closed captions or the manual Presenter view workaround will get your speaker data back on track without forcing you to completely abandon Firefox.
Sources
Sources
I men in dia (arc) I can see my headphones in both microphone and speakers
I men in dia (arc) I can see my headphones in both microphone and speakers
Open upload file menu
Tools
Open mode picker
Pro
Send message
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
JY-18909-automated-reports-ask-jiminny ■ 869720
28
28
Ask Jiminny Reports
Ask Jiminny Reports
Create
Report name
Prompt Prompt
Prompt
Prompt
Saved search Saved search
Saved search
Saved search
All statuses All statuses
All statuses
All statuses
Clear all
NAME
FREQUENCY
SHARED
EXPIRING
ACTIONS
Test 2
Daily
28/03/2026
Test 5
Daily
18/04/2026
Test 6
Daily
19/04/2026
You are currently impersonating Nikolay Yankov
Edit...
|
10526
|
|
5048
|
94
|
61
|
2026-04-13T12:53:33.968183+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-13/1776 /Users/lukas/.screenpipe/data/data/2026-04-13/1776084813968_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelplall94% <47* Unable to access screenpipe activity dataDOCKERO $1- Used Claude, LikelyDEV (-zsh)relatedtoO 882APP (-zsh)• *3-zsh• *4screenpipework (querying the screenpipe search API)-zsh• 25-zsh86-zsh®O 87Mon 13 Apr 15:53:33181* Unable to access s...X8TL;DR: Mostly a dev day focused on building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening reading on Slovak news.what did I do today so farThe screenpipe MCP server has disconnected, so I can't query your activity right now. You'd need to reconnect it to get today's summary.You can try restarting the screenpipe MCP server and then ask again.give mesummary for last 48 hoursThe screenpipe MCPserver is still disconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCPserver or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP serverstatus, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(Claude mcp list)L Checking MCP server health...claude.ai Reminders: https://todo.lakylak.xyz/mcp - ! Needs authentication. +5 lines (ctrl+o to expand)Screenpipe shows asconnected. The tools may just need to be re-registered in this session. Let me try calling it directly:The screenpipe MCP is connected, but the tools got deregistered from this session when it disconnected earlier and can't be re-loaded mid-conversation.Start a new Claude Code session - the tools will be fully available again and I can pull the 48-hour summary right away.? for shortcuts...
|
NULL
|
8451892128874792329
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelplall94% <47* Unable to access screenpipe activity dataDOCKERO $1- Used Claude, LikelyDEV (-zsh)relatedtoO 882APP (-zsh)• *3-zsh• *4screenpipework (querying the screenpipe search API)-zsh• 25-zsh86-zsh®O 87Mon 13 Apr 15:53:33181* Unable to access s...X8TL;DR: Mostly a dev day focused on building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening reading on Slovak news.what did I do today so farThe screenpipe MCP server has disconnected, so I can't query your activity right now. You'd need to reconnect it to get today's summary.You can try restarting the screenpipe MCP server and then ask again.give mesummary for last 48 hoursThe screenpipe MCPserver is still disconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCPserver or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP serverstatus, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(Claude mcp list)L Checking MCP server health...claude.ai Reminders: https://todo.lakylak.xyz/mcp - ! Needs authentication. +5 lines (ctrl+o to expand)Screenpipe shows asconnected. The tools may just need to be re-registered in this session. Let me try calling it directly:The screenpipe MCP is connected, but the tools got deregistered from this session when it disconnected earlier and can't be re-loaded mid-conversation.Start a new Claude Code session - the tools will be fully available again and I can pull the 48-hour summary right away.? for shortcuts...
|
NULL
|
|
48254
|
1024
|
47
|
2026-04-17T12:31:56.875784+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776429116875_m2.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v99 JY-20692-fix-integration-app-[API_KEY] v© AutomatedReportsService.php© SendReportJob.php© SendReportMailJob.php© ReportController.php© TokenBuilder.phpO package-lock.json© TeamSetupController.phppnp apl.onp• Filesystem.phpC Team.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php= phpstan.neon.dist© RequestGenerateReportJob.php& OpportunitySyncTrait.php x© Opportunity.php=phpstan-baseline.neon€ InteractsWithPivotTable.php© OpportunityUpdated.php< phpunit.xmlQ-cacheastades575Cc W.*Te raw_sql_query.sql576trait OpportunitySyncTraitM- KEADMEMOA33 X2 X 19{0 sonar-project.properties=test.py1071private function getCurrentContactCrmIds(Opportunity $opportunity): array{...}579<> Untitled Diagram.xml1077—580Is vetur.config.js1 usage581M+ WEBHOOK_FILTERING_IMPLE1078private function logContactAssociationChanges(582› ib External LibrariesOpportunity Sopportunity,583E® Scratches and Consolesarray scurrenceoncaccermas,584v D Database Consolesarray econcaccassoclations.5851084VA-Uarray sconcacusionda,=586& consoe =ulalldy scunlaclslonclllove587A DEAL RISKS [EU]): void {...}F588A DI [EU]1093587Tusaue590v A jiminny@localhostprivate function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): voidf...}591A console [jiminny@localt11155924 DI [iminny@localhost]1 usage593A HS_local [iminny@local1116private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): 594 vA SF [jiminny@localhost]1133595A zoho_dev ljiminny@loca1 usage596V &PROD1154private function attachSingleContact(Opportunity $opportunity, string $crmid, int $id): boolf...}A console [PROD]1154c consoe IrrouI2 DI [PROD]0 1155private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): boolf...}1177= custom.log= laravel.logTx: Autov4 SF [jiminny@localhost]PlaygroundA HS_local [iminny@localhost]JOIN teams t1..n<->1: on t.id = u.team_idWHERE U.team_id = 581 and sa.provider = 'salesfonce' :SELECT * FROM automated_report_results order by id desc;select * 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-7345381b6044 , ["pdf", "podcast"]SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuig;select * from automated_reporresults order by id desc;SELECT * FROMautomated_report_results WHERE id = 1919;select * fromautomated_report_results WHERE ceRontaid = 54;select * fromopportunities where id = 7594349;SELECT * FROM teams HERE name LIKE "%Les%'; # 711, 692, 16067B - [EMAIL] * fromplaybooks where team_id = 711; # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;SELECT * FROM crm_fields WHERE id = 226147;SELECT * FROM crm_field_values WHERE crm_field_id = 226147;Servicesv D DatabaseV A EU4, console 1 s 59 msv Ajiminny@localhost4 SFdns locallV &PROD4 console 1 s 241 msYESAGINGc consoey DockerOutputiii liminnv.crm_field values# 711, 692, 16067B -...[EMAIL] x12 rowsveIx. AUtO vboLBQG60id Tuvid (UUID with time-low a…P : . team_id T4142 a2d6059b-a5df-4b40-bed0-a7877c5cfb394143 cdf0ce24-8e94-4540-8e17-864ad78632984148 1897440d-87f9-4bc4-b983-8ac740b3e55f4149 576d61fe-091a-4669-b459-7ae3ec1229d54248 01848184-1d44-42d9-8e4f-f4526f07c27a4373 5724b2d0-5ca8-4bab-aea4-4ead61ef9b954374 ab6bf89b-95d7-4d3e-a2a9-002ff12f85a74920 9a41525f-4d20-47d1-8c77-639e647df5ff4954 4627c0e3-ec8d-4a1b-838b-29962776bdd2105515 8d9e50bb-4e8a-4f61-86e3-5b30347058e15516 4fd32ad0-78a3-4d4a-a446-2efc12fde5395520 98550621-37df-4553-a4e7-0003c9de8859! activity_type Y@activity_field_id Y711 event711 event711 task711 Lask711 event711 task711 task711 task711 event711 event711 event711 event! name T226147 LMUS CX Playbook226147 Zone 2 Playbook226139 Enablement Teamosy UUtooundbis226147 Zone 1 KA Playbook226139 TestZoo7esttestDis_selectable Y ÷ Mai_activity_type_detection_enabled Tнннаа226157 Pipe x lerritory Planning226147 Test UK226147 LMUS CX Playbook test226147 LMUS CX Playbook test226147 LMUS CX Playbook testingI created_at Y0 2023-05-18 14:09:570 2023-05-18 14:11:110 2023-05-22 15:35:110 2023-05-22 16:09:530 2023-07-06 21:59:170 2023-09-11 12:33:100 2023-09-11 12:47:500 2024-08-19 10:49:200 2024-09-09 15:04:410 2026-04-16 07:11:030 2026-04-16 07:17:440 2026-04-16 08:14:07g Tech Day Review • in 1h 29 mAutomatedReportsCommandTestv100% C•Fri 17 Apr 15:31:56A console (EU]4 console [PROD] >A console [STAGING]Gajiminny v034 A1 A33 X 61CSV vI updated_at TI deleted_at T2025-03-31 17:39:56<null>2023-05-18 14:11:11<null>2025-07-24 02:33:27SIULL2023-05-22 16:09:53<null>2023-07-06 22:00:372023-07-06 22:02023-09-11 12:33:142023-09-11 12:32023-09-11 12:48:012023-09-11 12:42024-08-19 10:49:203024-09-99 15.059422026-04-16 07:17:202026-04-16 07:18:35170-94-10 08-14.03024-09-09 159912026-04-16 07:12026-04-16 07:1<nULL12 rows retrieved starting from 1 in 514 ms (execution: 148 ms, fetching: 366 ms)W Windsurf Teams 594:22 0 UTF-84 spaces...
|
NULL
|
8451695436322802487
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v99 JY-20692-fix-integration-app-[API_KEY] v© AutomatedReportsService.php© SendReportJob.php© SendReportMailJob.php© ReportController.php© TokenBuilder.phpO package-lock.json© TeamSetupController.phppnp apl.onp• Filesystem.phpC Team.php© CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php= phpstan.neon.dist© RequestGenerateReportJob.php& OpportunitySyncTrait.php x© Opportunity.php=phpstan-baseline.neon€ InteractsWithPivotTable.php© OpportunityUpdated.php< phpunit.xmlQ-cacheastades575Cc W.*Te raw_sql_query.sql576trait OpportunitySyncTraitM- KEADMEMOA33 X2 X 19{0 sonar-project.properties=test.py1071private function getCurrentContactCrmIds(Opportunity $opportunity): array{...}579<> Untitled Diagram.xml1077—580Is vetur.config.js1 usage581M+ WEBHOOK_FILTERING_IMPLE1078private function logContactAssociationChanges(582› ib External LibrariesOpportunity Sopportunity,583E® Scratches and Consolesarray scurrenceoncaccermas,584v D Database Consolesarray econcaccassoclations.5851084VA-Uarray sconcacusionda,=586& consoe =ulalldy scunlaclslonclllove587A DEAL RISKS [EU]): void {...}F588A DI [EU]1093587Tusaue590v A jiminny@localhostprivate function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): voidf...}591A console [jiminny@localt11155924 DI [iminny@localhost]1 usage593A HS_local [iminny@local1116private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): 594 vA SF [jiminny@localhost]1133595A zoho_dev ljiminny@loca1 usage596V &PROD1154private function attachSingleContact(Opportunity $opportunity, string $crmid, int $id): boolf...}A console [PROD]1154c consoe IrrouI2 DI [PROD]0 1155private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): boolf...}1177= custom.log= laravel.logTx: Autov4 SF [jiminny@localhost]PlaygroundA HS_local [iminny@localhost]JOIN teams t1..n<->1: on t.id = u.team_idWHERE U.team_id = 581 and sa.provider = 'salesfonce' :SELECT * FROM automated_report_results order by id desc;select * 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-7345381b6044 , ["pdf", "podcast"]SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuig;select * from automated_reporresults order by id desc;SELECT * FROMautomated_report_results WHERE id = 1919;select * fromautomated_report_results WHERE ceRontaid = 54;select * fromopportunities where id = 7594349;SELECT * FROM teams HERE name LIKE "%Les%'; # 711, 692, 16067B - [EMAIL] * fromplaybooks where team_id = 711; # event 226147SELECT * FROM playbook_categories WHERE playbook_id = 5515;SELECT * FROM crm_fields WHERE id = 226147;SELECT * FROM crm_field_values WHERE crm_field_id = 226147;Servicesv D DatabaseV A EU4, console 1 s 59 msv Ajiminny@localhost4 SFdns locallV &PROD4 console 1 s 241 msYESAGINGc consoey DockerOutputiii liminnv.crm_field values# 711, 692, 16067B -...[EMAIL] x12 rowsveIx. AUtO vboLBQG60id Tuvid (UUID with time-low a…P : . team_id T4142 a2d6059b-a5df-4b40-bed0-a7877c5cfb394143 cdf0ce24-8e94-4540-8e17-864ad78632984148 1897440d-87f9-4bc4-b983-8ac740b3e55f4149 576d61fe-091a-4669-b459-7ae3ec1229d54248 01848184-1d44-42d9-8e4f-f4526f07c27a4373 5724b2d0-5ca8-4bab-aea4-4ead61ef9b954374 ab6bf89b-95d7-4d3e-a2a9-002ff12f85a74920 9a41525f-4d20-47d1-8c77-639e647df5ff4954 4627c0e3-ec8d-4a1b-838b-29962776bdd2105515 8d9e50bb-4e8a-4f61-86e3-5b30347058e15516 4fd32ad0-78a3-4d4a-a446-2efc12fde5395520 98550621-37df-4553-a4e7-0003c9de8859! activity_type Y@activity_field_id Y711 event711 event711 task711 Lask711 event711 task711 task711 task711 event711 event711 event711 event! name T226147 LMUS CX Playbook226147 Zone 2 Playbook226139 Enablement Teamosy UUtooundbis226147 Zone 1 KA Playbook226139 TestZoo7esttestDis_selectable Y ÷ Mai_activity_type_detection_enabled Tнннаа226157 Pipe x lerritory Planning226147 Test UK226147 LMUS CX Playbook test226147 LMUS CX Playbook test226147 LMUS CX Playbook testingI created_at Y0 2023-05-18 14:09:570 2023-05-18 14:11:110 2023-05-22 15:35:110 2023-05-22 16:09:530 2023-07-06 21:59:170 2023-09-11 12:33:100 2023-09-11 12:47:500 2024-08-19 10:49:200 2024-09-09 15:04:410 2026-04-16 07:11:030 2026-04-16 07:17:440 2026-04-16 08:14:07g Tech Day Review • in 1h 29 mAutomatedReportsCommandTestv100% C•Fri 17 Apr 15:31:56A console (EU]4 console [PROD] >A console [STAGING]Gajiminny v034 A1 A33 X 61CSV vI updated_at TI deleted_at T2025-03-31 17:39:56<null>2023-05-18 14:11:11<null>2025-07-24 02:33:27SIULL2023-05-22 16:09:53<null>2023-07-06 22:00:372023-07-06 22:02023-09-11 12:33:142023-09-11 12:32023-09-11 12:48:012023-09-11 12:42024-08-19 10:49:203024-09-99 15.059422026-04-16 07:17:202026-04-16 07:18:35170-94-10 08-14.03024-09-09 159912026-04-16 07:12026-04-16 07:1<nULL12 rows retrieved starting from 1 in 514 ms (execution: 148 ms, fetching: 366 ms)W Windsurf Teams 594:22 0 UTF-84 spaces...
|
48252
|
|
61252
|
1320
|
48
|
2026-04-21T06:45:57.016008+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776753957016_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEdit→ GViewHistoryBookmarksProfilesTool FirefoxFileEdit→ GViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/agt-teir-cwt?authuser=lukas.kovalik%40jiminny.comg Daily - Platform • now100% [4• 8• Tue 21 Apr 9:45:561 [EMAIL] accountLukas KovalikDaily - PlatformAneliya Angelova, Galya Dimitrova, Nikolay Ivanov and 3 moreare in this call• Use Gemini to take notesShare notes and transcriptStartJoin nowOther ways to join~{ MacBook Pro…..4 System Defa...• FaceTime HD... •g Backgrounds...Gemini is available in Meet as your personal in-meeting assistant. It can analyze conversation via temporaryaccess to meeting captions. Using Ask Gemini won't create a recording or store meeting data. The meetinghost can turn it off. Learn more...
|
NULL
|
8451313940036087592
|
NULL
|
click
|
ocr
|
NULL
|
FirefoxFileEdit→ GViewHistoryBookmarksProfilesTool FirefoxFileEdit→ GViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/agt-teir-cwt?authuser=lukas.kovalik%40jiminny.comg Daily - Platform • now100% [4• 8• Tue 21 Apr 9:45:561 [EMAIL] accountLukas KovalikDaily - PlatformAneliya Angelova, Galya Dimitrova, Nikolay Ivanov and 3 moreare in this call• Use Gemini to take notesShare notes and transcriptStartJoin nowOther ways to join~{ MacBook Pro…..4 System Defa...• FaceTime HD... •g Backgrounds...Gemini is available in Meet as your personal in-meeting assistant. It can analyze conversation via temporaryaccess to meeting captions. Using Ask Gemini won't create a recording or store meeting data. The meetinghost can turn it off. Learn more...
|
61249
|
|
77340
|
1942
|
37
|
2026-04-24T09:06:31.924111+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-24/1777 /Users/lukas/.screenpipe/data/data/2026-04-24/1777021591924_m2.jpg...
|
Finder
|
Test
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
Jazyky
16 Mar 2026 at 10:32
82,19 GB
Folder
#recycle
11 Apr 2026 at 15:53
76,94 GB
Folder
SyncData
20 Apr 2026 at 21:09
36,64 GB
Folder
screenpipe
Today at 9:35
19,29 GB
Folder
db.sqlite
22 Apr 2026 at 20:35
6,64 GB
Document
archive.db
Today at 9:35
6,48 GB
Document
data
Today at 9:36
6,18 GB
Folder
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
Škola
28 Jan 2026 at 19:56
8,3 GB
Folder
Computer Science
22 Nov 2025 at 14:17
7,54 GB
Folder
ubuntu-24.04.4-live-server-amd64.iso
6 Mar 2026 at 20:53
3,41 GB
ISO Disk Image
CODE
16 Oct 2025 at 14:56
578,8 MB
Folder
Gitara
28 Jan 2026 at 19:55
3,1 MB
Folder
start machine.wav
14 Jun 2008 at 11:03
2 MB
Waveform audio
location-history.json
16 Mar 2026 at 6:43
1,2 MB
JSON
location-history(1).json
16 Mar 2026 at 6:53
1,2 MB
JSON
1910229e6394bdc967d792141382106f.ug-tmp
28 Feb 2026 at 9:08
Zero bytes
Document
Name
Date Modified
Size
Kind
1 of 20 selected, 2 TB available
Test...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Favourites","depth":6,"bounds":{"left":0.07446808,"top":0.1452514,"width":0.06216755,"height":0.015163607},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"jiminny","depth":6,"bounds":{"left":0.082446806,"top":0.16520351,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"AirDrop","depth":6,"bounds":{"left":0.082446806,"top":0.18754987,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Recents","depth":6,"bounds":{"left":0.082446806,"top":0.20989625,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Applications","depth":6,"bounds":{"left":0.082446806,"top":0.23224261,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Documents","depth":6,"bounds":{"left":0.082446806,"top":0.254589,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Downloads","depth":6,"bounds":{"left":0.082446806,"top":0.27693537,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"lukas","depth":6,"bounds":{"left":0.082446806,"top":0.29928172,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"iCloud","depth":6,"bounds":{"left":0.07446808,"top":0.3272147,"width":0.06216755,"height":0.015163607},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"iCloud Drive","depth":6,"bounds":{"left":0.082446806,"top":0.3471668,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Sync folder","depth":6,"bounds":{"left":0.082446806,"top":0.36951315,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Locations","depth":6,"bounds":{"left":0.07446808,"top":0.39744613,"width":0.06216755,"height":0.015163607},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"DXP4800PLUS-B5F","depth":6,"bounds":{"left":0.082446806,"top":0.41739824,"width":0.043218084,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Eject","depth":6,"bounds":{"left":0.1263298,"top":0.41899443,"width":0.0043218085,"height":0.009577015},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"Network","depth":6,"bounds":{"left":0.082446806,"top":0.43974462,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Tags","depth":6,"bounds":{"left":0.07446808,"top":0.46767756,"width":0.06216755,"height":0.015163607},"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"CRM","depth":6,"bounds":{"left":0.082446806,"top":0.48762968,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Orange","depth":6,"bounds":{"left":0.082446806,"top":0.509976,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Red","depth":6,"bounds":{"left":0.082446806,"top":0.5323224,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Yellow","depth":6,"bounds":{"left":0.082446806,"top":0.5546688,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Green","depth":6,"bounds":{"left":0.082446806,"top":0.57701516,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Blue","depth":6,"bounds":{"left":0.082446806,"top":0.59936154,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Purple","depth":6,"bounds":{"left":0.082446806,"top":0.6217079,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"All Tags…","depth":6,"bounds":{"left":0.082446806,"top":0.6440543,"width":0.049534574,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Name","depth":7,"bounds":{"left":0.15259309,"top":0.15003991,"width":0.011635638,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Date Modified","depth":7,"bounds":{"left":0.24634309,"top":0.15003991,"width":0.025930852,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Size","depth":7,"bounds":{"left":0.30651596,"top":0.15003991,"width":0.008976064,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Kind","depth":7,"bounds":{"left":0.3387633,"top":0.15003991,"width":0.00930851,"height":0.011173184},"role_description":"text"},{"role":"AXTextField","text":"Jazyky","depth":7,"bounds":{"left":0.15259309,"top":0.17318435,"width":0.01662234,"height":0.012769354},"value":"Jazyky","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"16 Mar 2026 at 10:32","depth":7,"bounds":{"left":0.24634309,"top":0.17318435,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"82,19 GB","depth":7,"bounds":{"left":0.3148271,"top":0.17318435,"width":0.020611702,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.17318435,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"#recycle","depth":7,"bounds":{"left":0.15259309,"top":0.18914606,"width":0.019946808,"height":0.012769354},"value":"#recycle","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"11 Apr 2026 at 15:53","depth":7,"bounds":{"left":0.24634309,"top":0.18914606,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"76,94 GB","depth":7,"bounds":{"left":0.3148271,"top":0.18914606,"width":0.020611702,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.18914606,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"SyncData","depth":7,"bounds":{"left":0.15259309,"top":0.20510775,"width":0.022273935,"height":0.012769354},"value":"SyncData","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"20 Apr 2026 at 21:09","depth":7,"bounds":{"left":0.24634309,"top":0.20510775,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"36,64 GB","depth":7,"bounds":{"left":0.3148271,"top":0.20510775,"width":0.020611702,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.20510775,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"screenpipe","depth":7,"bounds":{"left":0.15259309,"top":0.22106944,"width":0.025265958,"height":0.012769354},"value":"screenpipe","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:35","depth":7,"bounds":{"left":0.24634309,"top":0.22106944,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"19,29 GB","depth":7,"bounds":{"left":0.3148271,"top":0.22106944,"width":0.020611702,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.22106944,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"db.sqlite","depth":7,"bounds":{"left":0.1575798,"top":0.23703113,"width":0.020279255,"height":0.012769354},"value":"db.sqlite","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"22 Apr 2026 at 20:35","depth":7,"bounds":{"left":0.24634309,"top":0.23703113,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"6,64 GB","depth":7,"bounds":{"left":0.3174867,"top":0.23703113,"width":0.017952127,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.3387633,"top":0.23703113,"width":0.023603724,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"archive.db","depth":7,"bounds":{"left":0.1575798,"top":0.2529928,"width":0.023936171,"height":0.012769354},"value":"archive.db","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:35","depth":7,"bounds":{"left":0.24634309,"top":0.2529928,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"6,48 GB","depth":7,"bounds":{"left":0.3174867,"top":0.2529928,"width":0.017952127,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.3387633,"top":0.2529928,"width":0.023603724,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"data","depth":7,"bounds":{"left":0.1575798,"top":0.26895452,"width":0.011635638,"height":0.012769354},"value":"data","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Today at 9:36","depth":7,"bounds":{"left":0.24634309,"top":0.26895452,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"6,18 GB","depth":7,"bounds":{"left":0.3174867,"top":0.26895452,"width":0.017952127,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.26895452,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"pipes","depth":7,"bounds":{"left":0.1575798,"top":0.2849162,"width":0.013630319,"height":0.012769354},"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.24634309,"top":0.2849162,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"13 KB","depth":7,"bounds":{"left":0.32180852,"top":0.2849162,"width":0.013630319,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.2849162,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"screenpipe-day.sh","depth":7,"bounds":{"left":0.1575798,"top":0.3008779,"width":0.039893616,"height":0.012769354},"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.24634309,"top":0.3008779,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"3 KB","depth":7,"bounds":{"left":0.32446808,"top":0.3008779,"width":0.010970744,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Terminal scripts","depth":7,"bounds":{"left":0.3387633,"top":0.3008779,"width":0.03357713,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"screenpipe.db","depth":7,"bounds":{"left":0.1575798,"top":0.31683958,"width":0.03158245,"height":0.012769354},"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.24634309,"top":0.31683958,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Zero bytes","depth":7,"bounds":{"left":0.31117022,"top":0.31683958,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.3387633,"top":0.31683958,"width":0.023603724,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"test_write","depth":7,"bounds":{"left":0.1575798,"top":0.33280128,"width":0.022606382,"height":0.012769354},"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.24634309,"top":0.33280128,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Zero bytes","depth":7,"bounds":{"left":0.31117022,"top":0.33280128,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unix Executable File","depth":7,"bounds":{"left":0.3387633,"top":0.33280128,"width":0.034906916,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"Škola","depth":7,"bounds":{"left":0.15259309,"top":0.34876296,"width":0.013630319,"height":0.012769354},"value":"Škola","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"28 Jan 2026 at 19:56","depth":7,"bounds":{"left":0.24634309,"top":0.34876296,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"8,3 GB","depth":7,"bounds":{"left":0.32014626,"top":0.34876296,"width":0.015292553,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.34876296,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"Computer Science","depth":7,"bounds":{"left":0.15259309,"top":0.36472467,"width":0.039893616,"height":0.012769354},"value":"Computer Science","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"22 Nov 2025 at 14:17","depth":7,"bounds":{"left":0.24634309,"top":0.36472467,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"7,54 GB","depth":7,"bounds":{"left":0.3174867,"top":0.36472467,"width":0.017952127,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.36472467,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"ubuntu-24.04.4-live-server-amd64.iso","depth":7,"bounds":{"left":0.15259309,"top":0.38068634,"width":0.080784574,"height":0.012769354},"value":"ubuntu-24.04.4-live-server-amd64.iso","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Mar 2026 at 20:53","depth":7,"bounds":{"left":0.24634309,"top":0.38068634,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"3,41 GB","depth":7,"bounds":{"left":0.3174867,"top":0.38068634,"width":0.017952127,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"ISO Disk Image","depth":7,"bounds":{"left":0.3387633,"top":0.38068634,"width":0.031914894,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"CODE","depth":7,"bounds":{"left":0.15259309,"top":0.39664805,"width":0.014960106,"height":0.012769354},"value":"CODE","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"16 Oct 2025 at 14:56","depth":7,"bounds":{"left":0.24634309,"top":0.39664805,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"578,8 MB","depth":7,"bounds":{"left":0.31416222,"top":0.39664805,"width":0.021276595,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.39664805,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"Gitara","depth":7,"bounds":{"left":0.15259309,"top":0.41260973,"width":0.014960106,"height":0.012769354},"value":"Gitara","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"28 Jan 2026 at 19:55","depth":7,"bounds":{"left":0.24634309,"top":0.41260973,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"3,1 MB","depth":7,"bounds":{"left":0.31981382,"top":0.41260973,"width":0.015957447,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.3387633,"top":0.41260973,"width":0.014295213,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"start machine.wav","depth":7,"bounds":{"left":0.15259309,"top":0.42857143,"width":0.039228722,"height":0.012769354},"value":"start machine.wav","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"14 Jun 2008 at 11:03","depth":7,"bounds":{"left":0.24634309,"top":0.42857143,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"2 MB","depth":7,"bounds":{"left":0.3238032,"top":0.42857143,"width":0.011968086,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Waveform audio","depth":7,"bounds":{"left":0.3387633,"top":0.42857143,"width":0.033909574,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"location-history.json","depth":7,"bounds":{"left":0.15259309,"top":0.4445331,"width":0.043882977,"height":0.012769354},"value":"location-history.json","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"16 Mar 2026 at 6:43","depth":7,"bounds":{"left":0.24634309,"top":0.4445331,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"1,2 MB","depth":7,"bounds":{"left":0.31981382,"top":0.4445331,"width":0.015957447,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"JSON","depth":7,"bounds":{"left":0.3387633,"top":0.4445331,"width":0.012965426,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"location-history(1).json","depth":7,"bounds":{"left":0.15259309,"top":0.46049482,"width":0.04920213,"height":0.012769354},"value":"location-history(1).json","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"16 Mar 2026 at 6:53","depth":7,"bounds":{"left":0.24634309,"top":0.46049482,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"1,2 MB","depth":7,"bounds":{"left":0.31981382,"top":0.46049482,"width":0.015957447,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"JSON","depth":7,"bounds":{"left":0.3387633,"top":0.46049482,"width":0.012965426,"height":0.012769354},"role_description":"text"},{"role":"AXTextField","text":"1910229e6394bdc967d792141382106f.ug-tmp","depth":7,"bounds":{"left":0.15259309,"top":0.4764565,"width":0.09042553,"height":0.012769354},"value":"1910229e6394bdc967d792141382106f.ug-tmp","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"28 Feb 2026 at 9:08","depth":7,"bounds":{"left":0.24634309,"top":0.4764565,"width":0.056848403,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Zero bytes","depth":7,"bounds":{"left":0.31117022,"top":0.4764565,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.3387633,"top":0.4764565,"width":0.023603724,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Name","depth":6,"bounds":{"left":0.14095744,"top":0.1452514,"width":0.10372341,"height":0.022346368},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Date Modified","depth":6,"bounds":{"left":0.24468085,"top":0.1452514,"width":0.06017287,"height":0.022346368},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Size","depth":6,"bounds":{"left":0.30485374,"top":0.1452514,"width":0.032247342,"height":0.022346368},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"Kind","depth":6,"bounds":{"left":0.33710107,"top":0.1452514,"width":0.040226065,"height":0.022346368},"role_description":"sort button","subrole":"AXSortButton","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"1 of 20 selected, 2 TB available","depth":2,"bounds":{"left":0.22772606,"top":0.79090184,"width":0.059175532,"height":0.011173184},"automation_id":"_NS:34","role_description":"text"},{"role":"AXStaticText","text":"Test","depth":1,"bounds":{"left":0.16555852,"top":0.103751,"width":0.08610372,"height":0.0415004},"role_description":"text"}]...
|
8451169722729081669
|
-2075568038485274653
|
click
|
accessibility
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
Jazyky
16 Mar 2026 at 10:32
82,19 GB
Folder
#recycle
11 Apr 2026 at 15:53
76,94 GB
Folder
SyncData
20 Apr 2026 at 21:09
36,64 GB
Folder
screenpipe
Today at 9:35
19,29 GB
Folder
db.sqlite
22 Apr 2026 at 20:35
6,64 GB
Document
archive.db
Today at 9:35
6,48 GB
Document
data
Today at 9:36
6,18 GB
Folder
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
Škola
28 Jan 2026 at 19:56
8,3 GB
Folder
Computer Science
22 Nov 2025 at 14:17
7,54 GB
Folder
ubuntu-24.04.4-live-server-amd64.iso
6 Mar 2026 at 20:53
3,41 GB
ISO Disk Image
CODE
16 Oct 2025 at 14:56
578,8 MB
Folder
Gitara
28 Jan 2026 at 19:55
3,1 MB
Folder
start machine.wav
14 Jun 2008 at 11:03
2 MB
Waveform audio
location-history.json
16 Mar 2026 at 6:43
1,2 MB
JSON
location-history(1).json
16 Mar 2026 at 6:53
1,2 MB
JSON
1910229e6394bdc967d792141382106f.ug-tmp
28 Feb 2026 at 9:08
Zero bytes
Document
Name
Date Modified
Size
Kind
1 of 20 selected, 2 TB available
Test...
|
77339
|
|
36898
|
750
|
21
|
2026-04-16T11:07:05.187701+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776337625187_m1.jpg...
|
Firefox
|
Jiminny — Work
|
True
|
app.jiminny.eu/connect/zohocrm
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Inbox (1,561) - [EMAIL] - Jiminny Mail
Jiminny x Shiji - Reconnecting the platform
Jiminny x Shiji - Reconnecting the platform
For you - Confluence
For you - Confluence
Lukas Kovalik - Time Off
Lukas Kovalik - Time Off
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot
Userpilot
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
New Tab
New Tab
Jiminny
Jiminny
Google
Google
IntegrationAccessor | Membrane SDK - v0.28.1
IntegrationAccessor | Membrane SDK - v0.28.1
Jiminny · Membrane
Jiminny · Membrane
Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app
Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app
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
App "Zoho CRM" · Kavita · Membrane - 16 April 2026
App "Zoho CRM" · Kavita · Membrane - 16 April 2026
Jiminny
Jiminny
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Account disconnected
Account disconnected
It looks like your Zoho CRM account has become disconnected
Please re-connect to continue
zohocrm Sign in with Zoho CRM
Sign in with Zoho CRM
You are currently impersonating ITSD Apps Admin...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"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":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox (1,561) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Jiminny x Shiji - Reconnecting the platform","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny x Shiji - Reconnecting the platform","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"For you - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"For you - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Lukas Kovalik - Time Off","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lukas Kovalik - Time Off","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · 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":"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":"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":"Google","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Google","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"IntegrationAccessor | Membrane SDK - v0.28.1","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"IntegrationAccessor | Membrane SDK - v0.28.1","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny · Membrane","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny · Membrane","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app","depth":5,"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,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"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,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"App \"Zoho CRM\" · Kavita · Membrane - 16 April 2026","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"App \"Zoho CRM\" · Kavita · Membrane - 16 April 2026","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":true},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"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,"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,"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,"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,"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,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Account disconnected","depth":8,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Account disconnected","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"It looks like your Zoho CRM account has become disconnected","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Please re-connect to continue","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"zohocrm Sign in with Zoho CRM","depth":8,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sign in with Zoho CRM","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You are currently impersonating ITSD Apps Admin","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8451074053935168825
|
6789835871023416057
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Inbox (1,561) - [EMAIL] - Jiminny Mail
Jiminny x Shiji - Reconnecting the platform
Jiminny x Shiji - Reconnecting the platform
For you - Confluence
For you - Confluence
Lukas Kovalik - Time Off
Lukas Kovalik - Time Off
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot
Userpilot
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
New Tab
New Tab
Jiminny
Jiminny
Google
Google
IntegrationAccessor | Membrane SDK - v0.28.1
IntegrationAccessor | Membrane SDK - v0.28.1
Jiminny · Membrane
Jiminny · Membrane
Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app
Fix an autocomplete mistake that swapped Event for EventListener. by Vasil-Jiminny · Pull Request #11977 · jiminny/app
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
App "Zoho CRM" · Kavita · Membrane - 16 April 2026
App "Zoho CRM" · Kavita · Membrane - 16 April 2026
Jiminny
Jiminny
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Account disconnected
Account disconnected
It looks like your Zoho CRM account has become disconnected
Please re-connect to continue
zohocrm Sign in with Zoho CRM
Sign in with Zoho CRM
You are currently impersonating ITSD Apps Admin...
|
36897
|
|
21229
|
469
|
3
|
2026-04-15T09:58:32.796744+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776247112796_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoEDHomeDMsActivityFilesLater..• +SlackFileEditViewGoEDHomeDMsActivityFilesLater..•More+HistoryWindowHelp→Search Jiminny IncJiminny ... ~# curiosity_laD# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the _people_of jimi…..Direct messages••• Galya Dimitrova3Aneliya Angelova, ...€. Vasil VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina Petrova0. Nikolay Nikolov2Galya Dimitrova, Ni...2 Galya Dimitrova, Ni...::: AppsJira CloudToast# thank-yous8 39• MessagesAdd canvasO Files+ngPet.Tuesday, April 7th~Claire, thank you so much for supportingme outside working hours with theRydoo addendum. I really appreciate it, asthey needed it urgently. You are a truechampion!View Recognition MomentTodayThe Loop APP 12:46 PMStoyan Tomov has received "Be Customer-Centred" eCard from Stefka Stoyanova® Stefka StoyanovaStoyan, thank you for stepping in quicklyand finding a way to export >4k activitieswith their metadata for Superside for justa few daysYou worked during Easterholidays and late nights to finish thisexport by the time promised to thecustomer Aner A bilView Recognition Moment1 reply Today at 12:49 PMMessage #thank-yous+Aa...New(aholSupport Daily - in 2h 2 m100% <478Wed 15 Apr 12:58:32159-14:~18185-zsh|86-zshO 87* Unable to a...88-zsh870977100%NOT SETNOT SETDISABLEDcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}"reportUuid":"2461bd36-1f8c-4162-b7dd-4c03ca39bd78"',"teamId":1, "expiresAt" :"2026-0-8428-6f0ddf3e6f19"}"reportUuid": "f278e4f1-0f02-40e7-9461-6d18992c7241", "teamId" :1, "expiresAt" :"2026-0›-8428-6f0ddf3e6f19"'}'reportUuid":"d88089d5-3c70-48c1-98a4-c8b60dab6852", "teamId" :1,"expiresAt":"2026-0-8428-6f0ddf3e6f19"}["reportUuid": "802607bc-9ef1-4203-b93e-560000552a5d", "teamId" :1, "expiresAt": "2026-0-8428-6f0ddf3e6f19"}"isFirstDay0fMonth" : false, "currentMonth":4, "isQuarterlyMonth" : true}{"correlation_n_id": "e067b865-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6lay (manual override) {"reportId":"38","reportUuid":"802607bc-9ef1-4203-b93e-560000$5b-8428-6f0ddf3e6f19"}ly (manual override) {"reportId": "38", "reportUuid": "802607bc-9ef1-4203-b93e-5600005ice_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}srrelation_id":"e067b865-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465:port {"reportUuid": "802607bc-9ef1-4203-b93e-560000552a5d", "teamId" :1, "frequency" :"id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"};-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}...
|
NULL
|
8450846914265990315
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoEDHomeDMsActivityFilesLater..• +SlackFileEditViewGoEDHomeDMsActivityFilesLater..•More+HistoryWindowHelp→Search Jiminny IncJiminny ... ~# curiosity_laD# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the _people_of jimi…..Direct messages••• Galya Dimitrova3Aneliya Angelova, ...€. Vasil VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina Petrova0. Nikolay Nikolov2Galya Dimitrova, Ni...2 Galya Dimitrova, Ni...::: AppsJira CloudToast# thank-yous8 39• MessagesAdd canvasO Files+ngPet.Tuesday, April 7th~Claire, thank you so much for supportingme outside working hours with theRydoo addendum. I really appreciate it, asthey needed it urgently. You are a truechampion!View Recognition MomentTodayThe Loop APP 12:46 PMStoyan Tomov has received "Be Customer-Centred" eCard from Stefka Stoyanova® Stefka StoyanovaStoyan, thank you for stepping in quicklyand finding a way to export >4k activitieswith their metadata for Superside for justa few daysYou worked during Easterholidays and late nights to finish thisexport by the time promised to thecustomer Aner A bilView Recognition Moment1 reply Today at 12:49 PMMessage #thank-yous+Aa...New(aholSupport Daily - in 2h 2 m100% <478Wed 15 Apr 12:58:32159-14:~18185-zsh|86-zshO 87* Unable to a...88-zsh870977100%NOT SETNOT SETDISABLEDcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}"reportUuid":"2461bd36-1f8c-4162-b7dd-4c03ca39bd78"',"teamId":1, "expiresAt" :"2026-0-8428-6f0ddf3e6f19"}"reportUuid": "f278e4f1-0f02-40e7-9461-6d18992c7241", "teamId" :1, "expiresAt" :"2026-0›-8428-6f0ddf3e6f19"'}'reportUuid":"d88089d5-3c70-48c1-98a4-c8b60dab6852", "teamId" :1,"expiresAt":"2026-0-8428-6f0ddf3e6f19"}["reportUuid": "802607bc-9ef1-4203-b93e-560000552a5d", "teamId" :1, "expiresAt": "2026-0-8428-6f0ddf3e6f19"}"isFirstDay0fMonth" : false, "currentMonth":4, "isQuarterlyMonth" : true}{"correlation_n_id": "e067b865-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6lay (manual override) {"reportId":"38","reportUuid":"802607bc-9ef1-4203-b93e-560000$5b-8428-6f0ddf3e6f19"}ly (manual override) {"reportId": "38", "reportUuid": "802607bc-9ef1-4203-b93e-5600005ice_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}srrelation_id":"e067b865-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465:port {"reportUuid": "802607bc-9ef1-4203-b93e-560000552a5d", "teamId" :1, "frequency" :"id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"};-fcb2-43df-bfba-9e0b498ec087", "trace_id":"7b83e85f-24e6-465b-8428-6f0ddf3e6f19"}...
|
NULL
|
|
75010
|
1868
|
32
|
2026-04-23T10:29:06.453503+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-23/1776 /Users/lukas/.screenpipe/data/data/2026-04-23/1776940146453_m2.jpg...
|
Firefox
|
Jy 20541 extract common traits by Vasil-Jiminny · Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/12008/changes#diff-79d github.com/jiminny/app/pull/12008/changes#diff-79dc084299d57efa2491d7f2eae6b88fe02c19af3ff28601d13918799c987bef...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
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
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
Userpilot | Saved Reports
Userpilot | Saved Reports
Jiminny
Jiminny
Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app
Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (33)
Pull requests
(
33
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (32)
Security and quality
(
32
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Jy 20541 extract common traits #12008 Edit title
Jy 20541 extract common traits
#
12008
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
Vasil-Jiminny
Vasil-Jiminny
wants to merge 39 commits into
master
master
from
JY-20541-extract-common-traits
JY-20541-extract-common-traits
Copy head branch name to clipboard
Lines changed: 1321 additions & 442 deletions
Conversation (5)
Conversation
(
5
)
Commits (39)
Commits
(
39
)
Checks (2)
Checks
(
2
)
Files changed (20)
Files changed
(
20
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
Jy 20541 extract common traits
Jy 20541 extract common traits
#
12008
All commits
All commits
Vasil-Jiminny
Vasil-Jiminny
wants to merge 39 commits into
master
master
from
JY-20541-extract-common-traits
JY-20541-extract-common-traits
Copy head branch name to clipboard
Refresh
Refresh
17
/
20
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Component/Activity/Services
GetDefaultActivityTypeService.php
GetDefaultActivityTypeService.php
Listeners/Crm
RemoteCrmRecordDeletedListener.php
RemoteCrmRecordDeletedListener.php
Models
Activity.php
Activity.php
PlaybookCategory.php
PlaybookCategory.php
Services/Crm
Close
Service.php
Service.php
Helpers
ActivityPlaybookTrait.php
ActivityPlaybookTrait.php
CrmHelperRepository.php
CrmHelperRepository.php
Listeners
ConvertLeadActivities.php
ConvertLeadActivities.php
Salesforce
Fields
FieldHelper.php
FieldHelper.php
ServiceTraits
FollowupActivityTrait.php
FollowupActivityTrait.php
Service.php
Service.php
BaseService.php
BaseService.php
tests/Unit
Component/Activity/Services
GetDefaultActivityTypeServiceTest.php
GetDefaultActivityTypeServiceTest.php
Services/Crm
Helpers
ActivityPlaybookTraitTest.php
ActivityPlaybookTraitTest.php
IntegrationApp
ServiceTest.php
ServiceTest.php
Listeners
ConvertLeadActivitiesTest.php
ConvertLeadActivitiesTest.php
Salesforce
Fields
ServiceTraits
Collapse file
app/Component/Activity/Services/GetDefaultActivityTypeService.php
app/Component/Activity/Services/GetDefaultActivityTypeService.php
app/Component/Activity/Services/GetDefaultActivityTypeService.php
Copy file name to clipboard
Expand all lines: app/Component/Activity/Services/GetDefaultActivityTypeService.php
Lines changed: 7 additions & 1 deletion
Not Viewed
Viewed
Comment on this file
More options
Original file line number
Original file line
Diff line number
Diff line change
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
72
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
73
{
73
{
74
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
74
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
75
+
// Sidekick playbook may be null, and the activity playbook may be null as well.
76
+
// Both can be soft-deleted.
77
+
// For that reason, at least one of the two playbooks must be guaranteed not to be null.
78
+
if
(
$
sidekickPlaybook
===
null
) {
79
+
return
false
;
80
+
}
75
81
76
-
return
$
activity
->
getActivityType
()->
getPlaybook
()->
getId
() ===
$
sidekickPlaybook
?->getId();
82
+
return
$
activity
->
getActivityType
()
?
->getPlaybook()
?
->getId() ===
$
sidekickPlaybook
?->getId();
77
}
83
}
78
}
84
}
Original file line number
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
73
74
75
76
77
78
Original file line
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
{
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
-
return
$
activity
->
getActivityType
()->
getPlaybook
()->
getId
() ===
$
sidekickPlaybook
?->getId();
}
}
Diff line number
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
73
74
75
76
77
78
79
80
81
82
83
84
Diff line change
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
{
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
+
// Sidekick playbook may be null, and the activity playbook may be null as well.
+
// Both can be soft-deleted....
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.23321144,"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":"New Tab","depth":4,"bounds":{"left":0.23138298,"top":0.09497207,"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":"New Tab","depth":5,"bounds":{"left":0.24468085,"top":0.10614525,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app","depth":4,"bounds":{"left":0.23138298,"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":"AI reports promotion pages by nikolay-yankov · Pull Request #11998 · jiminny/app","depth":5,"bounds":{"left":0.24468085,"top":0.13886672,"width":0.14128989,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.23138298,"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":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.24468085,"top":0.17158818,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23138298,"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","depth":5,"bounds":{"left":0.24468085,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Saved Reports","depth":4,"bounds":{"left":0.23138298,"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":"Userpilot | Saved Reports","depth":5,"bounds":{"left":0.24468085,"top":0.23703113,"width":0.044049203,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.23138298,"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":"Jiminny","depth":5,"bounds":{"left":0.24468085,"top":0.2697526,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app","depth":4,"bounds":{"left":0.23138298,"top":0.29130086,"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":"Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app","depth":5,"bounds":{"left":0.24468085,"top":0.30247405,"width":0.14660904,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.29870346,"top":0.29848364,"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":"New Tab","depth":4,"bounds":{"left":0.23420878,"top":0.3256185,"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.23420878,"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.24517952,"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.25631648,"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.26745346,"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.2785904,"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":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (33)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"33","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (32)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"32","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Jy 20541 extract common traits #12008 Edit title","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jy 20541 extract common traits","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12008","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Preview","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":"Preview","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","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":"Code","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 39 commits into","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20541-extract-common-traits","depth":16,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20541-extract-common-traits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 1321 additions & 442 deletions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (5)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Conversation","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (39)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"39","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Checks (2)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Files changed (20)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Files changed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Pull Request Toolbar","depth":14,"bounds":{"left":0.32164228,"top":0.07581804,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull Request Toolbar","depth":15,"bounds":{"left":0.32164228,"top":0.07861133,"width":0.030086435,"height":0.08060654},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file tree","depth":14,"bounds":{"left":0.32164228,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Open","depth":14,"bounds":{"left":0.34424868,"top":0.06943336,"width":0.011968086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jy 20541 extract common traits","depth":14,"bounds":{"left":0.3628657,"top":0.058260176,"width":0.07164229,"height":0.016759777},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20541 extract common traits","depth":16,"bounds":{"left":0.3628657,"top":0.059856344,"width":0.07164229,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"bounds":{"left":0.43716756,"top":0.059856344,"width":0.0028257978,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12008","depth":15,"bounds":{"left":0.43999335,"top":0.059856344,"width":0.013630319,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"All commits","depth":14,"bounds":{"left":0.36020613,"top":0.07182761,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All commits","depth":16,"bounds":{"left":0.36319813,"top":0.07701516,"width":0.02244016,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"bounds":{"left":0.39827126,"top":0.07581804,"width":0.02642952,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"bounds":{"left":0.39827126,"top":0.07701516,"width":0.02642952,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 39 commits into","depth":15,"bounds":{"left":0.42603058,"top":0.07701516,"width":0.06050532,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"bounds":{"left":0.4878657,"top":0.074221864,"width":0.018450798,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"bounds":{"left":0.4898604,"top":0.07741421,"width":0.014461436,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"bounds":{"left":0.50764626,"top":0.07701516,"width":0.008643617,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20541-extract-common-traits","depth":16,"bounds":{"left":0.51761967,"top":0.074221864,"width":0.07596409,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20541-extract-common-traits","depth":17,"bounds":{"left":0.51961434,"top":0.07741421,"width":0.07197473,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"bounds":{"left":0.59491354,"top":0.07182761,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Refresh","depth":15,"bounds":{"left":0.78390956,"top":0.0650439,"width":0.027925532,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Refresh","depth":17,"bounds":{"left":0.79355055,"top":0.070231445,"width":0.015292553,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17","depth":15,"bounds":{"left":0.8211436,"top":0.070231445,"width":0.004155585,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"bounds":{"left":0.8252992,"top":0.070231445,"width":0.0023271276,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20","depth":15,"bounds":{"left":0.8287899,"top":0.070231445,"width":0.0051529254,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"viewed","depth":15,"bounds":{"left":0.83494014,"top":0.070231445,"width":0.013297873,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":14,"bounds":{"left":0.8565492,"top":0.0650439,"width":0.04338431,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":16,"bounds":{"left":0.86619014,"top":0.070231445,"width":0.030751329,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Submit review","depth":14,"bounds":{"left":0.9025931,"top":0.0650439,"width":0.03856383,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Submit","depth":16,"bounds":{"left":0.9055851,"top":0.070231445,"width":0.014793883,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"review","depth":16,"bounds":{"left":0.920379,"top":0.070231445,"width":0.012466756,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open diff view settings","depth":14,"bounds":{"left":0.9438165,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open overview panel","depth":14,"bounds":{"left":0.96143615,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open comments panel","depth":14,"bounds":{"left":0.97207445,"top":0.0650439,"width":0.017287234,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(","depth":16,"bounds":{"left":0.98038566,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":16,"bounds":{"left":0.9830452,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":16,"bounds":{"left":0.9857048,"top":0.070231445,"width":0.0014960107,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Filter files…","depth":16,"bounds":{"left":0.33294547,"top":0.11332801,"width":0.06815159,"height":0.023942538},"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Filter options","depth":16,"bounds":{"left":0.4040891,"top":0.112529926,"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":"AXHeading","text":"File tree","depth":15,"bounds":{"left":0.32197472,"top":0.15083799,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File tree","depth":16,"bounds":{"left":0.32197472,"top":0.15363128,"width":0.014295213,"height":0.0518755},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app","depth":19,"bounds":{"left":0.33793217,"top":0.15682362,"width":0.008144947,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Component/Activity/Services","depth":21,"bounds":{"left":0.34059176,"top":0.18276137,"width":0.061835106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GetDefaultActivityTypeService.php","depth":23,"bounds":{"left":0.34325132,"top":0.20830008,"width":0.07496676,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GetDefaultActivityTypeService.php","depth":24,"bounds":{"left":0.34325132,"top":0.20830008,"width":0.07496676,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Listeners/Crm","depth":21,"bounds":{"left":0.34059176,"top":0.23383878,"width":0.030086435,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"RemoteCrmRecordDeletedListener.php","depth":23,"bounds":{"left":0.34325132,"top":0.25937748,"width":0.084109046,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"RemoteCrmRecordDeletedListener.php","depth":24,"bounds":{"left":0.34325132,"top":0.25937748,"width":0.084109046,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Models","depth":21,"bounds":{"left":0.34059176,"top":0.2849162,"width":0.015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Activity.php","depth":23,"bounds":{"left":0.34325132,"top":0.31085396,"width":0.025265958,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Activity.php","depth":24,"bounds":{"left":0.34325132,"top":0.31085396,"width":0.025265958,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"PlaybookCategory.php","depth":23,"bounds":{"left":0.34325132,"top":0.33639267,"width":0.048537236,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"PlaybookCategory.php","depth":24,"bounds":{"left":0.34325132,"top":0.33639267,"width":0.048537236,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Services/Crm","depth":21,"bounds":{"left":0.34059176,"top":0.36193135,"width":0.028756648,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Close","depth":23,"bounds":{"left":0.34325132,"top":0.38747007,"width":0.012134309,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Service.php","depth":25,"bounds":{"left":0.3459109,"top":0.41340783,"width":0.025598405,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Service.php","depth":26,"bounds":{"left":0.3459109,"top":0.41340783,"width":0.025598405,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Helpers","depth":23,"bounds":{"left":0.34325132,"top":0.43894652,"width":0.01662234,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ActivityPlaybookTrait.php","depth":25,"bounds":{"left":0.3459109,"top":0.46448523,"width":0.054521278,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ActivityPlaybookTrait.php","depth":26,"bounds":{"left":0.3459109,"top":0.46448523,"width":0.054521278,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"CrmHelperRepository.php","depth":25,"bounds":{"left":0.3459109,"top":0.49002394,"width":0.055684842,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CrmHelperRepository.php","depth":26,"bounds":{"left":0.3459109,"top":0.49002394,"width":0.055684842,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Listeners","depth":23,"bounds":{"left":0.34325132,"top":0.51556265,"width":0.019614361,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ConvertLeadActivities.php","depth":25,"bounds":{"left":0.3459109,"top":0.54110134,"width":0.05651596,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ConvertLeadActivities.php","depth":26,"bounds":{"left":0.3459109,"top":0.54110134,"width":0.05651596,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Salesforce","depth":23,"bounds":{"left":0.34325132,"top":0.5666401,"width":0.022606382,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fields","depth":25,"bounds":{"left":0.3459109,"top":0.5925778,"width":0.012632979,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"FieldHelper.php","depth":27,"bounds":{"left":0.34857047,"top":0.6181165,"width":0.033909574,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"FieldHelper.php","depth":28,"bounds":{"left":0.34857047,"top":0.6181165,"width":0.033909574,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ServiceTraits","depth":25,"bounds":{"left":0.3459109,"top":0.64365524,"width":0.027426861,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"FollowupActivityTrait.php","depth":27,"bounds":{"left":0.34857047,"top":0.669593,"width":0.053856384,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"FollowupActivityTrait.php","depth":28,"bounds":{"left":0.34857047,"top":0.669593,"width":0.053856384,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Service.php","depth":25,"bounds":{"left":0.3459109,"top":0.69513166,"width":0.025598405,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Service.php","depth":26,"bounds":{"left":0.3459109,"top":0.69513166,"width":0.025598405,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BaseService.php","depth":23,"bounds":{"left":0.34325132,"top":0.7206704,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BaseService.php","depth":24,"bounds":{"left":0.34325132,"top":0.7206704,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"tests/Unit","depth":19,"bounds":{"left":0.33793217,"top":0.7462091,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Component/Activity/Services","depth":21,"bounds":{"left":0.34059176,"top":0.7717478,"width":0.061835106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GetDefaultActivityTypeServiceTest.php","depth":23,"bounds":{"left":0.34325132,"top":0.79768556,"width":0.08344415,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GetDefaultActivityTypeServiceTest.php","depth":24,"bounds":{"left":0.34325132,"top":0.79768556,"width":0.08344415,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Services/Crm","depth":21,"bounds":{"left":0.34059176,"top":0.82322425,"width":0.028756648,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Helpers","depth":23,"bounds":{"left":0.34325132,"top":0.848763,"width":0.01662234,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ActivityPlaybookTraitTest.php","depth":25,"bounds":{"left":0.3459109,"top":0.8747007,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ActivityPlaybookTraitTest.php","depth":26,"bounds":{"left":0.3459109,"top":0.8747007,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"IntegrationApp","depth":23,"bounds":{"left":0.34325132,"top":0.9002394,"width":0.031914894,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ServiceTest.php","depth":25,"bounds":{"left":0.3459109,"top":0.92577815,"width":0.034242023,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ServiceTest.php","depth":26,"bounds":{"left":0.3459109,"top":0.92577815,"width":0.034242023,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Listeners","depth":23,"bounds":{"left":0.34325132,"top":0.95131683,"width":0.019614361,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ConvertLeadActivitiesTest.php","depth":25,"bounds":{"left":0.3459109,"top":0.9768556,"width":0.0653258,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ConvertLeadActivitiesTest.php","depth":26,"bounds":{"left":0.3459109,"top":0.9768556,"width":0.0653258,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Salesforce","depth":23,"bounds":{"left":0.34325132,"top":1.0,"width":0.022606382,"height":-0.0023941994},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fields","depth":25,"bounds":{"left":0.3459109,"top":1.0,"width":0.012632979,"height":-0.028331995},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ServiceTraits","depth":25,"bounds":{"left":0.3459109,"top":1.0,"width":0.027426861,"height":-0.07940936},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Component/Activity/Services/GetDefaultActivityTypeService.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Component/Activity/Services/GetDefaultActivityTypeService.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Component/Activity/Services/GetDefaultActivityTypeService.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Component/Activity/Services/GetDefaultActivityTypeService.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 7 additions & 1 deletion","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Not Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","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":"Original file line number","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Original file line","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line number","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line change","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"72","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"private","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"playbookMatchesActivityPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"bool","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"72","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"private","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"playbookMatchesActivityPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"bool","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"73","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"73","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"74","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"this","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickService","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getSidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getUser","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"());","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"74","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"this","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickService","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getSidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getUser","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"());","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"75","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"// Sidekick playbook may be null, and the activity playbook may be null as well.","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"76","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"// Both can be soft-deleted.","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"77","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"// For that reason, at least one of the two playbooks must be guaranteed not to be null.","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"if","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"===","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"null","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") {","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"79","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"false","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":";","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"80","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"75","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"81","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"76","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getActivityType","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"()->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"()->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getId","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"() ===","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?->getId();","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"82","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getActivityType","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"()","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->getPlaybook()","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->getId() ===","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?->getId();","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"77","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"83","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"84","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Original file line number","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"72","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"73","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"74","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"75","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"76","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"77","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Original file line","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"private","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"playbookMatchesActivityPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"bool","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"this","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickService","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getSidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getUser","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"());","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"return","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getActivityType","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"()->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"()->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getId","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"() ===","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?->getId();","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line number","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"72","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"73","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"74","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"75","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"76","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"77","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"79","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"80","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"81","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"82","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"83","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"84","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line change","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"private","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"playbookMatchesActivityPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"bool","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"this","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sidekickService","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getSidekickPlaybook","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"activity","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"->","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getUser","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"());","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"// Sidekick playbook may be null, and the activity playbook may be null as well.","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"+","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"// Both can be soft-deleted.","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8450300368111725445
|
-6560489078984187600
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
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
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
Userpilot | Saved Reports
Userpilot | Saved Reports
Jiminny
Jiminny
Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app
Jy 20541 extract common traits by Vasil-Jiminny · Pull Request #12008 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (33)
Pull requests
(
33
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (32)
Security and quality
(
32
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Jy 20541 extract common traits #12008 Edit title
Jy 20541 extract common traits
#
12008
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
Vasil-Jiminny
Vasil-Jiminny
wants to merge 39 commits into
master
master
from
JY-20541-extract-common-traits
JY-20541-extract-common-traits
Copy head branch name to clipboard
Lines changed: 1321 additions & 442 deletions
Conversation (5)
Conversation
(
5
)
Commits (39)
Commits
(
39
)
Checks (2)
Checks
(
2
)
Files changed (20)
Files changed
(
20
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
Jy 20541 extract common traits
Jy 20541 extract common traits
#
12008
All commits
All commits
Vasil-Jiminny
Vasil-Jiminny
wants to merge 39 commits into
master
master
from
JY-20541-extract-common-traits
JY-20541-extract-common-traits
Copy head branch name to clipboard
Refresh
Refresh
17
/
20
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Component/Activity/Services
GetDefaultActivityTypeService.php
GetDefaultActivityTypeService.php
Listeners/Crm
RemoteCrmRecordDeletedListener.php
RemoteCrmRecordDeletedListener.php
Models
Activity.php
Activity.php
PlaybookCategory.php
PlaybookCategory.php
Services/Crm
Close
Service.php
Service.php
Helpers
ActivityPlaybookTrait.php
ActivityPlaybookTrait.php
CrmHelperRepository.php
CrmHelperRepository.php
Listeners
ConvertLeadActivities.php
ConvertLeadActivities.php
Salesforce
Fields
FieldHelper.php
FieldHelper.php
ServiceTraits
FollowupActivityTrait.php
FollowupActivityTrait.php
Service.php
Service.php
BaseService.php
BaseService.php
tests/Unit
Component/Activity/Services
GetDefaultActivityTypeServiceTest.php
GetDefaultActivityTypeServiceTest.php
Services/Crm
Helpers
ActivityPlaybookTraitTest.php
ActivityPlaybookTraitTest.php
IntegrationApp
ServiceTest.php
ServiceTest.php
Listeners
ConvertLeadActivitiesTest.php
ConvertLeadActivitiesTest.php
Salesforce
Fields
ServiceTraits
Collapse file
app/Component/Activity/Services/GetDefaultActivityTypeService.php
app/Component/Activity/Services/GetDefaultActivityTypeService.php
app/Component/Activity/Services/GetDefaultActivityTypeService.php
Copy file name to clipboard
Expand all lines: app/Component/Activity/Services/GetDefaultActivityTypeService.php
Lines changed: 7 additions & 1 deletion
Not Viewed
Viewed
Comment on this file
More options
Original file line number
Original file line
Diff line number
Diff line change
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
72
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
73
{
73
{
74
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
74
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
75
+
// Sidekick playbook may be null, and the activity playbook may be null as well.
76
+
// Both can be soft-deleted.
77
+
// For that reason, at least one of the two playbooks must be guaranteed not to be null.
78
+
if
(
$
sidekickPlaybook
===
null
) {
79
+
return
false
;
80
+
}
75
81
76
-
return
$
activity
->
getActivityType
()->
getPlaybook
()->
getId
() ===
$
sidekickPlaybook
?->getId();
82
+
return
$
activity
->
getActivityType
()
?
->getPlaybook()
?
->getId() ===
$
sidekickPlaybook
?->getId();
77
}
83
}
78
}
84
}
Original file line number
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
73
74
75
76
77
78
Original file line
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
{
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
-
return
$
activity
->
getActivityType
()->
getPlaybook
()->
getId
() ===
$
sidekickPlaybook
?->getId();
}
}
Diff line number
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
72
73
74
75
76
77
78
79
80
81
82
83
84
Diff line change
@@ -72,7 +72,13 @@ public function getForUserAndChannel(User $user, string $channel): ?PlaybookCate
private
function
playbookMatchesActivityPlaybook
(
Activity
$
activity
):
bool
{
$
sidekickPlaybook
=
$
this
->
sidekickService
->
getSidekickPlaybook
(
$
activity
->
getUser
());
+
// Sidekick playbook may be null, and the activity playbook may be null as well.
+
// Both can be soft-deleted....
|
75009
|
|
27518
|
572
|
93
|
2026-04-15T13:50:37.892465+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776261037892_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoEDHomeActivity..•More+HistoryW +SlackFileEditViewGoEDHomeActivity..•More+HistoryWindowHelp→Search 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 VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...ii: AppsToastJira Cloud# releases8 22Messagesnewdou+O Files• Bookmarksv 2 new messagesGitHub APP3:28 PM7 new commits pushed tomaster by nikolay-yankovNew24b989ee - 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 more( jiminny/app Added by GitHubCircleCl APP3:53 PMDeployment Successful!Project: appWhen:04/15/202612:53:30Tag:View JobMessage #releases+AaActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxFirefoxCP Isolated Web ContentFirefoxCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentFirefox GPU HelperFirefoxCP Isolated Web ContentFirefox GPU HelperVTDecoderXPCServiceFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)Notion Helper (Renderer)Claude Helper (Renderer)claudeFirefoxCP Isolated Web ContentiTerm2FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentMEMORY PRESSUREMem...2,03 GB1,20 GB993,4 MB962,8 MB836,5 MB793,5 MB783,4 MB554,1 MB547,4 MB543,8 MB516,0 MB464,8 MB454,1 MB426,1 MB413,9 MB394,4 MB391,7 MB390,1 MB372,5 MB343,6 MB327,1 MB326,3 MB326,1 MB301,4 MB252,2 MB245,6 MB245,1 MB224,7 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 16:50:37CPUMemoryDiskThreads39237626852829252612241626242725242315201513277272624EnergyPorts60519 7557271261 20320 019130242128250168121199125123126125122121174315220721241 836127123122PID93892407801442974146648424203080193671314673938993548041863358313527643652430163689848173265481148605195091035833487848298561387429516,00 GB14,20 GB<1,76 GB2,90 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas3,66 GB2,89 GB7,09 GB...
|
NULL
|
8450028705234957551
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoEDHomeActivity..•More+HistoryW +SlackFileEditViewGoEDHomeActivity..•More+HistoryWindowHelp→Search 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 VasilevSteliyan GeorgievAdelina Petrova, Ili...P. Adelina PetrovaD. Nikolay Nikolov2 Galya Dimitrova, Ni...ii: AppsToastJira Cloud# releases8 22Messagesnewdou+O Files• Bookmarksv 2 new messagesGitHub APP3:28 PM7 new commits pushed tomaster by nikolay-yankovNew24b989ee - 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 more( jiminny/app Added by GitHubCircleCl APP3:53 PMDeployment Successful!Project: appWhen:04/15/202612:53:30Tag:View JobMessage #releases+AaActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxFirefoxCP Isolated Web ContentFirefoxCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentFirefox GPU HelperFirefoxCP Isolated Web ContentFirefox GPU HelperVTDecoderXPCServiceFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)Notion Helper (Renderer)Claude Helper (Renderer)claudeFirefoxCP Isolated Web ContentiTerm2FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentMEMORY PRESSUREMem...2,03 GB1,20 GB993,4 MB962,8 MB836,5 MB793,5 MB783,4 MB554,1 MB547,4 MB543,8 MB516,0 MB464,8 MB454,1 MB426,1 MB413,9 MB394,4 MB391,7 MB390,1 MB372,5 MB343,6 MB327,1 MB326,3 MB326,1 MB301,4 MB252,2 MB245,6 MB245,1 MB224,7 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 16:50:37CPUMemoryDiskThreads39237626852829252612241626242725242315201513277272624EnergyPorts60519 7557271261 20320 019130242128250168121199125123126125122121174315220721241 836127123122PID93892407801442974146648424203080193671314673938993548041863358313527643652430163689848173265481148605195091035833487848298561387429516,00 GB14,20 GB<1,76 GB2,90 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas3,66 GB2,89 GB7,09 GB...
|
NULL
|
|
16884
|
369
|
16
|
2026-04-14T15:31:06.391378+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776180666391_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)Notion 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 ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...1,99 GB1,18 GB983,9 MB898,1 MB780,1 MB766,9 MB745,9 MB734,2 MB636,9 MB599,3 MB592,0 MB547,1 MB541,6 MB527,6 MB513,9 MB485,6 MB475,3 MB437,5 MB417,7 MB383,0 MB378,9 MB378,5 MB372,7 MB337,6 MB335,6 MB321,1 MB278,8 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:31:06CPUMemoryDiskThreads382323802972232515122626152128222426252727232725222413EnergyPorts59712216 13593812570412012616 43617216822723617733313011812112512312512712112412711812172PID248351470040714664600358014500478484984226548248438019146732427311487087349623340701479150891133432824628931710951120232249278005091016,00 GB14,07 GB <1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,01 GB2,96 GB6,55 GB...
|
NULL
|
8449727874252088628
|
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)Notion 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 ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...1,99 GB1,18 GB983,9 MB898,1 MB780,1 MB766,9 MB745,9 MB734,2 MB636,9 MB599,3 MB592,0 MB547,1 MB541,6 MB527,6 MB513,9 MB485,6 MB475,3 MB437,5 MB417,7 MB383,0 MB378,9 MB378,5 MB372,7 MB337,6 MB335,6 MB321,1 MB278,8 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:31:06CPUMemoryDiskThreads382323802972232515122626152128222426252727232725222413EnergyPorts59712216 13593812570412012616 43617216822723617733313011812112512312512712112412711812172PID248351470040714664600358014500478484984226548248438019146732427311487087349623340701479150891133432824628931710951120232249278005091016,00 GB14,07 GB <1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,01 GB2,96 GB6,55 GB...
|
16882
|
|
3944
|
NULL
|
0
|
2026-04-12T13:32:23.259738+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-12/1776 /Users/lukas/.screenpipe/data/data/2026-04-12/1776000743259_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0013888889,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0055555557,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12604167,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.13020833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.25069445,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25486112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.37534723,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3795139,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50416666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6246528,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.62881947,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.74930555,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7534722,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Unable to access screenpipe activity data (claude)","depth":2,"bounds":{"left":0.8736111,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.87777776,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.96944445,"top":0.032222223,"width":0.030555546,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.4965278,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8449023476417186364
|
392065140470573791
|
visual_change
|
accessibility
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
3943
|
|
3946
|
78
|
1
|
2026-04-12T13:32:45.339017+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-12/1776 /Users/lukas/.screenpipe/data/data/2026-04-12/1776000765339_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0013888889,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0055555557,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12604167,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.13020833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.25069445,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25486112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.37534723,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3795139,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50416666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6246528,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.62881947,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.74930555,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7534722,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Unable to access screenpipe activity data (claude)","depth":2,"bounds":{"left":0.8736111,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.87777776,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.96944445,"top":0.032222223,"width":0.030555546,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.4965278,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8449023476417186364
|
392065140470573791
|
click
|
accessibility
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
3945
|
|
3950
|
78
|
5
|
2026-04-12T13:33:06.137541+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-12/1776 /Users/lukas/.screenpipe/data/data/2026-04-12/1776000786137_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"{\n \"app_name\": \"\",\n \"text\": \"# JY-20431\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#JY-19982 1\\u2022 \\u2022=\\u20b4\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"E JY-20384 0.5 /2 0000=@\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20619 1 12 000=0\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"@JY-20614\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"# JY-20371\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n },\n {\n \"app_name\": \"\",\n \"text\": \"#* JY-20621\",\n \"timestamp\": \"2026-04-12T11:43:38.681562+03:00\",\n \"window_name\": \"\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT capture_trigger, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") GROUP BY capture_trigger ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"capture_trigger\": \"click\",\n \"n\": 1244\n },\n {\n \"capture_trigger\": \"visual_change\",\n \"n\": 436\n },\n {\n \"capture_trigger\": \"clipboard\",\n \"n\": 166\n },\n {\n \"capture_trigger\": \"idle\",\n \"n\": 119\n },\n {\n \"capture_trigger\": \"app_switch\",\n \"n\": 47\n },\n {\n \"capture_trigger\": \"manual\",\n \"n\": 9\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE timestamp > datetime(\\\"now\\\",\\\"-1 day\\\") AND app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 30\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"iTerm2\",\n \"n\": 349,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 112,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 15,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 3,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY text_source ORDER BY n DESC LIMIT 20\"}' \\\n | python3 -m json.tool\n[\n {\n \"n\": 1317,\n \"text_source\": \"ocr\"\n },\n {\n \"n\": 1148,\n \"text_source\": \"accessibility\"\n },\n {\n \"n\": 60,\n \"text_source\": \"hybrid\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT app_name, text_source, COUNT(*) as n FROM frames WHERE app_name != \\\"\\\" GROUP BY app_name, text_source ORDER BY n DESC LIMIT 50\"}' \\\n | python3 -m json.tool\n[\n {\n \"app_name\": \"Boosteroid\",\n \"n\": 1301,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 563,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 323,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Claude\",\n \"n\": 158,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 29,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Alfred\",\n \"n\": 24,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Safari\",\n \"n\": 20,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 15,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 13,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 9,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Firefox\",\n \"n\": 6,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Activity Monitor\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 4,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 4,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"UserNotificationCenter\",\n \"n\": 4,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"NetAuthAgent\",\n \"n\": 3,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Code\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Dia\",\n \"n\": 2,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Finder\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Raycast\",\n \"n\": 2,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"Slack\",\n \"n\": 2,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"Control Centre\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n },\n {\n \"app_name\": \"Preview\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"QuickTime Player\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"System Settings\",\n \"n\": 1,\n \"text_source\": \"accessibility\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"hybrid\"\n },\n {\n \"app_name\": \"iTerm2\",\n \"n\": 1,\n \"text_source\": \"ocr\"\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST http://localhost:3030/raw_sql \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"SELECT COUNT(*) as ocr_rows FROM ocr_text LIMIT 1\"}' \\\n | python3 -m json.tool\n[\n {\n \"ocr_rows\": 2752\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20\nzsh: no matches found: COUNT(*)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10\nError: in prepare, incomplete input\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0013888889,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0055555557,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12604167,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.13020833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.25069445,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25486112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.37534723,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3795139,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50416666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6246528,"top":0.05888889,"width":0.12465278,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.62881947,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.74930555,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7534722,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Unable to access screenpipe activity data (claude)","depth":2,"bounds":{"left":0.8736111,"top":0.05888889,"width":0.124305554,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.87777776,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.96944445,"top":0.032222223,"width":0.030555546,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.4965278,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8449023476417186364
|
392065140470573791
|
click
|
accessibility
|
NULL
|
{
"app_name": "",
{
"app_name": "",
"text": "# JY-20431",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#JY-19982 1\u2022 \u2022=\u20b4",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "E JY-20384 0.5 /2 0000=@",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20619 1 12 000=0",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "@JY-20614",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "# JY-20371",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
},
{
"app_name": "",
"text": "#* JY-20621",
"timestamp": "2026-04-12T11:43:38.681562+03:00",
"window_name": ""
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ curl -s -X POST [URL_WITH_CREDENTIALS] ~ $ sqlite3 -json ~/.screenpipe/db.sqlite SELECT app_name, COUNT(*) as n FROM frames WHERE app_name != '' GROUP BY app_name ORDER BY n DESC LIMIT 20
zsh: no matches found: COUNT(*)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 -column -header ~/.screenpipe/db.sqlite SELECT timestamp, app_name, window_name FROM frames ORDER BY timestamp DESC LIMIT 10
Error: in prepare, incomplete input
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Unable to access screenpipe activity data (claude)
Close Tab
⌥⌘1
-zsh...
|
3949
|
|
13536
|
294
|
13
|
2026-04-14T12:30:07.240574+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776169807240_m1.jpg...
|
Slack
|
Aneliya Angelova, Nikolay Yankov, Steliyan Georgie Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev (DM) - Jiminny Inc - 1 new item - Slack...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
Directories
platform-inner-team
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_jiminny
Vasil Vasilev
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Steliyan Georgiev
Adelina Petrova
,
Ilian Kyuchukov
,
Steliyan Georgiev
Adelina Petrova
Galya Dimitrova
Nikolay Nikolov
Galya Dimitrova
,
Nikolay Nikolov
Galya Dimitrova
,
Nikolay Yankov
Nikolay Yankov
Toast
Jira Cloud
Google Calendar
Nikolay Yankov
Today at 1:49:38 PM
Today at 1:49 PM
Добре, 2 неща:
в името на генерирания репорт е дата вчера, не днес
и имейл не дойде
image.png
Toggle file
image.png
10 replies
Lukas Kovalik
Today at 1:58:20 PM
Today at 1:58 PM
за дата там не знам как искаме да го правим. по принцип при всички други се гледа ден на зад при положение че идва през нощта.
Nikolay Yankov
Today at 1:58:22 PM
Today at 1:58 PM
@Lukas Kovalik
@Lukas Kovalik
видя ли този коментар
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 1:58:27 PM
Today at 1:58 PM
да
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Nikolay Yankov
Today at 1:59:00 PM
Today at 1:59 PM
не е ли датата на която е генерирано?
(edited)
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 1:59:04 PM
Today at 1:59 PM
email ще го видя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 2:43:12 PM
1 hour ago
за второто е направено да праща веднага само при one-off, иначе си праща когато му дойде време през нощта
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Today at 2:43:59 PM
2:43
и тука мога да му да добавя параметър само за тестване и да прати веднага ако се подаде на команда
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Nikolay Yankov
Today at 2:50:26 PM
39 minutes ago
да, да направим за да го тестваме, иначе няма да можем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 3:29:35 PM
Just now
готово
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Today at 3:29:55 PM
3:29
php artisan automated-reports:send --result-id {RESULT ID}
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
след като е генери
след като е генери
Also send to the group
Also send to the group
loading…
loading…...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Jiminny Inc","depth":12,"bounds":{"left":0.4861111,"top":0.08777778,"width":0.022222223,"height":0.035555556},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Jiminny (Staging)","depth":12,"bounds":{"left":0.4861111,"top":0.14555556,"width":0.022222223,"height":0.035555556},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Add workspaces","depth":12,"bounds":{"left":0.4861111,"top":0.20333333,"width":0.022222223,"height":0.035555556},"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.525,"top":0.07777778,"width":0.036111113,"height":0.075555556},"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.5326389,"top":0.13,"width":0.020833334,"height":0.015555556},"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.525,"top":0.15333334,"width":0.036111113,"height":0.075555556},"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.5347222,"top":0.20555556,"width":0.016666668,"height":0.015555556},"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.525,"top":0.22888888,"width":0.036111113,"height":0.075555556},"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.52916664,"top":0.28111112,"width":0.027083334,"height":0.015555556},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.525,"top":0.30444443,"width":0.036111113,"height":0.075555556},"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.5347222,"top":0.35666665,"width":0.015972223,"height":0.015555556},"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.525,"top":0.38,"width":0.036111113,"height":0.075555556},"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.53402776,"top":0.43222222,"width":0.018055556,"height":0.015555556},"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.525,"top":0.45555556,"width":0.036111113,"height":0.075555556},"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.53333336,"top":0.50777775,"width":0.01875,"height":0.015555556},"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"bounds":{"left":0.5951389,"top":0.12777779,"width":0.039583333,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"bounds":{"left":0.5951389,"top":0.12777779,"width":0.036805555,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"bounds":{"left":0.5951389,"top":0.12777779,"width":0.038194444,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"bounds":{"left":0.5951389,"top":0.12777779,"width":0.06111111,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.5951389,"top":0.12777779,"width":0.050694443,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.093055554,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.046527777,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.025694445,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.038194444,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.072222225,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.057638887,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"bounds":{"left":0.60625,"top":0.12777779,"width":0.054166667,"height":0.012222222},"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":23,"bounds":{"left":0.60625,"top":0.15111111,"width":0.04027778,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"bounds":{"left":0.60625,"top":0.18222222,"width":0.034027778,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"infra-changes","depth":23,"bounds":{"left":0.60625,"top":0.21333334,"width":0.061805554,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"bounds":{"left":0.60625,"top":0.24444444,"width":0.048611112,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.60625,"top":0.27555555,"width":0.072916664,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.60625,"top":0.30666667,"width":0.08055556,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.60625,"top":0.33777776,"width":0.035416666,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.60625,"top":0.36888888,"width":0.038194444,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":23,"bounds":{"left":0.60625,"top":0.4,"width":0.05138889,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.60625,"top":0.4311111,"width":0.036111113,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.60625,"top":0.46222222,"width":0.05138889,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.60625,"top":0.49333334,"width":0.094444446,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.60625,"top":0.56666666,"width":0.055555556,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.60625,"top":0.5977778,"width":0.07847222,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.68472224,"top":0.5977778,"width":0.013194445,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.68958336,"top":0.5977778,"width":0.029861111,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.60625,"top":0.6288889,"width":0.07986111,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Adelina Petrova","depth":23,"bounds":{"left":0.60625,"top":0.66,"width":0.072222225,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.67777777,"top":0.66,"width":0.0055555557,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Ilian Kyuchukov","depth":23,"bounds":{"left":0.68333334,"top":0.66,"width":0.015972223,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Adelina Petrova","depth":23,"bounds":{"left":0.60625,"top":0.6911111,"width":0.072222225,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.60625,"top":0.7222222,"width":0.07361111,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":23,"bounds":{"left":0.60625,"top":0.75333333,"width":0.07152778,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.60625,"top":0.78444445,"width":0.07361111,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.6791667,"top":0.78444445,"width":0.0055555557,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":23,"bounds":{"left":0.68472224,"top":0.78444445,"width":0.018055556,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.60625,"top":0.8155556,"width":0.07361111,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.6791667,"top":0.8155556,"width":0.0055555557,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.68472224,"top":0.8155556,"width":0.018055556,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.60625,"top":0.8466667,"width":0.06875,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.60625,"top":0.92,"width":0.025694445,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.60625,"top":0.95111114,"width":0.045833334,"height":0.02},"role_description":"text"},{"role":"AXStaticText","text":"Google Calendar","depth":23,"bounds":{"left":0.60625,"top":0.9822222,"width":0.06388889,"height":0.012222222},"role_description":"text"},{"role":"AXButton","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.7625,"top":0.12777779,"width":0.072222225,"height":0.0011111111},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.83402777,"top":0.12777779,"width":0.00625,"height":0.0011111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:49:38 PM","depth":23,"bounds":{"left":0.83958334,"top":0.12777779,"width":0.06458333,"height":0.0011111111},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:49 PM","depth":24,"bounds":{"left":0.83958334,"top":0.12777779,"width":0.06458333,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Добре, 2 неща:","depth":24,"bounds":{"left":0.7625,"top":0.12777779,"width":0.07361111,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.7652778,"top":0.12777779,"width":0.010416667,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"в името на генерирания репорт е дата вчера, не днес","depth":25,"bounds":{"left":0.78194445,"top":0.12777779,"width":0.18472221,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.7652778,"top":0.12777779,"width":0.010416667,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"и имейл не дойде","depth":25,"bounds":{"left":0.78194445,"top":0.12777779,"width":0.08680555,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"image.png","depth":24,"bounds":{"left":0.7625,"top":0.12777779,"width":0.04097222,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.80277777,"top":0.12777779,"width":0.0034722222,"height":0.0011111111},"role_description":"text"},{"role":"AXButton","text":"Toggle file","depth":24,"bounds":{"left":0.8055556,"top":0.12777779,"width":0.014583333,"height":0.0011111111},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXLink","text":"image.png","depth":26,"bounds":{"left":0.7625,"top":0.12777779,"width":0.22291666,"height":0.0011111111},"role_description":"Unlabelled image","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10 replies","depth":22,"bounds":{"left":0.73194444,"top":0.12777779,"width":0.03888889,"height":0.0011111111},"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7625,"top":0.12777779,"width":0.06458333,"height":0.0011111111},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82708335,"top":0.12777779,"width":0.0055555557,"height":0.0011111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:58:20 PM","depth":23,"bounds":{"left":0.83263886,"top":0.12777779,"width":0.06458333,"height":0.0011111111},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:58 PM","depth":24,"bounds":{"left":0.83263886,"top":0.12777779,"width":0.06458333,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"за дата там не знам как искаме да го правим. по принцип при всички други се гледа ден на зад при положение че идва през нощта.","depth":24,"bounds":{"left":0.7625,"top":0.12777779,"width":0.21944444,"height":0.06555556},"role_description":"text"},{"role":"AXButton","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.7625,"top":0.20333333,"width":0.072222225,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.83402777,"top":0.20555556,"width":0.00625,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:58:22 PM","depth":23,"bounds":{"left":0.83958334,"top":0.20888889,"width":0.06458333,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:58 PM","depth":24,"bounds":{"left":0.83958334,"top":0.20888889,"width":0.06458333,"height":0.016666668},"role_description":"text"},{"role":"AXLink","text":"@Lukas Kovalik","depth":24,"bounds":{"left":0.7625,"top":0.22888888,"width":0.07361111,"height":0.023333333},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"@Lukas Kovalik","depth":25,"bounds":{"left":0.7638889,"top":0.23,"width":0.07083333,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"видя ли този коментар","depth":24,"bounds":{"left":0.8354167,"top":0.23,"width":0.11319444,"height":0.02111111},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.18444444,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.18444444,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.18444444,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7625,"top":0.2611111,"width":0.06458333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82708335,"top":0.26333332,"width":0.0055555557,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:58:27 PM","depth":23,"bounds":{"left":0.83263886,"top":0.26666668,"width":0.06458333,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:58 PM","depth":24,"bounds":{"left":0.83263886,"top":0.26666668,"width":0.06458333,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"да","depth":24,"bounds":{"left":0.7625,"top":0.28777778,"width":0.011805556,"height":0.02111111},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.24222222,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.24222222,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.24222222,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.7625,"top":0.3188889,"width":0.072222225,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.83402777,"top":0.3211111,"width":0.00625,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:59:00 PM","depth":23,"bounds":{"left":0.83958334,"top":0.32444444,"width":0.06458333,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:59 PM","depth":24,"bounds":{"left":0.83958334,"top":0.32444444,"width":0.06458333,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"не е ли датата на която е генерирано?","depth":24,"bounds":{"left":0.7625,"top":0.34555554,"width":0.18333334,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.9458333,"top":0.34777778,"width":0.0027777778,"height":0.018888889},"role_description":"text"},{"role":"AXStaticText","text":"(edited)","depth":24,"bounds":{"left":0.9479167,"top":0.34777778,"width":0.030555556,"height":0.018888889},"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.9777778,"top":0.34777778,"width":0.0027777778,"height":0.018888889},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.3,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.3,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.3,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7625,"top":0.37666667,"width":0.06458333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82708335,"top":0.37888888,"width":0.0055555557,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 1:59:04 PM","depth":23,"bounds":{"left":0.83263886,"top":0.38222224,"width":0.06458333,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Today at 1:59 PM","depth":24,"bounds":{"left":0.83263886,"top":0.38222224,"width":0.06458333,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"email ще го видя","depth":24,"bounds":{"left":0.7625,"top":0.40333334,"width":0.07986111,"height":0.02111111},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.35777777,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.35777777,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.35777777,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7625,"top":0.43444446,"width":0.06458333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82708335,"top":0.43666667,"width":0.0055555557,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 2:43:12 PM","depth":23,"bounds":{"left":0.83263886,"top":0.44,"width":0.03888889,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1 hour ago","depth":24,"bounds":{"left":0.83263886,"top":0.44,"width":0.03888889,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"за второто е направено да праща веднага само при one-off, иначе си праща когато му дойде време през нощта","depth":24,"bounds":{"left":0.7625,"top":0.4611111,"width":0.20972222,"height":0.07},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.41555557,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.41555557,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.41555557,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 2:43:59 PM","depth":24,"bounds":{"left":0.74027777,"top":0.5466667,"width":0.016666668,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2:43","depth":25,"bounds":{"left":0.74027777,"top":0.5466667,"width":0.016666668,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"и тука мога да му да добавя параметър само за тестване и да прати веднага ако се подаде на команда","depth":24,"bounds":{"left":0.7625,"top":0.54333335,"width":0.21875,"height":0.07},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.5088889,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.5088889,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.5088889,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.7625,"top":0.62333333,"width":0.072222225,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.83402777,"top":0.6255556,"width":0.00625,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 2:50:26 PM","depth":23,"bounds":{"left":0.83958334,"top":0.6288889,"width":0.056944445,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"39 minutes ago","depth":24,"bounds":{"left":0.83958334,"top":0.6288889,"width":0.056944445,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"да, да направим за да го тестваме, иначе няма да можем","depth":24,"bounds":{"left":0.7625,"top":0.65,"width":0.22291666,"height":0.045555554},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.60444444,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.60444444,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.60444444,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7625,"top":0.70555556,"width":0.06458333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82708335,"top":0.7077778,"width":0.0055555557,"height":0.02111111},"role_description":"text"},{"role":"AXLink","text":"Today at 3:29:35 PM","depth":23,"bounds":{"left":0.83263886,"top":0.7111111,"width":0.03263889,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Just now","depth":24,"bounds":{"left":0.83263886,"top":0.7111111,"width":0.03263889,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"готово","depth":24,"bounds":{"left":0.7625,"top":0.7322222,"width":0.031944446,"height":0.02111111},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.68666667,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.68666667,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.68666667,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 3:29:55 PM","depth":24,"bounds":{"left":0.74027777,"top":0.7688889,"width":0.016666668,"height":0.016666668},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3:29","depth":25,"bounds":{"left":0.74027777,"top":0.7688889,"width":0.016666668,"height":0.016666668},"role_description":"text"},{"role":"AXStaticText","text":"php artisan automated-reports:send --result-id {RESULT ID}","depth":24,"bounds":{"left":0.76875,"top":0.78,"width":0.18541667,"height":0.036666665},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.82708335,"top":0.7311111,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.84930557,"top":0.7311111,"width":0.022222223,"height":0.036666665},"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":25,"bounds":{"left":0.8715278,"top":0.7311111,"width":0.022222223,"height":0.036666665},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"след като е генери","depth":26,"bounds":{"left":0.7326389,"top":0.8511111,"width":0.25208333,"height":0.043333333},"value":"след като е генери","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"след като е генери","depth":28,"bounds":{"left":0.7409722,"top":0.8622222,"width":0.09097222,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"Also send to the group","depth":25,"bounds":{"left":0.75972223,"top":0.9033333,"width":0.08263889,"height":0.016666668},"role_description":"text"},{"role":"AXCheckBox","text":"Also send to the group","depth":25,"bounds":{"left":0.7423611,"top":0.9033333,"width":0.009027778,"height":0.014444444},"role_description":"Tick box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"loading…","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"loading…","depth":11,"role_description":"text"}]...
|
8448984897393218379
|
-132408041937903294
|
idle
|
hybrid
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
Directories
platform-inner-team
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_jiminny
Vasil Vasilev
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Steliyan Georgiev
Adelina Petrova
,
Ilian Kyuchukov
,
Steliyan Georgiev
Adelina Petrova
Galya Dimitrova
Nikolay Nikolov
Galya Dimitrova
,
Nikolay Nikolov
Galya Dimitrova
,
Nikolay Yankov
Nikolay Yankov
Toast
Jira Cloud
Google Calendar
Nikolay Yankov
Today at 1:49:38 PM
Today at 1:49 PM
Добре, 2 неща:
в името на генерирания репорт е дата вчера, не днес
и имейл не дойде
image.png
Toggle file
image.png
10 replies
Lukas Kovalik
Today at 1:58:20 PM
Today at 1:58 PM
за дата там не знам как искаме да го правим. по принцип при всички други се гледа ден на зад при положение че идва през нощта.
Nikolay Yankov
Today at 1:58:22 PM
Today at 1:58 PM
@Lukas Kovalik
@Lukas Kovalik
видя ли този коментар
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 1:58:27 PM
Today at 1:58 PM
да
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Nikolay Yankov
Today at 1:59:00 PM
Today at 1:59 PM
не е ли датата на която е генерирано?
(edited)
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 1:59:04 PM
Today at 1:59 PM
email ще го видя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 2:43:12 PM
1 hour ago
за второто е направено да праща веднага само при one-off, иначе си праща когато му дойде време през нощта
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Today at 2:43:59 PM
2:43
и тука мога да му да добавя параметър само за тестване и да прати веднага ако се подаде на команда
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Nikolay Yankov
Today at 2:50:26 PM
39 minutes ago
да, да направим за да го тестваме, иначе няма да можем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 3:29:35 PM
Just now
готово
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
Today at 3:29:55 PM
3:29
php artisan automated-reports:send --result-id {RESULT ID}
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Forward message…
Save for later
More actions
след като е генери
след като е генери
Also send to the group
Also send to the group
loading…
loading…
SlackFileEditViewGoHistoryWindowHelp(MySQL 11.4.9-MariaDB-log) PROD/jiminny/leads• leaFieldTABLES_ lead_stagesleadsiduuidteam_idcrm_conf...stage_idstage_up...record_ty…converte...converte...converte...converte...crm_prov...user_idowner_idcompanydomaincountry_..nametitleemailphoneext+INDEXESTypeINTBINARYINTINTINTDATETIMEINTTIMESTAMPINTINTINTVARCHARINTIVARCHARVARCHARVARCHARCHARVARCHARVARCHARVARCHARVARCHARCHARLength101610101010101010128101281911912191128802510Non_unique11Key_namePRIMARYleads_u...leads_c...leads_c...leads_t...leads_S...leads_c...leads_c...leads_c...leads_r...leads_u...ІаSнC nSeq_in_ind….Column_nameiduuidcrm_config...crm_provid...team_idstage_idconverted_...converted_...converted_...record_typ...user_iderm sanfin+HomeD-DMsActivityFilesLater.*•MoreCollationCardin875688756883875686869779607583791250982292Q1+@vRetro - Platform • in 1h 30 m100% <7Tue 14 Apr 15:30:06Search Jiminny IncJiminny ...# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_ launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...Direct messages8. Vasil Vasilev3Aneliya Angelova, ...Ro Steliyan Georgiev3Adelina Petrova, Ili...% Adelina Petrova% Galya Dimitrova *8& Nikolay Nikolov "2Galya Dimitrova, Ni...2Galya Dimitrova, Ni.... Nikolay YankovThread Direct message with 3 othersза дата там не знам как искаме да го правим.по принцип при всички други се гледа ден назад при положение че идва през нощта.Nikolay Yankov Today at 1:58 PM@Lukas Kovalik видя ли този коментарLukas Kovalik Today at 1:58 PMдаNikolay Yankov Today at 1:59 PMне е ли датата на която е генерирано? (edited)Lukas Kovalik Today at 1:59 PMemail ще го видяLukas Kovalik 1 hour agoза второто е направено да праща веднагасамо при one-off, иначе си праща когато мудойде време през нощтаи тука мога да му да добавя параметьр самоза тестване и да прати веднага ако се подадена командаNikolay Yankov 39 minutes agoда, да направим за да го тестваме, иначе нямада можемLukas Kovalik Just nowГОТОВОphp artisan automated-reports:send --result-id {RESULT ID}след като е геa:: AppsToastJira CloudCanalo CalaAlso send to the group+...
|
NULL
|
|
6559
|
118
|
11
|
2026-04-13T13:56:15.892645+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-13/1776 /Users/lukas/.screenpipe/data/data/2026-04-13/1776088575892_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
OrionFileEditViewHistoryBookmarksToolsDevelopWindo OrionFileEditViewHistoryBookmarksToolsDevelopWindowHelp•Activity MonitorAll ProcessesProcess Namewaruaoynuresicor_annoscameracapturedMacinTalkAUSPvoicebankingddeletedtrialdcom.apple.geodASConfigurationSubscriberASConfigurationSubscriberLegacyProfilesSubscriberzshIsdmediaremotedAppSSODaemonScreenSharingSubscriberappstoredzshPasscodeSettingsSubscriberInteractiveLegacyProfilesSubscriberSoftwareUpdateSubscriberaudiomxdgamepolicydSoftwareUpdateSubscriberInteractiveLegacyProfilesSubscriberzshmapssyncdAccountSubscriberzshsirittsdMEMORY PRESSURElthlMem..v,u mo6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB5,9 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,7 MB5,7 MB5,7 MB5,7 MB5,7 MB5,6 MB5,6 MB5,6 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% [Mon 13 Apr 16:56:15CPUMemoryEnergyDiskNetworkThreads222222Portsvo62707269884431373122626254132347322282831566926252283252265PIDOUOTo549908169081790670889688915092119921239209551506873439076192076906845011921119207492110107558592117920724891891489211248949213016,00 GB12,96 GB2,95 GB1,38 GBApp Memory:Wired Memory:Compressed:Userranao_cmiodalassistlukaslukaslukaslukas_locationd_rmdlukaslukaslukaslukasrootrootlukasappstorelukaslukaslukas_rmd_audiomxdrootlukas_rmdlukaslukas_rmdlukaslukas5,49 GB2,54 GB4,34 GB...
|
NULL
|
8448846337871145825
|
NULL
|
click
|
ocr
|
NULL
|
OrionFileEditViewHistoryBookmarksToolsDevelopWindo OrionFileEditViewHistoryBookmarksToolsDevelopWindowHelp•Activity MonitorAll ProcessesProcess Namewaruaoynuresicor_annoscameracapturedMacinTalkAUSPvoicebankingddeletedtrialdcom.apple.geodASConfigurationSubscriberASConfigurationSubscriberLegacyProfilesSubscriberzshIsdmediaremotedAppSSODaemonScreenSharingSubscriberappstoredzshPasscodeSettingsSubscriberInteractiveLegacyProfilesSubscriberSoftwareUpdateSubscriberaudiomxdgamepolicydSoftwareUpdateSubscriberInteractiveLegacyProfilesSubscriberzshmapssyncdAccountSubscriberzshsirittsdMEMORY PRESSURElthlMem..v,u mo6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB6,0 MB5,9 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,8 MB5,7 MB5,7 MB5,7 MB5,7 MB5,7 MB5,6 MB5,6 MB5,6 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% [Mon 13 Apr 16:56:15CPUMemoryEnergyDiskNetworkThreads222222Portsvo62707269884431373122626254132347322282831566926252283252265PIDOUOTo549908169081790670889688915092119921239209551506873439076192076906845011921119207492110107558592117920724891891489211248949213016,00 GB12,96 GB2,95 GB1,38 GBApp Memory:Wired Memory:Compressed:Userranao_cmiodalassistlukaslukaslukaslukas_locationd_rmdlukaslukaslukaslukasrootrootlukasappstorelukaslukaslukas_rmd_audiomxdrootlukas_rmdlukaslukas_rmdlukaslukas5,49 GB2,54 GB4,34 GB...
|
NULL
|
|
26842
|
565
|
83
|
2026-04-15T13:34:22.802600+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776260062802_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
4312652438672115116/13563Imperial Age-Barracks Bui 4312652438672115116/13563Imperial Age-Barracks Built---Elite Longbowman Created--Warning: You are being attacked byPlayer 6 László I!!!--Halberdier Created-Right-click to attack this building!5 Magnus Olafsson: 18678/18678NV1 kovaliklukas: 15439/15439ĐNV2 Rajyapala: 15200/15200 @ IV8 Almish Yiltawar: 14650/14650 ©NV6 László I: 11276/11276 ≤ IV7 Maximilian of Habsburg: 7826/7826 IV4 Louis VI: 7132/7132 5 IV3 Huascár: 6527/6527 # TV...
|
NULL
|
8448739044003069636
|
NULL
|
click
|
ocr
|
NULL
|
4312652438672115116/13563Imperial Age-Barracks Bui 4312652438672115116/13563Imperial Age-Barracks Built---Elite Longbowman Created--Warning: You are being attacked byPlayer 6 László I!!!--Halberdier Created-Right-click to attack this building!5 Magnus Olafsson: 18678/18678NV1 kovaliklukas: 15439/15439ĐNV2 Rajyapala: 15200/15200 @ IV8 Almish Yiltawar: 14650/14650 ©NV6 László I: 11276/11276 ≤ IV7 Maximilian of Habsburg: 7826/7826 IV4 Louis VI: 7132/7132 5 IV3 Huascár: 6527/6527 # TV...
|
26840
|
|
8643
|
167
|
33
|
2026-04-14T06:57:44.978037+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776149864978_m2.jpg...
|
Firefox
|
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf — Work...
|
True
|
app.staging.jiminny.com/ai-reports/pdf/e2f4890a-d0 app.staging.jiminny.com/ai-reports/pdf/e2f4890a-d097-495b-8dfd-d4c25a5e8843...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
JY-20543 add AJ reports User pilot tracking by Lak JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
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
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Close tab
Inbox (1,540) - [EMAIL] - Jiminny Mail
Inbox (1,540) - [EMAIL] - Jiminny Mail
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\nExpected: {gt_label}\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\nExpected: {gt_label}\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Expand
Listen
Show more options
Gemini said
Gemini said
This Python script defines the
AiActivityTypeEvaluator
class, a specialized tool for evaluating AI-driven activity type classification. It extends a base evaluation framework to handle data collection, ground-truth comparison, and performance scoring.
Core Functionality
Core Functionality
Data Collection (
collect_test_set
):
* Supports fetching raw samples from
Elasticsearch (ES)
or loading them from
local JSON files
.
Implements a
replayability check
: It probes the live API endpoint to ensure the activity exists before including it in the dataset.
Filters data based on request body size, language, and the presence of an original response.
Ground Truth Management:
Saves inputs and "gold standard" responses to a local directory structure (
eval_output/ai_activity_type/...
).
Features an optional mode to populate ground truth using a high-order LLM (e.g.,
gpt-5_2
) if the
POPULATE_GROUND_TRUTH_LLM
flag is set.
Evaluation Logic (
evaluate_against_ground_truth
):
Compares the model's predicted
ai_activity_type
against either the original ES response or the LLM-generated ground truth.
Assigns a
quality_score
of
1.0
for a match and
0.0
for a mismatch or request failure.
Key Configuration Constants
Key Configuration Constants
Constant
Purpose
ENDPOINT_PATH
The specific API route being tested:
call/ai-activity-type
.
COMPARE_TO_GROUND_TRUTH
Determines if the baseline is the original data (
es
) or an
llm
.
SKIP_UNREPLAYABLE_ON_COLLECT
If
True
, discards records where the API returns "Cannot find activity."
REPLAYABILITY_CHECK_TIMEOUT_SECONDS
Limits the probe request to 20 seconds.
Constant
ENDPOINT_PATH
COMPARE_TO_GROUND_TRUTH
SKIP_UNREPLAYABLE_ON_COLLECT
REPLAYABILITY_CHECK_TIMEOUT_SECONDS
Purpose
The specific API route being tested:
call/ai-activity-type
.
Determines if the baseline is the original data (
es
) or an
llm
.
If
True
, discards records where the API returns "Cannot find activity."
Limits the probe request to 20 seconds.
Copy table
Execution Workflow
Execution Workflow
Parsing:
The script uses
create_parser
to handle CLI arguments like
--data-set
,
--populate-ground-truth-llm
, and
--compare-to-ground-truth
.
Initialization:
Sets up directory paths for inputs and ground truths based on the selected dataset name.
Run:
Executes the evaluation via
asyncio.run(run_evaluation(...))
, which orchestrates the collection, endpoint calling, and result scoring phases.
Copy prompt
Edit
You said are there soem issues with this PR
You said
are there soem issues with this PR
Listen
Show more options
Show thinking
Gemini said
Gemini said
Yes, there are several issues and code smells in this Pull Request, ranging from performance bottlenecks to architectural anti-patterns.
Here is a breakdown of the most notable issues, categorized by impact:
Performance & Async Anti-Patterns
Performance & Async Anti-Patterns
Sequential Requests Defeating Async (Lines 86-106):
Inside
_collect_from_es
, the code loops through
raw_samples
and
await
s a
session.post
request for each sample one by one. This means the script waits for one HTTP request to finish before starting the next, completely defeating the purpose of using
aiohttp
for asynchronous concurrency.
Fix:
Collect these coroutines into a list and use
asyncio.gather()
(ideally wrapped in an
asyncio.Semaphore
to avoid overwhelming the endpoint) to run the replayability probes concurrently.
Blocking File I/O in Async Functions (Lines 110-114, 184-188, 268-269):
Standard synchronous file operations (
with open(...)
,
json.dump
,
json.load
) are used inside
async def
functions. In Python, this blocks the entire event loop while the disk is reading/writing.
Fix:
Use an asynchronous file I/O library like
aiofiles
, or run the blocking I/O operations in a separate thread using
asyncio.to_thread()
.
Architecture & State Management
Architecture & State Management
Mutating Class-Level Variables (Lines 323-328):
The script parses CLI arguments and directly mutates the class attributes (e.g.,
AiActivityTypeEvaluator.DATA_SET = args.data_set
). This is a major anti-pattern. If you ever try to run tests in parallel or create multiple instances of this evaluator in a single process, the state will bleed across them.
Fix:
Pass these arguments into the
__init__
constructor of the instance (
self.data_set = args.data_set
) rather than modifying the class definition globally.
Code Quality & Edge Cases
Code Quality & Edge Cases
Broad Exception Catching (Line 107):
Using a bare
except Exception:
during the replayability probe is dangerous. It will catch
aiohttp.ClientError
(which is intended), but it will also silently swallow
TimeoutError...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app","depth":4,"bounds":{"left":0.00234375,"top":0.045138888,"width":0.0890625,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","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":"Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.015625,"top":0.09236111,"width":0.11796875,"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.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":"Jy 19798 evaluation for ai activity types by nikolaybiaivanov · Pull Request #468 · jiminny/prophet","depth":5,"bounds":{"left":0.015625,"top":0.12083333,"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.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":"Jiminny","depth":5,"bounds":{"left":0.015625,"top":0.14930555,"width":0.015625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf","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":true},{"role":"AXStaticText","text":"Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf","depth":5,"bounds":{"left":0.015625,"top":0.17777778,"width":0.1640625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.07890625,"top":0.17430556,"width":0.009375,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox (1,540) - lukas.kovalik@jiminny.com - Jiminny Mail","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":"Inbox (1,540) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.015625,"top":0.20625,"width":0.11484375,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.003125,"top":0.22638889,"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":"Close 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":"AXButton","text":"AI Chat settings","depth":7,"bounds":{"left":0.2171875,"top":0.047916666,"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":"Close","depth":7,"bounds":{"left":0.23125,"top":0.047916666,"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":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.228125,"top":0.090277776,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"bounds":{"left":0.0984375,"top":0.090277776,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"bounds":{"left":0.1953125,"top":0.090277776,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"bounds":{"left":0.2109375,"top":0.090277776,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"bounds":{"left":0.09335937,"top":0.12847222,"width":0.000390625,"height":0.00069444446},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"bounds":{"left":0.09335937,"top":0.13055556,"width":0.14101562,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\\nExpected: {gt_label}\\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.","depth":21,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\\nExpected: {gt_label}\\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand","depth":21,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Listen","depth":22,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Gemini said","depth":20,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This Python script defines the","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AiActivityTypeEvaluator","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"class, a specialized tool for evaluating AI-driven activity type classification. It extends a base evaluation framework to handle data collection, ground-truth comparison, and performance scoring.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Core Functionality","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Core Functionality","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Data Collection (","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"collect_test_set","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"* Supports fetching raw samples from","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Elasticsearch (ES)","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"or loading them from","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"local JSON files","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Implements a","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"replayability check","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": It probes the live API endpoint to ensure the activity exists before including it in the dataset.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Filters data based on request body size, language, and the presence of an original response.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ground Truth Management:","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Saves inputs and \"gold standard\" responses to a local directory structure (","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"eval_output/ai_activity_type/...","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":").","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Features an optional mode to populate ground truth using a high-order LLM (e.g.,","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"gpt-5_2","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") if the","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"POPULATE_GROUND_TRUTH_LLM","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"flag is set.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Evaluation Logic (","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"evaluate_against_ground_truth","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Compares the model's predicted","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ai_activity_type","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"against either the original ES response or the LLM-generated ground truth.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigns a","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"quality_score","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"of","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for a match and","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.0","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for a mismatch or request failure.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Key Configuration Constants","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Key Configuration Constants","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Constant","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Purpose","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ENDPOINT_PATH","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The specific API route being tested:","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"call/ai-activity-type","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"COMPARE_TO_GROUND_TRUTH","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Determines if the baseline is the original data (","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"es","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") or an","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"llm","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SKIP_UNREPLAYABLE_ON_COLLECT","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"True","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", discards records where the API returns \"Cannot find activity.\"","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"REPLAYABILITY_CHECK_TIMEOUT_SECONDS","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Limits the probe request to 20 seconds.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Constant","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ENDPOINT_PATH","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"COMPARE_TO_GROUND_TRUTH","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SKIP_UNREPLAYABLE_ON_COLLECT","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"REPLAYABILITY_CHECK_TIMEOUT_SECONDS","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Purpose","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The specific API route being tested:","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"call/ai-activity-type","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Determines if the baseline is the original data (","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"es","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") or an","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"llm","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"True","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", discards records where the API returns \"Cannot find activity.\"","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Limits the probe request to 20 seconds.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy table","depth":24,"bounds":{"left":0.22070312,"top":0.0,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Execution Workflow","depth":23,"bounds":{"left":0.103125,"top":0.0,"width":0.13320312,"height":0.016666668},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Execution Workflow","depth":24,"bounds":{"left":0.103125,"top":0.0,"width":0.060546875,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Parsing:","depth":26,"bounds":{"left":0.1171875,"top":0.009027778,"width":0.024609376,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The script uses","depth":26,"bounds":{"left":0.14179687,"top":0.009027778,"width":0.04609375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"create_parser","depth":27,"bounds":{"left":0.19023438,"top":0.010416667,"width":0.042578124,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to handle CLI arguments like","depth":26,"bounds":{"left":0.1171875,"top":0.009027778,"width":0.119140625,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--data-set","depth":27,"bounds":{"left":0.1171875,"top":0.028472222,"width":0.107421875,"height":0.03125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":26,"bounds":{"left":0.12929687,"top":0.045138888,"width":0.003125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--populate-ground-truth-llm","depth":27,"bounds":{"left":0.13476562,"top":0.046527777,"width":0.08867188,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", and","depth":26,"bounds":{"left":0.1171875,"top":0.045138888,"width":0.11171875,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--compare-to-ground-truth","depth":27,"bounds":{"left":0.13203125,"top":0.06458333,"width":0.08203125,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":26,"bounds":{"left":0.21640626,"top":0.063194446,"width":0.0015625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Initialization:","depth":26,"bounds":{"left":0.1171875,"top":0.08680555,"width":0.039453126,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sets up directory paths for inputs and ground truths based on the selected dataset name.","depth":26,"bounds":{"left":0.1171875,"top":0.08680555,"width":0.11875,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run:","depth":26,"bounds":{"left":0.1171875,"top":0.14652778,"width":0.013671875,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Executes the evaluation via","depth":26,"bounds":{"left":0.13085938,"top":0.14652778,"width":0.080078125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"asyncio.run(run_evaluation(...))","depth":27,"bounds":{"left":0.11953125,"top":0.16597222,"width":0.10507812,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", which orchestrates the collection, endpoint calling, and result scoring phases.","depth":26,"bounds":{"left":0.1171875,"top":0.16458334,"width":0.11289062,"height":0.06875},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"bounds":{"left":0.1203125,"top":0.28194445,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"bounds":{"left":0.1375,"top":0.28194445,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said are there soem issues with this PR","depth":21,"bounds":{"left":0.1609375,"top":0.29027778,"width":0.072265625,"height":0.03888889},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"bounds":{"left":0.09335937,"top":0.2923611,"width":0.0234375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"are there soem issues with this PR","depth":23,"bounds":{"left":0.1609375,"top":0.29305556,"width":0.062109374,"height":0.034027778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"bounds":{"left":0.22382812,"top":0.35694444,"width":0.015625,"height":0.027777778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"bounds":{"left":0.22382812,"top":0.35208333,"width":0.015625,"height":0.027777778},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"bounds":{"left":0.11953125,"top":0.35902777,"width":0.036328126,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"bounds":{"left":0.11679687,"top":0.3951389,"width":0.000390625,"height":0.00069444446},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"bounds":{"left":0.11679687,"top":0.39652777,"width":0.048046876,"height":0.016666668},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Yes, there are several issues and code smells in this Pull Request, ranging from performance bottlenecks to architectural anti-patterns.","depth":24,"bounds":{"left":0.10390625,"top":0.40347221,"width":0.13242188,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is a breakdown of the most notable issues, categorized by impact:","depth":24,"bounds":{"left":0.10390625,"top":0.46875,"width":0.11640625,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Performance & Async Anti-Patterns","depth":23,"bounds":{"left":0.10390625,"top":0.5222222,"width":0.13242188,"height":0.016666668},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Performance & Async Anti-Patterns","depth":24,"bounds":{"left":0.10390625,"top":0.5236111,"width":0.10859375,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sequential Requests Defeating Async (Lines 86-106):","depth":26,"bounds":{"left":0.11757813,"top":0.5465278,"width":0.11601563,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Inside","depth":26,"bounds":{"left":0.16289063,"top":0.56458336,"width":0.019921875,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"_collect_from_es","depth":27,"bounds":{"left":0.11992188,"top":0.58402777,"width":0.05234375,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", the code loops through","depth":26,"bounds":{"left":0.11757813,"top":0.58263886,"width":0.10429688,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"raw_samples","depth":27,"bounds":{"left":0.14414063,"top":0.6020833,"width":0.0359375,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":26,"bounds":{"left":0.18242188,"top":0.6006944,"width":0.0140625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"await","depth":27,"bounds":{"left":0.19882813,"top":0.6020833,"width":0.01640625,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"s a","depth":26,"bounds":{"left":0.21757813,"top":0.6006944,"width":0.009765625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"session.post","depth":27,"bounds":{"left":0.11992188,"top":0.6201389,"width":0.039453126,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"request for each sample one by one. This means the script waits for one HTTP request to finish before starting the next, completely defeating the purpose of using","depth":26,"bounds":{"left":0.11757813,"top":0.61875,"width":0.11640625,"height":0.08680555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"aiohttp","depth":27,"bounds":{"left":0.18046875,"top":0.6923611,"width":0.023046875,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for asynchronous concurrency.","depth":26,"bounds":{"left":0.11757813,"top":0.6909722,"width":0.09921875,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fix:","depth":28,"bounds":{"left":0.1296875,"top":0.7326389,"width":0.009765625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Collect these coroutines into a list and use","depth":28,"bounds":{"left":0.1296875,"top":0.7326389,"width":0.09921875,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"asyncio.gather()","depth":29,"bounds":{"left":0.16601562,"top":0.75208336,"width":0.05234375,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(ideally wrapped in an","depth":28,"bounds":{"left":0.1296875,"top":0.75069445,"width":0.09257813,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"asyncio.Semaphore","depth":29,"bounds":{"left":0.13203125,"top":0.7881944,"width":0.055859376,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to avoid overwhelming the endpoint) to run the replayability probes concurrently.","depth":28,"bounds":{"left":0.1296875,"top":0.78680557,"width":0.10546875,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Blocking File I/O in Async Functions (Lines 110-114, 184-188, 268-269):","depth":26,"bounds":{"left":0.11757813,"top":0.84652776,"width":0.10976563,"height":0.03263889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Standard synchronous file operations (","depth":26,"bounds":{"left":0.11757813,"top":0.8645833,"width":0.107421875,"height":0.050694443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with open(...)","depth":27,"bounds":{"left":0.12226562,"top":0.90208334,"width":0.045703124,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":26,"bounds":{"left":0.1703125,"top":0.90069443,"width":0.003515625,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"json.dump","depth":27,"bounds":{"left":0.17617187,"top":0.90208334,"width":0.029296875,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":26,"bounds":{"left":0.2078125,"top":0.90069443,"width":0.003125,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"json.load","depth":27,"bounds":{"left":0.11992188,"top":0.9201389,"width":0.0296875,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") are used inside","depth":26,"bounds":{"left":0.15195313,"top":0.91875,"width":0.048046876,"height":0.014583333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"async def","depth":27,"bounds":{"left":0.20234375,"top":0.9201389,"width":0.0296875,"height":0.013194445},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"functions. In Python, this blocks the entire event loop while the disk is reading/writing.","depth":26,"bounds":{"left":0.11757813,"top":0.91875,"width":0.11875,"height":0.06875},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fix:","depth":28,"bounds":{"left":0.1296875,"top":0.9965278,"width":0.009765625,"height":0.003472209},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use an asynchronous file I/O library like","depth":28,"bounds":{"left":0.1296875,"top":0.9965278,"width":0.09335937,"height":0.003472209},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"aiofiles","depth":29,"bounds":{"left":0.1625,"top":1.0,"width":0.0265625,"height":-0.015972257},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", or run the blocking I/O operations in a separate thread using","depth":28,"bounds":{"left":0.1296875,"top":1.0,"width":0.10585938,"height":-0.014583349},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"asyncio.to_thread()","depth":29,"bounds":{"left":0.16914062,"top":1.0,"width":0.0625,"height":-0.052083373},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":28,"bounds":{"left":0.23398438,"top":1.0,"width":0.0015625,"height":-0.050694466},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Architecture & State Management","depth":23,"bounds":{"left":0.10390625,"top":1.0,"width":0.13242188,"height":-0.08611107},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Architecture & State Management","depth":24,"bounds":{"left":0.10390625,"top":1.0,"width":0.103515625,"height":-0.087499976},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Mutating Class-Level Variables (Lines 323-328):","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The script parses CLI arguments and directly mutates the class attributes (e.g.,","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AiActivityTypeEvaluator.DATA_SET = args.data_set","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"). This is a major anti-pattern. If you ever try to run tests in parallel or create multiple instances of this evaluator in a single process, the state will bleed across them.","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fix:","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pass these arguments into the","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"__init__","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"constructor of the instance (","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"self.data_set = args.data_set","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":") rather than modifying the class definition globally.","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Code Quality & Edge Cases","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Code Quality & Edge Cases","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Broad Exception Catching (Line 107):","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Using a bare","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"except Exception:","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"during the replayability probe is dangerous. It will catch","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"aiohttp.ClientError","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(which is intended), but it will also silently swallow","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TimeoutError","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8448672044444230511
|
6714708941980086551
|
visual_change
|
accessibility
|
NULL
|
JY-20543 add AJ reports User pilot tracking by Lak JY-20543 add AJ reports User pilot tracking by LakyLak · Pull Request #11932 · jiminny/app
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 1 Q2 - Platform Team - Scrum Board - Jira
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
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Ask Jiminny test report - 8 Apr 2026 - Ask Jiminny test report - 13 Apr 2026.pdf
Close tab
Inbox (1,540) - [EMAIL] - Jiminny Mail
Inbox (1,540) - [EMAIL] - Jiminny Mail
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\nExpected: {gt_label}\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 19798 evaluation for ai activity types by nikol</tabTitle>” with “<selection>@@ -0,0 +1,330 @@1+#!/usr/bin/env python32+import asyncio3+import json4+import os5+from pathlib import Path6+from typing import Any, Dict, List7+8+import aiohttp9+10+from src.component.call_processing.schemes.ai_activity_type_request import AiActivityTypeRequest11+from src.component.call_processing.schemes.ai_activity_type_response import AiActivityTypeResponse12+from src.eval.abstract_evaluator import AbstractEvaluator13+from src.eval.collectors import collect_test_set as es_collect_test_set14+from src.eval.common_evaluator_runner import create_parser, run_evaluation15+from src.eval.endpoints import run_endpoint as run_endpoint_http16+from src.eval.models import EvaluationResult17+18+19+class AiActivityTypeEvaluator(AbstractEvaluator):20+ENDPOINT_PATH = "call/ai-activity-type"21+REQUEST_MODEL = AiActivityTypeRequest22+RESPONSE_MODEL = AiActivityTypeResponse23+OUTPUT_SUBFOLDER = "ai_activity_type"24+USES_LLM_EVALUATION = False25+26+READS_FROM_DATASET_FOLDER = True27+28+DATA_SET: str = "initial"29+30+MINIMUM_REQUEST_BODY_SIZE: int = 031+32+SKIP_UNREPLAYABLE_ON_COLLECT: bool = True33+REPLAYABILITY_CHECK_TIMEOUT_SECONDS: float = 20.034+35+POPULATE_GROUND_TRUTH_LLM: bool = False36+GROUND_TRUTH_LLM_ENDPOINT: str = "OPENAI:gpt-5_2"37+38+COMPARE_TO_GROUND_TRUTH: str = "es"39+40+def __init__(self, **kwargs: Any) -> None:41+super().__init__(**kwargs)42+_repo_root = Path(__file__).parents[2]43+_datasets_root = _repo_root / "eval_output" / self.OUTPUT_SUBFOLDER / "eval_datasets"44+_dataset_dir = _datasets_root / self.__class__.DATA_SET45+self._dataset_dir = _dataset_dir46+self._inputs_dir = _dataset_dir / "input"47+self._ground_truths_dir = _dataset_dir / "ground_truth"48+49+async def collect_test_set(self) -> List[Dict[str, Any]]:50+if self.es_host_name:51+return await self._collect_from_es()52+return await self._collect_from_files()53+54+async def _collect_from_es(self) -> List[Dict[str, Any]]:55+if self._inputs_dir.exists() or self._ground_truths_dir.exists():56+raise FileExistsError(57+f"Dataset folder already exists: {self._inputs_dir.parent}. "58+"Choose a different --data-set name or remove the folder manually."59+ )60+61+raw_samples = await es_collect_test_set(62+es_host_name=self.es_host_name,63+es_port=self.es_port,64+endpoint_path=self.ENDPOINT_PATH,65+limit=self.limit,66+language_filter=self.language_filter,67+min_prompt_length=self.min_prompt_length,68+is_json_response=self.IS_JSON_RESPONSE,69+exclude_languages=self.exclude_languages,70+ )71+72+self._inputs_dir.mkdir(parents=True, exist_ok=True)73+self._ground_truths_dir.mkdir(parents=True, exist_ok=True)74+75+min_size = self.MINIMUM_REQUEST_BODY_SIZE76+samples: List[Dict[str, Any]] = []77+skipped_no_response = 078+skipped_too_small = 079+skipped_unreplayable = 080+skipped_probe_errors = 081+82+endpoint_url = f"{self.api_host}/{self.ENDPOINT_PATH}"83+84+timeout = aiohttp.ClientTimeout(total=self.REPLAYABILITY_CHECK_TIMEOUT_SECONDS)85+async with aiohttp.ClientSession(timeout=timeout) as session:86+for sample in raw_samples:87+es_id = sample["id"]88+request_body = sample["request_body"]89+original_response = sample.get("original_response")90+91+if not original_response:92+skipped_no_response += 193+continue94+95+if min_size and len(json.dumps(request_body)) < min_size:96+skipped_too_small += 197+continue98+99+if self.SKIP_UNREPLAYABLE_ON_COLLECT:100+try:101+async with session.post(endpoint_url, json=request_body) as resp:102+if resp.status != 200:103+body_text = await resp.text()104+if "Cannot find activity" in body_text:105+skipped_unreplayable += 1106+continue107+except Exception:108+skipped_probe_errors += 1109+110+with open(self._inputs_dir / f"{es_id}.json", "w") as f:111+json.dump(request_body, f, indent=2)112+113+with open(self._ground_truths_dir / f"gt_{es_id}.json", "w") as f:114+json.dump(original_response, f, indent=2)115+116+samples.append(117+ {118+"id": es_id,119+"request_body": request_body,120+"original_response": original_response,121+"ground_truth": original_response,122+ }123+ )124+125+print(f"Wrote {len(samples)} samples to {self._inputs_dir.parent}")126+if skipped_no_response:127+print(f"Skipped {skipped_no_response} records with no response body")128+if skipped_too_small:129+print(130+f"Skipped {skipped_too_small} records whose request body was smaller "131+f"than {min_size} characters"132+ )133+if skipped_unreplayable:134+print(f"Skipped {skipped_unreplayable} records that are not replayable (missing activity in ES)")135+if skipped_probe_errors:136+print(f"Warning: replayability probe errored for {skipped_probe_errors} records (kept those records)")137+138+if self.__class__.POPULATE_GROUND_TRUTH_LLM:139+label_results = await run_endpoint_http(140+test_set=samples,141+endpoint_url=endpoint_url,142+request_model=self.REQUEST_MODEL,143+force_llm_endpoint=self.__class__.GROUND_TRUTH_LLM_ENDPOINT,144+is_streaming_response=self.IS_STREAMING_RESPONSE,145+timeout_seconds=300.0,146+parallel_requests=self.parallel_requests,147+return_prompt_in_run=self.RETURN_PROMPT_IN_RUN,148+ )149+150+for i, r in enumerate(label_results):151+forced = self.__class__.GROUND_TRUTH_LLM_ENDPOINT152+model = forced.split(":", 1)[1] if ":" in forced else forced153+samples[i]["ground_truth_llm_model"] = model154+155+if not r.get("success", True):156+samples[i]["ground_truth_llm"] = None157+samples[i]["ground_truth_llm_reasoning"] = None158+samples[i]["ground_truth_llm_error_type"] = r.get("error_type")159+samples[i]["ground_truth_llm_error_message"] = r.get("error_message")160+continue161+162+resp = r.get("new_response") or {}163+samples[i]["ground_truth_llm"] = resp.get("ai_activity_type")164+samples[i]["ground_truth_llm_reasoning"] = resp.get("ai_activity_type_reasoning")165+166+return samples167+168+async def _collect_from_files(self) -> List[Dict[str, Any]]:169+if not self._inputs_dir.exists():170+raise FileNotFoundError(171+f"Dataset folder not found: {self._inputs_dir}. "172+"Run --steps collect first or check your --data-set name."173+ )174+175+samples: List[Dict[str, Any]] = []176+for filename in sorted(os.listdir(self._inputs_dir)):177+input_path = self._inputs_dir / filename178+gt_path = self._ground_truths_dir / f"gt_{filename}"179+180+if not gt_path.exists():181+print(f"Warning: ground truth not found for {filename}, skipping")182+continue183+184+with open(input_path, "r") as f:185+request_body: Dict[str, Any] = json.load(f)186+187+with open(gt_path, "r") as f:188+ground_truth: Dict[str, Any] = json.load(f)189+190+samples.append(191+ {192+"id": Path(filename).stem,193+"request_body": request_body,194+"original_response": None,195+"ground_truth": ground_truth,196+ }197+ )198+199+print(f"Loaded {len(samples)} samples from {self._inputs_dir.parent}")200+return samples201+202+async def evaluate_against_ground_truth(self, results: List[Dict[str, Any]]) -> List[EvaluationResult]:203+evaluation_results: List[EvaluationResult] = []204+compare_to = self.__class__.COMPARE_TO_GROUND_TRUTH205+206+for res in results:207+req_id = res["request_id"]208+is_success = res.get("success", True)209+210+if not is_success:211+evaluation_results.append(212+EvaluationResult(213+request_id=req_id,214+request_body=res["request_body"],215+new_response=res.get("new_response"),216+valid_schema=False,217+quality_score=0.0,218+quality_feedback=f"Request failed: {res.get('error_type')} - {res.get('error_message')}",219+response_time=res.get("response_time"),220+success=False,221+error_type=res.get("error_type"),222+error_message=res.get("error_message"),223+ground_truth_match=False,224+ )225+ )226+continue227+228+pred = (res.get("new_response") or {}).get("ai_activity_type")229+230+if compare_to == "llm":231+if "ground_truth_llm" not in res:232+evaluation_results.append(233+EvaluationResult(234+request_id=req_id,235+request_body=res["request_body"],236+new_response=res.get("new_response"),237+valid_schema=res.get("valid_schema", True),238+quality_score=0.0,239+quality_feedback=(240+"Missing ground_truth_llm in run results. Ensure collect step populated it and "241+"endpoints.py passes it through."242+ ),243+response_time=res.get("response_time"),244+success=True,245+ground_truth_match=False,246+ )247+ )248+continue249+gt_label = res.get("ground_truth_llm")250+else:251+gt_path = self._ground_truths_dir / f"gt_{req_id}.json"252+if not gt_path.exists():253+evaluation_results.append(254+EvaluationResult(255+request_id=req_id,256+request_body=res["request_body"],257+new_response=res.get("new_response"),258+valid_schema=res.get("valid_schema", True),259+quality_score=0.0,260+quality_feedback=f"Ground truth file not found: {gt_path}",261+response_time=res.get("response_time"),262+success=True,263+ground_truth_match=False,264+ )265+ )266+continue267+268+with open(gt_path, "r") as f:269+ground_truth_dict: Dict[str, Any] = json.load(f)270+271+gt_label = (ground_truth_dict or {}).get("ai_activity_type")272+273+matched = pred == gt_label274+275+evaluation_results.append(276+EvaluationResult(277+request_id=req_id,278+request_body=res["request_body"],279+new_response=res.get("new_response"),280+valid_schema=res.get("valid_schema", True),281+quality_score=1.0 if matched else 0.0,282+quality_feedback="PASS" if matched else f"FAIL\nExpected: {gt_label}\nGot: {pred}",283+response_time=res.get("response_time"),284+success=True,285+ground_truth_match=matched,286+ )287+ )288+289+return evaluation_results290+291+292+if __name__ == "__main__":293+parser = create_parser(AiActivityTypeEvaluator)294+parser.add_argument(295+"--data-set",296+type=str,297+default="initial",298+dest="data_set",299+help="Dataset folder under eval_output/ai_activity_type/eval_datasets/ (default: initial)",300+ )301+302+parser.add_argument(303+"--populate-ground-truth-llm",304+action="store_true",305+dest="populate_ground_truth_llm",306+ )307+parser.add_argument(308+"--ground-truth-llm-endpoint",309+type=str,310+default="OPENAI:gpt-5_2",311+dest="ground_truth_llm_endpoint",312+ )313+314+parser.add_argument(315+"--compare-to-ground-truth",316+type=str,317+choices=["es", "llm"],318+default="es",319+dest="compare_to_ground_truth",320+ )321+322+args = parser.parse_args()323+AiActivityTypeEvaluator.DATA_SET = args.data_set324+325+AiActivityTypeEvaluator.POPULATE_GROUND_TRUTH_LLM = bool(args.populate_ground_truth_llm)326+AiActivityTypeEvaluator.GROUND_TRUTH_LLM_ENDPOINT = args.ground_truth_llm_endpoint327+328+AiActivityTypeEvaluator.COMPARE_TO_GROUND_TRUTH = args.compare_to_ground_truth329+330+asyncio.run(run_evaluation(AiActivityTypeEvaluator, args))</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Expand
Listen
Show more options
Gemini said
Gemini said
This Python script defines the
AiActivityTypeEvaluator
class, a specialized tool for evaluating AI-driven activity type classification. It extends a base evaluation framework to handle data collection, ground-truth comparison, and performance scoring.
Core Functionality
Core Functionality
Data Collection (
collect_test_set
):
* Supports fetching raw samples from
Elasticsearch (ES)
or loading them from
local JSON files
.
Implements a
replayability check
: It probes the live API endpoint to ensure the activity exists before including it in the dataset.
Filters data based on request body size, language, and the presence of an original response.
Ground Truth Management:
Saves inputs and "gold standard" responses to a local directory structure (
eval_output/ai_activity_type/...
).
Features an optional mode to populate ground truth using a high-order LLM (e.g.,
gpt-5_2
) if the
POPULATE_GROUND_TRUTH_LLM
flag is set.
Evaluation Logic (
evaluate_against_ground_truth
):
Compares the model's predicted
ai_activity_type
against either the original ES response or the LLM-generated ground truth.
Assigns a
quality_score
of
1.0
for a match and
0.0
for a mismatch or request failure.
Key Configuration Constants
Key Configuration Constants
Constant
Purpose
ENDPOINT_PATH
The specific API route being tested:
call/ai-activity-type
.
COMPARE_TO_GROUND_TRUTH
Determines if the baseline is the original data (
es
) or an
llm
.
SKIP_UNREPLAYABLE_ON_COLLECT
If
True
, discards records where the API returns "Cannot find activity."
REPLAYABILITY_CHECK_TIMEOUT_SECONDS
Limits the probe request to 20 seconds.
Constant
ENDPOINT_PATH
COMPARE_TO_GROUND_TRUTH
SKIP_UNREPLAYABLE_ON_COLLECT
REPLAYABILITY_CHECK_TIMEOUT_SECONDS
Purpose
The specific API route being tested:
call/ai-activity-type
.
Determines if the baseline is the original data (
es
) or an
llm
.
If
True
, discards records where the API returns "Cannot find activity."
Limits the probe request to 20 seconds.
Copy table
Execution Workflow
Execution Workflow
Parsing:
The script uses
create_parser
to handle CLI arguments like
--data-set
,
--populate-ground-truth-llm
, and
--compare-to-ground-truth
.
Initialization:
Sets up directory paths for inputs and ground truths based on the selected dataset name.
Run:
Executes the evaluation via
asyncio.run(run_evaluation(...))
, which orchestrates the collection, endpoint calling, and result scoring phases.
Copy prompt
Edit
You said are there soem issues with this PR
You said
are there soem issues with this PR
Listen
Show more options
Show thinking
Gemini said
Gemini said
Yes, there are several issues and code smells in this Pull Request, ranging from performance bottlenecks to architectural anti-patterns.
Here is a breakdown of the most notable issues, categorized by impact:
Performance & Async Anti-Patterns
Performance & Async Anti-Patterns
Sequential Requests Defeating Async (Lines 86-106):
Inside
_collect_from_es
, the code loops through
raw_samples
and
await
s a
session.post
request for each sample one by one. This means the script waits for one HTTP request to finish before starting the next, completely defeating the purpose of using
aiohttp
for asynchronous concurrency.
Fix:
Collect these coroutines into a list and use
asyncio.gather()
(ideally wrapped in an
asyncio.Semaphore
to avoid overwhelming the endpoint) to run the replayability probes concurrently.
Blocking File I/O in Async Functions (Lines 110-114, 184-188, 268-269):
Standard synchronous file operations (
with open(...)
,
json.dump
,
json.load
) are used inside
async def
functions. In Python, this blocks the entire event loop while the disk is reading/writing.
Fix:
Use an asynchronous file I/O library like
aiofiles
, or run the blocking I/O operations in a separate thread using
asyncio.to_thread()
.
Architecture & State Management
Architecture & State Management
Mutating Class-Level Variables (Lines 323-328):
The script parses CLI arguments and directly mutates the class attributes (e.g.,
AiActivityTypeEvaluator.DATA_SET = args.data_set
). This is a major anti-pattern. If you ever try to run tests in parallel or create multiple instances of this evaluator in a single process, the state will bleed across them.
Fix:
Pass these arguments into the
__init__
constructor of the instance (
self.data_set = args.data_set
) rather than modifying the class definition globally.
Code Quality & Edge Cases
Code Quality & Edge Cases
Broad Exception Catching (Line 107):
Using a bare
except Exception:
during the replayability probe is dangerous. It will catch
aiohttp.ClientError
(which is intended), but it will also silently swallow
TimeoutError...
|
8641
|
|
16871
|
369
|
11
|
2026-04-14T15:30:43.884955+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776180643884_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpED→Search Jim +SlackFileEditViewGoHistoryWindowHelpED→Search 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)Notion 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 ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...1,99 GB1,18 GB987,0 MB897,0 MB780,1 MB767,0 MB745,0 MB734,2 MB636,9 MB600,0 MB591,9 MB547,1 MB541,6 MB527,6 MB513,0 MB485,6 MB475,3 MB437,5 MB417,7 MB383,0 MB379,0 MB378,3 MB372,6 MB337,6 MB335,6 MB321,1 MB278,8 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:30:43CPUMemoryDiskThreads372423823074242515112626152029232425262727232824232413EnergyPorts59412416 13594112770612212616 43617216622623717731913112012112312312512712112612512012172PID248351470040714664600358014500478484984226548248438019146732427311487087349623340701479150891133432824628931710951120232249278005091016,00 GB14,03 GB <1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,02 GB2,95 GB6,50 GB...
|
NULL
|
8448440896245677416
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoHistoryWindowHelpED→Search Jim +SlackFileEditViewGoHistoryWindowHelpED→Search 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)Notion 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 ContentFirefoxCP Isolated Web ContentclaudeMEMORY PRESSUREMem...1,99 GB1,18 GB987,0 MB897,0 MB780,1 MB767,0 MB745,0 MB734,2 MB636,9 MB600,0 MB591,9 MB547,1 MB541,6 MB527,6 MB513,0 MB485,6 MB475,3 MB437,5 MB417,7 MB383,0 MB379,0 MB378,3 MB372,6 MB337,6 MB335,6 MB321,1 MB278,8 MB277,1 MBPhysical Memory:Memory Used:Cached Files:Swap Used:100% <47Tue 14 Apr 18:30:43CPUMemoryDiskThreads372423823074242515112626152029232425262727232824232413EnergyPorts59412416 13594112770612212616 43617216622623717731913112012112312312512712112612512012172PID248351470040714664600358014500478484984226548248438019146732427311487087349623340701479150891133432824628931710951120232249278005091016,00 GB14,03 GB <1,88 GB3,01 GBApp Memory:Wired Memory:Compressed:NetworkUserlukaslukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,02 GB2,95 GB6,50 GB...
|
NULL
|
|
14551
|
328
|
8
|
2026-04-14T13:57:36.371753+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776175056371_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 orimaLearn 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+HomeDMsActivityFilesLater.*•More(aolJiminny ...+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...%. Adelina Petrova. Galya Dimitrova *Rs Nikolay Nikolov "2 Galya Dimitrova, Ni...2Galya Dimitrova, Ni...Ro Nikolay Yankov::: AppsToastJira CloudGoogle Cale...Retro - Platform • in 3 m100% 147Tue 14 Apr 16:57:36→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
|
8448420735093734785
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV ( SlackFileEditViewGoHistoryWindowHelpDOCKER981DEV (docker)882APP (-zsh)[EMAIL]'s next:Try Docker Debug forseamless,persistentdebugging tools in any container orimaLearn 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+HomeDMsActivityFilesLater.*•More(aolJiminny ...+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...%. Adelina Petrova. Galya Dimitrova *Rs Nikolay Nikolov "2 Galya Dimitrova, Ni...2Galya Dimitrova, Ni...Ro Nikolay Yankov::: AppsToastJira CloudGoogle Cale...Retro - Platform • in 3 m100% 147Tue 14 Apr 16:57:36→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...
|
14547
|
|
57346
|
1234
|
60
|
2026-04-20T11:49:29.192519+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776685769192_m2.jpg...
|
Slack
|
Slack
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackActivityLaterVIewmistonWindowJiminny ...Dratt SlackActivityLaterVIewmistonWindowJiminny ...Dratts & centi8 DirectoriesEb External connections# Starred8 jiminny-x-integrati...& platform-inner-teamE Channels# ai-chapter# alertsS hackendi# confusion-clinica curiositv ad# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# support# thank-yous# the_people_of_jimi...6? Direct messagesP. Aneliya AngelovaP. Galya Dimitrova2 Stefka StovanovalR. Stoyan TomovB Aneliya Angelova,...O Nikolav Nikolov& Stoyan Tanev*. Vasil VasilevP. Nikolay IvanovP. Vesi: Apps• Toastf Jira CloudHelpQ Search: shared-activi# releases• MessagesBookmarksr FilesVhen: 04/20/ ZUZo U0:13:44TodayView JobGItHUD APP 1:41 PM•20 new commits pushed to master bv valokin-liminnvSasceros •Jy-zusos ada synobiecs curadon logging8dcbc8es -JY-20553 add SvncOpportunites duraton logging.a5be5570 - JY-20553 update tests479904qf -JY-20553 add Hubspot webhooks distributon36074034 -JY-20553 add testsojinnwlann Added bv GitHubCircleCl APP 2:01 PMDeployment Successful!Project: appWhen: 04/20/2026 11:01:36View JobGitHub APP 2:21 PM4 new commits pushed to master by LakyLakad47aa83 - JY-20692 change confirmation parameter40a9a611 - JY-20692 code review suggestionбе617312 - Merge branch 'master' into JY-20692-fix-integration-app-[API_KEY] - Merge pull request #11986 from jiminny/JY-20692-fix-integration-app-coken-auth-response-changea imi.ny/app | Added by GitHubCircleCI APP 2:42 PMDeployment Successful!Project: appTag:When: 04/20/2026 11:42:10View JobMessage #releases+ Аa8 22100% C43 ® Mon 20 Apr 14:49:28[ @ Inspector & Console D Debugger J Network () Style Editor A Performance Memory »02300.x+ Q • Disable Cache No Throttling :>.| T Filter URLsAll HTML CSS JS XHR Fonts Images Media WS Other404404Method DomainA api-iam.intercom.ioPOSTIapi-lam.intercom.ioInitiatorTypeSizeping115 B | 145 m115 В | 146 mGSign InSign in with GoogleSign in with Office 365Login via SSODon't have account vet? Sneak to vour sales leader to get an invitelBy usine this service vou agree to the Privacy Policy and Terms of Service.ITERMS IKNOWLEDGE BASE BLOG2 requestsFinish: 1.15s DOMContentLoaded: 327 ms load: 545 mg...
|
NULL
|
8448043712833588965
|
NULL
|
visual_change
|
ocr
|
NULL
|
SlackActivityLaterVIewmistonWindowJiminny ...Dratt SlackActivityLaterVIewmistonWindowJiminny ...Dratts & centi8 DirectoriesEb External connections# Starred8 jiminny-x-integrati...& platform-inner-teamE Channels# ai-chapter# alertsS hackendi# confusion-clinica curiositv ad# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# support# thank-yous# the_people_of_jimi...6? Direct messagesP. Aneliya AngelovaP. Galya Dimitrova2 Stefka StovanovalR. Stoyan TomovB Aneliya Angelova,...O Nikolav Nikolov& Stoyan Tanev*. Vasil VasilevP. Nikolay IvanovP. Vesi: Apps• Toastf Jira CloudHelpQ Search: shared-activi# releases• MessagesBookmarksr FilesVhen: 04/20/ ZUZo U0:13:44TodayView JobGItHUD APP 1:41 PM•20 new commits pushed to master bv valokin-liminnvSasceros •Jy-zusos ada synobiecs curadon logging8dcbc8es -JY-20553 add SvncOpportunites duraton logging.a5be5570 - JY-20553 update tests479904qf -JY-20553 add Hubspot webhooks distributon36074034 -JY-20553 add testsojinnwlann Added bv GitHubCircleCl APP 2:01 PMDeployment Successful!Project: appWhen: 04/20/2026 11:01:36View JobGitHub APP 2:21 PM4 new commits pushed to master by LakyLakad47aa83 - JY-20692 change confirmation parameter40a9a611 - JY-20692 code review suggestionбе617312 - Merge branch 'master' into JY-20692-fix-integration-app-[API_KEY] - Merge pull request #11986 from jiminny/JY-20692-fix-integration-app-coken-auth-response-changea imi.ny/app | Added by GitHubCircleCI APP 2:42 PMDeployment Successful!Project: appTag:When: 04/20/2026 11:42:10View JobMessage #releases+ Аa8 22100% C43 ® Mon 20 Apr 14:49:28[ @ Inspector & Console D Debugger J Network () Style Editor A Performance Memory »02300.x+ Q • Disable Cache No Throttling :>.| T Filter URLsAll HTML CSS JS XHR Fonts Images Media WS Other404404Method DomainA api-iam.intercom.ioPOSTIapi-lam.intercom.ioInitiatorTypeSizeping115 B | 145 m115 В | 146 mGSign InSign in with GoogleSign in with Office 365Login via SSODon't have account vet? Sneak to vour sales leader to get an invitelBy usine this service vou agree to the Privacy Policy and Terms of Service.ITERMS IKNOWLEDGE BASE BLOG2 requestsFinish: 1.15s DOMContentLoaded: 327 ms load: 545 mg...
|
57345
|
|
23402
|
504
|
52
|
2026-04-15T11:22:11.596967+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776252131596_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
+SlackFileEditViewGoEDHomeDMsActivityFilesLater..• +SlackFileEditViewGoEDHomeDMsActivityFilesLater..•More+HistoryWindowHelp→Search 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 22+Messages@ Files• BookmarksCircleClv 2 new messagesDeploymentsuccessrui:Project: appWhen:04/15/202609:51:25Tag:View JobGitHub APP 1:53 PM2 new commits pushed tomaster 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-waveform( jiminny/app Added by GitHubCircleCl APP 2:18 PMDeployment Successful!Project: appWhen:04/15/202611:18:51Tag:View JobMessage #releasesAaNew(alolSupport Daily • in 38 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP 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 ContentFirefoxCP Isolated Web ContentClaudeMem...2,14 GB1,10 GB960,6 MB908,3 MB835,0 MB780,9 MB767,3 MB592,4 MB544,3 MB522,1 MB496,0 MB454,2 MB449,5 MB436,3 MB427,0 MB402,4 MB382,2 MB371,9 MB342,7 MB342,3 MB326,2 MB310,5 MB296,9 MB256,1 MB252,9 MB238,9 MB195,8 MB193,5 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 14:22:11CPUMemoryDiskThreads38212674842511262925251526242626231524132028156262759EnergyPorts61419 2441257321 20512419 451167250241126121185124122123126120172120723131252081 787122126721PID83696407429748014146644203084283701146738019367133548041863358313527643652430164817326548368985091011483583360519487856138482986049116,00 GB13,93 GB<2,04 GB3,07 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,39 GB2,96 GB6,02 GB...
|
NULL
|
8448035908389426393
|
NULL
|
click
|
ocr
|
NULL
|
+SlackFileEditViewGoEDHomeDMsActivityFilesLater..• +SlackFileEditViewGoEDHomeDMsActivityFilesLater..•More+HistoryWindowHelp→Search 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 22+Messages@ Files• BookmarksCircleClv 2 new messagesDeploymentsuccessrui:Project: appWhen:04/15/202609:51:25Tag:View JobGitHub APP 1:53 PM2 new commits pushed tomaster 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-waveform( jiminny/app Added by GitHubCircleCl APP 2:18 PMDeployment Successful!Project: appWhen:04/15/202611:18:51Tag:View JobMessage #releasesAaNew(alolSupport Daily • in 38 mRActivity MonitorAll ProcessesProcess NameBoosteroidWindowServerFirefoxCP Isolated Web ContentFirefoxFirefoxFirefoxCP Isolated Web ContentCursorUlViewService (Not Responding)VTDecoderXPCServiceFirefox GPU HelperFirefox GPU HelperFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP 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 ContentFirefoxCP Isolated Web ContentClaudeMem...2,14 GB1,10 GB960,6 MB908,3 MB835,0 MB780,9 MB767,3 MB592,4 MB544,3 MB522,1 MB496,0 MB454,2 MB449,5 MB436,3 MB427,0 MB402,4 MB382,2 MB371,9 MB342,7 MB342,3 MB326,2 MB310,5 MB296,9 MB256,1 MB252,9 MB238,9 MB195,8 MB193,5 MBMEMORY PRESSUREPhysical Memory:Memory Used:Cached Files:Swap Used:100% <478Wed 15 Apr 14:22:11CPUMemoryDiskThreads38212674842511262925251526242626231524132028156262759EnergyPorts61419 2441257321 20512419 451167250241126121185124122123126120172120723131252081 787122126721PID83696407429748014146644203084283701146738019367133548041863358313527643652430164817326548368985091011483583360519487856138482986049116,00 GB13,93 GB<2,04 GB3,07 GBApp Memory:Wired Memory:Compressed:NetworkUserlukas_windowserverlukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukaslukas4,39 GB2,96 GB6,02 GB...
|
NULL
|
|
28885
|
595
|
38
|
2026-04-15T14:25:30.624762+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776263130624_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
8834961720782035158/185toImperial AgePlayer 2 Rajy 8834961720782035158/185toImperial AgePlayer 2 Rajyapala!!!-Rajyapala resigned.-Halberdier Created---Elite Longbowman Created---Light Cavalry Created-2 Rajyapala: 'Odsblood! I accidentallyresigned by mistake.2 Rajyapala: No wonder thou wertvictorious! I shalt abdicate.Game Paused (P)Mini-mapThe mini-map shows the world at a smallerscale. Click the mini-map to go to thatlocation in the world.5 Magnus Olafsson: 35948/359481 kovaliklukas: 32352/323528 Almish Yiltawar: 25967/25967Rajyapala: 24480/24409NV6 Lásal6 I: 12344/12344€IV7 Maximilian ef Habsbung: 6531/6531-MNV4 Louis VI: 6219/62193 Huaseám: 5966/5966IV...
|
NULL
|
8447868029202514245
|
NULL
|
click
|
ocr
|
NULL
|
8834961720782035158/185toImperial AgePlayer 2 Rajy 8834961720782035158/185toImperial AgePlayer 2 Rajyapala!!!-Rajyapala resigned.-Halberdier Created---Elite Longbowman Created---Light Cavalry Created-2 Rajyapala: 'Odsblood! I accidentallyresigned by mistake.2 Rajyapala: No wonder thou wertvictorious! I shalt abdicate.Game Paused (P)Mini-mapThe mini-map shows the world at a smallerscale. Click the mini-map to go to thatlocation in the world.5 Magnus Olafsson: 35948/359481 kovaliklukas: 32352/323528 Almish Yiltawar: 25967/25967Rajyapala: 24480/24409NV6 Lásal6 I: 12344/12344€IV7 Maximilian ef Habsbung: 6531/6531-MNV4 Louis VI: 6219/62193 Huaseám: 5966/5966IV...
|
28883
|
|
36119
|
734
|
7
|
2026-04-16T10:22:04.335475+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-16/1776 /Users/lukas/.screenpipe/data/data/2026-04-16/1776334924335_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesTools•. FirefoxFileEditViewHistoryBookmarksProfilesTools•.WindowHelp>0 ll Support Daily - in 1h 38 m100% CThu 16 Apr 13:22:04Sign in - Google Accounts - Workaccounts.google.com/v3/signin/accountchooser?client_id=641273190747.apps.googleusercontent.com&prompt=select_account&redir #=DOCKER• ₴1DEV (docker)82APP (-z./public/vue-assets/assets/GridView-CJVxH4Dg.js./public/vue-assets/assets/ondemand-CBhkAD17.js./public/vue-assets/assets/CrmLink-rTdmxqkp.js./public/vue-assets/assets/liquor-tree-DbetBeVs.js./public/vue-assets/assets/DealRiskList-BnbcVBB8.js../public/vue-assets/assets/AskAnything-s720pn9E.js./public/vue-assets/assets/lib-BPR1zwwF.js:/public/vue-assets/assets/AppFormField-BgVfo6PN.js./public/vue-assets/assets/deal-view-Jn4yJ9Hz.js../public/vue-assets/assets/exports-DIyAIXcT.js../public/vue-assets/assets/playlists-DpSiCNMr.js../public/vue-assets/assets/callScoringTemplates-DQc-jo../public/vue-assets/assets/_copy0bject-DzIIjTZN.js•/public/vue-assets/assets/pusher-CYYPj3Hn.js./public/vue-assets/assets/onboard-DDojXW3c.js./public/vue-assets/assets/StatusBadge-BMn_k29a.js./public/vue-assets/assets/kiosk-nxpVorIV.js./public/vue-assets/assets/deal-insights-D5sbo4zZ.js../public/vue-assets/assets/ListView-D1HYjAvt.js../public/vue-assets/assets/_plugin-vue_export-helper-:./public/vue-assets/assets/WelcomeLayout-B2BjjI5T.js:./public/vue-assets/assets/dashboard-CDcAQG1E.js../public/vue-assets/assets/emoji-input-D_ee3_TC.js../public/vue-assets/assets/sentry-h1XGLinV.js../public/vue-assets/assets/OrgSettingsLayout-1YAa®isa../public/vue-assets/assets/vuex.esm-bundler-CxmCn-TU.../public/vue-assets/assets/playback-VJS8X-le.js./public/vue-assets/assets/AppButton-OYq5I1u7.js./public/vue-assets/assets/index.module-DoWLvO1P.js./public/vue-assets/assets/intl-tel-input-C4VqCHzY.js./public/vue-assets/assets/team-insights-CrkL2M3g.js../public/vue-assets/assets/popper-DC--DigQ.js../public/vue-assets/assets/PhoneField-DsfvGNK0.js•/public/vue-assets/assets/Live-DHZ3jGjw.js./public/vue-assets/assets/video-js-skin.less_vue_typr../public/vue-assets/assets/index-DVKeaTSE.js../public/vue-assets/assets/logged-in-layout-B0d2IU06.]GSign in with GoogleEnglish (United States)[plugin builtin:vite-reporter](!) Some chunks are larger than 500 kB after minificat- Using dynamic import() to code-split the application- Use build.rolldown0ptions.output.codeSplitting to imj- Adjust chunk size limit for this warning via build.cl• built in 29.74slukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app,Waiting for [EMAIL] an accountto continue to Zoho AccountsO Integration [EMAIL]@ Use another accountBefore using this app, you can review Zoho Accounts'sprivacy policy and terms of service.HelpPrivacyTerms...
|
NULL
|
8447723769740590866
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesTools•. FirefoxFileEditViewHistoryBookmarksProfilesTools•.WindowHelp>0 ll Support Daily - in 1h 38 m100% CThu 16 Apr 13:22:04Sign in - Google Accounts - Workaccounts.google.com/v3/signin/accountchooser?client_id=641273190747.apps.googleusercontent.com&prompt=select_account&redir #=DOCKER• ₴1DEV (docker)82APP (-z./public/vue-assets/assets/GridView-CJVxH4Dg.js./public/vue-assets/assets/ondemand-CBhkAD17.js./public/vue-assets/assets/CrmLink-rTdmxqkp.js./public/vue-assets/assets/liquor-tree-DbetBeVs.js./public/vue-assets/assets/DealRiskList-BnbcVBB8.js../public/vue-assets/assets/AskAnything-s720pn9E.js./public/vue-assets/assets/lib-BPR1zwwF.js:/public/vue-assets/assets/AppFormField-BgVfo6PN.js./public/vue-assets/assets/deal-view-Jn4yJ9Hz.js../public/vue-assets/assets/exports-DIyAIXcT.js../public/vue-assets/assets/playlists-DpSiCNMr.js../public/vue-assets/assets/callScoringTemplates-DQc-jo../public/vue-assets/assets/_copy0bject-DzIIjTZN.js•/public/vue-assets/assets/pusher-CYYPj3Hn.js./public/vue-assets/assets/onboard-DDojXW3c.js./public/vue-assets/assets/StatusBadge-BMn_k29a.js./public/vue-assets/assets/kiosk-nxpVorIV.js./public/vue-assets/assets/deal-insights-D5sbo4zZ.js../public/vue-assets/assets/ListView-D1HYjAvt.js../public/vue-assets/assets/_plugin-vue_export-helper-:./public/vue-assets/assets/WelcomeLayout-B2BjjI5T.js:./public/vue-assets/assets/dashboard-CDcAQG1E.js../public/vue-assets/assets/emoji-input-D_ee3_TC.js../public/vue-assets/assets/sentry-h1XGLinV.js../public/vue-assets/assets/OrgSettingsLayout-1YAa®isa../public/vue-assets/assets/vuex.esm-bundler-CxmCn-TU.../public/vue-assets/assets/playback-VJS8X-le.js./public/vue-assets/assets/AppButton-OYq5I1u7.js./public/vue-assets/assets/index.module-DoWLvO1P.js./public/vue-assets/assets/intl-tel-input-C4VqCHzY.js./public/vue-assets/assets/team-insights-CrkL2M3g.js../public/vue-assets/assets/popper-DC--DigQ.js../public/vue-assets/assets/PhoneField-DsfvGNK0.js•/public/vue-assets/assets/Live-DHZ3jGjw.js./public/vue-assets/assets/video-js-skin.less_vue_typr../public/vue-assets/assets/index-DVKeaTSE.js../public/vue-assets/assets/logged-in-layout-B0d2IU06.]GSign in with GoogleEnglish (United States)[plugin builtin:vite-reporter](!) Some chunks are larger than 500 kB after minificat- Using dynamic import() to code-split the application- Use build.rolldown0ptions.output.codeSplitting to imj- Adjust chunk size limit for this warning via build.cl• built in 29.74slukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app,Waiting for [EMAIL] an accountto continue to Zoho AccountsO Integration [EMAIL]@ Use another accountBefore using this app, you can review Zoho Accounts'sprivacy policy and terms of service.HelpPrivacyTerms...
|
36117
|
|
52727
|
1140
|
17
|
2026-04-20T07:31:26.424153+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776670286424_m1.jpg...
|
Slack
|
Galya Dimitrova (DM) - Jiminny Inc - 2 new items - Galya Dimitrova (DM) - Jiminny Inc - 2 new items - Slack...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
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
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Nikolay Nikolov
Galya Dimitrova
Stoyan Tanev
Vasil Vasilev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Galya Dimitrova
Apr 9th at 12:20:58 PM
12:20 PM
привет, само да ти кажа за тракването на панорама ако ти трябва нещо за Userpilot може да видиш с Ади
Lukas Kovalik
Apr 9th at 12:21:29 PM
12:21 PM
здрасти, супер токущо го направих само не знам как да го тествам
Apr 9th at 12:21:44 PM
12:21
ще го видя с Ади, мерси
Galya Dimitrova
Apr 9th at 12:35:52 PM
12:35 PM
Ами за тестване май може само на среда
.
Lukas Kovalik
Apr 9th at 12:38:21 PM
12:38 PM
Ади добави през админ staging, така че ще видим дали работи
Jump to date
Lukas Kovalik
Apr 15th at 12:39:25 PM
12:39 PM
здрасти, един бръз въпрос за ask jiminny reports когато имаш време
Apr 15th at 12:39:56 PM
12:39
в момента ако expired template го правим disabled
Apr 15th at 12:41:04 PM
12:41
ако обаче искат да го enable-нат трябва ли да имаме предвид expiration? Те са като цяло две различни неща
Apr 15th at 12:41:46 PM
12:41
може да не им позволим да го направят или пак да сетнем някакво време напред
Galya Dimitrova
Apr 15th at 12:59:34 PM
12:59 PM
чудя се, ама да ти кажа май няма нужда да правим сложни схеми. Защото в таблицата се вижда датата на която expire-ва. Та остави го да си го енейбълват но вече в кода е добре да си проверявате не само дали е енейбълнат но и дали не е expire-нал преди да го пускате към Стели
Lukas Kovalik
Apr 15th at 1:02:25 PM
1:02 PM
да то го има вече
Jump to date
Galya Dimitrova
Apr 16th at 11:58:52 AM
11:58 AM
Привет
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Apr 16th at 11:59:18 AM
11:59
когато стигнеш до това стори
https://jiminny.atlassian.net/browse/JY-20372
https://jiminny.atlassian.net/browse/JY-20372
JY-20372 AI Reports > Empty page design and promotion...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Jiminny Inc","depth":12,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Jiminny (Staging)","depth":12,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Add workspaces","depth":12,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"role_description":"text"},{"role":"AXButton","text":"More unreads","depth":17,"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":"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":"platform-tickets","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tomov","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Ves","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"role_description":"text"},{"role":"AXRadioButton","text":"Untitled","depth":17,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled","depth":19,"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","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":"Apr 9th at 12:20:58 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:20 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"привет, само да ти кажа за тракването на панорама ако ти трябва нещо за Userpilot може да видиш с Ади","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":"Apr 9th at 12:21:29 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:21 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"здрасти, супер токущо го направих само не знам как да го тествам","depth":25,"role_description":"text"},{"role":"AXLink","text":"Apr 9th at 12:21:44 PM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:21","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"ще го видя с Ади, мерси","depth":25,"role_description":"text"},{"role":"AXButton","text":"Galya Dimitrova","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":"Apr 9th at 12:35:52 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:35 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Ами за тестване май може само на среда","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":"Apr 9th at 12:38:21 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:38 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Ади добави през админ staging, така че ще видим дали работи","depth":25,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"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":"Apr 15th at 12:39:25 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:39 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"здрасти, един бръз въпрос за ask jiminny reports когато имаш време","depth":25,"role_description":"text"},{"role":"AXLink","text":"Apr 15th at 12:39:56 PM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:39","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"в момента ако expired template го правим disabled","depth":25,"role_description":"text"},{"role":"AXLink","text":"Apr 15th at 12:41:04 PM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:41","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"ако обаче искат да го enable-нат трябва ли да имаме предвид expiration? Те са като цяло две различни неща","depth":25,"role_description":"text"},{"role":"AXLink","text":"Apr 15th at 12:41:46 PM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:41","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"може да не им позволим да го направят или пак да сетнем някакво време напред","depth":25,"role_description":"text"},{"role":"AXButton","text":"Galya Dimitrova","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":"Apr 15th at 12:59:34 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:59 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"чудя се, ама да ти кажа май няма нужда да правим сложни схеми. Защото в таблицата се вижда датата на която expire-ва. Та остави го да си го енейбълват но вече в кода е добре да си проверявате не само дали е енейбълнат но и дали не е expire-нал преди да го пускате към Стели","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":"Apr 15th at 1:02:25 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1:02 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"да то го има вече","depth":25,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","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":"Apr 16th at 11:58:52 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:58 AM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Привет","depth":25,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"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,"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,"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,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"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,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Apr 16th at 11:59:18 AM","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"11:59","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"когато стигнеш до това стори","depth":25,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20372","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20372","depth":26,"role_description":"text"},{"role":"AXLink","text":"JY-20372 AI Reports > Empty page design and promotion","depth":27,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8447515797753947970
|
-3349805550454044670
|
app_switch
|
hybrid
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
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
confusion-clinic
curiosity_lab
engineering
frontend
general
infra-changes
jiminny-bg
platform-tickets
product_launches
random
releases
support
thank-yous
the_people_of_jiminny
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Nikolay Nikolov
Galya Dimitrova
Stoyan Tanev
Vasil Vasilev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Galya Dimitrova
Apr 9th at 12:20:58 PM
12:20 PM
привет, само да ти кажа за тракването на панорама ако ти трябва нещо за Userpilot може да видиш с Ади
Lukas Kovalik
Apr 9th at 12:21:29 PM
12:21 PM
здрасти, супер токущо го направих само не знам как да го тествам
Apr 9th at 12:21:44 PM
12:21
ще го видя с Ади, мерси
Galya Dimitrova
Apr 9th at 12:35:52 PM
12:35 PM
Ами за тестване май може само на среда
.
Lukas Kovalik
Apr 9th at 12:38:21 PM
12:38 PM
Ади добави през админ staging, така че ще видим дали работи
Jump to date
Lukas Kovalik
Apr 15th at 12:39:25 PM
12:39 PM
здрасти, един бръз въпрос за ask jiminny reports когато имаш време
Apr 15th at 12:39:56 PM
12:39
в момента ако expired template го правим disabled
Apr 15th at 12:41:04 PM
12:41
ако обаче искат да го enable-нат трябва ли да имаме предвид expiration? Те са като цяло две различни неща
Apr 15th at 12:41:46 PM
12:41
може да не им позволим да го направят или пак да сетнем някакво време напред
Galya Dimitrova
Apr 15th at 12:59:34 PM
12:59 PM
чудя се, ама да ти кажа май няма нужда да правим сложни схеми. Защото в таблицата се вижда датата на която expire-ва. Та остави го да си го енейбълват но вече в кода е добре да си проверявате не само дали е енейбълнат но и дали не е expire-нал преди да го пускате към Стели
Lukas Kovalik
Apr 15th at 1:02:25 PM
1:02 PM
да то го има вече
Jump to date
Galya Dimitrova
Apr 16th at 11:58:52 AM
11:58 AM
Привет
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Apr 16th at 11:59:18 AM
11:59
когато стигнеш до това стори
https://jiminny.atlassian.net/browse/JY-20372
https://jiminny.atlassian.net/browse/JY-20372
JY-20372 AI Reports > Empty page design and promotion
iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDEV (docker)APP (-zsh)|DOCKERLast login: Mon Apr 20 10:16:41 on ttys006DEV (docker)$82Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parentsPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ devroot@docker_lamp_1:/home/jiminny# |*3‹ >0 ll100% C47 8 Mon 20 Apr 10:31:26T₴1|-zsh• ₴4screenpipe"• *5DEV...
|
NULL
|
|
58895
|
1264
|
34
|
2026-04-20T13:08:49.647683+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776690529647_m1.jpg...
|
Firefox
|
Firefox
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/cxs-eips-npt?authuser=0laalNikolay Nikolov (Presenting, annotating)100% <78• Mon 20 Apr 16:08:498+887 [JY-20615) NotityZ (JY-20500) Batch2 (JY-20501) Batch i X© 0048:15 - RetineresJminny - CalendalD Meet - [Plattorh LLM Leaderooard.D TODODebug crm-sync..- Kehne L Sentry Cts L Lean L A ChapterHomeQ SearchAdd a comment.Suggest a reply.Who is working on this..status update.Yr00o.p0oconnenNikolay Nikolov&Initial Owner/Profile Sync for OpportunitiesWhere It HappensTrigger: ProfileCreated event → SyncProfileOppoztunities listener1 User connects to CRM → Profile created → ProfileCreated event |SyncProfileOpportunities: :handle()SyncOpportunitiesJob dispatchedLocationSyncProfile0pportunities.phpHow It WorksACUOTkevier© Rev Prophet( My PRs|+ CreateAsk Rovov DetailsFix versionsNoneSprintPlatform Sprint 3 Q2DaysNoneNeed QA|NoParent• JY-15971 CRM Synching ImprovemCanny LinksOpen Canny Linksv More fieldsOriginal estimateTime trackingNo time logged> Automation 4 Rule executions› featureOS Open featureosProfileCreated event fires when a new CRM profile is created> Sentry sl! Unked IssuesCreated 24 March 2026 at 18.03Uoredonn?wohenkeDispate1lmeet.google.com is sharing your screen.Mon 20 Apr 16:08L Al BockmarksAneliya AngelovaStefka Stoyanova3 othersNikolay Nikolov4:08 PM | [Platform] Refinement ®Lukas Kovalik1:07:00...
|
NULL
|
8447382556704973240
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/cxs-eips-npt?authuser=0laalNikolay Nikolov (Presenting, annotating)100% <78• Mon 20 Apr 16:08:498+887 [JY-20615) NotityZ (JY-20500) Batch2 (JY-20501) Batch i X© 0048:15 - RetineresJminny - CalendalD Meet - [Plattorh LLM Leaderooard.D TODODebug crm-sync..- Kehne L Sentry Cts L Lean L A ChapterHomeQ SearchAdd a comment.Suggest a reply.Who is working on this..status update.Yr00o.p0oconnenNikolay Nikolov&Initial Owner/Profile Sync for OpportunitiesWhere It HappensTrigger: ProfileCreated event → SyncProfileOppoztunities listener1 User connects to CRM → Profile created → ProfileCreated event |SyncProfileOpportunities: :handle()SyncOpportunitiesJob dispatchedLocationSyncProfile0pportunities.phpHow It WorksACUOTkevier© Rev Prophet( My PRs|+ CreateAsk Rovov DetailsFix versionsNoneSprintPlatform Sprint 3 Q2DaysNoneNeed QA|NoParent• JY-15971 CRM Synching ImprovemCanny LinksOpen Canny Linksv More fieldsOriginal estimateTime trackingNo time logged> Automation 4 Rule executions› featureOS Open featureosProfileCreated event fires when a new CRM profile is created> Sentry sl! Unked IssuesCreated 24 March 2026 at 18.03Uoredonn?wohenkeDispate1lmeet.google.com is sharing your screen.Mon 20 Apr 16:08L Al BockmarksAneliya AngelovaStefka Stoyanova3 othersNikolay Nikolov4:08 PM | [Platform] Refinement ®Lukas Kovalik1:07:00...
|
NULL
|
|
42082
|
892
|
28
|
2026-04-17T06:45:41.311629+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776408341311_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEdit ViewHistoryBookmarksProfilesTools FirefoxFileEdit ViewHistoryBookmarksProfilesTools WindowHelp‹ →0 lhl• •<→ C= C @ meet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.com11 Meet+Lukas Kovalik:Camera is starting• | Daily - Platform • now• All-In-One, Capture AreaC: Capture Previous Area• Capture Fullscreen• Capture Windowi Scrolling Capture• Self-TimerAa Capture Text (OCR)• Record ScreenA+₴3# Hide Desktop Icons• Open...'& Pin to the Screen...D Capture History...About CleanShot...Check for Updates...Settings...QuitTKTOTRTB100% <48• Fri 17 Apr 9:45:[EMAIL] accountformorgiev are in this calltesStart|78,Other ways to join{ soundcore A... ~‹) System Defa... -D1 FaceTime HD... •[g Backgrounds... •Gemini is available in Meet as your personal in-meeting assistant. It can analyze conversation via temporaryaccess to meeting captions. Using Ask Gemini won't create a recording or store meeting data. The meetingLộ3...
|
NULL
|
8447254718129114104
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEdit ViewHistoryBookmarksProfilesTools FirefoxFileEdit ViewHistoryBookmarksProfilesTools WindowHelp‹ →0 lhl• •<→ C= C @ meet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.com11 Meet+Lukas Kovalik:Camera is starting• | Daily - Platform • now• All-In-One, Capture AreaC: Capture Previous Area• Capture Fullscreen• Capture Windowi Scrolling Capture• Self-TimerAa Capture Text (OCR)• Record ScreenA+₴3# Hide Desktop Icons• Open...'& Pin to the Screen...D Capture History...About CleanShot...Check for Updates...Settings...QuitTKTOTRTB100% <48• Fri 17 Apr 9:45:[EMAIL] accountformorgiev are in this calltesStart|78,Other ways to join{ soundcore A... ~‹) System Defa... -D1 FaceTime HD... •[g Backgrounds... •Gemini is available in Meet as your personal in-meeting assistant. It can analyze conversation via temporaryaccess to meeting captions. Using Ask Gemini won't create a recording or store meeting data. The meetingLộ3...
|
42080
|
|
58489
|
1258
|
3
|
2026-04-20T12:49:47.134664+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776689387134_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% C428• Mon 20 Apr 15:49:4600 7PhpStormProject vmportContactBatch.php©ImportOpportunityBatch.phpSymcContact.phpDSyncOpportunty php 23.03.26, 1059, 84500 SyncOrmEntties Trait.phpService.php© SyncAccount.php©SyncProfieOpportunities.php© SyncProfieLeads.php 23.03.26, 10.59, 2.81) SyncProfleOpportunities.php 20.04.24SyncOpportunities.Job.phpOpportunitySyncTralt.phpDeaiRisksclass SyncProfile0pportunsehes Inplenents ShouldQueueElasticSearchpublic function handle(Prof$leCreated Sevent): void0 Groupsteanid'E mport1):• Steanio,0 MallboxNudgesSthis->job0ispatcher-›dispatch(new SyncProffleMetadata(Sproffle->getUser))):B OpportuPlaybookesSthis-screateDeaLInsightsLayoutIfDoesNotExist(ScreConfiguration):Eo Playists> E TeamsSsince « Sthis->configurationSettingsService-›getSyncPeriod(ScraConfiguration):Eo TranscriptionUsers› E WebhookF.gitkeep 210326, 1050,1B© ChangeLogContextCorrelationid,php 23.0331f (1 Sthis->configurationSettingsService->requiresSLidingRindowSearch($craConfiguration))Sthis->JobDispatcher->dispatchfnew SyncOpportunitiesJoblScraconfiguration-sgetId0),› Омай› 0 Modeis> Notifications"cra_proffle_id' a Scrald,"since" a Ssince,› ObserversOrocesProviderstrategy: OpportunitySyncStrategyResolver::LAST_MO0IFIED_BY_PROFILE_SYNC_OPPORTU SyncHubspotObjectsTest.testHandieWithN...y y Test Resultv 1 test passed 1 test total, 24 ms/opt/honebrew/Celtar/php/8.3.4/bin/phpTesting started at 11:54 ...PHPUnit 11.5.55 by Sebastian BergnannaPHP 8.3.4Configuration: Wecs/kest/ain.nny/lopp/Tine: 08:00.298, Mesory: 109.50 MBj else (Sthis->tinePeriodIterator->generateUnT11LNowForMaxSevenOays(startDate: Ssince,onPeriod: function (Carbon Sstart, Carbon Send) use (ScreConfiguration, Scrnid): vSthis->jobOispatcher->dispatchCnew SyncopportunátiesJobCScraConfiguration->getId),*crs_profile_1d' a Scraid,'since' » Sstart,*to" a Send,ihere aas mrohat test Onncr wanhansUminny|ateners1CrmCapp › app › Listeners › Crm › ® SyncProfieOpportunities.php › ® SyncProfieOpportunities › €merepoociooob snenin yout sorcen• а 8.Mon 20 Apr 16:40U SyncHubspotObjectsTest.testHandlSyncedAt~Salesforce Batch Con+0 ..crassync-epportunityKTUNITYSalesforce bulk syncs use batch processing (Redis - ProcessSalestoi8Other providers (HubSpot, etc.) remain unchanged (stil one-by-one)09SyncOpportunitiesJob.phpfL58 Do we have batches here forHubspot And SalesforceLet me check the syncOpportunities implementation for both providers:Answer: Batching in syncOpportunitiesProviderBatching?A PartialProcesses in batches of 200 BATCH PROCESSSX NoOne-by-one: fereach (SsfOpportunities asD phofereach (SsyncStrategy-»fetchOpportunities(...) as ShsOpportusbufferll - ShsOpportunity:SsyncCount += Sthis-oprocessOpportunityBatch(Sbuffer)AASydED ROU+ ©CodeClaude Opus 4,5PHP: 8.3 W Wodsurt TeamsSymfonyLF UTF-BG 4 spacesAneliya AngelovaStefka Stoyanova2 othersNikolay Nikolov3:49 PM | [Platform] Refinement ®Lukas Kovalik47:58...
|
NULL
|
8447095003270978742
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksToolsWindowHelp FirefoxFileEditViewHistoryBookmarksToolsWindowHelpmeet.google.com/cxs-eips-npt?authuser=0Nikolay Nikolov (Presenting, annotating)100% C428• Mon 20 Apr 15:49:4600 7PhpStormProject vmportContactBatch.php©ImportOpportunityBatch.phpSymcContact.phpDSyncOpportunty php 23.03.26, 1059, 84500 SyncOrmEntties Trait.phpService.php© SyncAccount.php©SyncProfieOpportunities.php© SyncProfieLeads.php 23.03.26, 10.59, 2.81) SyncProfleOpportunities.php 20.04.24SyncOpportunities.Job.phpOpportunitySyncTralt.phpDeaiRisksclass SyncProfile0pportunsehes Inplenents ShouldQueueElasticSearchpublic function handle(Prof$leCreated Sevent): void0 Groupsteanid'E mport1):• Steanio,0 MallboxNudgesSthis->job0ispatcher-›dispatch(new SyncProffleMetadata(Sproffle->getUser))):B OpportuPlaybookesSthis-screateDeaLInsightsLayoutIfDoesNotExist(ScreConfiguration):Eo Playists> E TeamsSsince « Sthis->configurationSettingsService-›getSyncPeriod(ScraConfiguration):Eo TranscriptionUsers› E WebhookF.gitkeep 210326, 1050,1B© ChangeLogContextCorrelationid,php 23.0331f (1 Sthis->configurationSettingsService->requiresSLidingRindowSearch($craConfiguration))Sthis->JobDispatcher->dispatchfnew SyncOpportunitiesJoblScraconfiguration-sgetId0),› Омай› 0 Modeis> Notifications"cra_proffle_id' a Scrald,"since" a Ssince,› ObserversOrocesProviderstrategy: OpportunitySyncStrategyResolver::LAST_MO0IFIED_BY_PROFILE_SYNC_OPPORTU SyncHubspotObjectsTest.testHandieWithN...y y Test Resultv 1 test passed 1 test total, 24 ms/opt/honebrew/Celtar/php/8.3.4/bin/phpTesting started at 11:54 ...PHPUnit 11.5.55 by Sebastian BergnannaPHP 8.3.4Configuration: Wecs/kest/ain.nny/lopp/Tine: 08:00.298, Mesory: 109.50 MBj else (Sthis->tinePeriodIterator->generateUnT11LNowForMaxSevenOays(startDate: Ssince,onPeriod: function (Carbon Sstart, Carbon Send) use (ScreConfiguration, Scrnid): vSthis->jobOispatcher->dispatchCnew SyncopportunátiesJobCScraConfiguration->getId),*crs_profile_1d' a Scraid,'since' » Sstart,*to" a Send,ihere aas mrohat test Onncr wanhansUminny|ateners1CrmCapp › app › Listeners › Crm › ® SyncProfieOpportunities.php › ® SyncProfieOpportunities › €merepoociooob snenin yout sorcen• а 8.Mon 20 Apr 16:40U SyncHubspotObjectsTest.testHandlSyncedAt~Salesforce Batch Con+0 ..crassync-epportunityKTUNITYSalesforce bulk syncs use batch processing (Redis - ProcessSalestoi8Other providers (HubSpot, etc.) remain unchanged (stil one-by-one)09SyncOpportunitiesJob.phpfL58 Do we have batches here forHubspot And SalesforceLet me check the syncOpportunities implementation for both providers:Answer: Batching in syncOpportunitiesProviderBatching?A PartialProcesses in batches of 200 BATCH PROCESSSX NoOne-by-one: fereach (SsfOpportunities asD phofereach (SsyncStrategy-»fetchOpportunities(...) as ShsOpportusbufferll - ShsOpportunity:SsyncCount += Sthis-oprocessOpportunityBatch(Sbuffer)AASydED ROU+ ©CodeClaude Opus 4,5PHP: 8.3 W Wodsurt TeamsSymfonyLF UTF-BG 4 spacesAneliya AngelovaStefka Stoyanova2 othersNikolay Nikolov3:49 PM | [Platform] Refinement ®Lukas Kovalik47:58...
|
NULL
|
|
4946
|
93
|
22
|
2026-04-13T12:46:43.978671+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-13/1776 /Users/lukas/.screenpipe/data/data/2026-04-13/1776084403978_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp* Unable to access screenpipe activity dataDOCKERO $1- Used Claude, LikelyDEV (-zsh)relatedtoO 882APP (-zsh)• *3-zsh• *4screenpipework (querying the screenpipe search API)-zsh• 25lall92% <4Mon 13 Apr 15:46:43181-zsh86-zsh®O 87* Unable to access s...TL;DR: Mostly a dev day focused on building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening reading on Slovak news.what did I do today so farThe screenpipe MCP server has disconnected, so I can't query your activity right now. You'd need to reconnect it to get today's summary.You can try restarting the screenpipe MCP server and then ask again.give mesummary for last 48 hoursThe screenpipe MCPserver is still disconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCPserver or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP serverstatus, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(Claude mcp list)L Checking MCP server health...claude.ai Reminders: https://todo.lakylak.xyz/mcp - ! Needs authentication. +5 lines (ctrl+o to expand)Screenpipe shows asconnected. The tools may just need to be re-registered in this session. Let me try calling it directly:The screenpipe MCP is connected, but the tools got deregistered from this session when it disconnected earlier and can't be re-loaded mid-conversation.Start a new Claude Code session - the tools will be fully available again and I can pull the 48-hour summary right away.? for shortcuts...
|
NULL
|
8446683892985811287
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp* Unable to access screenpipe activity dataDOCKERO $1- Used Claude, LikelyDEV (-zsh)relatedtoO 882APP (-zsh)• *3-zsh• *4screenpipework (querying the screenpipe search API)-zsh• 25lall92% <4Mon 13 Apr 15:46:43181-zsh86-zsh®O 87* Unable to access s...TL;DR: Mostly a dev day focused on building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening reading on Slovak news.what did I do today so farThe screenpipe MCP server has disconnected, so I can't query your activity right now. You'd need to reconnect it to get today's summary.You can try restarting the screenpipe MCP server and then ask again.give mesummary for last 48 hoursThe screenpipe MCPserver is still disconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCPserver or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP serverstatus, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(Claude mcp list)L Checking MCP server health...claude.ai Reminders: https://todo.lakylak.xyz/mcp - ! Needs authentication. +5 lines (ctrl+o to expand)Screenpipe shows asconnected. The tools may just need to be re-registered in this session. Let me try calling it directly:The screenpipe MCP is connected, but the tools got deregistered from this session when it disconnected earlier and can't be re-loaded mid-conversation.Start a new Claude Code session - the tools will be fully available again and I can pull the 48-hour summary right away.? for shortcuts...
|
NULL
|
|
54680
|
1181
|
16
|
2026-04-20T09:15:25.160867+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676525160_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityServiceTest extends TestCase
{
private ActivitySearch&MockObject $activitySearch;
private ElasticActivityRepository&MockObject $elasticRepository;
private LoggerInterface&MockObject $logger;
private AskJiminnyReportActivityService $service;
protected function setUp(): void
{
$this->activitySearch = $this->createMock(ActivitySearch::class);
$this->elasticRepository = $this->createMock(ElasticActivityRepository::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->service = new AskJiminnyReportActivityService(
$this->activitySearch,
$this->elasticRepository,
$this->logger,
);
}
private function makeFilter(string $key, ?string $value): SearchFilter&MockObject
{
$filter = $this->createMock(SearchFilter::class);
$filter->method('getFilterProperty')->willReturn($key);
$filter->method('getFilterValue')->willReturn($value);
return $filter;
}
private function makeUser(): User&MockObject
{
$tz = new \DateTimeZone('UTC');
$user = $this->createMock(User::class);
$user->method('getTimezone')->willReturn($tz);
$user->method('getId')->willReturn(1);
$user->method('getUuid')->willReturn('user-uuid');
return $user;
}
private function makeSavedSearch(array $filters): Search&MockObject
{
$savedSearch = $this->createMock(Search::class);
$savedSearch->method('getId')->willReturn(42);
$savedSearch->method('getFilters')->willReturn(new \Illuminate\Support\LazyCollection($filters));
return $savedSearch;
}
public function testGetActivityIdsForSavedSearchReturnsIds(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->expects($this->once())
->method('getArrayFilterKeys')
->with($user)
->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->expects($this->once())
->method('onDemandSearchIdsOnly')
->willReturn(['id-1', 'id-2', 'id-3']);
$this->logger->expects($this->once())
->method('info')
->with('[AskJiminnyReport] Fetched activity IDs for saved search');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1', 'id-2', 'id-3'], $result);
}
public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->expects($this->once())->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEmpty($result);
}
public function testGetActivityIdsFiltersOutDateFilters(): void
{
$user = $this->makeUser();
$nonDateFilter = $this->makeFilter('owner_id', '123');
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');
$updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');
$updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');
$savedSearch = $this->makeSavedSearch([
$nonDateFilter,
$startDateFilter,
$endDateFilter,
$updatedFromFilter,
$updatedToFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
}
public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void
{
$user = $this->makeUser();
$closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');
$closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');
$regularFilter = $this->makeFilter('rep_id', '99');
$savedSearch = $this->makeSavedSearch([
$closingStartFilter,
$closingEndFilter,
$regularFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesArrayFilters(): void
{
$user = $this->makeUser();
$filter1 = $this->makeFilter('outcome', 'positive');
$filter2 = $this->makeFilter('outcome', 'negative');
$savedSearch = $this->makeSavedSearch([$filter1, $filter2]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesScalarFilters(): void
{
$user = $this->makeUser();
$filter = $this->makeFilter('direction', 'inbound');
$savedSearch = $this->makeSavedSearch([$filter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-5'], $result);
}
public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
$this->assertFalse($capturedCriteria->isFirstRequest());
}
public function testGetActivityIdsLogsWithCorrectContext(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);
$this->logger->expects($this->once())
->method('info')
->with(
'[AskJiminnyReport] Fetched activity IDs for saved search',
$this->callback(fn ($context) => $context['saved_search_id'] === 42
&& $context['user_id'] === 1
&& $context['activity_count'] === 2)
);
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
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
9
12
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 * from teams where 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 automated_reports 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 * 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'
Project
Project
New File or Directory…...
|
[{"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","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":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","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":"2","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"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.0,"top":0.0,"width":0.014583333,"height":0.025555555},"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 Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\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":"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":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"12","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\nselect * from teams where 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 automated_reports 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\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'","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\nselect * from teams where 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 automated_reports 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\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'","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}]...
|
8446240623521191625
|
2146703058527524421
|
click
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityServiceTest extends TestCase
{
private ActivitySearch&MockObject $activitySearch;
private ElasticActivityRepository&MockObject $elasticRepository;
private LoggerInterface&MockObject $logger;
private AskJiminnyReportActivityService $service;
protected function setUp(): void
{
$this->activitySearch = $this->createMock(ActivitySearch::class);
$this->elasticRepository = $this->createMock(ElasticActivityRepository::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->service = new AskJiminnyReportActivityService(
$this->activitySearch,
$this->elasticRepository,
$this->logger,
);
}
private function makeFilter(string $key, ?string $value): SearchFilter&MockObject
{
$filter = $this->createMock(SearchFilter::class);
$filter->method('getFilterProperty')->willReturn($key);
$filter->method('getFilterValue')->willReturn($value);
return $filter;
}
private function makeUser(): User&MockObject
{
$tz = new \DateTimeZone('UTC');
$user = $this->createMock(User::class);
$user->method('getTimezone')->willReturn($tz);
$user->method('getId')->willReturn(1);
$user->method('getUuid')->willReturn('user-uuid');
return $user;
}
private function makeSavedSearch(array $filters): Search&MockObject
{
$savedSearch = $this->createMock(Search::class);
$savedSearch->method('getId')->willReturn(42);
$savedSearch->method('getFilters')->willReturn(new \Illuminate\Support\LazyCollection($filters));
return $savedSearch;
}
public function testGetActivityIdsForSavedSearchReturnsIds(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->expects($this->once())
->method('getArrayFilterKeys')
->with($user)
->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->expects($this->once())
->method('onDemandSearchIdsOnly')
->willReturn(['id-1', 'id-2', 'id-3']);
$this->logger->expects($this->once())
->method('info')
->with('[AskJiminnyReport] Fetched activity IDs for saved search');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1', 'id-2', 'id-3'], $result);
}
public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->expects($this->once())->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEmpty($result);
}
public function testGetActivityIdsFiltersOutDateFilters(): void
{
$user = $this->makeUser();
$nonDateFilter = $this->makeFilter('owner_id', '123');
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');
$updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');
$updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');
$savedSearch = $this->makeSavedSearch([
$nonDateFilter,
$startDateFilter,
$endDateFilter,
$updatedFromFilter,
$updatedToFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
}
public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void
{
$user = $this->makeUser();
$closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');
$closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');
$regularFilter = $this->makeFilter('rep_id', '99');
$savedSearch = $this->makeSavedSearch([
$closingStartFilter,
$closingEndFilter,
$regularFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesArrayFilters(): void
{
$user = $this->makeUser();
$filter1 = $this->makeFilter('outcome', 'positive');
$filter2 = $this->makeFilter('outcome', 'negative');
$savedSearch = $this->makeSavedSearch([$filter1, $filter2]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesScalarFilters(): void
{
$user = $this->makeUser();
$filter = $this->makeFilter('direction', 'inbound');
$savedSearch = $this->makeSavedSearch([$filter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-5'], $result);
}
public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
$this->assertFalse($capturedCriteria->isFirstRequest());
}
public function testGetActivityIdsLogsWithCorrectContext(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);
$this->logger->expects($this->once())
->method('info')
->with(
'[AskJiminnyReport] Fetched activity IDs for saved search',
$this->callback(fn ($context) => $context['saved_search_id'] === 42
&& $context['user_id'] === 1
&& $context['activity_count'] === 2)
);
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
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
9
12
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 * from teams where 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 automated_reports 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 * 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'
Project
Project
New File or Directory…...
|
54679
|
|
4769
|
90
|
42
|
2026-04-13T12:36:36.680334+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-13/1776 /Users/lukas/.screenpipe/data/data/2026-04-13/1776083796680_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp* Unable to access screenpipe activity data-zsh• *4-zsh• 25alol90% [A8Mon 13 Apr 15:36:36181* Unable to access s...X8DOCKERO ₴1DEV (-zsh)Claude (~5 min)- Used Claude,likelyrelatedO 882APP (-zsh)• *3|-zsh₴86-zsh®0 87screenpipe work (querying the screenpipe search API)TL;DR: Mostly a devdayfocusedon building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening readingon Slovak news.what did I dotodayso farThe screenpipe MCPserver has disconnected, so I can't query your activity right now.You'd need to reconnect it to get today's summary.You can try restartingthe screenpipe MCP server and then ask again.give me summary forlast 48 hoursThe screenpipe MCPserver is stilldisconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCP server or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP server status, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(claude mcp list)Running...sash commandclaude mcp listRun shell commandhis command requires approvalo you want to proceed?• 1.Yes2.Yes, and don't ask again for: claude mcp:*3. Noisc to cancel • Tab to amend • ctrl+e to explain...
|
NULL
|
8446227438624497482
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp* Unable to access screenpipe activity data-zsh• *4-zsh• 25alol90% [A8Mon 13 Apr 15:36:36181* Unable to access s...X8DOCKERO ₴1DEV (-zsh)Claude (~5 min)- Used Claude,likelyrelatedO 882APP (-zsh)• *3|-zsh₴86-zsh®0 87screenpipe work (querying the screenpipe search API)TL;DR: Mostly a devdayfocusedon building something with screenpipe data (a reporting UI), some light work task-checking on Jira/email, and evening readingon Slovak news.what did I dotodayso farThe screenpipe MCPserver has disconnected, so I can't query your activity right now.You'd need to reconnect it to get today's summary.You can try restartingthe screenpipe MCP server and then ask again.give me summary forlast 48 hoursThe screenpipe MCPserver is stilldisconnected - I don't have access to those tools. You'll need to reconnect it first.If screenpipe is running locally, you can try restarting the MCP server or check its status with ! screenpipe or however you normally manage it.it is healhty and running, chekc againThe tools aren't showing up in my session even though screenpipe is running. This likely means the MCP connection needs to be re-established on the Claude Code side.Try running ! claude mep list to check the MCP server status, or restart Claude Code to reconnect the screenpipe MCP server.claude mep listBash(claude mcp list)Running...sash commandclaude mcp listRun shell commandhis command requires approvalo you want to proceed?• 1.Yes2.Yes, and don't ask again for: claude mcp:*3. Noisc to cancel • Tab to amend • ctrl+e to explain...
|
4768
|
|
78771
|
2015
|
20
|
2026-04-24T13:43:25.722612+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-24/1777 /Users/lukas/.screenpipe/data/data/2026-04-24/1777038205722_m1.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?selectedIssue=JY-20508...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - 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
JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · jiminny/app
JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · 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
Pipelines - jiminny/app
Pipelines - jiminny/app
Inbox (1,609) - [EMAIL] - Jiminny Mail
Inbox (1,609) - [EMAIL] - Jiminny Mail
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Unnamed Group
Jiminny
Jiminny
503 Service Temporarily Unavailable
503 Service Temporarily Unavailable
app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · jiminny/app
app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · jiminny/app
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
Notifications
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...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - 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":"JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · 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":"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":"AXRadioButton","text":"Inbox (1,609) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Inbox (1,609) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Unnamed Group","depth":4,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"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":"503 Service Temporarily Unavailable","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"503 Service Temporarily Unavailable","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · 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":"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":"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":"Space navigation","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Space navigation","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":"Search, press enter to navigate to advanced search with your text query","depth":11,"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,"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":"Notifications","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Notifications","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"}]...
|
8446130962035824954
|
-7632485217848074034
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - 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
JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · jiminny/app
JY-20738 add debug logs on AJ report UP tracking by LakyLak · Pull Request #12013 · 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
Pipelines - jiminny/app
Pipelines - jiminny/app
Inbox (1,609) - [EMAIL] - Jiminny Mail
Inbox (1,609) - [EMAIL] - Jiminny Mail
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Unnamed Group
Jiminny
Jiminny
503 Service Temporarily Unavailable
503 Service Temporarily Unavailable
app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · jiminny/app
app/app/Http/Controllers/FrontendControllerTrait.php at fb01b96ae7a4635bc86648b82c2435789cddf693 · jiminny/app
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
Notifications
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...
|
78768
|
|
60709
|
1308
|
35
|
2026-04-21T06:15:02.592912+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776752102592_m1.jpg...
|
Firefox
|
Feed — jiminny — Sentry — Work
|
True
|
jiminny.sentry.io/issues/?environment=production-e jiminny.sentry.io/issues/?environment=production-eu&environment=production&project=82419&query=is%3Aunresolved&referrer=issue-list&sort=date&statsPeriod=1h...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira
[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira
🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - [EMAIL] - Jiminny Mail
🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - [EMAIL] - Jiminny Mail
[JY-20500] Batch initial sync for Salesforce - Jira
[JY-20500] Batch initial sync for Salesforce - Jira
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Close tab
Jiminny
Jiminny
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
Monitors
Monitors
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Expand
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts Moved
Alerts
Moved
Feed
Feed
Pause real-time updates
app
app
production-eu, production
production-eu, production
1H
1H
Add a search term
Edit operator for filter: is
is
Edit value for filter: is
unresolved
Remove filter: is
Add a search term
Add a search term
Edit operator for filter: is
is
Add a search term
Edit value for filter: is
unresolved
Remove filter: is
Clear search query
Last Seen
Last Seen
Save As
Save As
Select all
Issue
Last Seen
Age
Trend
24h
24h
1h
1h
Events
Users
Priority
Assignee
Select Issue
Jiminny\Http\AccessTokenProvider\TokenException
Jiminny\Http\AccessTokenProvider\TokenException
Level: Error
Token not found.
View Project Details
APP-1BQD
/app/Http/AccessTokenProvider/HubspotAccessTokenProvider.php in Jiminny\Http\AccessTokenProvider\HubspotAccessTokenProvider::getAccessToken
3min ago
1yr
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Mailbox\SyncInbox
View Project Details
APP-1BZV
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
4min ago
1yr
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Symfony\Component\Debug\Exception\FatalThrowableError
Symfony\Component\Debug\Exception\FatalThrowableError
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
View Project Details
APP-1DTF
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Quick Fix
14min ago
7mo
Ongoing
2
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Activity\HardDeleteActivities
View Project Details
APP-1EH6
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
24min ago
5mo
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Symfony\Component\ErrorHandler\Error\FatalError
Symfony\Component\ErrorHandler\Error\FatalError
Level: Error
Allowed memory size of 268435456 bytes exhausted (tried to allocate 10485760 bytes)
View Project Details
APP-1FNH
/app/Repositories/Crm/CrmEntityRepository.php in ?
29min ago
5d
New
3
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\SocialAccountTokenInvalidException
Jiminny\Exceptions\SocialAccountTokenInvalidException
Level: Error
Your Salesforce account has become disconnected. Please login to Jiminny to reconnect.
View Project Details
APP-1ET5
/app/Services/Crm/BaseService.php in Jiminny\Services\Crm\BaseService::validateUserAccountExists
40min ago
3mo
Ongoing
6
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Mailbox\SyncInbox
View Project Details
APP-1DKY
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
43min ago
8mo
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Component\ProphetAi\Exceptions\ProphetException
Jiminny\Component\ProphetAi\Exceptions\ProphetException
Level: Error
Unexpected service error.Server error: `POST https://prophet.jiminny.com/crm/deal/extract-field-values` resulted in a `504 Gateway Time-out` response: <html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
</body (truncated...)
View Project Details
APP-1DZ3...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"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,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20500] Batch initial sync for Salesforce - Jira","depth":4,"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,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"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":"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,"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,"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,"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,"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,"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":8,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle organization menu","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Explore","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Explore","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dashboards","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dashboards","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Monitors","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Monitors","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Try Business","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"What's New","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Help","depth":10,"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":10,"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,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Feed","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Errors & Outages","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Errors & Outages","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Breached Metrics","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Breached Metrics","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Warnings","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Warnings","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"User Feedback","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User Feedback","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All Views","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All Views","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Configure","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Alerts Moved","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Alerts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Moved","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Feed","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Feed","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Pause real-time updates","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"app","depth":11,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"production-eu, production","depth":11,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"production-eu, production","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"1H","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1H","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Add a search term","depth":14,"help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Edit operator for filter: is","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"is","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit value for filter: is","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"unresolved","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Remove filter: is","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Add a search term","depth":14,"help_text":"","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":14,"help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Edit operator for filter: is","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"is","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Add a search term","depth":14,"help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Edit value for filter: is","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"unresolved","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Remove filter: is","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Clear search query","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Last Seen","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Last Seen","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Save As","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Save As","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select all","depth":11,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last Seen","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Age","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trend","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"24h","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"24h","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1h","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1h","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Events","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Priority","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assignee","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Http\\AccessTokenProvider\\TokenException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Http\\AccessTokenProvider\\TokenException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Token not found.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1BQD","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Http/AccessTokenProvider/HubspotAccessTokenProvider.php in Jiminny\\Http\\AccessTokenProvider\\HubspotAccessTokenProvider::getAccessToken","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1yr","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Job timed out Jiminny\\Jobs\\Mailbox\\SyncInbox","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1BZV","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Queue/Worker/Worker.php in Jiminny\\Queue\\Worker\\Worker::Jiminny\\Queue\\Worker\\{closure}","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1yr","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Symfony\\Component\\Debug\\Exception\\FatalThrowableError","depth":14,"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":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1DTF","depth":13,"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":"AXLink","text":"Quick Fix","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Quick Fix","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7mo","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Job timed out Jiminny\\Jobs\\Activity\\HardDeleteActivities","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1EH6","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Queue/Worker/Worker.php in Jiminny\\Queue\\Worker\\Worker::Jiminny\\Queue\\Worker\\{closure}","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"24min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5mo","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Symfony\\Component\\ErrorHandler\\Error\\FatalError","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Symfony\\Component\\ErrorHandler\\Error\\FatalError","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Allowed memory size of 268435456 bytes exhausted (tried to allocate 10485760 bytes)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1FNH","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Repositories/Crm/CrmEntityRepository.php in ?","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"29min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5d","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"New","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Exceptions\\SocialAccountTokenInvalidException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Exceptions\\SocialAccountTokenInvalidException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Your Salesforce account has become disconnected. Please login to Jiminny to reconnect.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1ET5","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Services/Crm/BaseService.php in Jiminny\\Services\\Crm\\BaseService::validateUserAccountExists","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"40min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3mo","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Exceptions\\JobTimeoutException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Job timed out Jiminny\\Jobs\\Mailbox\\SyncInbox","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1DKY","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/app/Queue/Worker/Worker.php in Jiminny\\Queue\\Worker\\Worker::Jiminny\\Queue\\Worker\\{closure}","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"43min ago","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8mo","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ongoing","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue priority","depth":11,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"High","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Modify issue assignee","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Select Issue","depth":12,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Level: Error","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Unexpected service error.Server error: `POST https://prophet.jiminny.com/crm/deal/extract-field-values` resulted in a `504 Gateway Time-out` response: <html>\r <head><title>504 Gateway Time-out</title></head>\r <body>\r <center><h1>504 Gateway Time-out</h1></center>\r </body (truncated...)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View Project Details","depth":13,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP-1DZ3","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
8445349818415326798
|
1805726384840277503
|
app_switch
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira
[JY-20676] Notify the user if a Panorama prompts is deleted but is used in AJ Report - Jira
🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - [EMAIL] - Jiminny Mail
🚀 Q2 Kick-Off - Local in 🇬🇧 & 🇧🇬 at our 🏢/🏡 - Apr 2 - [EMAIL] - Jiminny Mail
[JY-20500] Batch initial sync for Salesforce - Jira
[JY-20500] Batch initial sync for Salesforce - Jira
Feed — jiminny — Sentry
Feed — jiminny — Sentry
Close tab
Jiminny
Jiminny
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
Monitors
Monitors
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Expand
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
All Views
All Views
Configure
Alerts Moved
Alerts
Moved
Feed
Feed
Pause real-time updates
app
app
production-eu, production
production-eu, production
1H
1H
Add a search term
Edit operator for filter: is
is
Edit value for filter: is
unresolved
Remove filter: is
Add a search term
Add a search term
Edit operator for filter: is
is
Add a search term
Edit value for filter: is
unresolved
Remove filter: is
Clear search query
Last Seen
Last Seen
Save As
Save As
Select all
Issue
Last Seen
Age
Trend
24h
24h
1h
1h
Events
Users
Priority
Assignee
Select Issue
Jiminny\Http\AccessTokenProvider\TokenException
Jiminny\Http\AccessTokenProvider\TokenException
Level: Error
Token not found.
View Project Details
APP-1BQD
/app/Http/AccessTokenProvider/HubspotAccessTokenProvider.php in Jiminny\Http\AccessTokenProvider\HubspotAccessTokenProvider::getAccessToken
3min ago
1yr
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Mailbox\SyncInbox
View Project Details
APP-1BZV
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
4min ago
1yr
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Symfony\Component\Debug\Exception\FatalThrowableError
Symfony\Component\Debug\Exception\FatalThrowableError
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
View Project Details
APP-1DTF
/app/Jobs/AutomatedReports/SendReportJob.php in Jiminny\Jobs\AutomatedReports\SendReportJob::handle
Quick Fix
Quick Fix
14min ago
7mo
Ongoing
2
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Activity\HardDeleteActivities
View Project Details
APP-1EH6
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
24min ago
5mo
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Symfony\Component\ErrorHandler\Error\FatalError
Symfony\Component\ErrorHandler\Error\FatalError
Level: Error
Allowed memory size of 268435456 bytes exhausted (tried to allocate 10485760 bytes)
View Project Details
APP-1FNH
/app/Repositories/Crm/CrmEntityRepository.php in ?
29min ago
5d
New
3
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\SocialAccountTokenInvalidException
Jiminny\Exceptions\SocialAccountTokenInvalidException
Level: Error
Your Salesforce account has become disconnected. Please login to Jiminny to reconnect.
View Project Details
APP-1ET5
/app/Services/Crm/BaseService.php in Jiminny\Services\Crm\BaseService::validateUserAccountExists
40min ago
3mo
Ongoing
6
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Exceptions\JobTimeoutException
Jiminny\Exceptions\JobTimeoutException
Level: Error
Job timed out Jiminny\Jobs\Mailbox\SyncInbox
View Project Details
APP-1DKY
/app/Queue/Worker/Worker.php in Jiminny\Queue\Worker\Worker::Jiminny\Queue\Worker\{closure}
43min ago
8mo
Ongoing
1
0
Modify issue priority
High
Modify issue assignee
Select Issue
Jiminny\Component\ProphetAi\Exceptions\ProphetException
Jiminny\Component\ProphetAi\Exceptions\ProphetException
Level: Error
Unexpected service error.Server error: `POST https://prophet.jiminny.com/crm/deal/extract-field-values` resulted in a `504 Gateway Time-out` response: <html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
</body (truncated...)
View Project Details
APP-1DZ3...
|
NULL
|
|
351
|
9
|
18
|
2026-04-09T17:47:59.729865+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-09/1775 /Users/lukas/.screenpipe/data/data/2026-04-09/1775756879729_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0Inh9.-zshDOCKERDEV (-zsh)882APP (-zsh)*3* Claude Code (node)O 84-zsh100% <78Thu 9 Apr 20:47:59T81-zsh₴6settingaudio chunk durationportaudio disabledvision disabledpause on DRM contentaudio enginevad enginedata directorydebug modetelemetryuse pii removaluse all monitorsignored windowsincluded windowscloud syncauto-destruct piddeepgram keyLanguagesvalue30 seconds3030truefalsefalseParakeetSilero/Users/lukas/.screenpipefalsetruetruetruedisabled0not setall languagesmonitorsaudio devicesno monitors availabledisabledyou are using local processing. all your data stays on your computer.warning: telemetry is enabled. only error-level data will be sent.to disable, use the --disable-telemetry flag.check latest changes here: https://github.com/screenpipe/screenpipe/releases2026-04-09T20:46:27.315779ZINFO screenpipe_core::pipes: pipe scheduler started (generation 2)2026-04-09T20:46:27.316005ZINFO screenpipe: starting UI event capture2026-04-09T20:46:27.319042ZWARN screenpipe: piagent install failed: bun not found- install from https://bun.sh2026-04-09T20:46:27.322573ZINFO screenpipe_engine::power::manager: initial power profile: PerformanceCon_ac=true, battery=Some(100))2026-04-09T20:46:27.332302ZINFO screenpipe_engine::ui_recorder: Starting UI event capture2026-04-09720:46:27.34660322026-04-09T20:46:27.346622ZINFO screenpipe_engine::calendar_speaker_id: speaker identification: started(user_name=<not set>)INFO screenpipe_engine::ui_recorder: UI recording session started: 80f0a2f3-465a-488c-b71a-12e547e041c82026-04-09T20:46:27.346798ZINFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-08 17:46:27.346795 UTC to 2026-04-0917:46:27.346795 UTC)2026-04-09T20:46:27.347710ZINFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)2026-04-09T20:46:27.351881ZINFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 332 frame entries, coverage from 2026-04-08 17:46:27.346795 UTC...
|
NULL
|
8444757427295209343
|
NULL
|
clipboard
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0Inh9.-zshDOCKERDEV (-zsh)882APP (-zsh)*3* Claude Code (node)O 84-zsh100% <78Thu 9 Apr 20:47:59T81-zsh₴6settingaudio chunk durationportaudio disabledvision disabledpause on DRM contentaudio enginevad enginedata directorydebug modetelemetryuse pii removaluse all monitorsignored windowsincluded windowscloud syncauto-destruct piddeepgram keyLanguagesvalue30 seconds3030truefalsefalseParakeetSilero/Users/lukas/.screenpipefalsetruetruetruedisabled0not setall languagesmonitorsaudio devicesno monitors availabledisabledyou are using local processing. all your data stays on your computer.warning: telemetry is enabled. only error-level data will be sent.to disable, use the --disable-telemetry flag.check latest changes here: https://github.com/screenpipe/screenpipe/releases2026-04-09T20:46:27.315779ZINFO screenpipe_core::pipes: pipe scheduler started (generation 2)2026-04-09T20:46:27.316005ZINFO screenpipe: starting UI event capture2026-04-09T20:46:27.319042ZWARN screenpipe: piagent install failed: bun not found- install from https://bun.sh2026-04-09T20:46:27.322573ZINFO screenpipe_engine::power::manager: initial power profile: PerformanceCon_ac=true, battery=Some(100))2026-04-09T20:46:27.332302ZINFO screenpipe_engine::ui_recorder: Starting UI event capture2026-04-09720:46:27.34660322026-04-09T20:46:27.346622ZINFO screenpipe_engine::calendar_speaker_id: speaker identification: started(user_name=<not set>)INFO screenpipe_engine::ui_recorder: UI recording session started: 80f0a2f3-465a-488c-b71a-12e547e041c82026-04-09T20:46:27.346798ZINFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-08 17:46:27.346795 UTC to 2026-04-0917:46:27.346795 UTC)2026-04-09T20:46:27.347710ZINFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)2026-04-09T20:46:27.351881ZINFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 332 frame entries, coverage from 2026-04-08 17:46:27.346795 UTC...
|
350
|
|
44519
|
940
|
51
|
2026-04-17T08:50:37.308177+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776415837308_m2.jpg...
|
Firefox
|
CloudWatch | eu-west-1 — Work
|
True
|
eu-west-1.console.aws.amazon.com/cloudwatch/home?r eu-west-1.console.aws.amazon.com/cloudwatch/home?region=eu-west-1#logsV2:logs-insights$3FqueryDetail$3D~(end~0~start~-43200~timeType~'RELATIVE~tz~'UTC~unit~'seconds~editorString~'fields*20*40timestamp*2c*20*40message*2c*20*40logStream*2c*20*40log*0a*7c*20filter*20*40message*20like*20*2f7594349*2f*20*0a*7c*20filter*20*40message*20not*20like*20*2fAnalytic*2f*20*7c*20filter*20*40message*20not*20like*20*2fTranscript*2f*0a*7c*20filter*20*40message*20not*20like*20*2fWebhook*2f*20*7c*20filter*20*40message*20not*20like*20*2fMeetingBot*2f*20*0a*7c*20limit*2010000~queryId~'0551e814-f51a-4339-8372-80d7ba4cef27~source~(~'worker~'worker-analytics~'worker-app~'worker-audio~'worker-calendar~'worker-conferences~'worker-crm-sync~'worker-default~'worker-delayed~'worker-dialers~'worker-dialers-fifo~'worker-download~'worker-emails~'worker-meeting-bot~'worker-nudges~'worker-processing-1~'worker-processing-2~'worker-processing-3~'worker-processing-4~'worker-processing-5~'worker-processing-delayed~'worker-softphone~'worker-video~'worker-video-app~'php~'php-app)~lang~'CWLI~logClass~'STANDARD~queryBy~'logGroupName)...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Workers | Datadog
Developers | HubSpot
Developers Workers | Datadog
Developers | HubSpot
Developers | HubSpot
Inbox (1,575) - [EMAIL] - Jiminny Mail
Inbox (1,575) - [EMAIL] - Jiminny Mail
120216 is your HubSpot Log In Code - [EMAIL] - Jiminny Mail
120216 is your HubSpot Log In Code - [EMAIL] - Jiminny Mail
CloudWatch | eu-west-1
CloudWatch | eu-west-1
Close tab
New Tab
New Tab
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AWS Console Home
Skip to Main Content
Skip to Main Content
Amazon Q
Services
Search
Ask Amazon Q
[Option+S]
CloudShell
Notifications (none available)
Help & support
Settings
Europe (Ireland)
Europe (Ireland)
EU
Account ID: 7657-2019-9711
EU
EC2 EC2
EC2
Elastic Container Service Elastic Container Service
Elastic Container Service
S3 S3
S3
CodeDeploy CodeDeploy
CodeDeploy
CloudWatch CloudWatch
CloudWatch
ElastiCache ElastiCache
ElastiCache
Aurora and RDS Aurora and RDS
Aurora and RDS
Amazon OpenSearch Service Amazon OpenSearch Service
Amazon OpenSearch Service
CloudFront CloudFront
CloudFront
MediaLive MediaLive
MediaLive
Open side navigation
CloudWatch
CloudWatch
Logs Insights
Logs Insights
Query definition
Query definition
Info : Query definition
Log Analytics
a unified observability platform for a smoother experience, now in preview mode. Click
here
here
to try it out!
5m (5 Minutes)
30m (30 Minutes)
1h (1 Hour)
3h (3 Hours)
12h (12 Hours)
Custom
Custom
Compare (Off)
Compare
(
Off
)
Time zone UTC timezone
UTC timezone
Start tailing with selected log group (opens in a new tab)
Start tailing
Query scope
Query scope Log group name
Log group name
Select up to 50 log groups
Show more chosen log groups
Show more chosen log groups (+25)
Browse
:
Log Groups
|
Facets
|
Lookup tables
Undo
Redo
Logs Insights QL
Query generator
Query generator
Fields
Saved and sample queries
Query commands
Run query...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.00234375,"top":0.07847222,"width":0.0890625,"height":0.028472222},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Developers | HubSpot","depth":4,"bounds":{"left":0.0,"top":0.11597222,"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":"Developers | HubSpot","depth":5,"bounds":{"left":0.015625,"top":0.12569444,"width":0.04453125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Inbox (1,575) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.14444445,"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":"Inbox (1,575) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.015625,"top":0.15416667,"width":0.11445312,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"120216 is your HubSpot Log In Code - integration-account@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.17291667,"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":"120216 is your HubSpot Log In Code - integration-account@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.015625,"top":0.18263888,"width":0.17734376,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | eu-west-1","depth":4,"bounds":{"left":0.0,"top":0.2013889,"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":"CloudWatch | eu-west-1","depth":5,"bounds":{"left":0.015625,"top":0.21111111,"width":0.048828125,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.07890625,"top":0.20763889,"width":0.009375,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.22986111,"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.23958333,"width":0.017578125,"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.25833333,"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.26805556,"width":0.1515625,"height":0.009722223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.003125,"top":0.28819445,"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":"AWS Console Home","depth":13,"bounds":{"left":0.09375,"top":0.08125,"width":0.025390625,"height":0.033333335},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to Main Content","depth":13,"bounds":{"left":0.09335937,"top":0.08055556,"width":0.0015625,"height":0.0013888889},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to Main Content","depth":14,"bounds":{"left":0.09414063,"top":0.08125,"width":0.01953125,"height":0.045138888},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Amazon Q","depth":14,"bounds":{"left":0.11953125,"top":0.08125,"width":0.01953125,"height":0.033333335},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Services","depth":13,"bounds":{"left":0.1390625,"top":0.08125,"width":0.01953125,"height":0.033333335},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXComboBox","text":"Search","depth":16,"bounds":{"left":0.15859374,"top":0.0875,"width":0.2109375,"height":0.020833334},"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ask Amazon Q","depth":15,"bounds":{"left":0.35390624,"top":0.08958333,"width":0.01171875,"height":0.016666668},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[Option+S]","depth":16,"bounds":{"left":0.32851562,"top":0.09166667,"width":0.02734375,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"CloudShell","depth":14,"bounds":{"left":0.58554685,"top":0.08125,"width":0.01875,"height":0.033333335},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Notifications (none available)","depth":15,"bounds":{"left":0.60429686,"top":0.084027775,"width":0.01953125,"height":0.027777778},"help_text":"Notifications","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Help & support","depth":15,"bounds":{"left":0.6238281,"top":0.08125,"width":0.01953125,"height":0.033333335},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Settings","depth":15,"bounds":{"left":0.64335936,"top":0.08125,"width":0.01953125,"height":0.033333335},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXComboBox","text":"Europe (Ireland)","depth":15,"bounds":{"left":0.6628906,"top":0.08125,"width":0.05390625,"height":0.033333335},"value":"Europe (Ireland)","help_text":"Europe (Ireland)","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Europe (Ireland)","depth":17,"bounds":{"left":0.6695312,"top":0.093055554,"width":0.034375,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"EU","depth":15,"bounds":{"left":0.7167969,"top":0.08125,"width":0.07929687,"height":0.033333335},"help_text":"EU_View_Only @ jiminny-eu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Account ID: 7657-2019-9711","depth":19,"bounds":{"left":0.7203125,"top":0.083333336,"width":0.06367187,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"EU","depth":18,"bounds":{"left":0.78164065,"top":0.099305555,"width":0.005859375,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"EC2 EC2","depth":16,"bounds":{"left":0.096875,"top":0.11666667,"width":0.023828125,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"EC2","depth":18,"bounds":{"left":0.109375,"top":0.121527776,"width":0.008203125,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Elastic Container Service Elastic Container Service","depth":16,"bounds":{"left":0.12070312,"top":0.11666667,"width":0.06757812,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Elastic Container Service","depth":18,"bounds":{"left":0.13320312,"top":0.121527776,"width":0.051953126,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"S3 S3","depth":16,"bounds":{"left":0.18828125,"top":0.11666667,"width":0.02109375,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"S3","depth":18,"bounds":{"left":0.20078126,"top":0.121527776,"width":0.00546875,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"CodeDeploy CodeDeploy","depth":16,"bounds":{"left":0.209375,"top":0.11666667,"width":0.04140625,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CodeDeploy","depth":18,"bounds":{"left":0.221875,"top":0.121527776,"width":0.02578125,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"CloudWatch CloudWatch","depth":16,"bounds":{"left":0.25078124,"top":0.11666667,"width":0.04140625,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch","depth":18,"bounds":{"left":0.26328126,"top":0.121527776,"width":0.02578125,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"ElastiCache ElastiCache","depth":16,"bounds":{"left":0.2921875,"top":0.11666667,"width":0.03984375,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ElastiCache","depth":18,"bounds":{"left":0.3046875,"top":0.121527776,"width":0.02421875,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Aurora and RDS Aurora and RDS","depth":16,"bounds":{"left":0.33203125,"top":0.11666667,"width":0.048828125,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Aurora and RDS","depth":18,"bounds":{"left":0.34453124,"top":0.121527776,"width":0.033203125,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Amazon OpenSearch Service Amazon OpenSearch Service","depth":16,"bounds":{"left":0.38085938,"top":0.11666667,"width":0.07421875,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Amazon OpenSearch Service","depth":18,"bounds":{"left":0.39335936,"top":0.121527776,"width":0.0609375,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"CloudFront CloudFront","depth":16,"bounds":{"left":0.45507812,"top":0.11666667,"width":0.039453126,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudFront","depth":18,"bounds":{"left":0.4675781,"top":0.121527776,"width":0.023828125,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"MediaLive MediaLive","depth":16,"bounds":{"left":0.49453124,"top":0.11666667,"width":0.037109375,"height":0.019444445},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MediaLive","depth":18,"bounds":{"left":0.50703126,"top":0.121527776,"width":0.021484375,"height":0.010416667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open side navigation","depth":13,"bounds":{"left":0.1,"top":0.14166667,"width":0.01171875,"height":0.020833334},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"CloudWatch","depth":14,"bounds":{"left":0.11640625,"top":0.14444445,"width":0.031640626,"height":0.015277778},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch","depth":16,"bounds":{"left":0.1171875,"top":0.14583333,"width":0.030078124,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Logs Insights","depth":14,"bounds":{"left":0.16054687,"top":0.14513889,"width":0.03359375,"height":0.013888889},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Logs Insights","depth":16,"bounds":{"left":0.16054687,"top":0.14583333,"width":0.03359375,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Query definition","depth":26,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Query definition","depth":28,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Info : Query definition","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Log Analytics","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"a unified observability platform for a smoother experience, now in preview mode. Click","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"here","depth":28,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"here","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to try it out!","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"5m (5 Minutes)","depth":27,"help_text":"5 Minutes","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"30m (30 Minutes)","depth":27,"help_text":"30 Minutes","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"1h (1 Hour)","depth":27,"help_text":"1 Hour","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"3h (3 Hours)","depth":27,"help_text":"3 Hours","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"12h (12 Hours)","depth":27,"help_text":"12 Hours","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Custom","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Custom","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Compare (Off)","depth":26,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Compare","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Off","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Time zone UTC timezone","depth":26,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"UTC timezone","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Start tailing with selected log group (opens in a new tab)","depth":26,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Start tailing","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Query scope","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Query scope Log group name","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Log group name","depth":29,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Select up to 50 log groups","depth":28,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show more chosen log groups","depth":27,"bounds":{"left":0.18945312,"top":0.0,"width":0.0984375,"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":"Show more chosen log groups (+25)","depth":29,"bounds":{"left":0.19804688,"top":0.0,"width":0.0890625,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Browse","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":28,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Log Groups","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"|","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Facets","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"|","depth":27,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Lookup tables","depth":27,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Undo","depth":28,"bounds":{"left":0.7253906,"top":0.035416666,"width":0.0109375,"height":0.013888889},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Redo","depth":28,"bounds":{"left":0.73945314,"top":0.035416666,"width":0.0109375,"height":0.013888889},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Logs Insights QL","depth":29,"bounds":{"left":0.111328125,"top":0.06458333,"width":0.06757812,"height":0.022222223},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Query generator","depth":26,"bounds":{"left":0.18203124,"top":0.061805554,"width":0.06171875,"height":0.028472222},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Query generator","depth":28,"bounds":{"left":0.19609375,"top":0.06875,"width":0.04296875,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fields","depth":28,"bounds":{"left":0.25625,"top":0.06875,"width":0.01484375,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Saved and sample queries","depth":28,"bounds":{"left":0.28828126,"top":0.06875,"width":0.06640625,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Query commands","depth":28,"bounds":{"left":0.371875,"top":0.06875,"width":0.0453125,"height":0.0125},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Run query","depth":27,"bounds":{"left":0.1046875,"top":0.099305555,"width":0.04375,"height":0.022222223},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
8444667576990073713
|
-419669049448156506
|
visual_change
|
accessibility
|
NULL
|
Workers | Datadog
Developers | HubSpot
Developers Workers | Datadog
Developers | HubSpot
Developers | HubSpot
Inbox (1,575) - [EMAIL] - Jiminny Mail
Inbox (1,575) - [EMAIL] - Jiminny Mail
120216 is your HubSpot Log In Code - [EMAIL] - Jiminny Mail
120216 is your HubSpot Log In Code - [EMAIL] - Jiminny Mail
CloudWatch | eu-west-1
CloudWatch | eu-west-1
Close tab
New Tab
New Tab
Configure SSH access to multiple environment - Engineering - Confluence
Configure SSH access to multiple environment - Engineering - Confluence
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AWS Console Home
Skip to Main Content
Skip to Main Content
Amazon Q
Services
Search
Ask Amazon Q
[Option+S]
CloudShell
Notifications (none available)
Help & support
Settings
Europe (Ireland)
Europe (Ireland)
EU
Account ID: 7657-2019-9711
EU
EC2 EC2
EC2
Elastic Container Service Elastic Container Service
Elastic Container Service
S3 S3
S3
CodeDeploy CodeDeploy
CodeDeploy
CloudWatch CloudWatch
CloudWatch
ElastiCache ElastiCache
ElastiCache
Aurora and RDS Aurora and RDS
Aurora and RDS
Amazon OpenSearch Service Amazon OpenSearch Service
Amazon OpenSearch Service
CloudFront CloudFront
CloudFront
MediaLive MediaLive
MediaLive
Open side navigation
CloudWatch
CloudWatch
Logs Insights
Logs Insights
Query definition
Query definition
Info : Query definition
Log Analytics
a unified observability platform for a smoother experience, now in preview mode. Click
here
here
to try it out!
5m (5 Minutes)
30m (30 Minutes)
1h (1 Hour)
3h (3 Hours)
12h (12 Hours)
Custom
Custom
Compare (Off)
Compare
(
Off
)
Time zone UTC timezone
UTC timezone
Start tailing with selected log group (opens in a new tab)
Start tailing
Query scope
Query scope Log group name
Log group name
Select up to 50 log groups
Show more chosen log groups
Show more chosen log groups (+25)
Browse
:
Log Groups
|
Facets
|
Lookup tables
Undo
Redo
Logs Insights QL
Query generator
Query generator
Fields
Saved and sample queries
Query commands
Run query...
|
44517
|
|
216
|
6
|
20
|
2026-04-09T17:19:01.102692+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-09/1775 /Users/lukas/.screenpipe/data/data/2026-04-09/1775755141102_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2•00ShellEditViewSessionScripts|ProfilesWindo iTerm2•00ShellEditViewSessionScripts|ProfilesWindowHelp100% [47 8• Thu 9 Apr 20:19:00screenpipe"83* Check today's app usage (... O *4DOCKERDEV (-zsh)182APP (-zsh)screenpipe"-zshwhisper_model_load: loading modelwhisper_model_load: n_vocab= 51865whisper_model_load: n_audio_ctx= 1500whisper_model_load: n_audio_state = 384whisper_model_load: n_audio_head= 6whisper_model_load: n_audio_layer = 4whisper_model_load: n_text_ctx= 448whisper_model_load: n_text_state = 384whisper_model_load: n_text_head= 6whisper_model_load: n_text_layer= 4whisper_model_load: n_mels= 80whisper_model_load: ftype= 1whisper_model_load:qntvr= 0whisper_model_load: type= 1 (tiny)whisper_model_load: adding 1608 extra tokenswhisper_model_load: n_langs= 99whisper_model_load:Metal totalsize =77.11 MBwhisper_model_load: model size77.11 MB2026-04-09T20:18:53.001173Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfullywhisper_backend_init_gpu: device 0: Metal (type: 1)whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)whisper_backend_init_gpu: using Metal backendCor Petol cropeription: erggml_metal_init: allocatingggml_metal_init: found device: Apple M1ggml_metal_init: picking default device: Apple M1ggml_metal_init: use fusion= trueggml_metal_init: use concurrency= trueggml_metal_init: use graph optimize = truewhisper_backend_init: using BLAS backendwhisper_init_state: kv self size =3.15 MBwhisper_init_state: kv cross size =9.44 MBwhisper_init_state: kv padsize =2.36 MBwhisper_init_state: compute buffer (conv)=14.17 MBwhisper_init_state: compute buffer (encode) =65.96 MBwhisper_init_state: compute buffer (cross)=8.50 MBwhisper_init_state: compute buffer (decode) = 96.83 MB2026-04-09T20:18:53.005400ZINFO screenpipe_audio:: audio_manager: :manager: transcription session created (will be reused across segments)2026-04-09T20:18:53.005773ZINFO screenpipe_audio::audio_manager::manager: audio manager started2026-04-09T20:18:53.005828ZINFO screenpipe_audio:: audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events2026-04-09T20:18:54.300159ZINFO screenpipe_audio: : device: :device_manager: starting recording for device: soundcore AeroClip (input)2026-04-09120:18:54.300247ZINFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for soundcore AeroClip (input) (30s segments)2026-04-09T20:18:54.947320ZINFO screenpipe_audio::device: :device_manager: starting recording for device: System Audio (output)2026-04-09T20:18:54.947365ZINFO screenpipe_audio:: core::run_record_and_transcribe: starting continuous recording for System Audio (output) (30s segments)2026-04-09T20:18:58.125886ZINFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2732202531443799157, trigger=clipboard)₴6+...
|
NULL
|
8444330839776703392
|
NULL
|
clipboard
|
ocr
|
NULL
|
iTerm2•00ShellEditViewSessionScripts|ProfilesWindo iTerm2•00ShellEditViewSessionScripts|ProfilesWindowHelp100% [47 8• Thu 9 Apr 20:19:00screenpipe"83* Check today's app usage (... O *4DOCKERDEV (-zsh)182APP (-zsh)screenpipe"-zshwhisper_model_load: loading modelwhisper_model_load: n_vocab= 51865whisper_model_load: n_audio_ctx= 1500whisper_model_load: n_audio_state = 384whisper_model_load: n_audio_head= 6whisper_model_load: n_audio_layer = 4whisper_model_load: n_text_ctx= 448whisper_model_load: n_text_state = 384whisper_model_load: n_text_head= 6whisper_model_load: n_text_layer= 4whisper_model_load: n_mels= 80whisper_model_load: ftype= 1whisper_model_load:qntvr= 0whisper_model_load: type= 1 (tiny)whisper_model_load: adding 1608 extra tokenswhisper_model_load: n_langs= 99whisper_model_load:Metal totalsize =77.11 MBwhisper_model_load: model size77.11 MB2026-04-09T20:18:53.001173Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfullywhisper_backend_init_gpu: device 0: Metal (type: 1)whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)whisper_backend_init_gpu: using Metal backendCor Petol cropeription: erggml_metal_init: allocatingggml_metal_init: found device: Apple M1ggml_metal_init: picking default device: Apple M1ggml_metal_init: use fusion= trueggml_metal_init: use concurrency= trueggml_metal_init: use graph optimize = truewhisper_backend_init: using BLAS backendwhisper_init_state: kv self size =3.15 MBwhisper_init_state: kv cross size =9.44 MBwhisper_init_state: kv padsize =2.36 MBwhisper_init_state: compute buffer (conv)=14.17 MBwhisper_init_state: compute buffer (encode) =65.96 MBwhisper_init_state: compute buffer (cross)=8.50 MBwhisper_init_state: compute buffer (decode) = 96.83 MB2026-04-09T20:18:53.005400ZINFO screenpipe_audio:: audio_manager: :manager: transcription session created (will be reused across segments)2026-04-09T20:18:53.005773ZINFO screenpipe_audio::audio_manager::manager: audio manager started2026-04-09T20:18:53.005828ZINFO screenpipe_audio:: audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events2026-04-09T20:18:54.300159ZINFO screenpipe_audio: : device: :device_manager: starting recording for device: soundcore AeroClip (input)2026-04-09120:18:54.300247ZINFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for soundcore AeroClip (input) (30s segments)2026-04-09T20:18:54.947320ZINFO screenpipe_audio::device: :device_manager: starting recording for device: System Audio (output)2026-04-09T20:18:54.947365ZINFO screenpipe_audio:: core::run_record_and_transcribe: starting continuous recording for System Audio (output) (30s segments)2026-04-09T20:18:58.125886ZINFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2732202531443799157, trigger=clipboard)₴6+...
|
NULL
|
|
30377
|
619
|
8
|
2026-04-15T15:02:27.159649+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776265347159_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
177272322461901921134/200Imperial AgePlayer 8 Almi 177272322461901921134/200Imperial AgePlayer 8 Almish Yiltawar!!!---Villager Created--Halberdier Created---Elite Longbowman Created---Light Cavalry Created-1 kovaliklukas: 48059/48059E Magnus Olafsson: 40786/40786 8 IV8 Almish Yiltawar: 36793/36793 GIVRajyapala: 23275/23275NV6 LAez16 L0 12424/12424 2 IV7 Maximilian of Habsbung: 6531/6531 T IV3 HuaseÁn: 5931/52314 Lowig VI: 5792/5702Light Cavalry7+4+ 0+3/2+4kovaliklukas (Britons)5/60...
|
NULL
|
8443241750693224352
|
NULL
|
click
|
ocr
|
NULL
|
177272322461901921134/200Imperial AgePlayer 8 Almi 177272322461901921134/200Imperial AgePlayer 8 Almish Yiltawar!!!---Villager Created--Halberdier Created---Elite Longbowman Created---Light Cavalry Created-1 kovaliklukas: 48059/48059E Magnus Olafsson: 40786/40786 8 IV8 Almish Yiltawar: 36793/36793 GIVRajyapala: 23275/23275NV6 LAez16 L0 12424/12424 2 IV7 Maximilian of Habsbung: 6531/6531 T IV3 HuaseÁn: 5931/52314 Lowig VI: 5792/5702Light Cavalry7+4+ 0+3/2+4kovaliklukas (Britons)5/60...
|
30375
|
|
75135
|
1872
|
10
|
2026-04-23T10:37:55.220247+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-23/1776 /Users/lukas/.screenpipe/data/data/2026-04-23/1776940675220_m2.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeActivityMoreslackcalVIewMistonWindowhelp@ Desc HomeActivityMoreslackcalVIewMistonWindowhelp@ Describe what you are looking forJiminny ... ~# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages3 Aneliya Angelova, ...€. Vasil VasilevR. Adelina Petrova M8. Stoyan Tomovf.. Nikolay YankovP. Petko KashinskiR. Aneliya Angelova. Nikolay Nikolov&. Mario Georgiev% Todor Stamatov OC. Gabriela DurevaP. Galya Dimitrova E* Stefka Stoyanova2. Stoyan Tanev Elt: Apps• ToastJira Cloud@ Google Cale...& Aneliya Angelova, ...84MessagesAdd canvaUr FilesTukas Kovallk 10-12 AMда, ами добреToday ~ ня, на старитепепорти editediAneliya Angelova 10:14 AMтаитьла на репорта и Data source секцияташе показват поавилния периол нали -понеже това се разминаваше лпо сега.Lukas Kovalik 10:47 AMсега забелязах че стария count които сеползва в при контрол на достьпcanAccessAiRenort боои само ресултатикойто са поатени. не тези които сагeнериоаниNikolav Yankov 1:31 PMкакво значи които са пратени?по приниип условието беше - ако за user-aима генерирано и може ла го глела на атrevorts страницaтаLukas Kovalik 1:35 PMла, говоря за нешо още от прели, count.който се глела дали има user прaво ла глелаal-revorts стоаница, орои пратени не тезикойто са генериоани само. Реално ако сепраща всичко на ред почти няма да севижла пазлика editedMessage Aneliya Angel&a, Nikolay Yankov, Steli...+ Aa €C< 40 1 Support Daily-in 1h 23m ® 6T 100% C/3 Thu 23 Apr 13:37:55©github.com/jiminny/New TabAl reports promotion pages by nik• Jy-9712 | Nuges to expire after on8 Jiminnyu Userpilot | Saved Reports8 Jiminny. Jy 20541 extract common trait X+ New TabJy 20541 extract common traits #12008Vasil-Jiminny wants to merge 40 commits into master from JY-20541-extract-common-traitsapp() call inside ActivityPlaybookTrait: :getPlaybookapp/Services/Crm/Helpers/ActivityPlaybookTrait.php:35SplaybookResolver = app(Playbookkesolver::class);Using the service locator in the middle of a method makes this harder to test in isolation. CrmHelperRepository wasrightly injected — PlaybookResolver could follow the same pattern. Not a blocker, but worth noting as the trait ismeant to improve testability.getPlaybookCategory ordering is implicitapp/Services/Crm/Helpers/CrmHelperRepository.php:22→›orderBy("1d, "desc")Ordering by id desc and taking the first result is a tie-breaking heuristic (take the newest duplicate) but this intentionisn't documented. A comment explaining why duplicates may exist and the resolution strategy would prevent futuresurnrises.contact id bypasses the accessor patternapp/Services/Crm/Listeners/ConvertLeadActivities.php:124'contact_id' => $convertedLead->getAttribute('converted_contact_id'),Other converted IDs in the same method use typed accessor methods (e.g. getOpportunity() , getAccount() ), buconverted contact id goes directly through getAttribute. Minor inconsistency.Positives worth calling out• The N+1 fix in ConvertLeadActivities is well done — computing the update payload once and applying it to allactivities is clearly the right approach.• The withDelay docblock is excellent: it explains why the delay exists, not just what it does. That context would bevery hard to reconstruct later.Chaneieu tertcetwyrypse) te ant poyotegtreyayi: grepaybno th)/ ule tat oreuch cales (inctuing• The Dispatcher injection in SalesforcelService constructor is a good improvement for testability over theevent() helner...
|
NULL
|
8443080918863245057
|
NULL
|
click
|
ocr
|
NULL
|
HomeActivityMoreslackcalVIewMistonWindowhelp@ Desc HomeActivityMoreslackcalVIewMistonWindowhelp@ Describe what you are looking forJiminny ... ~# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages3 Aneliya Angelova, ...€. Vasil VasilevR. Adelina Petrova M8. Stoyan Tomovf.. Nikolay YankovP. Petko KashinskiR. Aneliya Angelova. Nikolay Nikolov&. Mario Georgiev% Todor Stamatov OC. Gabriela DurevaP. Galya Dimitrova E* Stefka Stoyanova2. Stoyan Tanev Elt: Apps• ToastJira Cloud@ Google Cale...& Aneliya Angelova, ...84MessagesAdd canvaUr FilesTukas Kovallk 10-12 AMда, ами добреToday ~ ня, на старитепепорти editediAneliya Angelova 10:14 AMтаитьла на репорта и Data source секцияташе показват поавилния периол нали -понеже това се разминаваше лпо сега.Lukas Kovalik 10:47 AMсега забелязах че стария count които сеползва в при контрол на достьпcanAccessAiRenort боои само ресултатикойто са поатени. не тези които сагeнериоаниNikolav Yankov 1:31 PMкакво значи които са пратени?по приниип условието беше - ако за user-aима генерирано и може ла го глела на атrevorts страницaтаLukas Kovalik 1:35 PMла, говоря за нешо още от прели, count.който се глела дали има user прaво ла глелаal-revorts стоаница, орои пратени не тезикойто са генериоани само. Реално ако сепраща всичко на ред почти няма да севижла пазлика editedMessage Aneliya Angel&a, Nikolay Yankov, Steli...+ Aa €C< 40 1 Support Daily-in 1h 23m ® 6T 100% C/3 Thu 23 Apr 13:37:55©github.com/jiminny/New TabAl reports promotion pages by nik• Jy-9712 | Nuges to expire after on8 Jiminnyu Userpilot | Saved Reports8 Jiminny. Jy 20541 extract common trait X+ New TabJy 20541 extract common traits #12008Vasil-Jiminny wants to merge 40 commits into master from JY-20541-extract-common-traitsapp() call inside ActivityPlaybookTrait: :getPlaybookapp/Services/Crm/Helpers/ActivityPlaybookTrait.php:35SplaybookResolver = app(Playbookkesolver::class);Using the service locator in the middle of a method makes this harder to test in isolation. CrmHelperRepository wasrightly injected — PlaybookResolver could follow the same pattern. Not a blocker, but worth noting as the trait ismeant to improve testability.getPlaybookCategory ordering is implicitapp/Services/Crm/Helpers/CrmHelperRepository.php:22→›orderBy("1d, "desc")Ordering by id desc and taking the first result is a tie-breaking heuristic (take the newest duplicate) but this intentionisn't documented. A comment explaining why duplicates may exist and the resolution strategy would prevent futuresurnrises.contact id bypasses the accessor patternapp/Services/Crm/Listeners/ConvertLeadActivities.php:124'contact_id' => $convertedLead->getAttribute('converted_contact_id'),Other converted IDs in the same method use typed accessor methods (e.g. getOpportunity() , getAccount() ), buconverted contact id goes directly through getAttribute. Minor inconsistency.Positives worth calling out• The N+1 fix in ConvertLeadActivities is well done — computing the update payload once and applying it to allactivities is clearly the right approach.• The withDelay docblock is excellent: it explains why the delay exists, not just what it does. That context would bevery hard to reconstruct later.Chaneieu tertcetwyrypse) te ant poyotegtreyayi: grepaybno th)/ ule tat oreuch cales (inctuing• The Dispatcher injection in SalesforcelService constructor is a good improvement for testability over theevent() helner...
|
75133
|
|
21442
|
474
|
23
|
2026-04-15T10:09:50.906980+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-15/1776 /Users/lukas/.screenpipe/data/data/2026-04-15/1776247790906_m2.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2002001002004/5Dark AgeGame Paused (P)Town Center0 2002001002004/5Dark AgeGame Paused (P)Town Center0/157 3/5kovalfklukas (Britons))2400/24006 Mindaugas: 180/1801 kovaliklukas: 178/1784 Siddhraj Jaisingh: 177/1773 Bird Jaguar: 173/173Anccu Hualloc: 173/1738 Ashikaga Takauji: 170/1707 Basil the Macedonian: 170/1705 Honorius: 170/170...
|
NULL
|
8443058075663191815
|
NULL
|
click
|
ocr
|
NULL
|
2002001002004/5Dark AgeGame Paused (P)Town Center0 2002001002004/5Dark AgeGame Paused (P)Town Center0/157 3/5kovalfklukas (Britons))2400/24006 Mindaugas: 180/1801 kovaliklukas: 178/1784 Siddhraj Jaisingh: 177/1773 Bird Jaguar: 173/173Anccu Hualloc: 173/1738 Ashikaga Takauji: 170/1707 Basil the Macedonian: 170/1705 Honorius: 170/170...
|
21440
|
|
60130
|
1297
|
33
|
2026-04-20T15:24:27.171348+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776698667171_m2.jpg...
|
Raycast
|
Raycast
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
VIewWindowHelp•Salestorce vCOLLECTIONS• Amazon con VIewWindowHelp•Salestorce vCOLLECTIONS• Amazon connectAmazon Connect Copy• AWS• SalesForcelecoe• XantiHITP <(url}/services/data/v50.0/tooling/query/E Docs Params•@uerv ParamsBody Cookies 3 Headers 9 Test"USON VPreviewN DeoudBod"O Chat o=+ New chat Proiects8 Artifactse CustomizePinnedBulgarian citizenshio application proces.Dawarich location tracking oroiectSalesforce APl errors with Organization!MacBook unexpected restarts and kanjiSecurity patch review and testing guidaiFood calorie values referenceTracking location history from last weekScreenpipe WAL processing when stoppReviewing recent conversation highlightsMac allases not recognizedBoosteroid still recording despite ignoreMissing JavaScript promise in authorizaLinuy SOl ite Ull for NASClaude API 500 internal server errorScreenpipe query capabilities and usageeGPU compatibility with Mac mini and SUnderstanding OpenRouter APl gatewa)Screenpipe 14-day retention explainedReddit homepage feed overviewDocker container not visible in console2 Lukas KovalikCAMIDONMCNTe> spfcs>FLOWS• Connect Git = Concole 5.l TerminSalesforce APl errors with Organization and FieldDefinition queries v->pluck('value'),The Tooling API FieldDefinition endooint adds almost nothing here that describe doesn'talready give vou — and it requires elevated permissions vou evidently don't have. Just usedescaide.relationshipName": null,"relationshiporder": nuu"restrictedbeletell: falsel"restrictedPicklist". false."searchPrerilterable": talse."soapType": "xsd:string","type" :"picklist","unnque": talse."writeRequiresMasterRead": false}, When calling /services/data/v50.0/tooling/query/?q=SELECTId. DataType. DeveloperName.Label.Length. Descript1onFROMFieldDefinitionWHEREDurableld = 'Event.Type' I getClaude is Al and can make mistakes. Please double-check responsesSonnet 4.6vGET https:lesmills.my.sale.‹ Type to filter entries...Todav/services/data/v50.0/tooling/que…."name"."/services/data/v50.0/sobjects/Ev...0 ..U /services/data/v50.0/tooling/que...SubjectIcorvicacidatolusA OlcahiontclOr•Clipboard History100% LzMOn ZU AO 10-24:21V. AlIn SaveSendbulk cait .*Variables in requestE tokenE url> All variablesAll Tivoes/services/data/v50.0/tooling/query/?q=SELEC1Id, DataType, DeveLoperName, Label, Length, DescriptionFieldDefinition"DurableId = 'Event.Type'InformationSourceContent tvneCharactersWordsPaste to ClaudePostmanText (Formatted)Actions8eKGiobals Vault Took -- m=m...
|
NULL
|
8442990226477944810
|
NULL
|
visual_change
|
ocr
|
NULL
|
VIewWindowHelp•Salestorce vCOLLECTIONS• Amazon con VIewWindowHelp•Salestorce vCOLLECTIONS• Amazon connectAmazon Connect Copy• AWS• SalesForcelecoe• XantiHITP <(url}/services/data/v50.0/tooling/query/E Docs Params•@uerv ParamsBody Cookies 3 Headers 9 Test"USON VPreviewN DeoudBod"O Chat o=+ New chat Proiects8 Artifactse CustomizePinnedBulgarian citizenshio application proces.Dawarich location tracking oroiectSalesforce APl errors with Organization!MacBook unexpected restarts and kanjiSecurity patch review and testing guidaiFood calorie values referenceTracking location history from last weekScreenpipe WAL processing when stoppReviewing recent conversation highlightsMac allases not recognizedBoosteroid still recording despite ignoreMissing JavaScript promise in authorizaLinuy SOl ite Ull for NASClaude API 500 internal server errorScreenpipe query capabilities and usageeGPU compatibility with Mac mini and SUnderstanding OpenRouter APl gatewa)Screenpipe 14-day retention explainedReddit homepage feed overviewDocker container not visible in console2 Lukas KovalikCAMIDONMCNTe> spfcs>FLOWS• Connect Git = Concole 5.l TerminSalesforce APl errors with Organization and FieldDefinition queries v->pluck('value'),The Tooling API FieldDefinition endooint adds almost nothing here that describe doesn'talready give vou — and it requires elevated permissions vou evidently don't have. Just usedescaide.relationshipName": null,"relationshiporder": nuu"restrictedbeletell: falsel"restrictedPicklist". false."searchPrerilterable": talse."soapType": "xsd:string","type" :"picklist","unnque": talse."writeRequiresMasterRead": false}, When calling /services/data/v50.0/tooling/query/?q=SELECTId. DataType. DeveloperName.Label.Length. Descript1onFROMFieldDefinitionWHEREDurableld = 'Event.Type' I getClaude is Al and can make mistakes. Please double-check responsesSonnet 4.6vGET https:lesmills.my.sale.‹ Type to filter entries...Todav/services/data/v50.0/tooling/que…."name"."/services/data/v50.0/sobjects/Ev...0 ..U /services/data/v50.0/tooling/que...SubjectIcorvicacidatolusA OlcahiontclOr•Clipboard History100% LzMOn ZU AO 10-24:21V. AlIn SaveSendbulk cait .*Variables in requestE tokenE url> All variablesAll Tivoes/services/data/v50.0/tooling/query/?q=SELEC1Id, DataType, DeveLoperName, Label, Length, DescriptionFieldDefinition"DurableId = 'Event.Type'InformationSourceContent tvneCharactersWordsPaste to ClaudePostmanText (Formatted)Actions8eKGiobals Vault Took -- m=m...
|
60129
|
|
84
|
3
|
34
|
2026-04-09T17:03:07.786731+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-09/1775 /Users/lukas/.screenpipe/data/data/2026-04-09/1775754187786_m1.jpg...
|
Safari
|
Order Room Service • HBO Max
|
True
|
https://play.hbomax.com/video/watch/16b35e6c-e745-
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Back
Bookmarks
Search
Favourites
Favourites
Favour Back
Bookmarks
Search
Favourites
Favourites
Favourites
Tab Group Favourites
Tab Group Favourites
Tab Group Favourites
NAS
NAS
NAS
Home
Home
Home
Portainer
Portainer
Portainer
Nginx Proxy Manager
Nginx Proxy Manager
Nginx Proxy Manager
App
App
App
Bitwarden Web vault
Bitwarden Web vault
Bitwarden Web vault
PDF Stirling
PDF Stirling
PDF Stirling...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Back","depth":3,"automation_id":"LibrarySidebarNavigationViewController.returnButton","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"Bookmarks","depth":3,"automation_id":"LibrarySidebarNavigationViewController._viewLabel","role_description":"text"},{"role":"AXButton","text":"Search","depth":6,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Favourites","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Favourites","depth":7,"automation_id":"BookmarksSidebarTableFolderCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Favourites","depth":8,"automation_id":"_NS:7","value":"Favourites","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Tab Group Favourites","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Tab Group Favourites","depth":7,"automation_id":"BookmarksSidebarTableFolderCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Tab Group Favourites","depth":8,"automation_id":"_NS:7","value":"Tab Group Favourites","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"NAS","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"NAS","depth":7,"automation_id":"BookmarksSidebarTableFolderCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"NAS","depth":8,"automation_id":"_NS:7","value":"NAS","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Home","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Home","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Home","depth":8,"automation_id":"_NS:7","value":"Home","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Portainer","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Portainer","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Portainer","depth":8,"automation_id":"_NS:7","value":"Portainer","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Nginx Proxy Manager","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Nginx Proxy Manager","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Nginx Proxy Manager","depth":8,"automation_id":"_NS:7","value":"Nginx Proxy Manager","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"App","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"App","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"App","depth":8,"automation_id":"_NS:7","value":"App","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"Bitwarden Web vault","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"Bitwarden Web vault","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"Bitwarden Web vault","depth":8,"automation_id":"_NS:7","value":"Bitwarden Web vault","role_description":"text field","is_enabled":true,"is_focused":false},{"role":"AXCell","text":"PDF Stirling","depth":6,"role_description":"cell"},{"role":"AXTextField","text":"PDF Stirling","depth":7,"automation_id":"BookmarksSidebarTableCellView","role_description":"text field","is_focused":false},{"role":"AXTextField","text":"PDF Stirling","depth":8,"automation_id":"_NS:7","value":"PDF Stirling","role_description":"text field","is_enabled":true,"is_focused":false}]...
|
8442746488558663357
|
-6882732368349935693
|
click
|
accessibility
|
NULL
|
Back
Bookmarks
Search
Favourites
Favourites
Favour Back
Bookmarks
Search
Favourites
Favourites
Favourites
Tab Group Favourites
Tab Group Favourites
Tab Group Favourites
NAS
NAS
NAS
Home
Home
Home
Portainer
Portainer
Portainer
Nginx Proxy Manager
Nginx Proxy Manager
Nginx Proxy Manager
App
App
App
Bitwarden Web vault
Bitwarden Web vault
Bitwarden Web vault
PDF Stirling
PDF Stirling
PDF Stirling...
|
NULL
|
|
5557
|
103
|
7
|
2026-04-13T13:18:42.645370+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-13/1776 /Users/lukas/.screenpipe/data/data/2026-04-13/1776086322645_m1.jpg...
|
Boosteroid
|
Boosteroid
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp•DOCKER* Unable to access screenpipe activity dataO ₴1DEV (-zsh)O 882APP (-zsh)• *3-zsh• 84-zsh• ₴5-zsh86-zsh®Bash(curl -s "http://localhost:3030/search?content_type=ocr&start_time=2026-04-11T00:00:00Z&end_time=2026-04-13T23:59:59Z&limit=5000&offset=0"im..)L Running..98% <RMon 13 Apr 16:18:421812>&1O 87python3* Unable to access s...-с "sash commandcurl -s "http://localhost:3030/search?content_type=ocr&start_time=2026-04-11T00:00:00Z&end_time=2026-04-13T23:59:59Z&limit=5000&offset=0"import json, sysfrom collections import defaultdictdata = json.load(sys.stdin)items = data.get('data', [])apps = defaultdict(int)windows = defaultdict(int)for item in items:c = item.get('content', (})app = c.get('app_name'"Unknown") orwindow = C.get('window_name', ""S or Unknown'apps[app] += 1if window:windows [f'[{app}] {window}'] += 1print(f'Total frames: {len(items)}')printOprint('=== Apps (frames) ===')for app, count in sorted(apps.items(), key=lambda x: -x[1]):print(f'{app}: {count}')printOprint('=== Top Windows ===')for w, count in sorted(windows.items(), key=lambda x: -x[1])[:25]:print(f' {count:4d}x {w[:110]}')" 2>81Run shell commando you want to proceed?• 1.Yes2.Yes, and don't ask again for similar commands in /Users/lukas3. Noisc to cancel • Tab to amend• ctrl+e to explainpython3 -c"...
|
NULL
|
8442715373531609501
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp•DOCKER* Unable to access screenpipe activity dataO ₴1DEV (-zsh)O 882APP (-zsh)• *3-zsh• 84-zsh• ₴5-zsh86-zsh®Bash(curl -s "http://localhost:3030/search?content_type=ocr&start_time=2026-04-11T00:00:00Z&end_time=2026-04-13T23:59:59Z&limit=5000&offset=0"im..)L Running..98% <RMon 13 Apr 16:18:421812>&1O 87python3* Unable to access s...-с "sash commandcurl -s "http://localhost:3030/search?content_type=ocr&start_time=2026-04-11T00:00:00Z&end_time=2026-04-13T23:59:59Z&limit=5000&offset=0"import json, sysfrom collections import defaultdictdata = json.load(sys.stdin)items = data.get('data', [])apps = defaultdict(int)windows = defaultdict(int)for item in items:c = item.get('content', (})app = c.get('app_name'"Unknown") orwindow = C.get('window_name', ""S or Unknown'apps[app] += 1if window:windows [f'[{app}] {window}'] += 1print(f'Total frames: {len(items)}')printOprint('=== Apps (frames) ===')for app, count in sorted(apps.items(), key=lambda x: -x[1]):print(f'{app}: {count}')printOprint('=== Top Windows ===')for w, count in sorted(windows.items(), key=lambda x: -x[1])[:25]:print(f' {count:4d}x {w[:110]}')" 2>81Run shell commando you want to proceed?• 1.Yes2.Yes, and don't ask again for similar commands in /Users/lukas3. Noisc to cancel • Tab to amend• ctrl+e to explainpython3 -c"...
|
NULL
|
|
42136
|
894
|
0
|
2026-04-17T06:49:04.644871+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-17/1776 /Users/lukas/.screenpipe/data/data/2026-04-17/1776408544644_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.comDaily - Platform • now100% 123 • Fri 17 Apr 9:49:04NNikolay Yankov (Presenting, annotating)ChromeFileViewHistoryWindowHelpInt9 ServicrFont AvlCost|cF Project( Fix Der[JY-97* Project|https://jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedissue=JY-2055388MI• Home | SalesforceEal DatadogPlatform Team88Q Sear$ Jy-20285 / Q JY-20553READY FDelays in CRM SyncReworkPhase:NudgesCOST-Ev DescriptionBacklogcrm_sync queue consistently contains messages with 18+ hours age, meanwhile the number of messages is not huge,5 .0therefore more worker won't help. Please make sure that the messages in this queue are processed timely - for not morethan 1-2 minutes.A JY-2Investicwhy exFontawMAINTEReady fe1 nD JY-2Approximate Age Of Oldest Message* is an AWS SQS metric that measures:The time elapsed since the oldest message was added to the queue and is still waiting to be received (picked up by aworker)AI Reppage dipromotAJ REPSBacklog6 .Metric ValueMeaning19 hoursA message (job) was dispatched 19 hours ago and has notyet been picked up by any worker[ JY-2SubtasksSend emailIssue with9:49 AM | Daily - PlatformJimine*dev.ap@ dev.apOCTLUYQ8• Fri 17 Apr 9:49dev.apC All BookmarksNikolay NikolovNikolay IvanovCode Review vDetailsAssigneeNikolay NikolovAssign to meReporter& Stefka StoyanovaDevelopmentQ Open with VS Code1 branch30 commits1 pull request1 buildComponentsPlatformSub-ProductAdd options* Improve Story2 othersNikolay Yankov16 hours agomeet.google.comNkolay Vackov (You, prese...Lukas Kovalik• 3:12=...
|
NULL
|
8442485671583718858
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.comDaily - Platform • now100% 123 • Fri 17 Apr 9:49:04NNikolay Yankov (Presenting, annotating)ChromeFileViewHistoryWindowHelpInt9 ServicrFont AvlCost|cF Project( Fix Der[JY-97* Project|https://jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedissue=JY-2055388MI• Home | SalesforceEal DatadogPlatform Team88Q Sear$ Jy-20285 / Q JY-20553READY FDelays in CRM SyncReworkPhase:NudgesCOST-Ev DescriptionBacklogcrm_sync queue consistently contains messages with 18+ hours age, meanwhile the number of messages is not huge,5 .0therefore more worker won't help. Please make sure that the messages in this queue are processed timely - for not morethan 1-2 minutes.A JY-2Investicwhy exFontawMAINTEReady fe1 nD JY-2Approximate Age Of Oldest Message* is an AWS SQS metric that measures:The time elapsed since the oldest message was added to the queue and is still waiting to be received (picked up by aworker)AI Reppage dipromotAJ REPSBacklog6 .Metric ValueMeaning19 hoursA message (job) was dispatched 19 hours ago and has notyet been picked up by any worker[ JY-2SubtasksSend emailIssue with9:49 AM | Daily - PlatformJimine*dev.ap@ dev.apOCTLUYQ8• Fri 17 Apr 9:49dev.apC All BookmarksNikolay NikolovNikolay IvanovCode Review vDetailsAssigneeNikolay NikolovAssign to meReporter& Stefka StoyanovaDevelopmentQ Open with VS Code1 branch30 commits1 pull request1 buildComponentsPlatformSub-ProductAdd options* Improve Story2 othersNikolay Yankov16 hours agomeet.google.comNkolay Vackov (You, prese...Lukas Kovalik• 3:12=...
|
42134
|
|
51624
|
1118
|
4
|
2026-04-20T06:15:44.344220+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776665744344_m1.jpg...
|
PhpStorm
|
faVsco.js – ~/jiminny/app/front-end/src/components faVsco.js – ~/jiminny/app/front-end/src/components/connect/connect.vue...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11986 on JY-20692-fix-in Project: faVsco.js, menu
#11986 on JY-20692-fix-integration-app-toke…hange, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions...
|
[{"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":"#11986 on JY-20692-fix-integration-app-toke…hange, menu","depth":5,"help_text":"Pull request #11986 exists for current branch JY-20692-fix-integration-app-toke…hange","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}]...
|
8441868302252650497
|
1774700050893719750
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#11986 on JY-20692-fix-in Project: faVsco.js, menu
#11986 on JY-20692-fix-integration-app-toke…hange, menu
Start Listening for PHP Debug Connections
AutomatedReportsCommandTest
Run 'AutomatedReportsCommandTest'
Debug 'AutomatedReportsCommandTest'
More Actions
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelpDaily - Platform - in 30m100% <78Mon 20 Apr 9:15:44screenpipe"181DOCKERO ₴18852026-04-20109:09:04.511440Z2026-04-20T09:09:04.519984Zscreenpipe"* Review screenpipe U...• 86entries, coveragefrom2026-04-1906:09:04.509295 UTC-zsh2026-04-20T09:09:04.547289Z2026-04-20109:09:04.96542522026-04-20T09:09:04.965463Z2026-04-20T09:09:04.965503Z2026-04-20109:09:05.22698222026-04-20T09:09:05.227016Z2026-04-20T09:09:05.227136ZDEV (-zsh)₴2APP (-zsh)*3-zsh84INFOscreenpipe_engine::hot_frame_cache:hot_frame_cache:warmedwith & frameINFOscreenpipe_engine::server:Server listening on [IP_ADDRESS]:3030INFOscreenpipe_connect::mdns:mdns:advertising screenpipe onport 3030INFOscreenpipe_engine::vision_manager::manager: Starting vision recordingfor monitor 1 (1440x900)INFOscreenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device:monitor_1)INFOscreenpipe_engine::event_driven_capture: event-driven capture startedfor monitor 1 (device: monitor_1)INFOscreenpipe_engine::vision_manager::manager: Starting vision recordingfor monitor 2 (3008x1253)INFOscreenpipe_engine::vision_manager::manager:Starting event-driven capture for monitor 2 (device: monitor_2)screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstoppoll)2026-04-20109:09:05.227375ZINFOscreenpipe_engine::event_driven_capture:event-driven capturestarted for monitor 2 (device:monitor_2)2026-04-20T09:09:07.300820ZINFOsck_rs::stream_manager:persistent SCK streamstarted fordisplay 1 (1440x900,2fps, 3 excluded)2026-04-20T09:09:07.600290ZINFOscreenpipe_engine::event_driven_capture:startupcapture for monitor 1: frame_id=51507, dur=136ms2026-04-20109:09:07.6837362INFO sck_rs::stream_manager:persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)2026-04-20T09:09:07.989000ZINFOscreenpipe_engine::event_driven_capture:startupcapture for monitor 2: frame_id=51508,dur=185ms2026-04-20109:10:09.2314562WARNsqlx::query:FROM\nISNOTsummary-"SELECT id, snapshot_path, device_name, "db.statement="\n\nSELECT\nNULL\nANDdevicetimestamoASC\nLIMIT\nid, \nframes\nWHERE\nsnapshot.pathtimestamo < ?1\ nORDER BYInname\ns0001n"snapshot_path, \ndevice_name, \ntimestamp \nrowsaffected arowsreturned 197 elapsed-4.915444333s20.PS$IN04-20109:10:38628622026-04-20T09:10:23.507120Z2026-04-20T09:11:42.391615Z2026-04-20T09:11:42.475795Z2026-04-20T09:11:44.750359Z2026-04-20T09:11:44.980679Z2026-04-20109:11:53.686192Z2026-04-20T09:11:53.738064Z2026-04-20T09:11:56.291827Z2026-04-20709:11:56.45108322026-04-20T09:12:46.023481Z2026-04-20T09:12:49.049656Z2026-04-20T09:13:23.025287Z2026-04-20T09:13:28.322087Z2026-04-20T09:14:35.739274Z2026-04-20T09:15:24.523245ZFROM\nframes \nWHERE\n0652833s2026-04-20T09:15:24.523440Z2026-04-20T09:15:37.319126Z381381nash=6-4381eenpipe_engine::snapshotlsnapscompaction:17.9MB- 8MBRhpStorm.cheшnecompaction2MB0..6x),100 JPEGSdeleted14PEGSdeletedINFOscreenpipe_engine::event_driven_capture:contentdedup:skippingcaptureINFOscreenpipe_engine::event_driven_capture:contentdedup:skippingfor monitor 1 (hash=6544687314381512705,trigger=click)capture for monitor 2 (hash=6544687314381512705,trigger=click)INFOINFOscreenpipe_engine::event_driven_capture:contentdedup:skippingcapture for monitor 1 (hash=6544687314381512705,trigger=click)screenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 1 (hash=6544687314381512705,trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 2 (hash=6544687314381512705,trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 2 (hash=6544687314381512705,trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 1 (hash=6544687314381512705,trigger=click)INFOscreenpipe_engine::event_driven_capture:contentdedup: skippingcapture for monitor 1 (hash=6544687314381512705,trigger=click)INFOscreenpipe_engine::event_driven_capture:contentdedup:skipping capture for monitor 2 (hash=6544687314381512705, trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 2 (hash=1367434359766307217, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: contentdedup:INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 2 (hash=1367434359766307217, trigger=visual_change)skipping capture for monitor 2 (hash=596503974090759224, trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 2 (hash=3622643354436184557, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup:skipping capturefor monitor 2 (hash=-3577748614007823836, trigger=click)WARN sqlx::query:summary="SELECT id,snapshot_path, device_name,db.statement="\n\nSELECT\nid, Insnapshot_path, \ndevice_name, \nsnapshot_path IS NOT NULL\nANDtimestamp < ?1\nORDER BY\ndevice_name, \ntimestamp ASC\nLIMIT\n5000\n"timestamp\nrows_affected=0 rows_returned=3 elapsed=1.84INFOscreenpipe_engine::snapshot_compaction: snapshotcompaction: found 3 eligible framesINFO screenpipe_engine::event_driven_capture: contentdedup: skipping capture for monitor 2 (hash=-7719336893453902381, trigger=click)...
|
NULL
|