@dsh-enhanced/assistant-delivery 0.1.62 → 0.1.64
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/README.md +32 -10
- package/bin/dsh-restart-supervisor.js +76 -0
- package/lib/agent-runtime.d.ts +21 -1
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +192 -23
- package/lib/agent-runtime.js.map +1 -1
- package/lib/coordinator.d.ts.map +1 -1
- package/lib/coordinator.js +10 -0
- package/lib/coordinator.js.map +1 -1
- package/lib/operator-snapshot.d.ts +1 -1
- package/lib/operator-snapshot.d.ts.map +1 -1
- package/lib/operator-snapshot.js +5 -5
- package/lib/operator-snapshot.js.map +1 -1
- package/lib/restart-native.d.ts +47 -0
- package/lib/restart-native.d.ts.map +1 -0
- package/lib/restart-native.js +170 -0
- package/lib/restart-native.js.map +1 -0
- package/lib/restart-runtime.d.ts +38 -0
- package/lib/restart-runtime.d.ts.map +1 -0
- package/lib/restart-runtime.js +335 -0
- package/lib/restart-runtime.js.map +1 -0
- package/lib/restart-store.d.ts +132 -0
- package/lib/restart-store.d.ts.map +1 -0
- package/lib/restart-store.js +757 -0
- package/lib/restart-store.js.map +1 -0
- package/lib/restart-supervisor.d.ts +129 -0
- package/lib/restart-supervisor.d.ts.map +1 -0
- package/lib/restart-supervisor.js +615 -0
- package/lib/restart-supervisor.js.map +1 -0
- package/lib/service.d.ts +45 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +488 -6
- package/lib/service.js.map +1 -1
- package/lib/sqlite.d.ts +1 -1
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +76 -2
- package/lib/sqlite.js.map +1 -1
- package/lib/store.d.ts +41 -1
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +433 -85
- package/lib/store.js.map +1 -1
- package/lib/tools.d.ts.map +1 -1
- package/lib/tools.js +21 -2
- package/lib/tools.js.map +1 -1
- package/lib/types.d.ts +33 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +11 -10
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { freezeMessage, MessageId } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
const continuationSource = {
|
|
4
|
+
kind: 'assistant-delivery',
|
|
5
|
+
form: 'notice',
|
|
6
|
+
summary: 'Resume the interrupted owner task',
|
|
7
|
+
};
|
|
8
|
+
export class RestartContinuationError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = 'RestartContinuationError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** The stable identity is stored by Delivery before any native admission. */
|
|
17
|
+
export function createRestartContinuation(input) {
|
|
18
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,199}$/u.test(input.continuationId)
|
|
19
|
+
|| input.text.trim() === '' || Buffer.byteLength(input.text, 'utf8') > 4_096) {
|
|
20
|
+
throw new RestartContinuationError('invalid', 'invalid restart continuation identity or text');
|
|
21
|
+
}
|
|
22
|
+
const id = MessageId(`dsh-restart-${createHash('sha256').update(input.continuationId).digest('hex')}`);
|
|
23
|
+
return freezeMessage({
|
|
24
|
+
id, role: 'user', content: [{ type: 'text', text: input.text }],
|
|
25
|
+
source: continuationSource,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function sameMessage(candidate, expected) {
|
|
29
|
+
return JSON.stringify(candidate) === JSON.stringify(expected);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Inspect the complete native log, not just today's pending projection. A
|
|
33
|
+
* previously claimed message must never be made pending again after restart.
|
|
34
|
+
*/
|
|
35
|
+
export function inspectRestartContinuation(agent, message) {
|
|
36
|
+
if (message.source.kind !== continuationSource.kind
|
|
37
|
+
|| message.source.form !== continuationSource.form
|
|
38
|
+
|| message.source.summary !== continuationSource.summary) {
|
|
39
|
+
throw new RestartContinuationError('invalid', 'restart continuation source is not Host-owned');
|
|
40
|
+
}
|
|
41
|
+
const pending = { 'next-turn': [], 'next-step': [] };
|
|
42
|
+
let seen = false;
|
|
43
|
+
let removedWithoutCancellation = false;
|
|
44
|
+
let claimedTurn;
|
|
45
|
+
let settledReason;
|
|
46
|
+
let openTurn;
|
|
47
|
+
for (const event of agent.session.snapshotEvents()) {
|
|
48
|
+
if (event.type === 'turn/start')
|
|
49
|
+
openTurn = event.data.turn;
|
|
50
|
+
if (event.type === 'agent/inbox/spliced') {
|
|
51
|
+
const target = event.data.target;
|
|
52
|
+
const entries = pending[target];
|
|
53
|
+
const start = event.data.start;
|
|
54
|
+
const removed = entries.slice(start, start + (event.data.removedCount ?? 0));
|
|
55
|
+
if (removed.some(item => item.id === message.id) && event.data.outcome !== 'canceled') {
|
|
56
|
+
removedWithoutCancellation = true;
|
|
57
|
+
}
|
|
58
|
+
for (const inserted of event.data.inserted) {
|
|
59
|
+
if (inserted.id !== message.id)
|
|
60
|
+
continue;
|
|
61
|
+
seen = true;
|
|
62
|
+
if (!sameMessage(inserted, message)) {
|
|
63
|
+
throw new RestartContinuationError('conflict', 'restart continuation identity has different native content');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
entries.splice(start, event.data.removedCount ?? 0, ...event.data.inserted);
|
|
67
|
+
}
|
|
68
|
+
if (event.type === 'user/message' && event.data.id === message.id) {
|
|
69
|
+
seen = true;
|
|
70
|
+
if (!sameMessage(event.data, message)) {
|
|
71
|
+
throw new RestartContinuationError('conflict', 'restart continuation identity has different entered content');
|
|
72
|
+
}
|
|
73
|
+
if (openTurn === undefined || claimedTurn !== undefined) {
|
|
74
|
+
throw new RestartContinuationError('ambiguous', 'restart continuation has no unique native turn');
|
|
75
|
+
}
|
|
76
|
+
claimedTurn = openTurn;
|
|
77
|
+
}
|
|
78
|
+
if (event.type === 'turn/end' && event.data.turn === claimedTurn) {
|
|
79
|
+
settledReason = event.data.reason.kind;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const liveTurn = agent.inbox.nextTurn.filter(item => item.id === message.id);
|
|
83
|
+
const liveStep = agent.inbox.nextStep.filter(item => item.id === message.id);
|
|
84
|
+
if (JSON.stringify(pending['next-turn']) !== JSON.stringify(agent.inbox.nextTurn)
|
|
85
|
+
|| JSON.stringify(pending['next-step']) !== JSON.stringify(agent.inbox.nextStep)) {
|
|
86
|
+
throw new RestartContinuationError('ambiguous', 'native Inbox projection differs from its event log');
|
|
87
|
+
}
|
|
88
|
+
if (claimedTurn !== undefined) {
|
|
89
|
+
if (liveTurn.length > 0 || liveStep.length > 0) {
|
|
90
|
+
throw new RestartContinuationError('ambiguous', 'a claimed restart continuation is pending again');
|
|
91
|
+
}
|
|
92
|
+
return settledReason === undefined
|
|
93
|
+
? { kind: 'claimed', turn: claimedTurn }
|
|
94
|
+
: { kind: 'settled', turn: claimedTurn, reason: settledReason };
|
|
95
|
+
}
|
|
96
|
+
if (removedWithoutCancellation || liveStep.length > 0 || liveTurn.length > 1)
|
|
97
|
+
return { kind: 'ambiguous' };
|
|
98
|
+
if (liveTurn.length === 1)
|
|
99
|
+
return { kind: 'pending' };
|
|
100
|
+
return seen ? { kind: 'ambiguous' } : { kind: 'unseen' };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The caller must install its model/tool dispatch fences before invoking this.
|
|
104
|
+
* Native maintenance keeps the wake parked until Session persistence confirms
|
|
105
|
+
* the splice. Failure cancels that wake and requires the caller to dispose the
|
|
106
|
+
* Agent handle before attempting another admission.
|
|
107
|
+
*/
|
|
108
|
+
export async function admitRestartContinuation(agent, message, admission) {
|
|
109
|
+
const check = async () => {
|
|
110
|
+
if (admission.signal?.aborted) {
|
|
111
|
+
throw new RestartContinuationError('authorization-revoked', 'restart continuation was cancelled');
|
|
112
|
+
}
|
|
113
|
+
await admission.authorize();
|
|
114
|
+
if (admission.signal?.aborted) {
|
|
115
|
+
throw new RestartContinuationError('authorization-revoked', 'restart continuation was cancelled');
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
return agent.runMaintenance(async (signal) => {
|
|
119
|
+
let wakeParked = false;
|
|
120
|
+
try {
|
|
121
|
+
await check();
|
|
122
|
+
if (signal.aborted)
|
|
123
|
+
throw new RestartContinuationError('authorization-revoked', 'native maintenance was cancelled');
|
|
124
|
+
const state = inspectRestartContinuation(agent, message);
|
|
125
|
+
if (state.kind === 'claimed' || state.kind === 'settled')
|
|
126
|
+
return state;
|
|
127
|
+
if (state.kind === 'ambiguous') {
|
|
128
|
+
throw new RestartContinuationError('ambiguous', 'restart continuation history cannot prove a safe admission');
|
|
129
|
+
}
|
|
130
|
+
if (agent.inbox.nextStep.length > 0
|
|
131
|
+
|| agent.inbox.nextTurn.some(item => item.id !== message.id)) {
|
|
132
|
+
throw new RestartContinuationError('ambiguous', 'another native input is pending before restart continuation');
|
|
133
|
+
}
|
|
134
|
+
if (state.kind === 'pending' && !agent.inbox.remove(message.id)) {
|
|
135
|
+
throw new RestartContinuationError('ambiguous', 'restart continuation pending identity changed');
|
|
136
|
+
}
|
|
137
|
+
// Native followup may append before throwing. Suppress its wake even when
|
|
138
|
+
// its caller never receives a successful return.
|
|
139
|
+
wakeParked = true;
|
|
140
|
+
agent.followup(message);
|
|
141
|
+
let flushed;
|
|
142
|
+
try {
|
|
143
|
+
flushed = await admission.flush();
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new RestartContinuationError('flush-failed', `restart continuation flush failed: ${String(error)}`);
|
|
147
|
+
}
|
|
148
|
+
if (!flushed)
|
|
149
|
+
throw new RestartContinuationError('flush-failed', 'restart continuation flush was not confirmed');
|
|
150
|
+
await check();
|
|
151
|
+
if (signal.aborted)
|
|
152
|
+
throw new RestartContinuationError('authorization-revoked', 'native maintenance was cancelled');
|
|
153
|
+
admission.onAdmitted?.();
|
|
154
|
+
return { kind: 'pending' };
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// A disposed cancellation suppresses runMaintenance's latched wake. The
|
|
158
|
+
// caller still owns the awaitable handle teardown; this cannot establish
|
|
159
|
+
// quiescence for any already dispatched external action.
|
|
160
|
+
if (wakeParked) {
|
|
161
|
+
try {
|
|
162
|
+
agent.cancel({ kind: 'disposed' }, { keepInbox: true });
|
|
163
|
+
}
|
|
164
|
+
catch { /* The caller still owns the handle's mandatory teardown. */ }
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=restart-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-native.js","sourceRoot":"","sources":["../src/restart-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAA;AAGjF,MAAM,kBAAkB,GAAG;IACzB,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mCAAmC;CACpC,CAAA;AAEV,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAC5B;IAArB,YAAqB,IAAqF,EAAE,OAAe;QACzH,KAAK,CAAC,OAAO,CAAC,CAAA;QADK,SAAI,GAAJ,IAAI,CAAiF;QAExG,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAAC,KAA+C;IACvF,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;WACjE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAC/E,MAAM,IAAI,wBAAwB,CAAC,SAAS,EAAE,+CAA+C,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,eAAe,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACtG,OAAO,aAAa,CAAC;QACnB,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,EAAE,kBAAkB;KAC3B,CAAC,CAAA;AACJ,CAAC;AAOD,SAAS,WAAW,CAAC,SAAsB,EAAE,QAAqB;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAY,EAAE,OAAoB;IAC3E,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI;WAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI;WAC/C,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC3D,MAAM,IAAI,wBAAwB,CAAC,SAAS,EAAE,+CAA+C,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,EAAmB,EAAE,WAAW,EAAE,EAAmB,EAAE,CAAA;IACtF,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,0BAA0B,GAAG,KAAK,CAAA;IACtC,IAAI,WAA+B,CAAA;IACnC,IAAI,aAA6E,CAAA;IACjF,IAAI,QAA4B,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA;QAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA;YAChC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;YAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAA;YAC5E,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACtF,0BAA0B,GAAG,IAAI,CAAA;YACnC,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;oBAAE,SAAQ;gBACxC,IAAI,GAAG,IAAI,CAAA;gBACX,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;oBACpC,MAAM,IAAI,wBAAwB,CAAC,UAAU,EAAE,4DAA4D,CAAC,CAAA;gBAC9G,CAAC;YACH,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7E,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YAClE,IAAI,GAAG,IAAI,CAAA;YACX,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,wBAAwB,CAAC,UAAU,EAAE,6DAA6D,CAAC,CAAA;YAC/G,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACxD,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,gDAAgD,CAAC,CAAA;YACnG,CAAC;YACD,WAAW,GAAG,QAAQ,CAAA;QACxB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACjE,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QACxC,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5E,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;WAC5E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,oDAAoD,CAAC,CAAA;IACvG,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,iDAAiD,CAAC,CAAA;QACpG,CAAC;QACD,OAAO,aAAa,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACxC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IACnE,CAAC;IACD,IAAI,0BAA0B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAC1G,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACrD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC1D,CAAC;AAYD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAY,EACZ,OAAoB,EACpB,SAAuC;IAEvC,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAA;QACnG,CAAC;QACD,MAAM,SAAS,CAAC,SAAS,EAAE,CAAA;QAC3B,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAA;QACnG,CAAC;IACH,CAAC,CAAA;IACD,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QACzC,IAAI,UAAU,GAAG,KAAK,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,KAAK,EAAE,CAAA;YACb,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,kCAAkC,CAAC,CAAA;YACnH,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACxD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YACtE,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,4DAA4D,CAAC,CAAA;YAC/G,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;mBAC9B,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,6DAA6D,CAAC,CAAA;YAChH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,wBAAwB,CAAC,WAAW,EAAE,+CAA+C,CAAC,CAAA;YAClG,CAAC;YACD,0EAA0E;YAC1E,iDAAiD;YACjD,UAAU,GAAG,IAAI,CAAA;YACjB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACvB,IAAI,OAAgB,CAAA;YACpB,IAAI,CAAC;gBAAC,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;YACzC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,IAAI,wBAAwB,CAAC,cAAc,EAAE,sCAAsC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC3G,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,wBAAwB,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAA;YAChH,MAAM,KAAK,EAAE,CAAA;YACb,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,kCAAkC,CAAC,CAAA;YACnH,SAAS,CAAC,UAAU,EAAE,EAAE,CAAA;YACxB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAW,CAAA;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yEAAyE;YACzE,yEAAyE;YACzE,yDAAyD;YACzD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC;oBAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAAC,CAAC;gBAC/D,MAAM,CAAC,CAAC,4DAA4D,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
2
|
+
import type { ConversationBinding, InboundEnvelope } from './types.js';
|
|
3
|
+
import type { RestartRecord, RestartStore } from './restart-store.js';
|
|
4
|
+
export interface RestartConfig {
|
|
5
|
+
databasePath: string;
|
|
6
|
+
ownerRouteId: string;
|
|
7
|
+
maxModelRequests: number;
|
|
8
|
+
maxToolCalls: number;
|
|
9
|
+
taskTimeoutMs: number;
|
|
10
|
+
/** Restart-safe read-only tools; ordinary owner tool availability is unchanged. */
|
|
11
|
+
allowedTools: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export declare const restartContinuationText = "The serving process completed a planned maintenance restart. Continue the same owner task from the persisted conversation. The restart tool already succeeded; do not restart again or repeat completed operations. Inspect any uncertain external result before further writes. This is a Host continuation, not a new human request.";
|
|
14
|
+
export declare const restartDigest: (value: unknown) => string;
|
|
15
|
+
export interface RestartRun {
|
|
16
|
+
readonly agent: Agent;
|
|
17
|
+
readonly inboxId: string;
|
|
18
|
+
readonly continuation?: RestartRecord;
|
|
19
|
+
canRequest(): boolean;
|
|
20
|
+
request(reason: string): RestartRecord;
|
|
21
|
+
requested(): RestartRecord | undefined;
|
|
22
|
+
checkpoint(): Promise<RestartRecord | undefined>;
|
|
23
|
+
dispose(): void;
|
|
24
|
+
}
|
|
25
|
+
/** Host-owned barriers around the existing native loop; this class never schedules work. */
|
|
26
|
+
export declare function attachRestartRun(input: {
|
|
27
|
+
agent: Agent;
|
|
28
|
+
inboxId: string;
|
|
29
|
+
binding: Readonly<ConversationBinding>;
|
|
30
|
+
envelope: Readonly<InboundEnvelope>;
|
|
31
|
+
continuation?: RestartRecord;
|
|
32
|
+
store: RestartStore;
|
|
33
|
+
config: RestartConfig;
|
|
34
|
+
isRestartSafeTool(agent: Agent, name: string): boolean;
|
|
35
|
+
authorize(): boolean;
|
|
36
|
+
authorizeRestart(): boolean;
|
|
37
|
+
}): RestartRun;
|
|
38
|
+
//# sourceMappingURL=restart-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-runtime.d.ts","sourceRoot":"","sources":["../src/restart-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGrE,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,mFAAmF;IACnF,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAChC;AAED,eAAO,MAAM,uBAAuB,2UAA2U,CAAA;AAC/W,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,MAA0E,CAAA;AAEzH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAA;IACrC,UAAU,IAAI,OAAO,CAAA;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAA;IACtC,SAAS,IAAI,aAAa,GAAG,SAAS,CAAA;IACtC,UAAU,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAA;IAChD,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IACtC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IACnC,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,aAAa,CAAA;IACrB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACtD,SAAS,IAAI,OAAO,CAAA;IACpB,gBAAgB,IAAI,OAAO,CAAA;CAC5B,GAAG,UAAU,CAqPb"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { createRestartContinuation } from './restart-native.js';
|
|
3
|
+
export const restartContinuationText = 'The serving process completed a planned maintenance restart. Continue the same owner task from the persisted conversation. The restart tool already succeeded; do not restart again or repeat completed operations. Inspect any uncertain external result before further writes. This is a Host continuation, not a new human request.';
|
|
4
|
+
export const restartDigest = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
5
|
+
/** Host-owned barriers around the existing native loop; this class never schedules work. */
|
|
6
|
+
export function attachRestartRun(input) {
|
|
7
|
+
const { agent, store, inboxId } = input;
|
|
8
|
+
const task = store.getTask(inboxId);
|
|
9
|
+
if (task === undefined)
|
|
10
|
+
throw new Error('assistant-delivery: restart task budget is missing');
|
|
11
|
+
const original = input.continuation === undefined;
|
|
12
|
+
const taskEventOffset = agent.session.snapshotEvents().length;
|
|
13
|
+
let live = true;
|
|
14
|
+
let eligible = true;
|
|
15
|
+
let open = 0;
|
|
16
|
+
let ownRequestId = input.continuation?.id;
|
|
17
|
+
let timer;
|
|
18
|
+
let observationWarned = false;
|
|
19
|
+
const safeTool = (name) => {
|
|
20
|
+
if (!input.config.allowedTools.includes(name))
|
|
21
|
+
return false;
|
|
22
|
+
try {
|
|
23
|
+
return input.isRestartSafeTool(agent, name);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const markIneligible = (reason) => {
|
|
30
|
+
eligible = false;
|
|
31
|
+
if (!original || ownRequestId !== undefined)
|
|
32
|
+
return;
|
|
33
|
+
// An unavailable journal removes restart eligibility, but never denies
|
|
34
|
+
// the owner's unrelated model or tool operation.
|
|
35
|
+
try {
|
|
36
|
+
store.markIneligible(inboxId, reason);
|
|
37
|
+
}
|
|
38
|
+
catch { /* fail closed for restart only */ }
|
|
39
|
+
};
|
|
40
|
+
const observationFailed = () => {
|
|
41
|
+
markIneligible('observation-unavailable');
|
|
42
|
+
if (observationWarned)
|
|
43
|
+
return;
|
|
44
|
+
observationWarned = true;
|
|
45
|
+
try {
|
|
46
|
+
agent.ctx.logger.warn('assistant-delivery: restart observation unavailable; ordinary task continues');
|
|
47
|
+
}
|
|
48
|
+
catch { /* logging cannot change the ordinary task outcome */ }
|
|
49
|
+
};
|
|
50
|
+
const observedTask = () => {
|
|
51
|
+
try {
|
|
52
|
+
return store.getTask(inboxId);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
observationFailed();
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const observe = (kind) => {
|
|
60
|
+
try {
|
|
61
|
+
store.observe(inboxId, kind, randomUUID());
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
observationFailed();
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const startTimer = () => {
|
|
68
|
+
if (timer !== undefined)
|
|
69
|
+
return;
|
|
70
|
+
timer = setTimeout(() => agent.cancel({ kind: 'hook', reason: 'assistant-delivery-restart-budget-expired' }), Math.max(1, task.deadline - Date.now()));
|
|
71
|
+
timer.unref?.();
|
|
72
|
+
};
|
|
73
|
+
const assertRecovery = () => {
|
|
74
|
+
if (!live || Date.now() >= task.deadline || !input.authorize()) {
|
|
75
|
+
throw new Error('assistant-delivery: restart task authority or deadline changed');
|
|
76
|
+
}
|
|
77
|
+
const current = store.activeRequestForBinding(input.binding.id);
|
|
78
|
+
if (ownRequestId !== undefined && (current?.id !== ownRequestId
|
|
79
|
+
|| (input.continuation !== undefined && current.status !== 'resuming'))) {
|
|
80
|
+
throw new Error('assistant-delivery: restart operation was cancelled or replaced');
|
|
81
|
+
}
|
|
82
|
+
if (current !== undefined && (current.inboxId !== inboxId
|
|
83
|
+
|| (input.continuation !== undefined && current.status !== 'resuming'))) {
|
|
84
|
+
throw new Error('assistant-delivery: restart continuation no longer owns this task');
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const requested = () => {
|
|
88
|
+
if (original && ownRequestId === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
const record = store.activeRequestForBinding(input.binding.id);
|
|
91
|
+
return record?.inboxId === inboxId && record.status === 'requested' ? record : undefined;
|
|
92
|
+
};
|
|
93
|
+
const noNewWork = () => {
|
|
94
|
+
assertRecovery();
|
|
95
|
+
if (original && store.activeRequestForBinding(input.binding.id) !== undefined) {
|
|
96
|
+
throw new Error('assistant-delivery: restart checkpoint is pending');
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const flush = async () => {
|
|
100
|
+
if (!await agent.ctx.sessions.flush(agent.session))
|
|
101
|
+
throw new Error('assistant-delivery: restart session flush failed');
|
|
102
|
+
assertRecovery();
|
|
103
|
+
};
|
|
104
|
+
const taskEvents = () => agent.session.snapshotEvents().slice(taskEventOffset);
|
|
105
|
+
const toolEvidence = (pendingRestartCallId) => {
|
|
106
|
+
const calls = new Map();
|
|
107
|
+
const results = new Set();
|
|
108
|
+
for (const event of taskEvents()) {
|
|
109
|
+
if (event.type === 'tool/call') {
|
|
110
|
+
const id = String(event.data.callId);
|
|
111
|
+
if (calls.has(id))
|
|
112
|
+
return false;
|
|
113
|
+
calls.set(id, event.data.name);
|
|
114
|
+
if (id !== pendingRestartCallId && !safeTool(event.data.name)
|
|
115
|
+
&& !(event.data.name === 'delivery_request_restart' && ownRequestId !== undefined))
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
else if (event.type === 'tool/result') {
|
|
119
|
+
const id = String(event.data.message.toolCallId);
|
|
120
|
+
if (!calls.has(id) || results.has(id) || event.data.message.isError === true)
|
|
121
|
+
return false;
|
|
122
|
+
results.add(id);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [...calls].every(([id, name]) => (id === pendingRestartCallId && name === 'delivery_request_restart') || results.has(id));
|
|
126
|
+
};
|
|
127
|
+
const removers = [];
|
|
128
|
+
removers.push(agent.ctx.on('session/event', (session, event) => {
|
|
129
|
+
if (session !== agent.session || !original)
|
|
130
|
+
return;
|
|
131
|
+
if (event.type === 'tool/call' && event.data.name !== 'delivery_request_restart' && !safeTool(event.data.name)) {
|
|
132
|
+
markIneligible('unsafe-tool-call');
|
|
133
|
+
}
|
|
134
|
+
else if (event.type === 'tool/result' && event.data.message.isError === true) {
|
|
135
|
+
markIneligible('tool-result-error');
|
|
136
|
+
}
|
|
137
|
+
else if (event.type === 'turn/end' && event.data.reason.kind !== 'completed') {
|
|
138
|
+
markIneligible('turn-incomplete');
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
removers.push(agent.ctx.on('llm/stream', async function* (options, next) {
|
|
142
|
+
const initiator = agent.ctx.agents.currentInitiator();
|
|
143
|
+
const ownSession = options.sessionId === agent.session.id;
|
|
144
|
+
// llm/stream is a process-wide hook. A different initiating Agent with a
|
|
145
|
+
// different Session is unrelated work; a call causally owned by this Agent
|
|
146
|
+
// but routed to another Session is delegation and remains in this budget.
|
|
147
|
+
if (!ownSession && initiator !== agent) {
|
|
148
|
+
yield* next();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (original && ownRequestId === undefined) {
|
|
152
|
+
try {
|
|
153
|
+
store.observeModel(inboxId, { provider: options.provider, model: options.model,
|
|
154
|
+
...(options.reasoningEffort === undefined ? {} : { reasoningEffort: options.reasoningEffort }) });
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
observationFailed();
|
|
158
|
+
}
|
|
159
|
+
observe('model');
|
|
160
|
+
if (initiator !== agent || !ownSession)
|
|
161
|
+
markIneligible('delegated-model');
|
|
162
|
+
if (options.maxTokens === undefined || options.maxTokens > task.maxOutputTokens)
|
|
163
|
+
markIneligible('model-output-budget');
|
|
164
|
+
const current = observedTask();
|
|
165
|
+
const frozen = current?.model;
|
|
166
|
+
if (frozen?.provider !== options.provider || frozen.model !== options.model
|
|
167
|
+
|| frozen.reasoningEffort !== options.reasoningEffort)
|
|
168
|
+
markIneligible('model-drift');
|
|
169
|
+
if (current !== undefined && current.modelRequests > task.maxModelRequests)
|
|
170
|
+
markIneligible('model-count-budget');
|
|
171
|
+
try {
|
|
172
|
+
yield* next();
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
markIneligible('model-result-unknown');
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (initiator !== agent || !ownSession)
|
|
181
|
+
throw new Error('assistant-delivery: restart task cannot delegate a model call');
|
|
182
|
+
noNewWork();
|
|
183
|
+
const model = store.getTask(inboxId)?.model;
|
|
184
|
+
if (model === undefined || options.provider !== model.provider || options.model !== model.model
|
|
185
|
+
|| options.reasoningEffort !== model.reasoningEffort
|
|
186
|
+
|| options.maxTokens === undefined || options.maxTokens > task.maxOutputTokens) {
|
|
187
|
+
throw new Error('assistant-delivery: restart frozen model or output budget changed');
|
|
188
|
+
}
|
|
189
|
+
store.reserve(inboxId, 'model', randomUUID());
|
|
190
|
+
await flush();
|
|
191
|
+
noNewWork();
|
|
192
|
+
open += 1;
|
|
193
|
+
try {
|
|
194
|
+
for await (const chunk of next()) {
|
|
195
|
+
assertRecovery();
|
|
196
|
+
yield chunk;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
open -= 1;
|
|
201
|
+
}
|
|
202
|
+
}, { prepend: true }));
|
|
203
|
+
removers.push(agent.ctx.on('tools/execute', async (execution, next) => {
|
|
204
|
+
// Tool dispatches carry the exact target Agent. Preserve unrelated peers;
|
|
205
|
+
// a different target still belongs here when this Agent initiated it.
|
|
206
|
+
const initiator = agent.ctx.agents.currentInitiator();
|
|
207
|
+
if (execution.agent !== agent && initiator !== agent)
|
|
208
|
+
return await next();
|
|
209
|
+
if (original && ownRequestId === undefined) {
|
|
210
|
+
observe('tool');
|
|
211
|
+
if (execution.agent !== agent || initiator !== agent)
|
|
212
|
+
markIneligible('delegated-tool');
|
|
213
|
+
if (execution.name !== 'delivery_request_restart' && !safeTool(execution.name))
|
|
214
|
+
markIneligible('unsafe-tool');
|
|
215
|
+
const current = observedTask();
|
|
216
|
+
if (current !== undefined && current.toolCalls > task.maxToolCalls)
|
|
217
|
+
markIneligible('tool-count-budget');
|
|
218
|
+
open += 1;
|
|
219
|
+
try {
|
|
220
|
+
const result = await next();
|
|
221
|
+
if (result.isError)
|
|
222
|
+
markIneligible('tool-result-error');
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
markIneligible('tool-result-unknown');
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
open -= 1;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (execution.agent !== agent || initiator !== agent)
|
|
234
|
+
throw new Error('assistant-delivery: restart task cannot delegate tools');
|
|
235
|
+
noNewWork();
|
|
236
|
+
if (execution.name === 'delivery_request_restart' || !safeTool(execution.name)) {
|
|
237
|
+
throw new Error('assistant-delivery: tool is outside the restart-safe capability contract');
|
|
238
|
+
}
|
|
239
|
+
store.reserve(inboxId, 'tool', randomUUID());
|
|
240
|
+
await flush();
|
|
241
|
+
noNewWork();
|
|
242
|
+
open += 1;
|
|
243
|
+
try {
|
|
244
|
+
return await next();
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
open -= 1;
|
|
248
|
+
}
|
|
249
|
+
}, { prepend: true }));
|
|
250
|
+
removers.push(agent.ctx.on('agent/pre-step', async (payload, next) => {
|
|
251
|
+
if (payload.agent !== agent)
|
|
252
|
+
return await next();
|
|
253
|
+
if (original && ownRequestId === undefined)
|
|
254
|
+
return await next();
|
|
255
|
+
if (original && store.activeRequestForBinding(input.binding.id) !== undefined)
|
|
256
|
+
return { kind: 'reject' };
|
|
257
|
+
assertRecovery();
|
|
258
|
+
return await next();
|
|
259
|
+
}, { prepend: true }));
|
|
260
|
+
if (!original)
|
|
261
|
+
startTimer();
|
|
262
|
+
const dispose = () => {
|
|
263
|
+
if (!live)
|
|
264
|
+
return;
|
|
265
|
+
live = false;
|
|
266
|
+
if (timer !== undefined)
|
|
267
|
+
clearTimeout(timer);
|
|
268
|
+
for (const remove of removers)
|
|
269
|
+
remove();
|
|
270
|
+
};
|
|
271
|
+
agent.ctx.effect(() => dispose, 'assistant-delivery.restart-task');
|
|
272
|
+
return {
|
|
273
|
+
agent, inboxId, ...(input.continuation === undefined ? {} : { continuation: input.continuation }), requested, dispose,
|
|
274
|
+
canRequest() {
|
|
275
|
+
try {
|
|
276
|
+
const current = store.getTask(inboxId);
|
|
277
|
+
return live && original && ownRequestId === undefined && eligible && current !== undefined
|
|
278
|
+
&& current.toolCalls < task.maxToolCalls && store.isEligible(inboxId)
|
|
279
|
+
&& store.activeRequestForBinding(input.binding.id) === undefined
|
|
280
|
+
&& input.authorizeRestart();
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
request(reason) {
|
|
287
|
+
assertRecovery();
|
|
288
|
+
if (!original || !eligible || !store.isEligible(inboxId) || !input.authorizeRestart()) {
|
|
289
|
+
throw new Error('assistant-delivery: restart is not authorized for this task');
|
|
290
|
+
}
|
|
291
|
+
const response = agent.session.snapshotEvents().findLast(event => event.type === 'assistant/message');
|
|
292
|
+
const calls = response?.type === 'assistant/message'
|
|
293
|
+
? response.data.message.content.filter(block => block.type === 'tool-call') : [];
|
|
294
|
+
if (calls.length !== 1 || calls[0]?.type !== 'tool-call' || calls[0].name !== 'delivery_request_restart') {
|
|
295
|
+
markIneligible('restart-not-exclusive');
|
|
296
|
+
throw new Error('assistant-delivery: restart must be the only tool in its model response');
|
|
297
|
+
}
|
|
298
|
+
if (open !== 1 || !toolEvidence(String(calls[0].id))) {
|
|
299
|
+
markIneligible('tool-evidence-unknown');
|
|
300
|
+
throw new Error('assistant-delivery: prior effects are not proven restart-safe');
|
|
301
|
+
}
|
|
302
|
+
const current = store.getTask(inboxId);
|
|
303
|
+
if (current === undefined || current.modelRequests >= task.maxModelRequests
|
|
304
|
+
|| current.toolCalls > task.maxToolCalls || Date.now() >= task.deadline) {
|
|
305
|
+
markIneligible('restart-budget-exhausted');
|
|
306
|
+
throw new Error('assistant-delivery: restart has no remaining budget or deadline');
|
|
307
|
+
}
|
|
308
|
+
const result = store.request(inboxId, { reason, requestKey: `restart:${inboxId}` });
|
|
309
|
+
ownRequestId = result.id;
|
|
310
|
+
startTimer();
|
|
311
|
+
return result;
|
|
312
|
+
},
|
|
313
|
+
async checkpoint() {
|
|
314
|
+
const record = requested();
|
|
315
|
+
if (record === undefined)
|
|
316
|
+
return undefined;
|
|
317
|
+
assertRecovery();
|
|
318
|
+
if (!eligible || open !== 0 || agent.status !== 'idle'
|
|
319
|
+
|| agent.inbox.nextTurn.length !== 0 || agent.inbox.nextStep.length !== 0) {
|
|
320
|
+
throw new Error('assistant-delivery: restart checkpoint is not quiescent');
|
|
321
|
+
}
|
|
322
|
+
await flush();
|
|
323
|
+
if (!toolEvidence())
|
|
324
|
+
throw new Error('assistant-delivery: restart tool effects are not all settled');
|
|
325
|
+
const events = agent.session.snapshotEvents();
|
|
326
|
+
return store.checkpoint(record.id, {
|
|
327
|
+
sessionEventCount: events.length,
|
|
328
|
+
sessionDigest: restartDigest(events),
|
|
329
|
+
continuationMessageId: createRestartContinuation({ continuationId: record.id, text: restartContinuationText }).id,
|
|
330
|
+
continuationTextDigest: restartDigest(restartContinuationText),
|
|
331
|
+
});
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=restart-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-runtime.js","sourceRoot":"","sources":["../src/restart-runtime.ts"],"names":[],"mappings":"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"}
|