|
6421
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
Service-Desk - Queues - Platform team - Service space - Jira
Service-Desk - Queues - Platform team - Service space - Jira
Jy 20807 check various issues with stages by nikolaybiaivanov · Pull Request #12041 · jiminny/app
Jy 20807 check various issues with stages by nikolaybiaivanov · Pull Request #12041 · jiminny/app
Illuminate\Queue\MaxAttemptsExceededException: Jiminny\Jobs\Activity\DeleteTeamChurnData has been attempted too many times. — jiminny — app
Illuminate\Queue\MaxAttemptsExceededException: Jiminny\Jobs\Activity\DeleteTeamChurnData has been attempted too many times. — jiminny — app
Pull requests · jiminny/app
Pull requests · jiminny/app
Userpilot | Ask Jiminny Report Generated
Userpilot | Ask Jiminny Report Generated
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
Problem loading page
Problem loading page
Search the CRM - HubSpot docs
Search the CRM - HubSpot docs
Jiminny
Jiminny
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
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
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New)
Jiminny (New)
Platform Team
Platform Team
Add people
Add people
Board actions
Board actions
Share
Automation
Give feedback
Give feedback
Enter full screen
Enter full screen
Summary
Summary
Timeline
Timeline
Backlog
Backlog
Active sprints
Active sprints
Calendar
Calendar
Reports
Reports
Testing Board
Testing Board
List
List
Forms
Forms
Components
Components
Development
Development
Code
Code
8 more tabs
More
8
Add to navigation
As you type to search or apply filters, the board updates with work items to match.
Search on current page
Filter by assignee
Filter assignees by Lukas Kovalik
Filter assignees by Aneliya Angelova
Filter assignees by Nikolay Ivanov
Filter assignees by Nikolay Nikolov
Filter assignees by Steliyan Georgiev
Filter assignees by Unassigned
Epic
Epic
Type
Type
Quick filters
Quick filters
Complete sprint
Complete sprint
Sprint details
Sprint details
Group by Queries
Group
: Queries
Sprint insights
Sprint insights
View settings
View settings
More actions
More actions
Ready For DEV
READY FOR DEV
1
JY-19951 Setup test coverage for Prophet in Sonar. Use the enter key to load the work item.
Setup test coverage for Prophet in Sonar
MAINTENANCE
Backlog
JY-19951
JY-19951
1
In DEV
IN DEV
5
JY-20493 Smart Instant Nudge Pre-filtering. Use the enter key to load the work item.
Smart Instant Nudge Pre-filtering
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-20493
JY-20493
3.5
pull request
JY-20566 AI Review - Q1 - Summary/Action items/Key Points. Use the enter key to load the work item.
AI Review - Q1 - Summary/Action items/Key Points
Growth - Maintain our competitive position, Edit Parent
GROWTH - MAINTAIN OUR COMPETITIVE POSITION
In Dev
JY-20566
JY-20566
2
Successful deployment to production.
JY-20625 [POC]Jiminny MCP Connector. Use the enter key to load the work item.
[POC]Jiminny MCP Connector
JIMINNY MCP CONNECTOR
In Progress
JY-20625
JY-20625
10
JY-20361 AJ Panorama for Call Scoring in OD. Use the enter key to load the work item.
AJ Panorama for Call Scoring in OD
AUTOMATED AI SCORING
In Dev
JY-20361
JY-20361
2.5
JY-20725 [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts. Use the enter key to load the work item.
[HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts
PLATFORM STABILITY
In Dev
JY-20725
JY-20725
4
Code Review
CODE REVIEW
Create work item in Code Review
Create
Blocked
BLOCKED
Create work item in Blocked
Create
QA
QA
1
Create work item
JY-20352 Sync opportunities without a local owner (user_id is null). Use the enter key to load the work item.
Sync opportunities without a local owner (user_id is null)
Platform Stability, Edit Parent
PLATFORM STABILITY
In QA...
|
Firefox
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira — Work...
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37...
|
6421
|
|
6420
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
Service-Desk - Queues - Platform team - Service space - Jira
Service-Desk - Queues - Platform team - Service space - Jira
Jy 20807 check various issues with stages by nikolaybiaivanov · Pull Request #12041 · jiminny/app
Jy 20807 check various issues with stages by nikolaybiaivanov · Pull Request #12041 · jiminny/app
Illuminate\Queue\MaxAttemptsExceededException: Jiminny\Jobs\Activity\DeleteTeamChurnData has been attempted too many times. — jiminny — app
Illuminate\Queue\MaxAttemptsExceededException: Jiminny\Jobs\Activity\DeleteTeamChurnData has been attempted too many times. — jiminny — app
Pull requests · jiminny/app
Pull requests · jiminny/app
Userpilot | Ask Jiminny Report Generated
Userpilot | Ask Jiminny Report Generated
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
Problem loading page
Problem loading page
Search the CRM - HubSpot docs
Search the CRM - HubSpot docs
Jiminny
Jiminny
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
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
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions
Board actions
SE Kanban
SE Kanban
Board actions
Board actions
Service-Desk
Service-Desk
More actions for Service-Desk
More actions for Service-Desk
More spaces
More spaces
Filters
Filters
More actions for Filters
More actions for Filters
Dashboards
Dashboards
Create dashboard
Create dashboard
More actions for Dashboards
More actions for Dashboards
Operations
Operations
More actions for Operations
More actions for Operations
Confluence , (opens new window)
Confluence
, (opens new window)
Teams , (opens new window)
Teams
, (opens new window)
open menu
open menu
Customise sidebar
Customise sidebar
Resize side navigation panel
Spaces
Spaces
/
Jiminny (New)
Jiminny (New)
Platform Team
Platform Team
Add people
Add people
Board actions
Board actions
Share
Automation
Give feedback
Give feedback
Enter full screen
Enter full screen
Summary
Summary
Timeline
Timeline
Backlog
Backlog
Active sprints
Active sprints
Calendar
Calendar
Reports
Reports
Testing Board
Testing Board
List
List
Forms
Forms
Components
Components
Development
Development
Code
Code
8 more tabs
More
8
Add to navigation
As you type to search or apply filters, the board updates with work items to match.
Search on current page
Filter by assignee
Filter assignees by Lukas Kovalik
Filter assignees by Aneliya Angelova
Filter assignees by Nikolay Ivanov
Filter assignees by Nikolay Nikolov
Filter assignees by Steliyan Georgiev
Filter assignees by Unassigned
Epic
Epic
Type
Type
Quick filters
Quick filters
Complete sprint
Complete sprint
Sprint details
Sprint details
Group by Queries
Group
: Queries
Sprint insights
Sprint insights
View settings
View settings
More actions
More actions
Ready For DEV
READY FOR DEV
1
JY-19951 Setup test coverage for Prophet in Sonar. Use the enter key to load the work item.
Setup test coverage for Prophet in Sonar
MAINTENANCE
Backlog
JY-19951
JY-19951
1
In DEV
IN DEV
5
JY-20493 Smart Instant Nudge Pre-filtering. Use the enter key to load the work item.
Smart Instant Nudge Pre-filtering
Cost-effective and faster nudges, Edit Parent
COST-EFFECTIVE AND FASTER NUDGES
In Dev
JY-20493
JY-20493
3.5
pull request
JY-20566 AI Review - Q1 - Summary/Action items/Key Points. Use the enter key to load the work item.
AI Review - Q1 - Summary/Action items/Key Points
Growth - Maintain our competitive position, Edit Parent
GROWTH - MAINTAIN OUR COMPETITIVE POSITION
In Dev
JY-20566
JY-20566
2
Successful deployment to production.
JY-20625 [POC]Jiminny MCP Connector. Use the enter key to load the work item.
[POC]Jiminny MCP Connector
JIMINNY MCP CONNECTOR
In Progress
JY-20625
JY-20625
10
JY-20361 AJ Panorama for Call Scoring in OD. Use the enter key to load the work item.
AJ Panorama for Call Scoring in OD
AUTOMATED AI SCORING
In Dev
JY-20361
JY-20361
2.5
JY-20725 [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts. Use the enter key to load the work item.
[HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts
PLATFORM STABILITY
In Dev
JY-20725
JY-20725
4
Code Review
CODE REVIEW
Create work item in Code Review
Create
Blocked
BLOCKED
Create work item in Blocked
Create
QA
QA
1
Create work item
JY-20352 Sync opportunities without a local owner (user_id is null). Use the enter key to load the work item.
Sync opportunities without a local owner (user_id is null)
Platform Stability, Edit Parent
PLATFORM STABILITY
In QA
JY-20352
JY-20352
3
pull request
Assignee: Nikolay Ivanov
Create work item in QA
Create
PO Acceptance
PO ACCEPTANCE
Create work item in PO Acceptance
Create
Deploy
DEPLOY
7
JY-20372 AI Reports > Empty page design and promotion . Use the enter key to load the work item.
AI Reports > Empty page design and promotion
AJ REPORTS
Deployed
JY-20372
JY-20372
1
merged pull request
JY-20726 Grok via Azure. Use the enter key to load the work item.
Grok via Azure
MAINTENANCE
Deployed
JY-20726
JY-20726
1
Successful deployment to production.
JY-20770 Allow users to delete SS and Panorama prompts when those are used in a Report. Use the enter key to load the work item.
Allow users to delete SS and Panorama prompts when those are used in a Report
AJ REPORTS
Deployed
JY-20770
JY-20770
1
merged pull request
JY-20740 Release AJ Panorama reports to customers. Use the enter key to load the work item.
Release AJ Panorama reports to customers
AJ REPORTS
Deployed
JY-20740
JY-20740
0.5
merged pull request
JY-20699 Wrong formatting for summary in the CRM. Use the enter key to load the work item.
Wrong formatting for summary in the CRM...
|
Firefox
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira — Work...
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37...
|
6420
|
|
6419
|
2026-05-07T18:54:55.497046Z INFO screenpipe_engin 2026-05-07T18:54:55.497046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.231994Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.390410Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:55:06.295831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:07.396377Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:09.839989Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.048912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.804975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:11.059957Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.429679Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.659109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T18:55:23.935445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:24.058698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.178955Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.277855Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.129525Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.220403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:29.968445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.091636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.772215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.971040Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:32.549943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:32.978942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:35.570244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:47.355478Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.021248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.071082Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.861594Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:53.391510Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:53.458575Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:54.852127Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:55.741088Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:55.784717Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:59.855145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:00.061907Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:03.871033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:04.045971Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:06.982604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:09.887383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:10.072147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:12.860759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.008559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.689350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.888636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.676147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.858123Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:19.730668Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:21.116711Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:22.863392Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:25.857382Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:25.944869Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.736339Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.968277Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:34.697492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:35.493000Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:35.997405Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:36.243674Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.035501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.253420Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:40.873703Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:45.521180Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:48.170505Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:50.281026Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:50.469078Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.106211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.210447Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:57:22.940226Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:24.886659Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:24.943247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.711432Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.778020Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:29.024539Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:39.958516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.017451Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.803199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.851828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:44.583381Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:53.646842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:57:59.683165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:58:01.681512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:01.846528Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.296271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.439879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.063837Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.294769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:12.234562Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:15.252484Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:19.561623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:19.616652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.527237Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.877910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.554625Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.753207Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:33.910173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.138517Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.809937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.056953Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.346155Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.352776Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.504554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.976103Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.680653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.763338Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:43.792492Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 28 eligible frames
2026-05-07T18:58:44.847366Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.1x), 13 JPEGs deleted
2026-05-07T18:58:46.331780Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.7MB → 0.9MB (3.1x), 13 JPEGs deleted
2026-05-07T18:58:48.678585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:48.746019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.493557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.753975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.506759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.562677Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:59:02.164937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:02.359714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:07.935656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:20.555025Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:20.730118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.230889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.423662Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:24.957602Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:25.034890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:30.508120Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:36.354586Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:41.219685Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:45.536516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:54.454983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:57.496471Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:03.563631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:13.988490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:00:20.601584Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:00:24.762368Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:33.859654Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:37.007926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:39.897769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:42.942322Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:22.281415Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:34.487702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:35.618441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:37.608854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:38.423692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:43.325171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:44.635564Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:45.829351Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:47.566583Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:50.495459Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:02.758077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:05.639442Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:20.806652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:26.822902Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:29.836228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:38.912980Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:59.720424Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:02:59.781165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:03.524624Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:06.546298Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:10.484878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.021174Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.881960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:15.840626Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:16.930320Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:17.004444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:29.126718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:29.294389Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.141758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.235461Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:33.732408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:03:35.376128Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:35.474160Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:46.409563Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 26 eligible frames
2026-05-07T19:03:47.459920Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.3x), 13 JPEGs deleted
2026-05-07T19:03:47.478596Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:47.685688Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:48.638329Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.4MB → 0.9MB (2.7x), 11 JPEGs deleted
2026-05-07T19:04:08.116536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:08.325939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.048145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.143715Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.071599Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.251285Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:23.971234Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.733221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.860501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.720920Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.887707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.428290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.672954Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.345560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.435702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.955499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:14.123752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.832581Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.921333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.424048Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.639049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-05-07T19:05:24.585422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:24.763680Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:25.722186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:26.037507Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:27.058882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:51.616832Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:27.553495Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:49.097515Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:58.139828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:07:00.501236Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:07:22.494893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:07:25.541755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:08:48.672330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 49 eligible frames
2026-05-07T19:08:49.959722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 4.3MB → 0.4MB (10.2x), 20 JPEGs deleted
2026-05-07T19:08:52.053246Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 5.5MB → 2.0MB (2.7x), 27 JPEGs deleted
2026-05-07T19:09:24.524329Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:24.612542Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:56.724979Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:01.650171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:01.826705Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:02.894140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.771983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.962915Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.265782Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.415849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.827601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.956116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-05-07T19:10:32.051747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.141992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.911018Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:33.089188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.381195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.555111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:50.328077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.206906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.325017Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:57.111987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:58.935835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.791235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.892227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:04.654271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:11:09.783149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:10.922882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=visual_change)
2026-05-07T19:11:28.192704Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.083215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.270039Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:33.962918Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:34.153653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:42.021041Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.349693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.448166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:53.540965Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:56.520852Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:57.583112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=click)
2026-05-07T19:11:57.675537Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2382966049842329946, trigger=click)
2026-05-07T19:12:09.016494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.193611Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.920554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:10.162751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:17.749896Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:19.865640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:20.037736Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:21.229308Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:25.708397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:25.890046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.386069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.459158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:29.987752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:31.002923Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:31.055807Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:33.107450Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:36.037286Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:36.207370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.110854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.184943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:42.211049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:13:52.073799Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 52 eligible frames
2026-05-07T19:13:53.640097Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 5.4MB → 0.5MB (11.6x), 25 JPEGs deleted
2026-05-07T19:13:56.148303Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.9MB → 2.1MB (2.4x), 25 JPEGs deleted
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T19:15:32.114719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:32.277006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.023332Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.221489Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:35.156276Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:41.068772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:44.092868Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:18:56.195685Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-05-07T19:18:57.138533Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.0MB → 0.4MB (7.3x), 14 JPEGs deleted
2026-05-07T19:18:58.608172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.4MB → 1.3MB (2.6x), 18 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:22:06.254072Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:06.376479Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:07.042289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:23:58.623977Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames
2026-05-07T19:23:59.596007Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB (6.1x), 11 JPEGs deleted
2026-05-07T19:24:00.891142Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 2.7MB → 1.1MB (2.5x), 14 JPEGs deleted
2026-05-07T19:24:36.746388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:24:42.261437Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=visual_change)
2026-05-07T19:25:14.335824Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:14.501546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:18.608719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=visual_change)
2026-05-07T19:25:21.337705Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:21.444990Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-05-07T19:25:24.322060Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:24.497521Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:29.631670Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:25:29.804593Z INFO screenpipe_engine::event_driven_capture: content de...
|
iTerm2
|
screenpipe"
|
NULL
|
6419
|
|
6418
|
2026-05-07T18:54:10.198532Z INFO screenpipe_engin 2026-05-07T18:54:10.198532Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:10.266719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:12.661911Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:12.842182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:19.916432Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:33.125327Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=visual_change)
2026-05-07T18:54:36.216703Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=visual_change)
2026-05-07T18:54:40.760746Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:47.130927Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:47.189988Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:54.400631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:54.554825Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:55.270880Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:55.497046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.231994Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.390410Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:55:06.295831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:07.396377Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:09.839989Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.048912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.804975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:11.059957Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.429679Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.659109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T18:55:23.935445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:24.058698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.178955Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.277855Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.129525Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.220403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:29.968445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.091636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.772215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.971040Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:32.549943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:32.978942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:35.570244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:47.355478Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.021248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.071082Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.861594Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:53.391510Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:53.458575Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:54.852127Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:55.741088Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:55.784717Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:59.855145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:00.061907Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:03.871033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:04.045971Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:06.982604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:09.887383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:10.072147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:12.860759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.008559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.689350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.888636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.676147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.858123Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:19.730668Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:21.116711Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:22.863392Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:25.857382Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:25.944869Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.736339Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.968277Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:34.697492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:35.493000Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:35.997405Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:36.243674Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.035501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.253420Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:40.873703Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:45.521180Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:48.170505Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:50.281026Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:50.469078Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.106211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.210447Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:57:22.940226Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:24.886659Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:24.943247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.711432Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.778020Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:29.024539Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:39.958516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.017451Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.803199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.851828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:44.583381Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:53.646842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:57:59.683165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:58:01.681512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:01.846528Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.296271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.439879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.063837Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.294769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:12.234562Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:15.252484Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:19.561623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:19.616652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.527237Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.877910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.554625Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.753207Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:33.910173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.138517Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.809937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.056953Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.346155Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.352776Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.504554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.976103Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.680653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.763338Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:43.792492Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 28 eligible frames
2026-05-07T18:58:44.847366Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.1x), 13 JPEGs deleted
2026-05-07T18:58:46.331780Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.7MB → 0.9MB (3.1x), 13 JPEGs deleted
2026-05-07T18:58:48.678585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:48.746019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.493557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.753975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.506759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.562677Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:59:02.164937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:02.359714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:07.935656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:20.555025Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:20.730118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.230889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.423662Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:24.957602Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:25.034890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:30.508120Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:36.354586Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:41.219685Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:45.536516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:54.454983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:57.496471Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:03.563631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:13.988490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:00:20.601584Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:00:24.762368Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:33.859654Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:37.007926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:39.897769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:42.942322Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:22.281415Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:34.487702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:35.618441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:37.608854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:38.423692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:43.325171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:44.635564Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:45.829351Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:47.566583Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:50.495459Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:02.758077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:05.639442Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:20.806652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:26.822902Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:29.836228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:38.912980Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:59.720424Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:02:59.781165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:03.524624Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:06.546298Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:10.484878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.021174Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.881960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:15.840626Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:16.930320Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:17.004444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:29.126718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:29.294389Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.141758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.235461Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:33.732408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:03:35.376128Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:35.474160Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:46.409563Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 26 eligible frames
2026-05-07T19:03:47.459920Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.3x), 13 JPEGs deleted
2026-05-07T19:03:47.478596Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:47.685688Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:48.638329Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.4MB → 0.9MB (2.7x), 11 JPEGs deleted
2026-05-07T19:04:08.116536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:08.325939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.048145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.143715Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.071599Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.251285Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:23.971234Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.733221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.860501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.720920Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.887707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.428290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.672954Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.345560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.435702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.955499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:14.123752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.832581Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.921333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.424048Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.639049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-05-07T19:05:24.585422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:24.763680Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:25.722186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:26.037507Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:27.058882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:51.616832Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:27.553495Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:49.097515Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:58.139828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:07:00.501236Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:07:22.494893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:07:25.541755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:08:48.672330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 49 eligible frames
2026-05-07T19:08:49.959722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 4.3MB → 0.4MB (10.2x), 20 JPEGs deleted
2026-05-07T19:08:52.053246Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 5.5MB → 2.0MB (2.7x), 27 JPEGs deleted
2026-05-07T19:09:24.524329Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:24.612542Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:56.724979Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:01.650171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:01.826705Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:02.894140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.771983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.962915Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.265782Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.415849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.827601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.956116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-05-07T19:10:32.051747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.141992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.911018Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:33.089188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.381195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.555111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:50.328077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.206906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.325017Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:57.111987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:58.935835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.791235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.892227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:04.654271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:11:09.783149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:10.922882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=visual_change)
2026-05-07T19:11:28.192704Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.083215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.270039Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:33.962918Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:34.153653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:42.021041Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.349693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.448166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:53.540965Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:56.520852Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:57.583112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=click)
2026-05-07T19:11:57.675537Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2382966049842329946, trigger=click)
2026-05-07T19:12:09.016494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.193611Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.920554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:10.162751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:17.749896Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:19.865640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:20.037736Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:21.229308Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:25.708397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:25.890046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.386069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.459158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:29.987752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:31.002923Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:31.055807Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:33.107450Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:36.037286Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:36.207370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.110854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.184943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:42.211049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:13:52.073799Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 52 eligible frames
2026-05-07T19:13:53.640097Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 5.4MB → 0.5MB (11.6x), 25 JPEGs deleted
2026-05-07T19:13:56.148303Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.9MB → 2.1MB (2.4x), 25 JPEGs deleted
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T19:15:32.114719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:32.277006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.023332Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.221489Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:35.156276Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:41.068772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:44.092868Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:18:56.195685Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-05-07T19:18:57.138533Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.0MB → 0.4MB (7.3x), 14 JPEGs deleted
2026-05-07T19:18:58.608172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.4MB → 1.3MB (2.6x), 18 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:22:06.254072Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:06.376479Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:07.042289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:23:58.623977Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: f...
|
iTerm2
|
screenpipe"
|
NULL
|
6418
|
|
6417
|
2026-05-07T18:54:06.694530Z INFO screenpipe_engin 2026-05-07T18:54:06.694530Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:10.198532Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:10.266719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:12.661911Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:12.842182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:19.916432Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:33.125327Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=visual_change)
2026-05-07T18:54:36.216703Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=visual_change)
2026-05-07T18:54:40.760746Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:47.130927Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:47.189988Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-725354089524067917, trigger=click)
2026-05-07T18:54:54.400631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:54.554825Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:55.270880Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:55.497046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.231994Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8698828128144406184, trigger=click)
2026-05-07T18:54:56.390410Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8698828128144406184, trigger=click)
2026-05-07T18:55:06.295831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:07.396377Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:09.839989Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.048912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:10.804975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:11.059957Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.429679Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:13.659109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T18:55:23.935445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:24.058698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.178955Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:25.277855Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.129525Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:28.220403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:29.968445Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.091636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.772215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:30.971040Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:32.549943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:32.978942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:35.570244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:47.355478Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.021248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.071082Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:51.861594Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:53.391510Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:53.458575Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:54.852127Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:55:55.741088Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:55.784717Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:55:59.855145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:00.061907Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:03.871033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:04.045971Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:06.982604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:09.887383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:10.072147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:12.860759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.008559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.689350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:13.888636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.676147Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:16.858123Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:19.730668Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:21.116711Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:22.863392Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=visual_change)
2026-05-07T18:56:25.857382Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:25.944869Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.736339Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:27.968277Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7191546387729565793, trigger=click)
2026-05-07T18:56:34.697492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:35.493000Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:35.997405Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:36.243674Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.035501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:38.253420Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:40.873703Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:45.521180Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:48.170505Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=visual_change)
2026-05-07T18:56:50.281026Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:50.469078Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.106211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:56:51.210447Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:57:22.940226Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:24.886659Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:24.943247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.711432Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:27.778020Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:29.024539Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:39.958516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.017451Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.803199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:40.851828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9060737059899569463, trigger=click)
2026-05-07T18:57:44.583381Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9060737059899569463, trigger=visual_change)
2026-05-07T18:57:53.646842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:57:59.683165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=visual_change)
2026-05-07T18:58:01.681512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:01.846528Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.296271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:05.439879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.063837Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:08.294769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5104323009125083167, trigger=click)
2026-05-07T18:58:12.234562Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:15.252484Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=visual_change)
2026-05-07T18:58:19.561623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:19.616652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.527237Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:23.877910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.554625Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:27.753207Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:33.910173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.138517Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:34.809937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.056953Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:35.346155Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.352776Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.504554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:37.976103Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.680653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:38.763338Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2148254964752043084, trigger=click)
2026-05-07T18:58:43.792492Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 28 eligible frames
2026-05-07T18:58:44.847366Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.1x), 13 JPEGs deleted
2026-05-07T18:58:46.331780Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.7MB → 0.9MB (3.1x), 13 JPEGs deleted
2026-05-07T18:58:48.678585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:48.746019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.493557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:49.753975Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.506759Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:58:51.562677Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7711496428252417823, trigger=click)
2026-05-07T18:59:02.164937Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:02.359714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:07.935656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4196246356071550057, trigger=click)
2026-05-07T18:59:20.555025Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:20.730118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.230889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:21.423662Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:24.957602Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:25.034890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:30.508120Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:36.354586Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:41.219685Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T18:59:45.536516Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:54.454983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T18:59:57.496471Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:03.563631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:13.988490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:00:20.601584Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:00:24.762368Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:33.859654Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:37.007926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:39.897769Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:00:42.942322Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:22.281415Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:34.487702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:35.618441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:37.608854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:38.423692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:43.325171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:44.635564Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:45.829351Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:01:47.566583Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:01:50.495459Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:02.758077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:05.639442Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:20.806652Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:26.822902Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:29.836228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:38.912980Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:02:59.720424Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:02:59.781165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:03.524624Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:06.546298Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:10.484878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.021174Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:12.881960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:15.840626Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=visual_change)
2026-05-07T19:03:16.930320Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:17.004444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7035948308583544848, trigger=click)
2026-05-07T19:03:29.126718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:29.294389Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.141758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:31.235461Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:33.732408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:03:35.376128Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:35.474160Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:46.409563Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 26 eligible frames
2026-05-07T19:03:47.459920Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.8MB → 0.4MB (7.3x), 13 JPEGs deleted
2026-05-07T19:03:47.478596Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:47.685688Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:03:48.638329Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.4MB → 0.9MB (2.7x), 11 JPEGs deleted
2026-05-07T19:04:08.116536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:08.325939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.048145Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:09.143715Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.071599Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:10.251285Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:23.971234Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.733221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:32.860501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.720920Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:51.887707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.428290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:04:52.672954Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.345560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.435702Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:13.955499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:14.123752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.832581Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:16.921333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.424048Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:20.639049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-05-07T19:05:24.585422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:24.763680Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:25.722186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:26.037507Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:27.058882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2699748236748479093, trigger=click)
2026-05-07T19:05:51.616832Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:27.553495Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:49.097515Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:06:58.139828Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=visual_change)
2026-05-07T19:07:00.501236Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2699748236748479093, trigger=click)
2026-05-07T19:07:22.494893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:07:25.541755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:08:48.672330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 49 eligible frames
2026-05-07T19:08:49.959722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 4.3MB → 0.4MB (10.2x), 20 JPEGs deleted
2026-05-07T19:08:52.053246Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 5.5MB → 2.0MB (2.7x), 27 JPEGs deleted
2026-05-07T19:09:24.524329Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:24.612542Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:09:56.724979Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:01.650171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:01.826705Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:02.894140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.771983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:10:05.962915Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.265782Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:08.415849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.827601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:21.956116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-05-07T19:10:32.051747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.141992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:32.911018Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:33.089188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.381195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:49.555111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:50.328077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.206906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:55.325017Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:57.111987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:10:58.935835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.791235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:00.892227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:04.654271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5572763082875861589, trigger=visual_change)
2026-05-07T19:11:09.783149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5572763082875861589, trigger=click)
2026-05-07T19:11:10.922882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=visual_change)
2026-05-07T19:11:28.192704Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.083215Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:29.270039Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:33.962918Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:34.153653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:42.021041Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.349693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:43.448166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5837861084334909305, trigger=click)
2026-05-07T19:11:53.540965Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:56.520852Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=visual_change)
2026-05-07T19:11:57.583112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=2382966049842329946, trigger=click)
2026-05-07T19:11:57.675537Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2382966049842329946, trigger=click)
2026-05-07T19:12:09.016494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.193611Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:09.920554Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:10.162751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:17.749896Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:19.865640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:20.037736Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:21.229308Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:25.708397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:25.890046Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.386069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:28.459158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:29.987752Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:31.002923Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:31.055807Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:33.107450Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:36.037286Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:36.207370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.110854Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:12:39.184943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:12:42.211049Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:13:52.073799Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 52 eligible frames
2026-05-07T19:13:53.640097Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 5.4MB → 0.5MB (11.6x), 25 JPEGs deleted
2026-05-07T19:13:56.148303Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.9MB → 2.1MB (2.4x), 25 JPEGs deleted
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-05-07T19:15:32.114719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:32.277006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.023332Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:34.221489Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:15:35.156276Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:41.068772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:15:44.092868Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=visual_change)
2026-05-07T19:18:56.195685Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-05-07T19:18:57.138533Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.0MB → 0.4MB (7.3x), 14 JPEGs deleted
2026-05-07T19:18:58.608172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.4MB → 1.3MB (2.6x), 18 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-05-07T19:22:06.254072Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:06.376479Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-9059054231720352226, trigger=click)
2026-05-07T19:22:07.042289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping captur...
|
iTerm2
|
screenpipe"
|
NULL
|
6417
|
|
6416
|
Last login: Thu May 7 09:45:09 on ttys010
Poetry Last login: Thu May 7 09:45:09 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 667416
drwxr-xr-x 11 lukas staff 352 7 May 13:40 .
drwx------+ 93 lukas staff 2976 7 May 13:40 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 336154624 7 May 13:40 db.sqlite
-rw-r--r-- 1 lukas staff 65536 7 May 10:42 db.sqlite-shm
-rw-r--r-- 1 lukas staff 4408432 7 May 13:40 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 28408 6 May 21:02 screenpipe.2026-05-06.0.log
-rw-r--r-- 1 lukas staff 159469 7 May 13:40 screenpipe.2026-05-07.0.log
-rwxr-xr-x 1 lukas staff 14994 6 May 20:26 screenpipe_sync.sh
-rw-r--r-- 1 lukas staff 3167 7 May 09:23 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ du -sh ~/.screenpipe
449M /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
iTerm2
|
-zsh
|
NULL
|
6416
|
|
6415
|
Last login: Thu May 7 09:45:09 on ttys010
Poetry Last login: Thu May 7 09:45:09 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 667416
drwxr-xr-x 11 lukas staff 352 7 May 13:40 .
drwx------+ 93 lukas staff 2976 7 May 13:40 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 336154624 7 May 13:40 db.sqlite
-rw-r--r-- 1 lukas staff 65536 7 May 10:42 db.sqlite-shm
-rw-r--r-- 1 lukas staff 4408432 7 May 13:40 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 28408 6 May 21:02 screenpipe.2026-05-06.0.log
-rw-r--r-- 1 lukas staff 159469 7 May 13:40 screenpipe.2026-05-07.0.log
-rwxr-xr-x 1 lukas staff 14994 6 May 20:26 screenpipe_sync.sh
-rw-r--r-- 1 lukas staff 3167 7 May 09:23 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ du -sh ~/.screenpipe
449M /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
iTerm2
|
-zsh
|
NULL
|
6415
|
|
6414
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6414
|
|
6413
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6413
|
|
6412
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6412
|
|
6411
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6411
|
|
6410
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6410
|
|
6409
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6409
|
|
6408
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6408
|
|
6407
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6407
|
|
6406
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6406
|
|
6405
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6405
|
|
6404
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6404
|
|
6403
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6403
|
|
6402
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6402
|
|
6401
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6401
|
|
6400
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6400
|
|
6399
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6399
|
|
6398
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6398
|
|
6397
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6397
|
|
6396
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6396
|
|
6395
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6395
|
|
6394
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6394
|
|
6393
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6393
|
|
6392
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6392
|
|
6391
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6391
|
|
6390
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6390
|
|
6389
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6389
|
|
6388
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6388
|
|
6387
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6387
|
|
6386
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6386
|
|
6385
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6385
|
|
6384
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6384
|
|
6383
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6383
|
|
6382
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6382
|
|
6381
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6381
|
|
6380
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6380
|
|
6379
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6379
|
|
6378
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6378
|
|
6377
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6377
|
|
6376
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6376
|
|
6375
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6375
|
|
6374
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6374
|
|
6373
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6373
|
|
6372
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Delete;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Jiminny\Enums\CrmObject;
use Jiminny\Events\Crm\DetachActivityObject;
use Jiminny\Models\Activity;
use Psr\Log\LoggerInterface;
use Throwable;
trait DeleteCrmEntityTrait
{
public int $tries = 3;
public function timeout(): int
{
return 300; // 5 minutes
}
public function backoff(): array
{
return [30, 90, 180]; // 30 seconds, 1.5 minutes, 3 minutes
}
protected function handleActivities(
Collection $activities,
Dispatcher $dispatcher,
LoggerInterface $logger,
bool $emitEvent = true,
): void {
if ($activities->isEmpty()) {
return;
}
$crmObject = $this->getEntityType();
$entityIdField = $crmObject->value . '_id';
$activities->each(
function (Activity $activity) use ($dispatcher, $logger, $entityIdField, $crmObject, $emitEvent): void {
$stageId = $activity->getStage()?->getId();
$logData = [
$crmObject->value => $this->id,
'activity' => $activity->getId(),
'emitEvent' => $emitEvent,
];
$updateData = [
$entityIdField => null,
];
// For leads and opportunities, also nullify the stage_id
if ($stageId && in_array($crmObject, [CrmObject::LEAD, CrmObject::OPPORTUNITY], true)) {
$updateData['stage_id'] = null;
$logData['stage_id'] = $stageId;
}
$activity->update($updateData);
if ($emitEvent) {
$dispatcher->dispatch(new DetachActivityObject($activity, $crmObject));
}
$logger->info($this->getLogPrefix() . ' Detach from activity', $logData);
// Dispatch job to verify if CRM task/event still exists
if ($activity->hasCrmProviderId()) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
}
);
}
public function failed(Throwable $exception): void
{
$crmObject = $this->getEntityType();
Log::critical($this->getLogPrefix() . ' Job failed permanently', [
$crmObject->value => $this->id,
'exception' => $exception->getMessage(),
]);
}
// Abstract methods that must be implemented by the using class
abstract protected function getLogPrefix(): string;
abstract protected function getEntityType(): CrmObject;
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – DeleteCrmEntityTrait.php
|
NULL
|
6372
|