kiokuko-dsh 0.1.17 → 0.1.18
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/dist/dsh/composition.d.ts +12 -24
- package/dist/dsh/composition.d.ts.map +1 -1
- package/dist/dsh/composition.js +11 -17
- package/dist/dsh/composition.js.map +1 -1
- package/dist/dsh/host-adapter.d.ts +5 -0
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +128 -33
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/index.d.ts +1 -0
- package/dist/dsh/index.d.ts.map +1 -1
- package/dist/dsh/index.js +1 -0
- package/dist/dsh/index.js.map +1 -1
- package/dist/dsh/intake-gate.d.ts +2 -0
- package/dist/dsh/intake-gate.d.ts.map +1 -1
- package/dist/dsh/intake-gate.js +4 -0
- package/dist/dsh/intake-gate.js.map +1 -1
- package/dist/dsh/run-intake-service.d.ts +7 -0
- package/dist/dsh/run-intake-service.d.ts.map +1 -1
- package/dist/dsh/run-intake-service.js +7 -0
- package/dist/dsh/run-intake-service.js.map +1 -1
- package/dist/dsh/session-bridge.d.ts +27 -115
- package/dist/dsh/session-bridge.d.ts.map +1 -1
- package/dist/dsh/session-bridge.js +63 -545
- package/dist/dsh/session-bridge.js.map +1 -1
- package/dist/dsh/session-memory-finalizer.d.ts +106 -0
- package/dist/dsh/session-memory-finalizer.d.ts.map +1 -0
- package/dist/dsh/session-memory-finalizer.js +787 -0
- package/dist/dsh/session-memory-finalizer.js.map +1 -0
- package/dist/dsh/task-intake.d.ts +4 -0
- package/dist/dsh/task-intake.d.ts.map +1 -1
- package/dist/dsh/task-intake.js +12 -1
- package/dist/dsh/task-intake.js.map +1 -1
- package/docs/architecture.md +26 -5
- package/docs/dsh-plugin.md +16 -13
- package/docs/execution-ledger.md +17 -3
- package/dsh/cordis.patch.yml +1 -1
- package/migrations/002_dsh_memory_finalization.sql +119 -0
- package/package.json +4 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
2
|
import { DshEnnoController } from './enno-controller.js';
|
|
3
3
|
import { DshIntakeGate, type DshPreStepEvent } from './intake-gate.js';
|
|
4
|
-
import { type
|
|
4
|
+
import { type DshCloseIntent, type DshNativeSession, type DshRunLifecycle } from './session-bridge.js';
|
|
5
5
|
import { type DshToolPolicy } from './tool-policy.js';
|
|
6
6
|
import { type DshToolHost, type DshToolRegistrationContext } from './tools.js';
|
|
7
7
|
import { DshPonytailModes, type DshPonytailCommandContext } from './commands.js';
|
|
@@ -9,17 +9,13 @@ import { type DshSkillContext } from './standard-skill-provider.js';
|
|
|
9
9
|
import { mountSoulPrompt } from './prompt-policy.js';
|
|
10
10
|
import type { DshUserQuestions } from './user-interaction.js';
|
|
11
11
|
import type { DshRuntime } from './runtime.js';
|
|
12
|
+
import type { DshMemoryFinalizer } from './session-memory-finalizer.js';
|
|
12
13
|
/** The optional, explicit host adapter supplied by a dsh profile. */
|
|
13
14
|
export declare const KIOKUKO_DSH_HOST_SERVICE = "kiokukoDsh";
|
|
14
15
|
export interface DshNativePreStepPayload {
|
|
15
16
|
readonly agent: {
|
|
16
17
|
readonly id: string;
|
|
17
|
-
readonly session?:
|
|
18
|
-
readonly id: string;
|
|
19
|
-
readonly header?: {
|
|
20
|
-
readonly cwd?: string;
|
|
21
|
-
};
|
|
22
|
-
};
|
|
18
|
+
readonly session?: DshNativeSession;
|
|
23
19
|
readonly sessionId?: string;
|
|
24
20
|
};
|
|
25
21
|
readonly messages: readonly unknown[];
|
|
@@ -56,25 +52,17 @@ export interface DshCompositionHost {
|
|
|
56
52
|
readonly toolPolicy?: DshToolPolicy;
|
|
57
53
|
readonly intakeGate?: DshIntakeGate;
|
|
58
54
|
readonly mapPreStep?: (payload: DshNativePreStepPayload) => DshPreStepEvent | PromiseLike<DshPreStepEvent>;
|
|
59
|
-
|
|
60
|
-
readonly
|
|
61
|
-
|
|
55
|
+
/** Read-only exact active run binding; never used to mirror session events. */
|
|
56
|
+
readonly resolveSessionRunId?: (session: {
|
|
57
|
+
readonly id: string;
|
|
58
|
+
}) => string | undefined;
|
|
59
|
+
readonly memoryFinalizer?: Pick<DshMemoryFinalizer, 'start' | 'dispose' | 'whenIdle'>;
|
|
60
|
+
readonly memoryFinalizerOwner?: 'composition' | 'host';
|
|
62
61
|
readonly ennoController?: DshEnnoController;
|
|
63
62
|
readonly lifecycle?: DshRunLifecycle;
|
|
64
|
-
readonly
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
} | PromiseLike<{
|
|
68
|
-
readonly runId: string;
|
|
69
|
-
readonly status: 'completed' | 'failed' | 'cancelled';
|
|
70
|
-
} | undefined> | undefined;
|
|
71
|
-
readonly resolveSessionClose?: (sessionId: string, nativeSession: object) => {
|
|
72
|
-
readonly runId: string;
|
|
73
|
-
readonly status: 'completed' | 'failed' | 'cancelled';
|
|
74
|
-
} | PromiseLike<{
|
|
75
|
-
readonly runId: string;
|
|
76
|
-
readonly status: 'completed' | 'failed' | 'cancelled';
|
|
77
|
-
} | undefined> | undefined;
|
|
63
|
+
readonly lifecycleOwner?: 'composition' | 'host';
|
|
64
|
+
readonly resolveIdleClose?: (agentId: string, sessionId?: string, nativeSession?: object, nativeAgent?: object) => DshCloseIntent | PromiseLike<DshCloseIntent | undefined> | undefined;
|
|
65
|
+
readonly resolveSessionClose?: (sessionId: string, nativeSession: object) => DshCloseIntent | PromiseLike<DshCloseIntent | undefined> | undefined;
|
|
78
66
|
}
|
|
79
67
|
type DshToolHostRegistration = DshToolRegistrationContext['tools']['register'];
|
|
80
68
|
export interface DshCompositionHandle {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/dsh/composition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAA0D,MAAM,sBAAsB,CAAA;AAChH,OAAO,EAAE,aAAa,EAA2B,KAAK,eAAe,EAA0B,MAAM,kBAAkB,CAAA;AACvH,OAAO,
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/dsh/composition.ts"],"names":[],"mappings":"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"}
|
package/dist/dsh/composition.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import {
|
|
2
|
+
import { mountDshIdleLifecycle, mountDshSessionLifecycle } from './session-bridge.js';
|
|
3
3
|
import { mountDshToolPolicy } from './tool-policy.js';
|
|
4
4
|
import { mountDshModelTools } from './tools.js';
|
|
5
5
|
import { DshPonytailModes, mountDshPonytailCommand } from './commands.js';
|
|
@@ -104,6 +104,13 @@ export async function mountDshComposition(ctx, host) {
|
|
|
104
104
|
if (host.runtimeOwner !== 'host')
|
|
105
105
|
cleanupDisposers.push(disposer);
|
|
106
106
|
}
|
|
107
|
+
if (host.memoryFinalizer !== undefined) {
|
|
108
|
+
await host.memoryFinalizer.start();
|
|
109
|
+
const closeFinalizer = async () => host.memoryFinalizer.dispose();
|
|
110
|
+
setupResourceDisposers.push(closeFinalizer);
|
|
111
|
+
if (host.memoryFinalizerOwner !== 'host')
|
|
112
|
+
cleanupDisposers.push(closeFinalizer);
|
|
113
|
+
}
|
|
107
114
|
if (host.skills !== undefined) {
|
|
108
115
|
const disposer = mountStandardSkillProvider({ skills: host.skills });
|
|
109
116
|
setupResourceDisposers.push(disposer);
|
|
@@ -144,21 +151,6 @@ export async function mountDshComposition(ctx, host) {
|
|
|
144
151
|
throw new Error('kiokuko-dsh intake gate requires a native task projection');
|
|
145
152
|
ingressDisposers.push(mountNativeIntakeGate(ctx, host.intakeGate, host.mapPreStep));
|
|
146
153
|
}
|
|
147
|
-
if (host.bridge !== undefined) {
|
|
148
|
-
if (host.resolveSessionRunId === undefined)
|
|
149
|
-
throw new Error('kiokuko-dsh session bridge requires a run resolver');
|
|
150
|
-
ingressDisposers.push(mountDshSessionBridge(ctx, host.bridge, host.resolveSessionRunId));
|
|
151
|
-
ingressDisposers.push(mountDshDurabilityBarriers(ctx, host.bridge));
|
|
152
|
-
const closeBridge = async () => {
|
|
153
|
-
if (host.lifecycle !== undefined)
|
|
154
|
-
await host.lifecycle.dispose();
|
|
155
|
-
else
|
|
156
|
-
await host.bridge.close();
|
|
157
|
-
};
|
|
158
|
-
setupResourceDisposers.push(closeBridge);
|
|
159
|
-
if (host.bridgeOwner !== 'host')
|
|
160
|
-
cleanupDisposers.push(closeBridge);
|
|
161
|
-
}
|
|
162
154
|
if (host.ennoController !== undefined)
|
|
163
155
|
ingressDisposers.push(mountNativeEnnoController(ctx, host.ennoController));
|
|
164
156
|
if (host.lifecycle !== undefined) {
|
|
@@ -169,8 +161,10 @@ export async function mountDshComposition(ctx, host) {
|
|
|
169
161
|
throw new Error('kiokuko-dsh lifecycle requires the native DSH session flush service');
|
|
170
162
|
ingressDisposers.push(mountDshIdleLifecycle(ctx, host.lifecycle, host.resolveIdleClose, async (session) => { await nativeSessions.flush(session); }));
|
|
171
163
|
if (host.resolveSessionClose !== undefined) {
|
|
172
|
-
ingressDisposers.push(mountDshSessionLifecycle(ctx, host.lifecycle, host.resolveSessionClose));
|
|
164
|
+
ingressDisposers.push(mountDshSessionLifecycle(ctx, host.lifecycle, host.resolveSessionClose, async (session) => { await nativeSessions.flush(session); }));
|
|
173
165
|
}
|
|
166
|
+
if (host.lifecycleOwner !== 'host')
|
|
167
|
+
cleanupDisposers.push(() => host.lifecycle.dispose());
|
|
174
168
|
}
|
|
175
169
|
}
|
|
176
170
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/dsh/composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/dsh/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Context } from '@deepseek-ai/cordis';
|
|
2
2
|
import { KIOKUKO_DSH_HOST_SERVICE, type DshCompositionHost } from './composition.js';
|
|
3
|
+
import { type DshLlm, type DshSessionQuery } from './session-memory-finalizer.js';
|
|
3
4
|
import { type DshAdvisoryCall } from './advisory-runner.js';
|
|
4
5
|
export interface DshAdvisoryHost {
|
|
5
6
|
readonly verifyReadOnly: (call: DshAdvisoryCall) => boolean | PromiseLike<boolean>;
|
|
@@ -10,6 +11,10 @@ export interface DshHostAdapterOptions {
|
|
|
10
11
|
readonly migrationsDirectory?: string;
|
|
11
12
|
readonly repositoryRoot?: string;
|
|
12
13
|
readonly now?: () => string;
|
|
14
|
+
/** Test/custom host override; the normal DSH bundle injects sessionQuery. */
|
|
15
|
+
readonly sessionQuery?: DshSessionQuery;
|
|
16
|
+
/** Test/custom host override; the normal DSH bundle injects llm. */
|
|
17
|
+
readonly llm?: DshLlm;
|
|
13
18
|
/** Optional host-owned isolated, read-only advisory execution surface. */
|
|
14
19
|
readonly advisory?: DshAdvisoryHost;
|
|
15
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-adapter.d.ts","sourceRoot":"","sources":["../../src/dsh/host-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"host-adapter.d.ts","sourceRoot":"","sources":["../../src/dsh/host-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAA;AAkBzB,OAAO,EAA0C,KAAK,MAAM,EAA8B,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAErJ,OAAO,EAAqB,KAAK,eAAe,EAA+B,MAAM,sBAAsB,CAAA;AA+C3G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAClF,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D;AAMD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAA;IACvC,oEAAoE;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAqJD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAq8BtG;AAWD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}
|
package/dist/dsh/host-adapter.js
CHANGED
|
@@ -11,7 +11,8 @@ import { resolveCapabilities } from '../akinator/capabilities.js';
|
|
|
11
11
|
import { readAkinatorSession, readRunIntakeLink } from '../akinator/store.js';
|
|
12
12
|
import { DshToolPolicy } from './tool-policy.js';
|
|
13
13
|
import { DSH_MODEL_FACING_OPERATIONS, } from './tools.js';
|
|
14
|
-
import {
|
|
14
|
+
import { DshRunLifecycle } from './session-bridge.js';
|
|
15
|
+
import { DshMemoryFinalizer, dshTurnBoundarySeq } from './session-memory-finalizer.js';
|
|
15
16
|
import { DshConfirmationController, DshEnnoController } from './enno-controller.js';
|
|
16
17
|
import { DshAdvisoryRunner } from './advisory-runner.js';
|
|
17
18
|
import { DshPonytailModes, dshPonytailOwnerKey } from './commands.js';
|
|
@@ -30,6 +31,13 @@ import { curateMemoryCandidates } from '../memory/curator.js';
|
|
|
30
31
|
import { checkpointDshMemory } from '../memory/scoped-memory.js';
|
|
31
32
|
import { LedgerStore } from '../ledger/store.js';
|
|
32
33
|
import { ENNO_APPLICABLE_TASK_TYPES } from '../enno-oduno/types.js';
|
|
34
|
+
function sessionEventSource(value) {
|
|
35
|
+
const source = value;
|
|
36
|
+
if (typeof source?.snapshotEvents !== 'function') {
|
|
37
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'The exact native DSH session event source is unavailable');
|
|
38
|
+
}
|
|
39
|
+
return source;
|
|
40
|
+
}
|
|
33
41
|
function textFromMessages(messages, fallback) {
|
|
34
42
|
const userTexts = [];
|
|
35
43
|
for (const value of messages) {
|
|
@@ -173,6 +181,8 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
173
181
|
const userQuestions = native.get('userQuestions', false);
|
|
174
182
|
const sessions = native.get('sessions', false);
|
|
175
183
|
const agents = native.get('agents', false);
|
|
184
|
+
const sessionQuery = options.sessionQuery ?? native.get('sessionQuery', false);
|
|
185
|
+
const llm = options.llm ?? native.get('llm', false);
|
|
176
186
|
const advisory = options.advisory ?? native.get('dshAdvisory', false);
|
|
177
187
|
const root = realpathSync(options.repositoryRoot ?? process.cwd());
|
|
178
188
|
const runtime = new DshRuntime({
|
|
@@ -190,7 +200,12 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
190
200
|
const advisoryRounds = new Map();
|
|
191
201
|
const resumedLeases = new Map();
|
|
192
202
|
const policy = new DshToolPolicy({ phase: 'intake', runId: 'pending', workspace: 'pending', orchestrationId: 'pending', revision: 1, routeEpoch: 0 });
|
|
193
|
-
const
|
|
203
|
+
const memoryFinalizer = new DshMemoryFinalizer({
|
|
204
|
+
runtime,
|
|
205
|
+
...(sessionQuery === undefined ? {} : { sessionQuery }),
|
|
206
|
+
...(llm === undefined ? {} : { llm }),
|
|
207
|
+
...(options.now === undefined ? {} : { now: options.now }),
|
|
208
|
+
});
|
|
194
209
|
const modes = new DshPonytailModes();
|
|
195
210
|
const confirmationAnswerer = userQuestions === undefined ? undefined : createDshConfirmationAnswerer(userQuestions);
|
|
196
211
|
let prepareGeneration = 0;
|
|
@@ -289,6 +304,18 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
289
304
|
policy.setState(next);
|
|
290
305
|
}
|
|
291
306
|
};
|
|
307
|
+
const bindAndRecord = async (event, result, generation) => {
|
|
308
|
+
const sourceStartSeq = event.sourceStartSeq
|
|
309
|
+
?? dshTurnBoundarySeq(sessionEventSource(event.nativeSession), event.turn, 'start');
|
|
310
|
+
await memoryFinalizer.bindRunStart({
|
|
311
|
+
runId: result.prepared.run.runId,
|
|
312
|
+
workspace: result.prepared.project.workspace,
|
|
313
|
+
dshSessionId: event.sessionId,
|
|
314
|
+
sourceStartSeq,
|
|
315
|
+
sourceStartTurn: event.turn,
|
|
316
|
+
});
|
|
317
|
+
record(event, result, generation);
|
|
318
|
+
};
|
|
292
319
|
const refreshContinuedWorkLease = async (item, expected) => {
|
|
293
320
|
const expectedWorkUnitId = expected.nextAction === 'execute_work_unit'
|
|
294
321
|
? expected.directive?.workUnit?.id
|
|
@@ -331,6 +358,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
331
358
|
sessionId: event.sessionId,
|
|
332
359
|
agentId: event.agent.id,
|
|
333
360
|
turn: event.turn,
|
|
361
|
+
sourceStartSeq: event.sourceStartSeq ?? null,
|
|
334
362
|
task: event.task,
|
|
335
363
|
cwd: event.cwd,
|
|
336
364
|
profileHints: event.profileHints ?? null,
|
|
@@ -409,7 +437,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
409
437
|
...(event.nativeAgent === undefined ? {} : { nativeAgent: event.nativeAgent }),
|
|
410
438
|
...(event.nativeSession === undefined ? {} : { nativeSession: event.nativeSession }),
|
|
411
439
|
});
|
|
412
|
-
|
|
440
|
+
await bindAndRecord(event, continued, generation);
|
|
413
441
|
}
|
|
414
442
|
return continued;
|
|
415
443
|
}
|
|
@@ -427,12 +455,12 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
427
455
|
...(event.nativeAgent === undefined ? {} : { nativeAgent: event.nativeAgent }),
|
|
428
456
|
...(event.nativeSession === undefined ? {} : { nativeSession: event.nativeSession }),
|
|
429
457
|
});
|
|
430
|
-
|
|
458
|
+
await bindAndRecord(event, resumed, generation);
|
|
431
459
|
return resumed;
|
|
432
460
|
}
|
|
433
461
|
const prepared = await super.prepare(event);
|
|
434
462
|
if (prepared.admitted)
|
|
435
|
-
|
|
463
|
+
await bindAndRecord(event, prepared, generation);
|
|
436
464
|
return prepared;
|
|
437
465
|
}
|
|
438
466
|
async preStep(event, next) {
|
|
@@ -598,6 +626,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
598
626
|
const cwd = boundSession?.header?.cwd;
|
|
599
627
|
if (typeof cwd !== 'string' || cwd.length === 0)
|
|
600
628
|
throw new Error('kiokuko-dsh native session cwd is unavailable');
|
|
629
|
+
const sourceStartSeq = dshTurnBoundarySeq(sessionEventSource(boundSession), payload.turn, 'start');
|
|
601
630
|
const catalog = await capabilityCatalog(skills, tools, {
|
|
602
631
|
agent: { id: payload.agent.id },
|
|
603
632
|
nativeAgent: payload.agent,
|
|
@@ -625,6 +654,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
625
654
|
sessionId,
|
|
626
655
|
...(boundSession === undefined ? {} : { nativeSession: boundSession }),
|
|
627
656
|
turn: payload.turn,
|
|
657
|
+
sourceStartSeq,
|
|
628
658
|
step: payload.step,
|
|
629
659
|
task,
|
|
630
660
|
cwd,
|
|
@@ -931,12 +961,6 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
931
961
|
advisoryRunner,
|
|
932
962
|
submitAdvisory,
|
|
933
963
|
});
|
|
934
|
-
const resolveSessionRunId = (session) => {
|
|
935
|
-
const item = currentSession(session.id);
|
|
936
|
-
if (item?.nativeSession !== undefined && item.nativeSession !== session)
|
|
937
|
-
return undefined;
|
|
938
|
-
return item?.closed === true ? undefined : item?.runId;
|
|
939
|
-
};
|
|
940
964
|
const resolveIdleClose = async (agentId, sessionId, nativeSession, nativeAgent) => {
|
|
941
965
|
const item = currentForAgentEvent(agentId, sessionId, undefined, nativeSession, nativeAgent);
|
|
942
966
|
if (item === undefined || item.closed)
|
|
@@ -952,12 +976,20 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
952
976
|
if (item.prepared.intake.profile.taskType === 'chat')
|
|
953
977
|
return undefined;
|
|
954
978
|
if (state.status === 'completed' || state.nextAction === 'complete') {
|
|
955
|
-
return
|
|
979
|
+
return item.failed
|
|
980
|
+
? { runId: item.runId, status: 'failed' }
|
|
981
|
+
: { runId: item.runId, status: 'completed', terminalTurn: item.turn };
|
|
956
982
|
}
|
|
957
983
|
// Idle means the driver has no active work, not that Enno reached a
|
|
958
984
|
// terminal state. Keep only genuinely resumable active states open.
|
|
959
985
|
return undefined;
|
|
960
986
|
};
|
|
987
|
+
const resolveSessionRunId = (session) => {
|
|
988
|
+
const item = currentSession(session.id);
|
|
989
|
+
if (item?.nativeSession !== undefined && item.nativeSession !== session)
|
|
990
|
+
return undefined;
|
|
991
|
+
return item?.closed === true ? undefined : item?.runId;
|
|
992
|
+
};
|
|
961
993
|
const resolveSessionClose = async (sessionId, nativeSession) => {
|
|
962
994
|
const item = currentSession(sessionId);
|
|
963
995
|
if (item === undefined || item.closed || item.nativeSession !== nativeSession)
|
|
@@ -970,12 +1002,38 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
970
1002
|
if (state.status === 'blocked' || state.nextAction === 'report_blocker')
|
|
971
1003
|
return { runId: item.runId, status: 'failed' };
|
|
972
1004
|
if (item.prepared.intake.profile.taskType === 'chat' || state.status === 'completed' || state.nextAction === 'complete') {
|
|
973
|
-
return { runId: item.runId, status: 'completed' };
|
|
1005
|
+
return { runId: item.runId, status: 'completed', terminalTurn: item.turn };
|
|
974
1006
|
}
|
|
975
1007
|
return { runId: item.runId, status: 'cancelled' };
|
|
976
1008
|
};
|
|
977
1009
|
const closeRun = async (input) => {
|
|
978
|
-
|
|
1010
|
+
let scheduled = false;
|
|
1011
|
+
await runtime.withDatabase((database) => withImmediateTransaction(database, () => {
|
|
1012
|
+
const store = new LedgerStore(database);
|
|
1013
|
+
const before = store.readRun(input.runId);
|
|
1014
|
+
if (before === undefined)
|
|
1015
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Run close target does not exist');
|
|
1016
|
+
if (before.status === 'intake' || before.status === 'active') {
|
|
1017
|
+
terminalizeLedgerRunInTransaction(database, input.runId, input.status);
|
|
1018
|
+
}
|
|
1019
|
+
else if (before.status !== input.status) {
|
|
1020
|
+
throw new KiokukoError('CONFLICT', 'Run close status is immutable');
|
|
1021
|
+
}
|
|
1022
|
+
if (input.status === 'completed') {
|
|
1023
|
+
if (input.sourceEndSeq === undefined) {
|
|
1024
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Completed DSH run has no checkpointed log end');
|
|
1025
|
+
}
|
|
1026
|
+
memoryFinalizer.scheduleInTransaction(database, {
|
|
1027
|
+
runId: before.runId,
|
|
1028
|
+
workspace: before.workspace,
|
|
1029
|
+
dshSessionId: before.dshSessionId,
|
|
1030
|
+
sourceEndSeq: input.sourceEndSeq,
|
|
1031
|
+
});
|
|
1032
|
+
scheduled = true;
|
|
1033
|
+
}
|
|
1034
|
+
}));
|
|
1035
|
+
if (scheduled)
|
|
1036
|
+
memoryFinalizer.kick();
|
|
979
1037
|
const items = [...turns.values()].filter((candidate) => candidate.runId === input.runId);
|
|
980
1038
|
for (const item of items) {
|
|
981
1039
|
ennoController.retire({
|
|
@@ -1008,8 +1066,22 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
1008
1066
|
if (item !== undefined)
|
|
1009
1067
|
item.failed = true;
|
|
1010
1068
|
});
|
|
1011
|
-
const
|
|
1012
|
-
retireSupersededRun = (item, status) =>
|
|
1069
|
+
const runLifecycle = new DshRunLifecycle({ closeRun });
|
|
1070
|
+
retireSupersededRun = async (item, status) => {
|
|
1071
|
+
if (status !== 'completed') {
|
|
1072
|
+
await runLifecycle.closeTurn({ runId: item.runId, status });
|
|
1073
|
+
return;
|
|
1074
|
+
}
|
|
1075
|
+
if (item.nativeSession === undefined || sessions?.flush === undefined) {
|
|
1076
|
+
throw new KiokukoError('CONFLICT', 'Completed DSH run requires its exact native session checkpoint');
|
|
1077
|
+
}
|
|
1078
|
+
await sessions.flush(item.nativeSession);
|
|
1079
|
+
await runLifecycle.closeTurn({
|
|
1080
|
+
runId: item.runId,
|
|
1081
|
+
status,
|
|
1082
|
+
sourceEndSeq: dshTurnBoundarySeq(sessionEventSource(item.nativeSession), item.turn, 'end'),
|
|
1083
|
+
});
|
|
1084
|
+
};
|
|
1013
1085
|
const host = {
|
|
1014
1086
|
...(skills === undefined ? {} : { skills: skills }),
|
|
1015
1087
|
...(systemPrompt === undefined ? {} : { systemPrompt }),
|
|
@@ -1024,11 +1096,12 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
1024
1096
|
toolPolicy: policy,
|
|
1025
1097
|
}),
|
|
1026
1098
|
...(tools === undefined ? {} : { intakeGate: gate, mapPreStep }),
|
|
1027
|
-
|
|
1028
|
-
|
|
1099
|
+
memoryFinalizer,
|
|
1100
|
+
memoryFinalizerOwner: 'host',
|
|
1029
1101
|
resolveSessionRunId,
|
|
1030
1102
|
ennoController,
|
|
1031
|
-
lifecycle:
|
|
1103
|
+
lifecycle: runLifecycle,
|
|
1104
|
+
lifecycleOwner: 'host',
|
|
1032
1105
|
resolveIdleClose,
|
|
1033
1106
|
resolveSessionClose,
|
|
1034
1107
|
};
|
|
@@ -1060,25 +1133,54 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
1060
1133
|
catch (error) {
|
|
1061
1134
|
failures.push(error);
|
|
1062
1135
|
}
|
|
1063
|
-
const
|
|
1064
|
-
.filter((item) => !item.closed
|
|
1136
|
+
const remainingRuns = [...new Map([...turns.values()]
|
|
1137
|
+
.filter((item) => !item.closed)
|
|
1065
1138
|
.map((item) => [item.runId, item])).values()];
|
|
1066
|
-
for (const item of
|
|
1139
|
+
for (const item of remainingRuns) {
|
|
1067
1140
|
try {
|
|
1068
|
-
|
|
1141
|
+
let status;
|
|
1142
|
+
if (item.failed)
|
|
1143
|
+
status = 'failed';
|
|
1144
|
+
else if (item.prepared.intake.profile.taskType === 'chat')
|
|
1145
|
+
status = 'cancelled';
|
|
1146
|
+
else {
|
|
1147
|
+
const state = await runtime.withDatabase((database) => stateForRun(database, item));
|
|
1148
|
+
status = state.status === 'completed' || state.nextAction === 'complete'
|
|
1149
|
+
? 'completed'
|
|
1150
|
+
: state.status === 'blocked' || state.nextAction === 'report_blocker'
|
|
1151
|
+
? 'failed'
|
|
1152
|
+
: 'cancelled';
|
|
1153
|
+
}
|
|
1154
|
+
if (status === 'completed') {
|
|
1155
|
+
if (item.nativeSession === undefined || sessions?.flush === undefined) {
|
|
1156
|
+
throw new KiokukoError('CONFLICT', 'Completed DSH run requires its exact native session checkpoint');
|
|
1157
|
+
}
|
|
1158
|
+
await sessions.flush(item.nativeSession);
|
|
1159
|
+
}
|
|
1160
|
+
await runLifecycle.closeTurn({
|
|
1161
|
+
runId: item.runId,
|
|
1162
|
+
status,
|
|
1163
|
+
...(status !== 'completed' ? {} : {
|
|
1164
|
+
sourceEndSeq: dshTurnBoundarySeq(sessionEventSource(item.nativeSession), item.turn, 'end'),
|
|
1165
|
+
}),
|
|
1166
|
+
});
|
|
1069
1167
|
}
|
|
1070
1168
|
catch (error) {
|
|
1071
1169
|
failures.push(error);
|
|
1072
1170
|
}
|
|
1073
1171
|
}
|
|
1074
1172
|
try {
|
|
1075
|
-
await
|
|
1173
|
+
await runLifecycle.dispose();
|
|
1174
|
+
}
|
|
1175
|
+
catch (error) {
|
|
1176
|
+
failures.push(error);
|
|
1177
|
+
}
|
|
1178
|
+
try {
|
|
1179
|
+
await memoryFinalizer.dispose();
|
|
1076
1180
|
}
|
|
1077
1181
|
catch (error) {
|
|
1078
1182
|
failures.push(error);
|
|
1079
1183
|
}
|
|
1080
|
-
// Observer failures are deliberately fail-closed, but must not prevent
|
|
1081
|
-
// the database/runtime from being closed and releasing its resources.
|
|
1082
1184
|
try {
|
|
1083
1185
|
await runtime.close();
|
|
1084
1186
|
}
|
|
@@ -1099,13 +1201,6 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
1099
1201
|
},
|
|
1100
1202
|
};
|
|
1101
1203
|
}
|
|
1102
|
-
function lifecycleClose(runtime) {
|
|
1103
|
-
return ({ runId, status }) => runtime.withDatabase((database) => {
|
|
1104
|
-
const row = new LedgerStore(database).readRun(runId);
|
|
1105
|
-
if (row !== undefined && (row.status === 'intake' || row.status === 'active'))
|
|
1106
|
-
terminalizeLedgerRunInTransaction(database, runId, status);
|
|
1107
|
-
});
|
|
1108
|
-
}
|
|
1109
1204
|
function isEnnoResponse(value) {
|
|
1110
1205
|
return typeof value === 'object' && value !== null && 'ennoOduno' in value && typeof value.ennoOduno === 'object';
|
|
1111
1206
|
}
|