@raidiant/notifai 5.0.0 → 6.0.0
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/CHANGELOG.md +27 -0
- package/README.md +2 -2
- package/dist/client.d.ts +8 -3
- package/dist/client.js +24 -3
- package/dist/client.js.map +1 -1
- package/dist/commands-auth.d.ts +14 -0
- package/dist/commands-auth.js +154 -0
- package/dist/commands-auth.js.map +1 -0
- package/dist/commands-config.d.ts +31 -0
- package/dist/commands-config.js +246 -0
- package/dist/commands-config.js.map +1 -0
- package/dist/commands-core.d.ts +102 -0
- package/dist/commands-core.js +135 -0
- package/dist/commands-core.js.map +1 -0
- package/dist/commands-devices.d.ts +31 -0
- package/dist/commands-devices.js +124 -0
- package/dist/commands-devices.js.map +1 -0
- package/dist/commands-doctor.d.ts +24 -0
- package/dist/commands-doctor.js +1011 -0
- package/dist/commands-doctor.js.map +1 -0
- package/dist/commands-harness-context.d.ts +61 -0
- package/dist/commands-harness-context.js +93 -0
- package/dist/commands-harness-context.js.map +1 -0
- package/dist/commands-hook-shape.d.ts +17 -0
- package/dist/commands-hook-shape.js +37 -0
- package/dist/commands-hook-shape.js.map +1 -0
- package/dist/commands-hooks.d.ts +115 -0
- package/dist/commands-hooks.js +1225 -0
- package/dist/commands-hooks.js.map +1 -0
- package/dist/commands-init.d.ts +35 -0
- package/dist/commands-init.js +580 -0
- package/dist/commands-init.js.map +1 -0
- package/dist/commands-io.d.ts +2 -0
- package/dist/commands-io.js +110 -0
- package/dist/commands-io.js.map +1 -0
- package/dist/commands-logs.d.ts +30 -0
- package/dist/commands-logs.js +201 -0
- package/dist/commands-logs.js.map +1 -0
- package/dist/commands-send-support.d.ts +44 -0
- package/dist/commands-send-support.js +180 -0
- package/dist/commands-send-support.js.map +1 -0
- package/dist/commands-send.d.ts +33 -0
- package/dist/commands-send.js +519 -0
- package/dist/commands-send.js.map +1 -0
- package/dist/commands-setup-proof.d.ts +15 -0
- package/dist/commands-setup-proof.js +53 -0
- package/dist/commands-setup-proof.js.map +1 -0
- package/dist/commands-skill.d.ts +10 -0
- package/dist/commands-skill.js +71 -0
- package/dist/commands-skill.js.map +1 -0
- package/dist/commands.d.ts +12 -387
- package/dist/commands.js +12 -4536
- package/dist/commands.js.map +1 -1
- package/dist/config-schema.js +1 -1
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/credentials.js +13 -3
- package/dist/credentials.js.map +1 -1
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +127 -99
- package/dist/hooks.js.map +1 -1
- package/dist/interactive.js +4 -4
- package/dist/interactive.js.map +1 -1
- package/dist/logging.js +1 -0
- package/dist/logging.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/readiness.d.ts +3 -1
- package/dist/readiness.js.map +1 -1
- package/package.json +2 -2
- package/src/client.test.ts +90 -1
- package/src/client.ts +35 -2
- package/src/commands-auth.ts +174 -0
- package/src/commands-config.ts +307 -0
- package/src/commands-core.ts +240 -0
- package/src/commands-devices.ts +150 -0
- package/src/commands-doctor.ts +1209 -0
- package/src/commands-harness-context.ts +126 -0
- package/src/commands-hook-shape.ts +53 -0
- package/src/commands-hooks.ts +1586 -0
- package/src/commands-init.ts +721 -0
- package/src/commands-io.ts +108 -0
- package/src/commands-logs.ts +243 -0
- package/src/commands-send-support.ts +224 -0
- package/src/commands-send.ts +623 -0
- package/src/commands-setup-proof.ts +71 -0
- package/src/commands-skill.ts +84 -0
- package/src/commands.test.ts +493 -39
- package/src/commands.ts +58 -5614
- package/src/config-schema.ts +1 -1
- package/src/config.test.ts +9 -0
- package/src/config.ts +7 -2
- package/src/credentials.test.ts +25 -1
- package/src/credentials.ts +13 -3
- package/src/hooks.test.ts +351 -11
- package/src/hooks.ts +145 -97
- package/src/interactive.test.ts +19 -1
- package/src/interactive.ts +4 -4
- package/src/logging.test.ts +15 -2
- package/src/logging.ts +1 -0
- package/src/main.ts +1 -1
- package/src/readiness.ts +3 -1
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -282,12 +282,12 @@ export declare function clearSessionState(sessionId: string, env: NodeJS.Process
|
|
|
282
282
|
export declare function pruneAbandonedSessions(env: NodeJS.ProcessEnv, now?: number, maxAgeMs?: number): number;
|
|
283
283
|
export declare function claimQuestionPush(sessionId: string, env: NodeJS.ProcessEnv, now?: number, beforeStaleReplace?: () => void): boolean;
|
|
284
284
|
export declare function releaseQuestionPush(sessionId: string, env: NodeJS.ProcessEnv): void;
|
|
285
|
-
/** Records every live session working in a directory, for `notifai ask`. */
|
|
286
|
-
export declare function writeProjectSession(cwd: string, env: NodeJS.ProcessEnv, sessionId: string, now: number, harness: HookHarness): void;
|
|
287
285
|
export interface ProjectSessionPointer {
|
|
288
286
|
sessionId: string;
|
|
289
287
|
harness: HookHarness;
|
|
290
288
|
}
|
|
289
|
+
/** Records every live session working in a directory, for `notifai ask`. */
|
|
290
|
+
export declare function writeProjectSession(cwd: string, env: NodeJS.ProcessEnv, sessionId: string, now: number, harness: HookHarness): void;
|
|
291
291
|
/**
|
|
292
292
|
* Resolves the session working in `cwd`. Stale pointers are ignored rather than
|
|
293
293
|
* trusted: an id left by a session that ended days ago would send the question
|
package/dist/hooks.js
CHANGED
|
@@ -7,6 +7,7 @@ import { loadConfig, projectSessionPointerPath, sanitizeSessionId, sessionConfig
|
|
|
7
7
|
import { buildDraft } from './send.js';
|
|
8
8
|
import { atomicWriteFileSync } from './atomic-file.js';
|
|
9
9
|
import { withFileLock } from './file-lock.js';
|
|
10
|
+
import { inferInvocationContext } from './invocation-context.js';
|
|
10
11
|
import { HARNESS_CAPABILITIES, HARNESSES, } from './harnesses.js';
|
|
11
12
|
/**
|
|
12
13
|
* A retirement is only worth syncing while the question it retires could still
|
|
@@ -20,6 +21,18 @@ import { HARNESS_CAPABILITIES, HARNESSES, } from './harnesses.js';
|
|
|
20
21
|
const ORPHAN_TTL_MS = (REPLY_MAX_WINDOW_SECONDS + 3600) * 1000;
|
|
21
22
|
/** More orphans than this means something is looping; keep the newest. */
|
|
22
23
|
const ORPHAN_QUEUE_CAP = 50;
|
|
24
|
+
/** Keep immutable session grouping while replacing per-event Git location authoritatively. */
|
|
25
|
+
function sourceContextAtHookEvent(source, cwd) {
|
|
26
|
+
const invocation = cwd === undefined ? null : inferInvocationContext(cwd);
|
|
27
|
+
const current = {
|
|
28
|
+
...(source?.session_id !== undefined ? { session_id: source.session_id } : {}),
|
|
29
|
+
...(source?.session_label !== undefined ? { session_label: source.session_label } : {}),
|
|
30
|
+
...(source?.harness !== undefined ? { harness: source.harness } : {}),
|
|
31
|
+
...(invocation?.branch !== undefined ? { branch: invocation.branch } : {}),
|
|
32
|
+
...(invocation?.worktree !== undefined ? { worktree: invocation.worktree } : {}),
|
|
33
|
+
};
|
|
34
|
+
return Object.keys(current).length === 0 ? undefined : current;
|
|
35
|
+
}
|
|
23
36
|
function summarizeRequestIds(entries) {
|
|
24
37
|
const ids = entries.flatMap((entry) => entry.request_id === undefined ? [] : [entry.request_id]);
|
|
25
38
|
return { ids, display: ids.join(', ') };
|
|
@@ -322,52 +335,70 @@ function claimPath(sessionId, env) {
|
|
|
322
335
|
* meantime, and keeps one runaway agent from writing megabytes per session.
|
|
323
336
|
*/
|
|
324
337
|
const MAX_STORED_QUESTION_CHARS = 2000;
|
|
338
|
+
function storedProjectSessionPointer(candidate) {
|
|
339
|
+
if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate))
|
|
340
|
+
return null;
|
|
341
|
+
const entry = candidate;
|
|
342
|
+
if (typeof entry.session_id !== 'string' || entry.session_id === '')
|
|
343
|
+
return null;
|
|
344
|
+
if (typeof entry.updated_at !== 'number')
|
|
345
|
+
return null;
|
|
346
|
+
if (!HARNESSES.includes(entry.harness))
|
|
347
|
+
return null;
|
|
348
|
+
return {
|
|
349
|
+
sessionId: entry.session_id,
|
|
350
|
+
updatedAt: entry.updated_at,
|
|
351
|
+
harness: entry.harness,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function readStoredProjectSessionDocument(file) {
|
|
355
|
+
if (!existsSync(file))
|
|
356
|
+
return { root: {}, sessions: [] };
|
|
357
|
+
try {
|
|
358
|
+
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
359
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
360
|
+
return { root: {}, sessions: [] };
|
|
361
|
+
}
|
|
362
|
+
const root = parsed;
|
|
363
|
+
return {
|
|
364
|
+
root,
|
|
365
|
+
sessions: Array.isArray(root['sessions']) ? root['sessions'] : [],
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return { root: {}, sessions: [] };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
325
372
|
/** Records every live session working in a directory, for `notifai ask`. */
|
|
326
373
|
export function writeProjectSession(cwd, env, sessionId, now, harness) {
|
|
327
374
|
const file = projectSessionPointerPath(cwd, env);
|
|
328
375
|
withFileLock(`${file}.lock`, () => {
|
|
329
|
-
const
|
|
376
|
+
const stored = readStoredProjectSessionDocument(file);
|
|
377
|
+
const existing = [];
|
|
378
|
+
let refreshed = {};
|
|
379
|
+
for (const candidate of stored.sessions) {
|
|
380
|
+
const entry = storedProjectSessionPointer(candidate);
|
|
381
|
+
if (entry?.sessionId === sessionId) {
|
|
382
|
+
refreshed = { ...refreshed, ...candidate };
|
|
383
|
+
}
|
|
384
|
+
else if (entry === null || now - entry.updatedAt <= 24 * 3600 * 1000) {
|
|
385
|
+
existing.push(candidate);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
330
388
|
atomicWriteFileSync(file, `${JSON.stringify({
|
|
389
|
+
...stored.root,
|
|
331
390
|
sessions: [
|
|
332
|
-
...existing
|
|
333
|
-
|
|
334
|
-
updated_at: entry.updatedAt,
|
|
335
|
-
harness: entry.harness,
|
|
336
|
-
})),
|
|
337
|
-
{ session_id: sessionId, updated_at: now, harness },
|
|
391
|
+
...existing,
|
|
392
|
+
{ ...refreshed, session_id: sessionId, updated_at: now, harness },
|
|
338
393
|
],
|
|
339
394
|
})}\n`);
|
|
340
395
|
});
|
|
341
396
|
}
|
|
342
397
|
function readStoredProjectSessionPointers(file) {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
if (!Array.isArray(parsed.sessions))
|
|
348
|
-
return [];
|
|
349
|
-
return parsed.sessions.flatMap((candidate) => {
|
|
350
|
-
if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate))
|
|
351
|
-
return [];
|
|
352
|
-
const entry = candidate;
|
|
353
|
-
if (typeof entry.session_id !== 'string' || entry.session_id === '')
|
|
354
|
-
return [];
|
|
355
|
-
if (typeof entry.updated_at !== 'number')
|
|
356
|
-
return [];
|
|
357
|
-
if (!HARNESSES.includes(entry.harness))
|
|
358
|
-
return [];
|
|
359
|
-
return [
|
|
360
|
-
{
|
|
361
|
-
sessionId: entry.session_id,
|
|
362
|
-
updatedAt: entry.updated_at,
|
|
363
|
-
harness: entry.harness,
|
|
364
|
-
},
|
|
365
|
-
];
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
catch {
|
|
369
|
-
return [];
|
|
370
|
-
}
|
|
398
|
+
return readStoredProjectSessionDocument(file).sessions.flatMap((candidate) => {
|
|
399
|
+
const entry = storedProjectSessionPointer(candidate);
|
|
400
|
+
return entry === null ? [] : [entry];
|
|
401
|
+
});
|
|
371
402
|
}
|
|
372
403
|
/**
|
|
373
404
|
* Resolves the session working in `cwd`. Stale pointers are ignored rather than
|
|
@@ -421,17 +452,19 @@ export function readMatchingProjectSessionPointer(cwd, env, now, sessionId, harn
|
|
|
421
452
|
function clearMatchingProjectSession(cwd, env, sessionId) {
|
|
422
453
|
const file = projectSessionPointerPath(cwd, env);
|
|
423
454
|
withFileLock(`${file}.lock`, () => {
|
|
424
|
-
const
|
|
425
|
-
|
|
455
|
+
const stored = readStoredProjectSessionDocument(file);
|
|
456
|
+
const remaining = stored.sessions.filter((candidate) => {
|
|
457
|
+
const entry = storedProjectSessionPointer(candidate);
|
|
458
|
+
return entry === null || entry.sessionId !== sessionId;
|
|
459
|
+
});
|
|
460
|
+
const hasUnknownRootFields = Object.keys(stored.root).some((key) => key !== 'sessions');
|
|
461
|
+
if (remaining.length === 0 && !hasUnknownRootFields) {
|
|
426
462
|
rmSync(file, { force: true });
|
|
427
463
|
return;
|
|
428
464
|
}
|
|
429
465
|
atomicWriteFileSync(file, `${JSON.stringify({
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
updated_at: entry.updatedAt,
|
|
433
|
-
harness: entry.harness,
|
|
434
|
-
})),
|
|
466
|
+
...stored.root,
|
|
467
|
+
sessions: remaining,
|
|
435
468
|
})}\n`);
|
|
436
469
|
});
|
|
437
470
|
}
|
|
@@ -600,7 +633,8 @@ async function answerableDevices(ctx) {
|
|
|
600
633
|
return devices
|
|
601
634
|
.filter((device) => (device.platform === 'ios' || device.platform === 'macos') &&
|
|
602
635
|
device.registration_healthy &&
|
|
603
|
-
device.
|
|
636
|
+
device.capabilities?.includes('answer') === true &&
|
|
637
|
+
device.derived_status !== 'must_update')
|
|
604
638
|
.filter((device) => configured === null || configured.includes(device.device_id))
|
|
605
639
|
.map((device) => device.device_id);
|
|
606
640
|
}
|
|
@@ -661,7 +695,6 @@ const RETIREMENT_TITLES = {
|
|
|
661
695
|
answered: 'Answered',
|
|
662
696
|
answered_elsewhere: 'Answered in the terminal',
|
|
663
697
|
expired: 'Question expired',
|
|
664
|
-
superseded: 'Replaced by a newer question',
|
|
665
698
|
};
|
|
666
699
|
/**
|
|
667
700
|
* Park a delivered question for retirement. Called at the moment we learn it is
|
|
@@ -696,7 +729,7 @@ export function parkForRetirement(sessionId, env, pending, state) {
|
|
|
696
729
|
* question or retire a device that never received it. Fail explicitly and keep
|
|
697
730
|
* the pending record instead of silently broadening or narrowing the fanout.
|
|
698
731
|
*/
|
|
699
|
-
function retiringQuestion(pending, state) {
|
|
732
|
+
function retiringQuestion(pending, state, cwd) {
|
|
700
733
|
const hasRequest = pending.request_id !== undefined;
|
|
701
734
|
const hasCollapse = pending.collapse_key !== undefined;
|
|
702
735
|
const hasDevices = pending.device_ids !== undefined && pending.device_ids.length > 0;
|
|
@@ -705,13 +738,14 @@ function retiringQuestion(pending, state) {
|
|
|
705
738
|
if (!hasRequest || !hasCollapse || !hasDevices) {
|
|
706
739
|
throw new Error('live question state is incomplete; refusing to retire it without request, collapse, and device identifiers');
|
|
707
740
|
}
|
|
741
|
+
const source = sourceContextAtHookEvent(pending.source, cwd);
|
|
708
742
|
return {
|
|
709
743
|
request_id: pending.request_id,
|
|
710
744
|
collapse_key: pending.collapse_key,
|
|
711
745
|
device_ids: [...pending.device_ids],
|
|
712
746
|
question: pending.question,
|
|
713
747
|
...(pending.project !== undefined ? { project: pending.project } : {}),
|
|
714
|
-
...(
|
|
748
|
+
...(source !== undefined ? { source } : {}),
|
|
715
749
|
state,
|
|
716
750
|
};
|
|
717
751
|
}
|
|
@@ -1223,9 +1257,9 @@ async function reconcileAcknowledgementObligations(ctx, sessionId, due) {
|
|
|
1223
1257
|
* grows with each settled generation, so the cap that bounds chained
|
|
1224
1258
|
* answer-to-question loops is a real count rather than a constant 1.
|
|
1225
1259
|
*/
|
|
1226
|
-
function settleAcceptedAnswers(ctx, sessionId, accepted) {
|
|
1260
|
+
function settleAcceptedAnswers(ctx, sessionId, accepted, cwd) {
|
|
1227
1261
|
const retirements = accepted.answers
|
|
1228
|
-
.map(({ pending }) => retiringQuestion(pending, 'answered'))
|
|
1262
|
+
.map(({ pending }) => retiringQuestion(pending, 'answered', cwd))
|
|
1229
1263
|
.filter((entry) => entry !== null);
|
|
1230
1264
|
updateSessionState(sessionId, ctx.env, (current) => {
|
|
1231
1265
|
const retiring = [...(current.retiring ?? [])];
|
|
@@ -1249,7 +1283,7 @@ async function retirePendings(ctx, envelope, sessionId, entries, state) {
|
|
|
1249
1283
|
updateSessionState(sessionId, ctx.env, (current) => {
|
|
1250
1284
|
const retiring = [...(current.retiring ?? [])];
|
|
1251
1285
|
for (const entry of entries) {
|
|
1252
|
-
const retirement = retiringQuestion(entry, state);
|
|
1286
|
+
const retirement = retiringQuestion(entry, state, envelope.cwd);
|
|
1253
1287
|
if (retirement !== null && !retiring.some((item) => item.request_id === retirement.request_id)) {
|
|
1254
1288
|
retiring.push(retirement);
|
|
1255
1289
|
}
|
|
@@ -1338,37 +1372,32 @@ export async function handleUserPromptSubmit(ctx, envelope) {
|
|
|
1338
1372
|
const retiring = [...(current.retiring ?? [])];
|
|
1339
1373
|
const unasked = pendingList(current).filter((entry) => entry.request_id === undefined);
|
|
1340
1374
|
for (const entry of pendingList(current).filter((entry) => entry.request_id !== undefined)) {
|
|
1341
|
-
const retirement = retiringQuestion(entry, 'answered_elsewhere');
|
|
1375
|
+
const retirement = retiringQuestion(entry, 'answered_elsewhere', envelope.cwd);
|
|
1342
1376
|
if (retirement !== null &&
|
|
1343
1377
|
!retiring.some((parked) => parked.request_id === retirement.request_id)) {
|
|
1344
1378
|
retiring.push(retirement);
|
|
1345
1379
|
}
|
|
1346
1380
|
}
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
// answer is still journaled, so it can never pass for the user's presence.
|
|
1368
|
-
...(current.continuation === undefined
|
|
1369
|
-
? {}
|
|
1370
|
-
: { continuation: { ...current.continuation, count: 0 } }),
|
|
1371
|
-
};
|
|
1381
|
+
// Start from the whole document so fields introduced by a newer CLI remain
|
|
1382
|
+
// attached while this older writer applies the prompt transition it knows.
|
|
1383
|
+
const next = { ...current, last_prompt_at: ctx.now() };
|
|
1384
|
+
if (unasked.length > 0)
|
|
1385
|
+
next.pending = unasked;
|
|
1386
|
+
else
|
|
1387
|
+
delete next.pending;
|
|
1388
|
+
if (retiring.length > 0)
|
|
1389
|
+
next.retiring = retiring;
|
|
1390
|
+
else
|
|
1391
|
+
delete next.retiring;
|
|
1392
|
+
// The user typed, so whatever chain of answer-driven continuations was
|
|
1393
|
+
// running, a human has taken the turn and the consecutive count starts
|
|
1394
|
+
// over. Only a real prompt reaches here: the journal branch above returns
|
|
1395
|
+
// first, and a wake route's injected message always arrives while its own
|
|
1396
|
+
// answer is still journaled, so it can never pass for the user's presence.
|
|
1397
|
+
if (current.continuation !== undefined) {
|
|
1398
|
+
next.continuation = { ...current.continuation, count: 0 };
|
|
1399
|
+
}
|
|
1400
|
+
return next;
|
|
1372
1401
|
});
|
|
1373
1402
|
// The bridge that lets a plain `notifai ask` find the hook's canonical
|
|
1374
1403
|
// session: an agent shell command gets no hook payload, and not every
|
|
@@ -1473,9 +1502,9 @@ export async function runEscalationWaiter(ctx, options) {
|
|
|
1473
1502
|
if (!deliveryProven) {
|
|
1474
1503
|
for (const answer of accepted.answers)
|
|
1475
1504
|
reportAnswer(ctx, notes, answer, true);
|
|
1476
|
-
return await deliverAcceptedAnswers(ctx, sessionId, options.route, accepted, notes);
|
|
1505
|
+
return await deliverAcceptedAnswers(ctx, sessionId, options.route, accepted, notes, envelope.cwd);
|
|
1477
1506
|
}
|
|
1478
|
-
settleAcceptedAnswers(ctx, sessionId, accepted);
|
|
1507
|
+
settleAcceptedAnswers(ctx, sessionId, accepted, envelope.cwd);
|
|
1479
1508
|
settledAnswerThisPass = true;
|
|
1480
1509
|
state = readSessionState(sessionId, ctx.env);
|
|
1481
1510
|
const currentAcceptedIds = new Set(accepted.answers.flatMap(({ pending }) => pending.request_id === undefined ? [] : [pending.request_id]));
|
|
@@ -1540,7 +1569,7 @@ export function hookContinuationRoute() {
|
|
|
1540
1569
|
* consults is not a backstop: that is how a single answer once reached a
|
|
1541
1570
|
* session 250 times.
|
|
1542
1571
|
*/
|
|
1543
|
-
async function deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes) {
|
|
1572
|
+
async function deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes, cwd) {
|
|
1544
1573
|
const { answers: answered, remaining } = accepted;
|
|
1545
1574
|
const requestIds = summarizeRequestIds(answered.map((entry) => entry.pending)).ids;
|
|
1546
1575
|
const held = accepted.held_deliveries ?? 0;
|
|
@@ -1551,7 +1580,7 @@ async function deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes) {
|
|
|
1551
1580
|
limit: MAX_HELD_DELIVERIES,
|
|
1552
1581
|
request_ids: requestIds,
|
|
1553
1582
|
});
|
|
1554
|
-
settleAcceptedAnswers(ctx, sessionId, accepted);
|
|
1583
|
+
settleAcceptedAnswers(ctx, sessionId, accepted, cwd);
|
|
1555
1584
|
notes.push(`no route could hand the user's answer over in ${MAX_HELD_DELIVERIES} turns; not holding it any longer`);
|
|
1556
1585
|
return { notes };
|
|
1557
1586
|
}
|
|
@@ -1566,7 +1595,7 @@ async function deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes) {
|
|
|
1566
1595
|
// Settle rather than journal for ever. The answer has been offered as often
|
|
1567
1596
|
// as any working route could need, it is already in the notes of each of
|
|
1568
1597
|
// those turns, and the questions it answered still deserve retirement.
|
|
1569
|
-
settleAcceptedAnswers(ctx, sessionId, accepted);
|
|
1598
|
+
settleAcceptedAnswers(ctx, sessionId, accepted, cwd);
|
|
1570
1599
|
notes.push(`the user's answer reached the ${route.kind} route ${MAX_CONTINUATION_COUNT} times without being acknowledged; not delivering it again`);
|
|
1571
1600
|
return { notes };
|
|
1572
1601
|
}
|
|
@@ -1683,7 +1712,7 @@ async function handleClaimedStop(ctx, envelope, sessionId, state, pending, notes
|
|
|
1683
1712
|
reportAnswer(ctx, notes, answer, true);
|
|
1684
1713
|
// Anything still unasked rides the next Stop: the agent is being resumed
|
|
1685
1714
|
// with answers right now, and may not even need the rest afterwards.
|
|
1686
|
-
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes);
|
|
1715
|
+
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes, envelope.cwd);
|
|
1687
1716
|
}
|
|
1688
1717
|
const recoverableLive = live.filter((entry) => !permanentFailures.has(entry.request_id));
|
|
1689
1718
|
liveToEscalate = recoverableLive;
|
|
@@ -1786,6 +1815,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1786
1815
|
// server accepts answers into changed.
|
|
1787
1816
|
const ownerDeadlineAt = ceilingAt;
|
|
1788
1817
|
const questions = pendingQuestions(entry);
|
|
1818
|
+
const eventSource = sourceContextAtHookEvent(entry.source, envelope.cwd);
|
|
1789
1819
|
let intent = entry.submission;
|
|
1790
1820
|
if (intent === undefined) {
|
|
1791
1821
|
if (entry.body === undefined) {
|
|
@@ -1799,7 +1829,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1799
1829
|
questions,
|
|
1800
1830
|
...(entry.media !== undefined ? { media: entry.media } : {}),
|
|
1801
1831
|
...(entry.project !== undefined ? { project: entry.project } : {}),
|
|
1802
|
-
...(
|
|
1832
|
+
...(eventSource !== undefined ? { source: eventSource } : {}),
|
|
1803
1833
|
event: 'agent_question',
|
|
1804
1834
|
windowSeconds: replyWindowSeconds,
|
|
1805
1835
|
ownerDeadlineAt,
|
|
@@ -1878,7 +1908,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1878
1908
|
questions,
|
|
1879
1909
|
...(entry.media !== undefined ? { media: entry.media } : {}),
|
|
1880
1910
|
...(entry.project !== undefined ? { project: entry.project } : {}),
|
|
1881
|
-
...(
|
|
1911
|
+
...(eventSource !== undefined ? { source: eventSource } : {}),
|
|
1882
1912
|
event: 'agent_question',
|
|
1883
1913
|
windowSeconds: replyWindowSeconds,
|
|
1884
1914
|
ownerDeadlineAt,
|
|
@@ -1954,6 +1984,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1954
1984
|
: Date.parse(receipt.reply_expires_at);
|
|
1955
1985
|
const live = {
|
|
1956
1986
|
...entry,
|
|
1987
|
+
...(intent.draft.source !== undefined ? { source: intent.draft.source } : {}),
|
|
1957
1988
|
request_id: intent.request_id,
|
|
1958
1989
|
collapse_key: intent.collapse_key,
|
|
1959
1990
|
device_ids: intent.device_ids,
|
|
@@ -1973,6 +2004,8 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1973
2004
|
? committedReplyDeadline
|
|
1974
2005
|
: intent.owner_deadline_at,
|
|
1975
2006
|
};
|
|
2007
|
+
if (intent.draft.source === undefined)
|
|
2008
|
+
delete live.source;
|
|
1976
2009
|
delete live.submission;
|
|
1977
2010
|
submitted.push(live);
|
|
1978
2011
|
// Record what is now live on the user's devices BEFORE any wait. If we
|
|
@@ -1992,7 +2025,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
1992
2025
|
// The entry vanished while the submit was in flight (the user's prompt
|
|
1993
2026
|
// wiped the queue). The delivered notification must still be retirable,
|
|
1994
2027
|
// so park it rather than lose its only identifiers.
|
|
1995
|
-
const retirement = retiringQuestion(live, 'answered_elsewhere');
|
|
2028
|
+
const retirement = retiringQuestion(live, 'answered_elsewhere', envelope.cwd);
|
|
1996
2029
|
const retiring = [...(current.retiring ?? [])];
|
|
1997
2030
|
if (!retiring.some((parked) => parked.request_id === retirement.request_id)) {
|
|
1998
2031
|
retiring.push(retirement);
|
|
@@ -2022,7 +2055,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
2022
2055
|
const accepted = stageAcceptedAnswers(ctx, sessionId, staleAnswers, remaining);
|
|
2023
2056
|
for (const answer of staleAnswers)
|
|
2024
2057
|
reportAnswer(ctx, notes, answer, true);
|
|
2025
|
-
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes);
|
|
2058
|
+
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes, envelope.cwd);
|
|
2026
2059
|
}
|
|
2027
2060
|
const waitingOn = [
|
|
2028
2061
|
...alreadyLive.filter((entry) => entry.reply_deadline_at !== undefined && entry.reply_deadline_at > ctx.now()),
|
|
@@ -2082,7 +2115,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
2082
2115
|
const accepted = stageAcceptedAnswers(ctx, sessionId, finalAnswers, remaining);
|
|
2083
2116
|
for (const answer of finalAnswers)
|
|
2084
2117
|
reportAnswer(ctx, notes, answer, false);
|
|
2085
|
-
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes);
|
|
2118
|
+
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes, envelope.cwd);
|
|
2086
2119
|
}
|
|
2087
2120
|
const requestIdSummary = summarizeRequestIds(waitingOn);
|
|
2088
2121
|
ctx.log?.info('hook.answer', {
|
|
@@ -2127,7 +2160,7 @@ async function escalate(ctx, envelope, sessionId, unasked, alreadyLive, notes, h
|
|
|
2127
2160
|
const accepted = stageAcceptedAnswers(ctx, sessionId, answered, waitingOn.length - answered.length);
|
|
2128
2161
|
for (const answer of answered)
|
|
2129
2162
|
reportAnswer(ctx, notes, answer, false);
|
|
2130
|
-
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes);
|
|
2163
|
+
return deliverAcceptedAnswers(ctx, sessionId, route, accepted, notes, envelope.cwd);
|
|
2131
2164
|
}
|
|
2132
2165
|
// ---------------------------------------------------------------------------
|
|
2133
2166
|
// SessionEnd — local cleanup only
|
|
@@ -2151,7 +2184,7 @@ export function handleSessionEnd(env, envelope, now = Date.now()) {
|
|
|
2151
2184
|
const orphans = [...(state.retiring ?? [])];
|
|
2152
2185
|
for (const entry of pendingList(state)) {
|
|
2153
2186
|
try {
|
|
2154
|
-
const orphan = retiringQuestion(entry, 'expired');
|
|
2187
|
+
const orphan = retiringQuestion(entry, 'expired', envelope.cwd);
|
|
2155
2188
|
if (orphan !== null)
|
|
2156
2189
|
orphans.push(orphan);
|
|
2157
2190
|
}
|
|
@@ -2170,18 +2203,13 @@ export function handleSessionEnd(env, envelope, now = Date.now()) {
|
|
|
2170
2203
|
notes.push(`queued ${orphans.length} question${orphans.length > 1 ? 's' : ''} for retirement on the next hook`);
|
|
2171
2204
|
}
|
|
2172
2205
|
if (state.accepted !== undefined || (state.acknowledgement_due?.length ?? 0) > 0) {
|
|
2173
|
-
const preserved = {};
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2206
|
+
const preserved = { ...state };
|
|
2207
|
+
delete preserved.pending;
|
|
2208
|
+
delete preserved.retiring;
|
|
2209
|
+
delete preserved.acknowledgement_blocks;
|
|
2210
|
+
if ((preserved.acknowledgement_due?.length ?? 0) === 0) {
|
|
2211
|
+
delete preserved.acknowledgement_due;
|
|
2178
2212
|
}
|
|
2179
|
-
if (state.last_prompt_at !== undefined)
|
|
2180
|
-
preserved.last_prompt_at = state.last_prompt_at;
|
|
2181
|
-
if (state.last_stop_at !== undefined)
|
|
2182
|
-
preserved.last_stop_at = state.last_stop_at;
|
|
2183
|
-
if (state.continuation !== undefined)
|
|
2184
|
-
preserved.continuation = state.continuation;
|
|
2185
2213
|
writeSessionState(sessionId, env, preserved);
|
|
2186
2214
|
notes.push(state.accepted !== undefined
|
|
2187
2215
|
? 'preserved an accepted device answer for this exact session to resume'
|