crewly 1.20.279 → 1.20.281
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/hooks/live-checkout-guard/guard.mjs +452 -0
- package/config/skills/agent/core/reply/SKILL.md +2 -1
- package/config/skills/agent/core/reply/execute.sh +11 -3
- package/config/skills/agent/core/reply/execute.test.sh +4 -0
- package/dist/backend/backend/src/constants.d.ts +81 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +89 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +1 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +3 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts +5 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js +42 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-tool-policy.d.ts +72 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-tool-policy.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-tool-policy.js +113 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-tool-policy.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +111 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- 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 +4 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +4 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +11 -2
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/credential-guard.service.d.ts +3 -2
- package/dist/backend/backend/src/services/agent/credential-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/credential-guard.service.js +12 -4
- package/dist/backend/backend/src/services/agent/credential-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +7 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/live-checkout-guard.service.d.ts +45 -0
- package/dist/backend/backend/src/services/agent/live-checkout-guard.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/live-checkout-guard.service.js +109 -0
- package/dist/backend/backend/src/services/agent/live-checkout-guard.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +4 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +13 -7
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts +16 -0
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.js +37 -5
- package/dist/backend/backend/src/services/drive/drive-agent.service.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.d.ts +172 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.js +301 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-sync.service.d.ts +112 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-sync.service.js +247 -0
- package/dist/backend/backend/src/services/drive/drive-briefing-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.d.ts +88 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.js +18 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.d.ts +73 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.js +131 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts +9 -2
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js +9 -4
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-keep-warm.d.ts +72 -0
- package/dist/backend/backend/src/services/drive/drive-keep-warm.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-keep-warm.js +109 -0
- package/dist/backend/backend/src/services/drive/drive-keep-warm.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js +11 -5
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
- package/dist/backend/backend/src/utils/boot-owner-alert.d.ts +33 -0
- package/dist/backend/backend/src/utils/boot-owner-alert.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/boot-owner-alert.js +60 -0
- package/dist/backend/backend/src/utils/boot-owner-alert.js.map +1 -0
- package/dist/backend/backend/src/utils/build-provenance.d.ts +38 -0
- package/dist/backend/backend/src/utils/build-provenance.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/build-provenance.js +63 -1
- package/dist/backend/backend/src/utils/build-provenance.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +81 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +89 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- 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 +4 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +4 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +11 -2
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/credential-guard.service.d.ts +3 -2
- package/dist/cli/backend/src/services/agent/credential-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/credential-guard.service.js +12 -4
- package/dist/cli/backend/src/services/agent/credential-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/live-checkout-guard.service.d.ts +45 -0
- package/dist/cli/backend/src/services/agent/live-checkout-guard.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/live-checkout-guard.service.js +109 -0
- package/dist/cli/backend/src/services/agent/live-checkout-guard.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +4 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +13 -7
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/drive/drive-keep-warm.d.ts +72 -0
- package/dist/cli/backend/src/services/drive/drive-keep-warm.d.ts.map +1 -0
- package/dist/cli/backend/src/services/drive/drive-keep-warm.js +109 -0
- package/dist/cli/backend/src/services/drive/drive-keep-warm.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DriveBriefingSyncService — keeps this machine's Drive mode status snapshot
|
|
3
|
+
* fresh on Crewly Cloud (specs/2026-10-09-drive-mode-v3.md §1), so the voice
|
|
4
|
+
* answers "how is CE doing?" at once, built while work happens rather than
|
|
5
|
+
* pulled when the owner starts talking.
|
|
6
|
+
*
|
|
7
|
+
* - On events (a ticket changed, a work item moved, an agent wrote to the
|
|
8
|
+
* owner, a card was created or settled) it gathers them, rebuilds the
|
|
9
|
+
* snapshot and uploads it when it changed — at most one rebuild every
|
|
10
|
+
* 30 s; events in between are coalesced into the next one.
|
|
11
|
+
* - Every minute it rebuilds anyway (agent states, anything an event missed)
|
|
12
|
+
* and uploads only on a change; every 5 minutes it uploads regardless, so
|
|
13
|
+
* Cloud knows the snapshot is current.
|
|
14
|
+
* - Building costs no LLM call: see `drive-briefing-snapshot.ts`.
|
|
15
|
+
*
|
|
16
|
+
* Uses the machine's own Cloud token; signed out = nothing is sent.
|
|
17
|
+
* `CREWLY_DRIVE_BRIEFING=0` turns it off. A Cloud that does not take
|
|
18
|
+
* snapshots yet (404 / 400 / 503) is asked again in an hour. Never throws.
|
|
19
|
+
*
|
|
20
|
+
* @module services/drive/drive-briefing-sync.service
|
|
21
|
+
*/
|
|
22
|
+
import { DRIVE_BRIEFING_CONSTANTS } from '../../constants.js';
|
|
23
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
24
|
+
import { accountIdOfToken } from '../cloud/conversation-cloud-sync.service.js';
|
|
25
|
+
import { INSTANCE_ID_PATTERN } from '../cloud/conversation-ingest.contract.js';
|
|
26
|
+
const C = DRIVE_BRIEFING_CONSTANTS;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the snapshot push is switched off.
|
|
29
|
+
*
|
|
30
|
+
* @param env - Environment
|
|
31
|
+
* @returns True for `CREWLY_DRIVE_BRIEFING=0|off|false|no`
|
|
32
|
+
*/
|
|
33
|
+
export function isBriefingSyncDisabled(env) {
|
|
34
|
+
const v = env[C.KILL_SWITCH_ENV];
|
|
35
|
+
return typeof v === 'string' && ['0', 'off', 'false', 'no'].includes(v.trim().toLowerCase());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The snapshot's identity for change detection (its build time left out).
|
|
39
|
+
*
|
|
40
|
+
* @param s - Snapshot
|
|
41
|
+
* @returns Key
|
|
42
|
+
*/
|
|
43
|
+
export function snapshotKey(s) {
|
|
44
|
+
return JSON.stringify({ ...s, generatedAt: '' });
|
|
45
|
+
}
|
|
46
|
+
/** Pushes the machine's status snapshot to Crewly Cloud — see module docs. */
|
|
47
|
+
export class DriveBriefingSyncService {
|
|
48
|
+
deps;
|
|
49
|
+
logger;
|
|
50
|
+
fetchImpl;
|
|
51
|
+
now;
|
|
52
|
+
setTimer;
|
|
53
|
+
clearTimer;
|
|
54
|
+
started = false;
|
|
55
|
+
running = null;
|
|
56
|
+
rerun = false;
|
|
57
|
+
checkTimer = null;
|
|
58
|
+
debounceTimer = null;
|
|
59
|
+
unsubscribers = [];
|
|
60
|
+
lastKey = null;
|
|
61
|
+
lastAccount = null;
|
|
62
|
+
lastUploadAt = 0;
|
|
63
|
+
lastBuildAt = 0;
|
|
64
|
+
failures = 0;
|
|
65
|
+
pausedUntil = 0;
|
|
66
|
+
pauseLogged = false;
|
|
67
|
+
/**
|
|
68
|
+
* @param deps - Collaborators
|
|
69
|
+
*/
|
|
70
|
+
constructor(deps) {
|
|
71
|
+
this.deps = deps;
|
|
72
|
+
this.logger = deps.logger ?? LoggerService.getInstance().createComponentLogger('DriveBriefingSync');
|
|
73
|
+
this.fetchImpl = deps.fetchImpl ?? ((input, init) => fetch(input, init));
|
|
74
|
+
this.now = deps.now ?? Date.now;
|
|
75
|
+
this.setTimer = deps.setTimeout ?? ((fn, ms) => setTimeout(fn, ms));
|
|
76
|
+
this.clearTimer = deps.clearTimeout ?? ((h) => clearTimeout(h));
|
|
77
|
+
}
|
|
78
|
+
/** Subscribe to the event sources and start the periodic check. Idempotent; never throws. */
|
|
79
|
+
start() {
|
|
80
|
+
if (this.started)
|
|
81
|
+
return;
|
|
82
|
+
this.started = true;
|
|
83
|
+
for (const source of this.deps.sources ?? []) {
|
|
84
|
+
try {
|
|
85
|
+
this.unsubscribers.push(source(() => this.requestSync()));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.logger.warn('Drive briefing: an event source could not be watched', { error: error instanceof Error ? error.message : String(error) });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.scheduleCheck(0);
|
|
92
|
+
}
|
|
93
|
+
/** Stop timers and subscriptions. */
|
|
94
|
+
stop() {
|
|
95
|
+
this.started = false;
|
|
96
|
+
if (this.checkTimer)
|
|
97
|
+
this.clearTimer(this.checkTimer);
|
|
98
|
+
if (this.debounceTimer)
|
|
99
|
+
this.clearTimer(this.debounceTimer);
|
|
100
|
+
this.checkTimer = null;
|
|
101
|
+
this.debounceTimer = null;
|
|
102
|
+
for (const off of this.unsubscribers) {
|
|
103
|
+
try {
|
|
104
|
+
off();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// ignore
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
this.unsubscribers = [];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Something changed: rebuild after the gather window, and no sooner than
|
|
114
|
+
* the minimum interval after the last rebuild (events coalesce).
|
|
115
|
+
*/
|
|
116
|
+
requestSync() {
|
|
117
|
+
if (!this.started || this.debounceTimer)
|
|
118
|
+
return;
|
|
119
|
+
const sinceBuild = this.now() - this.lastBuildAt;
|
|
120
|
+
const delay = Math.max(C.DEBOUNCE_MS, C.MIN_INTERVAL_MS - sinceBuild);
|
|
121
|
+
this.debounceTimer = this.setTimer(() => {
|
|
122
|
+
this.debounceTimer = null;
|
|
123
|
+
void this.syncNow();
|
|
124
|
+
}, delay);
|
|
125
|
+
}
|
|
126
|
+
scheduleCheck(delayMs = C.CHECK_INTERVAL_MS) {
|
|
127
|
+
if (!this.started)
|
|
128
|
+
return;
|
|
129
|
+
this.checkTimer = this.setTimer(() => {
|
|
130
|
+
this.checkTimer = null;
|
|
131
|
+
// A rebuild ran moments ago (an event): this check has nothing to add.
|
|
132
|
+
if (this.lastBuildAt > 0 && this.now() - this.lastBuildAt < C.MIN_INTERVAL_MS) {
|
|
133
|
+
this.scheduleCheck();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
void this.syncNow().finally(() => this.scheduleCheck());
|
|
137
|
+
}, delayMs);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Rebuild and upload when it changed (or the full resync is due). One pass
|
|
141
|
+
* at a time; a call during one runs again after it. Never throws.
|
|
142
|
+
*
|
|
143
|
+
* @param force - Upload even when unchanged
|
|
144
|
+
* @returns What happened
|
|
145
|
+
*/
|
|
146
|
+
async syncNow(force = false) {
|
|
147
|
+
if (this.running) {
|
|
148
|
+
this.rerun = true;
|
|
149
|
+
return this.running;
|
|
150
|
+
}
|
|
151
|
+
this.running = (async () => {
|
|
152
|
+
let outcome = 'skipped';
|
|
153
|
+
try {
|
|
154
|
+
do {
|
|
155
|
+
this.rerun = false;
|
|
156
|
+
outcome = await this.pass(force);
|
|
157
|
+
} while (this.rerun);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
this.logger.warn('Drive briefing sync failed', { error: error instanceof Error ? error.message : String(error) });
|
|
161
|
+
outcome = 'failed';
|
|
162
|
+
}
|
|
163
|
+
return outcome;
|
|
164
|
+
})();
|
|
165
|
+
try {
|
|
166
|
+
return await this.running;
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
this.running = null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async pass(force) {
|
|
173
|
+
if (isBriefingSyncDisabled(this.deps.env ?? process.env))
|
|
174
|
+
return 'skipped';
|
|
175
|
+
const token = this.deps.cloud.getToken();
|
|
176
|
+
const base = this.deps.cloud.getCloudUrl();
|
|
177
|
+
if (!token || !base)
|
|
178
|
+
return 'skipped';
|
|
179
|
+
if (this.now() < this.pausedUntil)
|
|
180
|
+
return 'paused';
|
|
181
|
+
const account = accountIdOfToken(token);
|
|
182
|
+
if (account !== this.lastAccount) {
|
|
183
|
+
this.lastAccount = account;
|
|
184
|
+
this.lastKey = null;
|
|
185
|
+
this.lastUploadAt = 0;
|
|
186
|
+
}
|
|
187
|
+
const { instanceId } = await this.deps.identity();
|
|
188
|
+
if (!INSTANCE_ID_PATTERN.test(instanceId))
|
|
189
|
+
return 'skipped';
|
|
190
|
+
this.lastBuildAt = this.now();
|
|
191
|
+
const snapshot = await this.deps.build();
|
|
192
|
+
const key = snapshotKey(snapshot);
|
|
193
|
+
const fullDue = this.now() - this.lastUploadAt >= C.FULL_SYNC_INTERVAL_MS;
|
|
194
|
+
if (!force && !fullDue && key === this.lastKey)
|
|
195
|
+
return 'unchanged';
|
|
196
|
+
return this.upload(base, token, instanceId, snapshot, key);
|
|
197
|
+
}
|
|
198
|
+
async upload(base, token, instanceId, snapshot, key, refreshed = false) {
|
|
199
|
+
const url = `${base.replace(/\/+$/, '')}${C.PUT_PATH.replace(':instanceId', encodeURIComponent(instanceId))}`;
|
|
200
|
+
let status = 0;
|
|
201
|
+
let code = null;
|
|
202
|
+
try {
|
|
203
|
+
const res = await this.fetchImpl(url, {
|
|
204
|
+
method: 'PUT',
|
|
205
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
206
|
+
body: JSON.stringify({ snapshot }),
|
|
207
|
+
signal: AbortSignal.timeout(C.REQUEST_TIMEOUT_MS),
|
|
208
|
+
});
|
|
209
|
+
status = res.status;
|
|
210
|
+
if (res.ok) {
|
|
211
|
+
this.lastKey = key;
|
|
212
|
+
this.lastUploadAt = this.now();
|
|
213
|
+
this.failures = 0;
|
|
214
|
+
if (this.pauseLogged) {
|
|
215
|
+
this.pauseLogged = false;
|
|
216
|
+
this.logger.info('Crewly Cloud is taking Drive mode status updates again');
|
|
217
|
+
}
|
|
218
|
+
return 'uploaded';
|
|
219
|
+
}
|
|
220
|
+
const parsed = (await res.json().catch(() => null));
|
|
221
|
+
code = typeof parsed?.code === 'string' ? parsed.code : null;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
code = error instanceof Error ? error.message : String(error);
|
|
225
|
+
}
|
|
226
|
+
if (status === 401 && !refreshed && this.deps.cloud.tryRefreshToken && (await this.deps.cloud.tryRefreshToken().catch(() => false))) {
|
|
227
|
+
const fresh = this.deps.cloud.getToken();
|
|
228
|
+
if (fresh)
|
|
229
|
+
return this.upload(base, fresh, instanceId, snapshot, key, true);
|
|
230
|
+
}
|
|
231
|
+
if (status === 404 || status === 400 || status === 503) {
|
|
232
|
+
this.pausedUntil = this.now() + C.UNAVAILABLE_RETRY_MS;
|
|
233
|
+
if (!this.pauseLogged) {
|
|
234
|
+
this.pauseLogged = true;
|
|
235
|
+
this.logger.info('Crewly Cloud is not taking Drive mode status updates; checking again in an hour', { status, code });
|
|
236
|
+
}
|
|
237
|
+
return 'paused';
|
|
238
|
+
}
|
|
239
|
+
this.failures += 1;
|
|
240
|
+
const delay = Math.min(C.BACKOFF_INITIAL_MS * 2 ** (this.failures - 1), C.BACKOFF_MAX_MS);
|
|
241
|
+
this.pausedUntil = this.now() + delay;
|
|
242
|
+
if (this.failures === 1)
|
|
243
|
+
this.logger.warn('Drive mode status upload failed; will retry', { status, code, retryInMs: delay });
|
|
244
|
+
return 'failed';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=drive-briefing-sync.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-briefing-sync.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-briefing-sync.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drive mode v3 status snapshot, machine half (mirrors crewly-services
|
|
3
|
+
* `auth/src/drive/drive-briefing.contract.ts`; specs/2026-10-09-drive-mode-v3.md §1).
|
|
4
|
+
*
|
|
5
|
+
* The snapshot is what the voice orchestrator answers status questions from
|
|
6
|
+
* ("how is CE doing?", "what is Ella on?", "where is CE-12?") without asking
|
|
7
|
+
* an agent. This machine rebuilds it from structured data on every change
|
|
8
|
+
* and pushes it:
|
|
9
|
+
*
|
|
10
|
+
* PUT /api/cloud/instances/:instanceId/briefing {snapshot} (this machine's Cloud token)
|
|
11
|
+
*
|
|
12
|
+
* Names, never secrets: every text field is clipped and passed through the
|
|
13
|
+
* secret redactor before it leaves the machine. Pure types.
|
|
14
|
+
*
|
|
15
|
+
* @module services/drive/drive-briefing.contract
|
|
16
|
+
*/
|
|
17
|
+
/** Where a piece of work is (normalised across tickets and work items). */
|
|
18
|
+
export type BriefingItemStatus = 'open' | 'in_progress' | 'review' | 'blocked' | 'done' | 'cancelled';
|
|
19
|
+
/** What an agent is doing. */
|
|
20
|
+
export type BriefingAgentState = 'working' | 'idle' | 'starting' | 'stopped';
|
|
21
|
+
/** One team. */
|
|
22
|
+
export interface BriefingTeam {
|
|
23
|
+
name: string;
|
|
24
|
+
/** Lead's name */
|
|
25
|
+
lead?: string;
|
|
26
|
+
/** Members' names */
|
|
27
|
+
agents: string[];
|
|
28
|
+
open: number;
|
|
29
|
+
inProgress: number;
|
|
30
|
+
review: number;
|
|
31
|
+
blocked: number;
|
|
32
|
+
/** Finished in the last 24 h */
|
|
33
|
+
doneToday: number;
|
|
34
|
+
}
|
|
35
|
+
/** One agent. */
|
|
36
|
+
export interface BriefingAgent {
|
|
37
|
+
session: string;
|
|
38
|
+
name: string;
|
|
39
|
+
team?: string;
|
|
40
|
+
role?: string;
|
|
41
|
+
state: BriefingAgentState;
|
|
42
|
+
/** What it is working on now, and since when */
|
|
43
|
+
activity?: {
|
|
44
|
+
title: string;
|
|
45
|
+
since: string;
|
|
46
|
+
ref?: string;
|
|
47
|
+
};
|
|
48
|
+
/** Its last few messages to the owner, newest first, clipped */
|
|
49
|
+
lastToOwner?: Array<{
|
|
50
|
+
at: string;
|
|
51
|
+
text: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
/** A project ticket or a task-pool work item. */
|
|
55
|
+
export interface BriefingItem {
|
|
56
|
+
/** `CE-12`, `wi:1a2b3c4d` */
|
|
57
|
+
ref: string;
|
|
58
|
+
kind: 'ticket' | 'work';
|
|
59
|
+
title: string;
|
|
60
|
+
status: BriefingItemStatus;
|
|
61
|
+
/** Assignee's name */
|
|
62
|
+
assignee?: string;
|
|
63
|
+
team?: string;
|
|
64
|
+
project?: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
/** The last thing said about it (ticket log line, work item summary) */
|
|
67
|
+
last?: string;
|
|
68
|
+
}
|
|
69
|
+
/** Something waiting on the owner (live card / question / review only). */
|
|
70
|
+
export interface BriefingWaiting {
|
|
71
|
+
ref: string;
|
|
72
|
+
kind: 'decision' | 'question' | 'review';
|
|
73
|
+
from: string;
|
|
74
|
+
team?: string;
|
|
75
|
+
summary: string;
|
|
76
|
+
since: string;
|
|
77
|
+
urgency?: 'high' | 'normal' | 'low';
|
|
78
|
+
}
|
|
79
|
+
/** The snapshot this machine pushes. */
|
|
80
|
+
export interface BriefingSnapshot {
|
|
81
|
+
v: 1;
|
|
82
|
+
generatedAt: string;
|
|
83
|
+
teams: BriefingTeam[];
|
|
84
|
+
agents: BriefingAgent[];
|
|
85
|
+
items: BriefingItem[];
|
|
86
|
+
waiting: BriefingWaiting[];
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=drive-briefing.contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-briefing.contract.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-briefing.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,2EAA2E;AAC3E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAEtG,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7E,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iBAAiB;AACjB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,gEAAgE;IAChE,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,CAAC,CAAC;IACL,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drive mode v3 status snapshot, machine half (mirrors crewly-services
|
|
3
|
+
* `auth/src/drive/drive-briefing.contract.ts`; specs/2026-10-09-drive-mode-v3.md §1).
|
|
4
|
+
*
|
|
5
|
+
* The snapshot is what the voice orchestrator answers status questions from
|
|
6
|
+
* ("how is CE doing?", "what is Ella on?", "where is CE-12?") without asking
|
|
7
|
+
* an agent. This machine rebuilds it from structured data on every change
|
|
8
|
+
* and pushes it:
|
|
9
|
+
*
|
|
10
|
+
* PUT /api/cloud/instances/:instanceId/briefing {snapshot} (this machine's Cloud token)
|
|
11
|
+
*
|
|
12
|
+
* Names, never secrets: every text field is clipped and passed through the
|
|
13
|
+
* secret redactor before it leaves the machine. Pure types.
|
|
14
|
+
*
|
|
15
|
+
* @module services/drive/drive-briefing.contract
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=drive-briefing.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-briefing.contract.js","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-briefing.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather what the Drive mode status snapshot is built from
|
|
3
|
+
* (specs/2026-10-09-drive-mode-v3.md §1): teams and agents from storage,
|
|
4
|
+
* every project's tickets, the task pool, the briefing queue's live owner
|
|
5
|
+
* items and the agents' recent messages to the owner. Each source is read
|
|
6
|
+
* on its own; one that fails is left empty, never the whole snapshot.
|
|
7
|
+
*
|
|
8
|
+
* @module services/drive/drive-briefing.wiring
|
|
9
|
+
*/
|
|
10
|
+
import type { Team } from '../../types/index.js';
|
|
11
|
+
import type { OwnerTurnMark } from '../briefing/briefing-cards.js';
|
|
12
|
+
import type { RecallFeedMessage } from './drive-recall.js';
|
|
13
|
+
import { type SnapshotSources, type SnapshotTicketSource, type SnapshotWaitingSource, type SnapshotWorkItemSource } from './drive-briefing-snapshot.js';
|
|
14
|
+
/** Where the sources come from. */
|
|
15
|
+
export interface BriefingWiringDeps {
|
|
16
|
+
getTeams: () => Promise<Team[]>;
|
|
17
|
+
getProjects: () => Promise<Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
path: string;
|
|
20
|
+
}>>;
|
|
21
|
+
listTickets: (projectPath: string) => Promise<Array<Omit<SnapshotTicketSource, 'project'>>>;
|
|
22
|
+
listWorkItems: () => Promise<SnapshotWorkItemSource[]>;
|
|
23
|
+
/** Live owner items (the briefing queue) */
|
|
24
|
+
waiting: () => Promise<SnapshotWaitingSource[]>;
|
|
25
|
+
ownerFeed: (sinceMs: number, limit: number) => {
|
|
26
|
+
messages: RecallFeedMessage[];
|
|
27
|
+
ownerTurns: OwnerTurnMark[];
|
|
28
|
+
};
|
|
29
|
+
/** Whether the orchestrator's session runs */
|
|
30
|
+
orchestratorRunning: () => boolean;
|
|
31
|
+
/** The orchestrator's display name */
|
|
32
|
+
orchestratorName: string;
|
|
33
|
+
now?: () => Date;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gather the snapshot sources.
|
|
37
|
+
*
|
|
38
|
+
* @param deps - Where they come from
|
|
39
|
+
* @returns Sources for `buildBriefingSnapshot`
|
|
40
|
+
*/
|
|
41
|
+
export declare function collectSnapshotSources(deps: BriefingWiringDeps): Promise<SnapshotSources>;
|
|
42
|
+
/**
|
|
43
|
+
* Cached reads of the expensive sources (every project's tickets, the task
|
|
44
|
+
* pool), so a busy machine does not re-read them on each rebuild. A
|
|
45
|
+
* project's tickets are re-read after a change event for that project (or
|
|
46
|
+
* after {@link DRIVE_BRIEFING_CONSTANTS.TICKET_CACHE_MS}); the pool after a
|
|
47
|
+
* work-item event (or after {@link DRIVE_BRIEFING_CONSTANTS.POOL_CACHE_MS}).
|
|
48
|
+
*/
|
|
49
|
+
export declare class SnapshotSourceCache {
|
|
50
|
+
private readonly now;
|
|
51
|
+
private readonly tickets;
|
|
52
|
+
private pool;
|
|
53
|
+
/**
|
|
54
|
+
* @param now - Clock (ms)
|
|
55
|
+
*/
|
|
56
|
+
constructor(now?: () => number);
|
|
57
|
+
/**
|
|
58
|
+
* Wrap ticket and pool readers with the cache.
|
|
59
|
+
*
|
|
60
|
+
* @param readers - The uncached readers
|
|
61
|
+
* @returns Cached readers for {@link BriefingWiringDeps}
|
|
62
|
+
*/
|
|
63
|
+
wrap(readers: Pick<BriefingWiringDeps, 'listTickets' | 'listWorkItems'>): Pick<BriefingWiringDeps, 'listTickets' | 'listWorkItems'>;
|
|
64
|
+
/**
|
|
65
|
+
* A ticket of this project changed (or, without a path, any project).
|
|
66
|
+
*
|
|
67
|
+
* @param projectPath - Absolute project root
|
|
68
|
+
*/
|
|
69
|
+
invalidateTickets(projectPath?: string): void;
|
|
70
|
+
/** A work item moved. */
|
|
71
|
+
invalidatePool(): void;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=drive-briefing.wiring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-briefing.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-briefing.wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAItK,mCAAmC;AACnC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAClE,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5F,aAAa,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACvD,4CAA4C;IAC5C,OAAO,EAAE,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAChD,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;QAAC,UAAU,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;IAC9G,8CAA8C;IAC9C,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAWD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqC/F;AAUD;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAOlB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0F;IAClH,OAAO,CAAC,IAAI,CAAgE;IAE5E;;OAEG;gBAC0B,GAAG,GAAE,MAAM,MAAiB;IAEzD;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,eAAe,CAAC;IAkBnI;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7C,yBAAyB;IACzB,cAAc,IAAI,IAAI;CAGvB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather what the Drive mode status snapshot is built from
|
|
3
|
+
* (specs/2026-10-09-drive-mode-v3.md §1): teams and agents from storage,
|
|
4
|
+
* every project's tickets, the task pool, the briefing queue's live owner
|
|
5
|
+
* items and the agents' recent messages to the owner. Each source is read
|
|
6
|
+
* on its own; one that fails is left empty, never the whole snapshot.
|
|
7
|
+
*
|
|
8
|
+
* @module services/drive/drive-briefing.wiring
|
|
9
|
+
*/
|
|
10
|
+
import { DRIVE_BRIEFING_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
11
|
+
import { resolveMemberSessionName } from '../../utils/member-session-name.utils.js';
|
|
12
|
+
import { getTeamLeads } from '../../utils/team.utils.js';
|
|
13
|
+
import { agentStateOf } from './drive-briefing-snapshot.js';
|
|
14
|
+
const C = DRIVE_BRIEFING_CONSTANTS;
|
|
15
|
+
/** Read a source; a failure gives the fallback. */
|
|
16
|
+
async function read(fn, fallback) {
|
|
17
|
+
try {
|
|
18
|
+
return await fn();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return fallback;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Gather the snapshot sources.
|
|
26
|
+
*
|
|
27
|
+
* @param deps - Where they come from
|
|
28
|
+
* @returns Sources for `buildBriefingSnapshot`
|
|
29
|
+
*/
|
|
30
|
+
export async function collectSnapshotSources(deps) {
|
|
31
|
+
const now = deps.now?.() ?? new Date();
|
|
32
|
+
const [teams, projects, workItems, waiting] = await Promise.all([
|
|
33
|
+
read(deps.getTeams, []),
|
|
34
|
+
read(deps.getProjects, []),
|
|
35
|
+
read(deps.listWorkItems, []),
|
|
36
|
+
read(deps.waiting, []),
|
|
37
|
+
]);
|
|
38
|
+
const tickets = (await Promise.all(projects.map(async (p) => (await read(() => deps.listTickets(p.path), [])).map((t) => ({ ...t, project: p.name }))))).flat();
|
|
39
|
+
const agents = [
|
|
40
|
+
{ agentSession: ORCHESTRATOR_SESSION_NAME, name: deps.orchestratorName, role: 'orchestrator', state: safeBool(deps.orchestratorRunning) ? 'idle' : 'stopped' },
|
|
41
|
+
];
|
|
42
|
+
const seen = new Set([ORCHESTRATOR_SESSION_NAME]);
|
|
43
|
+
const teamRows = [];
|
|
44
|
+
for (const team of teams) {
|
|
45
|
+
const members = (team.members ?? []).filter((m) => m?.id && String(m.role) !== 'orchestrator');
|
|
46
|
+
const sessions = [];
|
|
47
|
+
for (const m of members) {
|
|
48
|
+
const session = resolveMemberSessionName(team.name, m);
|
|
49
|
+
if (!session)
|
|
50
|
+
continue;
|
|
51
|
+
sessions.push(session);
|
|
52
|
+
if (seen.has(session))
|
|
53
|
+
continue;
|
|
54
|
+
seen.add(session);
|
|
55
|
+
agents.push({ agentSession: session, name: m.name || session, team: team.name, ...(m.role ? { role: String(m.role) } : {}), state: agentStateOf(m.agentStatus, m.workingStatus) });
|
|
56
|
+
}
|
|
57
|
+
if (sessions.length === 0)
|
|
58
|
+
continue;
|
|
59
|
+
const lead = getTeamLeads(team)[0];
|
|
60
|
+
teamRows.push({ id: team.id, name: team.name, ...(lead ? { lead: resolveMemberSessionName(team.name, lead) } : { lead: sessions[0] }), members: sessions });
|
|
61
|
+
}
|
|
62
|
+
const feed = await read(() => deps.ownerFeed(now.getTime() - C.OWNER_FEED_WINDOW_MS, C.OWNER_FEED_SCAN_LIMIT), { messages: [], ownerTurns: [] });
|
|
63
|
+
return { now, agents, teams: teamRows, tickets, workItems, waiting, ownerFeed: feed };
|
|
64
|
+
}
|
|
65
|
+
function safeBool(fn) {
|
|
66
|
+
try {
|
|
67
|
+
return fn();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Cached reads of the expensive sources (every project's tickets, the task
|
|
75
|
+
* pool), so a busy machine does not re-read them on each rebuild. A
|
|
76
|
+
* project's tickets are re-read after a change event for that project (or
|
|
77
|
+
* after {@link DRIVE_BRIEFING_CONSTANTS.TICKET_CACHE_MS}); the pool after a
|
|
78
|
+
* work-item event (or after {@link DRIVE_BRIEFING_CONSTANTS.POOL_CACHE_MS}).
|
|
79
|
+
*/
|
|
80
|
+
export class SnapshotSourceCache {
|
|
81
|
+
now;
|
|
82
|
+
tickets = new Map();
|
|
83
|
+
pool = null;
|
|
84
|
+
/**
|
|
85
|
+
* @param now - Clock (ms)
|
|
86
|
+
*/
|
|
87
|
+
constructor(now = Date.now) {
|
|
88
|
+
this.now = now;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Wrap ticket and pool readers with the cache.
|
|
92
|
+
*
|
|
93
|
+
* @param readers - The uncached readers
|
|
94
|
+
* @returns Cached readers for {@link BriefingWiringDeps}
|
|
95
|
+
*/
|
|
96
|
+
wrap(readers) {
|
|
97
|
+
return {
|
|
98
|
+
listTickets: async (projectPath) => {
|
|
99
|
+
const hit = this.tickets.get(projectPath);
|
|
100
|
+
if (hit && this.now() - hit.at < C.TICKET_CACHE_MS)
|
|
101
|
+
return hit.value;
|
|
102
|
+
const value = await readers.listTickets(projectPath);
|
|
103
|
+
this.tickets.set(projectPath, { at: this.now(), value });
|
|
104
|
+
return value;
|
|
105
|
+
},
|
|
106
|
+
listWorkItems: async () => {
|
|
107
|
+
if (this.pool && this.now() - this.pool.at < C.POOL_CACHE_MS)
|
|
108
|
+
return this.pool.value;
|
|
109
|
+
const value = await readers.listWorkItems();
|
|
110
|
+
this.pool = { at: this.now(), value };
|
|
111
|
+
return value;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A ticket of this project changed (or, without a path, any project).
|
|
117
|
+
*
|
|
118
|
+
* @param projectPath - Absolute project root
|
|
119
|
+
*/
|
|
120
|
+
invalidateTickets(projectPath) {
|
|
121
|
+
if (projectPath)
|
|
122
|
+
this.tickets.delete(projectPath);
|
|
123
|
+
else
|
|
124
|
+
this.tickets.clear();
|
|
125
|
+
}
|
|
126
|
+
/** A work item moved. */
|
|
127
|
+
invalidatePool() {
|
|
128
|
+
this.pool = null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=drive-briefing.wiring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-briefing.wiring.js","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-briefing.wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
* GET /api/cloud/talk/session/:sid/machine/state?instanceId= → its conversations (after `end`)
|
|
10
10
|
* GET /api/cloud/talk/session/:sid/machine/recalls/:id?instanceId= → what to recall
|
|
11
11
|
* POST /api/cloud/talk/session/:sid/machine/recalls/:id {instanceId, messages}
|
|
12
|
+
* (`op:'warm'` → `machine/state` also lists the agents to keep warm, with `warmUntil`)
|
|
12
13
|
* Machine → Cloud (an agent's `reply --drive`):
|
|
13
|
-
* POST /api/cloud/talk/session/:sid/replies {instanceId, conversationId, agentSession, text, interim?, recap?, nextStep?}
|
|
14
|
+
* POST /api/cloud/talk/session/:sid/replies {instanceId, conversationId, agentSession, text, interim?, ack?, recap?, nextStep?}
|
|
15
|
+
* Machine → Cloud (its status snapshot, specs/2026-10-09-drive-mode-v3.md):
|
|
16
|
+
* PUT /api/cloud/instances/:instanceId/briefing {snapshot}
|
|
14
17
|
*
|
|
15
18
|
* @module services/drive/drive-cloud.contract
|
|
16
19
|
*/
|
|
@@ -20,7 +23,7 @@ export type DriveTargetKind = 'agent' | 'team' | 'channel';
|
|
|
20
23
|
export interface DriveRelayData {
|
|
21
24
|
v: 1;
|
|
22
25
|
kind: 'drive';
|
|
23
|
-
op: 'deliver' | 'end' | 'recall';
|
|
26
|
+
op: 'deliver' | 'end' | 'recall' | 'warm';
|
|
24
27
|
sessionId: string;
|
|
25
28
|
id?: string;
|
|
26
29
|
instanceId: string;
|
|
@@ -53,6 +56,10 @@ export interface DriveStateFetch {
|
|
|
53
56
|
conversationId: string;
|
|
54
57
|
agentSession: string;
|
|
55
58
|
}>;
|
|
59
|
+
/** Agents to keep warm while the session runs (v3) */
|
|
60
|
+
warm: string[];
|
|
61
|
+
/** Until when (ms); 0 when nothing is warm */
|
|
62
|
+
warmUntil: number;
|
|
56
63
|
}
|
|
57
64
|
/**
|
|
58
65
|
* A Drive mode relay payload, or null (any other `talk_message`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-cloud.contract.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-cloud.contract.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"drive-cloud.contract.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/drive/drive-cloud.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,kCAAkC;AAClC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3D,yBAAyB;AACzB,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClI,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,KAAK,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,sDAAsD;IACtD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAU3E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CA0B3E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAKvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUrE"}
|