crewly 1.20.66 → 1.20.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/skills/agent/core/drive-read/SKILL.md +1 -10
- package/config/skills/agent/core/drive-search/SKILL.md +0 -9
- package/config/skills/agent/core/drive-upload/SKILL.md +0 -9
- package/dist/backend/backend/src/constants.d.ts +44 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +44 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +6 -19
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +16 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +32 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +17 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +57 -9
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +23 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +50 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +20 -2
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +63 -6
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +28 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +66 -30
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +11 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +68 -18
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +44 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +44 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +17 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +57 -9
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +23 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +50 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +162 -0
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +708 -0
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.d.ts +73 -0
- package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.js +199 -0
- package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +20 -2
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +63 -6
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/package.json +1 -1
|
@@ -60,6 +60,29 @@ export declare class SubAgentMessageQueue {
|
|
|
60
60
|
* @returns Array of queued messages in insertion order, or empty array
|
|
61
61
|
*/
|
|
62
62
|
dequeueAll(sessionName: string): QueuedAgentMessage[];
|
|
63
|
+
/**
|
|
64
|
+
* Hand every queued message to `send`, one at a time.
|
|
65
|
+
*
|
|
66
|
+
* `sendMessageToAgent` answers `{ success: true, queued: true }` when it
|
|
67
|
+
* finds the agent busy and puts the message back — so a caller that only
|
|
68
|
+
* checked for a thrown error logged "Delivered" in the same millisecond
|
|
69
|
+
* as the re-queue, and reading the log pointed at the agent when the
|
|
70
|
+
* message had never reached it. Both call sites had their own copy of
|
|
71
|
+
* this loop; this is the shared one, and it distinguishes the two
|
|
72
|
+
* outcomes (2026-09-21, Ella).
|
|
73
|
+
*
|
|
74
|
+
* @param sessionName - The agent session name
|
|
75
|
+
* @param send - Delivers one message; `queued` means it went back on the queue
|
|
76
|
+
* @param gapMs - Pause between messages so the agent can process each
|
|
77
|
+
* @returns How many were delivered, deferred again, and failed
|
|
78
|
+
*/
|
|
79
|
+
flush(sessionName: string, send: (data: string) => Promise<{
|
|
80
|
+
queued?: boolean;
|
|
81
|
+
}>, gapMs?: number): Promise<{
|
|
82
|
+
delivered: number;
|
|
83
|
+
deferred: number;
|
|
84
|
+
failed: number;
|
|
85
|
+
}>;
|
|
63
86
|
/**
|
|
64
87
|
* Check if there are pending messages for a session.
|
|
65
88
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-message-queue.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA8BhD;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAiBrD;;;;;OAKG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWhC;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAIzC"}
|
|
1
|
+
{"version":3,"file":"sub-agent-message-queue.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA8BhD;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAiBrD;;;;;;;;;;;;;;;OAeG;IACG,KAAK,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,EACrD,KAAK,SAAI,GACP,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCnE;;;;;OAKG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWhC;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAIzC"}
|
|
@@ -97,6 +97,56 @@ export class SubAgentMessageQueue {
|
|
|
97
97
|
});
|
|
98
98
|
return messages;
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Hand every queued message to `send`, one at a time.
|
|
102
|
+
*
|
|
103
|
+
* `sendMessageToAgent` answers `{ success: true, queued: true }` when it
|
|
104
|
+
* finds the agent busy and puts the message back — so a caller that only
|
|
105
|
+
* checked for a thrown error logged "Delivered" in the same millisecond
|
|
106
|
+
* as the re-queue, and reading the log pointed at the agent when the
|
|
107
|
+
* message had never reached it. Both call sites had their own copy of
|
|
108
|
+
* this loop; this is the shared one, and it distinguishes the two
|
|
109
|
+
* outcomes (2026-09-21, Ella).
|
|
110
|
+
*
|
|
111
|
+
* @param sessionName - The agent session name
|
|
112
|
+
* @param send - Delivers one message; `queued` means it went back on the queue
|
|
113
|
+
* @param gapMs - Pause between messages so the agent can process each
|
|
114
|
+
* @returns How many were delivered, deferred again, and failed
|
|
115
|
+
*/
|
|
116
|
+
async flush(sessionName, send, gapMs = 0) {
|
|
117
|
+
const pending = this.dequeueAll(sessionName);
|
|
118
|
+
const out = { delivered: 0, deferred: 0, failed: 0 };
|
|
119
|
+
for (const [i, queued] of pending.entries()) {
|
|
120
|
+
try {
|
|
121
|
+
const result = await send(queued.data);
|
|
122
|
+
if (result?.queued) {
|
|
123
|
+
out.deferred += 1;
|
|
124
|
+
this.logger.info('Queued message deferred again — agent still busy', {
|
|
125
|
+
sessionName,
|
|
126
|
+
queuedAt: new Date(queued.queuedAt).toISOString(),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
out.delivered += 1;
|
|
131
|
+
this.logger.info('Queued message delivered', {
|
|
132
|
+
sessionName,
|
|
133
|
+
queuedAt: new Date(queued.queuedAt).toISOString(),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
out.failed += 1;
|
|
139
|
+
this.logger.error('Failed to deliver a queued message', {
|
|
140
|
+
sessionName,
|
|
141
|
+
error: err instanceof Error ? err.message : String(err),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (gapMs > 0 && i < pending.length - 1) {
|
|
145
|
+
await new Promise((r) => setTimeout(r, gapMs));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
100
150
|
/**
|
|
101
151
|
* Check if there are pending messages for a session.
|
|
102
152
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-message-queue.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sub-agent-message-queue.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { type WorkingStatus } from '../../constants.js';
|
|
2
|
+
import type { EventBusService } from '../event-bus/event-bus.service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Team Working Status File Structure
|
|
5
|
+
* Tracks ONLY workingStatus (idle vs in_progress) based on terminal activity
|
|
6
|
+
* agentStatus is now managed by AgentHeartbeatService via MCP calls
|
|
7
|
+
*/
|
|
8
|
+
export interface TeamWorkingStatusFile {
|
|
9
|
+
/** Orchestrator working status */
|
|
10
|
+
orchestrator: {
|
|
11
|
+
sessionName: string;
|
|
12
|
+
workingStatus: WorkingStatus;
|
|
13
|
+
lastActivityCheck: string;
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
};
|
|
16
|
+
/** Team member working statuses indexed by sessionName */
|
|
17
|
+
teamMembers: Record<string, {
|
|
18
|
+
sessionName: string;
|
|
19
|
+
teamMemberId: string;
|
|
20
|
+
workingStatus: WorkingStatus;
|
|
21
|
+
lastActivityCheck: string;
|
|
22
|
+
updatedAt: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** File metadata */
|
|
25
|
+
metadata: {
|
|
26
|
+
lastUpdated: string;
|
|
27
|
+
version: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Activity Monitor Service - NEW ARCHITECTURE
|
|
32
|
+
*
|
|
33
|
+
* Responsibilities:
|
|
34
|
+
* - Track ONLY workingStatus (idle vs in_progress) based on terminal activity
|
|
35
|
+
* - Create and manage teamWorkingStatus.json file
|
|
36
|
+
* - Integrate with AgentHeartbeatService for stale agent detection
|
|
37
|
+
* - Remove ALL agentStatus management (now owned by AgentHeartbeatService)
|
|
38
|
+
*
|
|
39
|
+
* Key Changes:
|
|
40
|
+
* - No more agentStatus updates to teams.json
|
|
41
|
+
* - Simple activity detection: output changed = in_progress, else = idle
|
|
42
|
+
* - Integration with stale detection (30-minute threshold)
|
|
43
|
+
* - Separate teamWorkingStatus.json file for working statuses
|
|
44
|
+
*/
|
|
45
|
+
export declare class ActivityMonitorService {
|
|
46
|
+
private static instance;
|
|
47
|
+
private logger;
|
|
48
|
+
private storageService;
|
|
49
|
+
private _sessionBackend;
|
|
50
|
+
private agentHeartbeatService;
|
|
51
|
+
private intervalId;
|
|
52
|
+
private readonly POLLING_INTERVAL;
|
|
53
|
+
private lastTerminalOutputs;
|
|
54
|
+
private readonly MAX_OUTPUT_SIZE;
|
|
55
|
+
private readonly ACTIVITY_CHECK_TIMEOUT;
|
|
56
|
+
private lastCleanup;
|
|
57
|
+
private crewlyHome;
|
|
58
|
+
private teamWorkingStatusFile;
|
|
59
|
+
private eventBusService;
|
|
60
|
+
/** Tracks when each session entered in_progress (epoch ms) */
|
|
61
|
+
private busyTransitionTimestamps;
|
|
62
|
+
/** Tracks which sessions have had their agent:busy event emitted */
|
|
63
|
+
private busyEventEmitted;
|
|
64
|
+
/** Tracks last recorded token counts per session to avoid duplicate recording */
|
|
65
|
+
private lastRecordedTokens;
|
|
66
|
+
/** Cached tokenTracking setting, refreshed periodically to avoid async reads in hot path */
|
|
67
|
+
private tokenTrackingEnabled;
|
|
68
|
+
private tokenTrackingLastCheck;
|
|
69
|
+
private constructor();
|
|
70
|
+
/**
|
|
71
|
+
* Get the session backend, lazily initializing if needed.
|
|
72
|
+
*/
|
|
73
|
+
private getBackend;
|
|
74
|
+
static getInstance(): ActivityMonitorService;
|
|
75
|
+
/**
|
|
76
|
+
* Inject the EventBusService for direct event publishing on status transitions.
|
|
77
|
+
*
|
|
78
|
+
* @param service - The EventBusService instance
|
|
79
|
+
*/
|
|
80
|
+
setEventBusService(service: EventBusService): void;
|
|
81
|
+
/**
|
|
82
|
+
* Build an AgentEvent for a working status transition.
|
|
83
|
+
*
|
|
84
|
+
* @param type - The event type ('agent:busy' or 'agent:idle')
|
|
85
|
+
* @param timestamp - ISO timestamp for the event
|
|
86
|
+
* @param identity - Agent identity fields (team/member/session)
|
|
87
|
+
* @param previousValue - The previous working status
|
|
88
|
+
* @param newValue - The new working status
|
|
89
|
+
* @returns A fully-formed AgentEvent
|
|
90
|
+
*/
|
|
91
|
+
private buildAgentEvent;
|
|
92
|
+
/**
|
|
93
|
+
* Handle duration-gated event emission for a session status transition.
|
|
94
|
+
* Suppresses spurious idle→busy→idle cycles by requiring a minimum
|
|
95
|
+
* busy duration (MIN_BUSY_DURATION_MS) before emitting events.
|
|
96
|
+
*
|
|
97
|
+
* @param key - Unique key for tracking (e.g. 'orchestrator' or session name)
|
|
98
|
+
* @param newStatus - The new working status
|
|
99
|
+
* @param previousStatus - The previous working status
|
|
100
|
+
* @param statusChanged - Whether the status actually changed this poll
|
|
101
|
+
* @param identity - Agent identity fields for building the event
|
|
102
|
+
* @param now - ISO timestamp for the event
|
|
103
|
+
*/
|
|
104
|
+
private handleDurationGatedEmission;
|
|
105
|
+
startPolling(): void;
|
|
106
|
+
stopPolling(): void;
|
|
107
|
+
private performActivityCheck;
|
|
108
|
+
/**
|
|
109
|
+
* NEW ARCHITECTURE: Simplified activity checking
|
|
110
|
+
*
|
|
111
|
+
* This method now:
|
|
112
|
+
* 1. Detects stale agents via AgentHeartbeatService (30-minute threshold)
|
|
113
|
+
* 2. Checks terminal activity for working status (ONLY)
|
|
114
|
+
* 3. Updates teamWorkingStatus.json (separate from teams.json)
|
|
115
|
+
* 4. Removes ALL agentStatus logic (handled by AgentHeartbeatService)
|
|
116
|
+
*/
|
|
117
|
+
private performActivityCheckInternal;
|
|
118
|
+
/**
|
|
119
|
+
* Load teamWorkingStatus.json file with proper initialization
|
|
120
|
+
*/
|
|
121
|
+
private loadTeamWorkingStatusFile;
|
|
122
|
+
/**
|
|
123
|
+
* Save teamWorkingStatus.json file with atomic write
|
|
124
|
+
*/
|
|
125
|
+
private saveTeamWorkingStatusFile;
|
|
126
|
+
/**
|
|
127
|
+
* Create default teamWorkingStatus.json structure
|
|
128
|
+
*/
|
|
129
|
+
private createDefaultTeamWorkingStatusFile;
|
|
130
|
+
/**
|
|
131
|
+
* Cleanup old terminal outputs and perform garbage collection
|
|
132
|
+
*/
|
|
133
|
+
private performPeriodicCleanup;
|
|
134
|
+
/**
|
|
135
|
+
* Attempt to parse and record token usage from PTY terminal output.
|
|
136
|
+
*
|
|
137
|
+
* Only records when token tracking is enabled in settings and when the
|
|
138
|
+
* parsed token counts differ from the last recorded values (to avoid
|
|
139
|
+
* duplicate recording from the same output being captured multiple times).
|
|
140
|
+
*
|
|
141
|
+
* @param sessionName - Agent session name
|
|
142
|
+
* @param output - Captured terminal output
|
|
143
|
+
* @param runtimeType - Runtime type hint for parser selection
|
|
144
|
+
*/
|
|
145
|
+
private tryRecordPtyTokenUsage;
|
|
146
|
+
/**
|
|
147
|
+
* Get terminal output with size limits for activity detection
|
|
148
|
+
*/
|
|
149
|
+
private getTerminalOutput;
|
|
150
|
+
isRunning(): boolean;
|
|
151
|
+
getPollingInterval(): number;
|
|
152
|
+
/**
|
|
153
|
+
* Get current team working status data
|
|
154
|
+
* Useful for external services that need to check working statuses
|
|
155
|
+
*/
|
|
156
|
+
getTeamWorkingStatus(): Promise<TeamWorkingStatusFile>;
|
|
157
|
+
/**
|
|
158
|
+
* Get working status for a specific session
|
|
159
|
+
*/
|
|
160
|
+
getWorkingStatusForSession(sessionName: string): Promise<WorkingStatus | null>;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=activity-monitor.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-monitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/activity-monitor.service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgI,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGtL,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMzE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,aAAa,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,aAAa,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,oBAAoB;IACpB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkD;IACnF,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IAC/C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,eAAe,CAAgC;IACvD,8DAA8D;IAC9D,OAAO,CAAC,wBAAwB,CAAkC;IAClE,oEAAoE;IACpE,OAAO,CAAC,gBAAgB,CAA0B;IAClD,iFAAiF;IACjF,OAAO,CAAC,kBAAkB,CAA6D;IACvF,4FAA4F;IAC5F,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,sBAAsB,CAAK;IAEnC,OAAO;IAQP;;OAEG;YACW,UAAU;WAUV,WAAW,IAAI,sBAAsB;IAOnD;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIlD;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2BAA2B;IAmD5B,YAAY,IAAI,IAAI;IAiBpB,WAAW,IAAI,IAAI;YAQZ,oBAAoB;IAoBlC;;;;;;;;OAQG;YACW,4BAA4B;IA+U1C;;OAEG;YACW,yBAAyB;IA+BvC;;OAEG;YACW,yBAAyB;IAiBvC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAiB1C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAmD9B;;OAEG;YACW,iBAAiB;IAuBxB,SAAS,IAAI,OAAO;IAIpB,kBAAkB,IAAI,MAAM;IAInC;;;OAGG;IACU,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAInE;;OAEG;IACU,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAiB5F"}
|