kiokuko-dsh 0.1.5 → 0.1.7
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/commands.d.ts +11 -2
- package/dist/dsh/commands.d.ts.map +1 -1
- package/dist/dsh/commands.js +46 -22
- package/dist/dsh/commands.js.map +1 -1
- package/dist/dsh/composition.d.ts +7 -0
- package/dist/dsh/composition.d.ts.map +1 -1
- package/dist/dsh/composition.js +4 -1
- package/dist/dsh/composition.js.map +1 -1
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +143 -7
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/intake-gate.d.ts.map +1 -1
- package/dist/dsh/intake-gate.js +76 -46
- package/dist/dsh/intake-gate.js.map +1 -1
- package/dist/dsh/intake-profile-resolver.d.ts.map +1 -1
- package/dist/dsh/intake-profile-resolver.js +9 -2
- package/dist/dsh/intake-profile-resolver.js.map +1 -1
- package/dist/dsh/session-bridge.d.ts +12 -0
- package/dist/dsh/session-bridge.d.ts.map +1 -1
- package/dist/dsh/session-bridge.js +25 -2
- package/dist/dsh/session-bridge.js.map +1 -1
- package/docs/dsh-plugin.md +18 -3
- package/package.json +1 -1
package/dist/dsh/commands.d.ts
CHANGED
|
@@ -18,6 +18,13 @@ export interface DshNativeCommandDefinition {
|
|
|
18
18
|
export interface DshNativeCommandInvocation {
|
|
19
19
|
readonly rawInput: string;
|
|
20
20
|
readonly signal: AbortSignal;
|
|
21
|
+
readonly agent?: {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly session?: {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
};
|
|
26
|
+
readonly sessionId?: string;
|
|
27
|
+
};
|
|
21
28
|
}
|
|
22
29
|
export type DshNativeCommandResult = {
|
|
23
30
|
readonly kind: 'success';
|
|
@@ -29,14 +36,16 @@ export type DshNativeCommandResult = {
|
|
|
29
36
|
/** Own request-local Ponytail state; it never changes global configuration. */
|
|
30
37
|
export declare class DshPonytailModes {
|
|
31
38
|
#private;
|
|
32
|
-
begin(requestId: string): void;
|
|
39
|
+
begin(requestId: string, owner?: string): void;
|
|
33
40
|
isActive(requestId: string): boolean;
|
|
34
41
|
set(requestId: string, mode: PonytailMode): PonytailMode;
|
|
35
|
-
execute(args: readonly string[]): string;
|
|
42
|
+
execute(args: readonly string[], owner?: string): string;
|
|
36
43
|
mode(requestId: string): PonytailMode | undefined;
|
|
37
44
|
end(requestId: string): boolean;
|
|
38
45
|
dispose(): void;
|
|
39
46
|
}
|
|
47
|
+
/** Stable owner key shared by turn admission and native command dispatch. */
|
|
48
|
+
export declare function dshPonytailOwnerKey(agentId: string, sessionId: string): string;
|
|
40
49
|
export declare function mountDshPonytailCommand(ctx: DshPonytailCommandContext, modes: DshPonytailModes): () => void;
|
|
41
50
|
/** Bind the command handler to one active request without leaking that request identity into the command text. */
|
|
42
51
|
export declare function executeDshPonytailCommand(modes: DshPonytailModes, requestId: string, args: readonly string[]): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/dsh/commands.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,oCAAqC,CAAA;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE;QACR,6EAA6E;QAC7E,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,GAClF,CAAC,CAAC,UAAU,EAAE,0BAA0B,KAAK,MAAM,IAAI,CAAC,CAAA;KAC7D,CAAA;CACF;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,0BAA0B,KAAK,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;CACvH;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/dsh/commands.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,oCAAqC,CAAA;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE;QACR,6EAA6E;QAC7E,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,GAClF,CAAC,CAAC,UAAU,EAAE,0BAA0B,KAAK,MAAM,IAAI,CAAC,CAAA;KAC7D,CAAA;CACF;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,0BAA0B,KAAK,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;CACvH;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AASrD,+EAA+E;AAC/E,qBAAa,gBAAgB;;IAI3B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY;IAOxD,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBxD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAS/B,OAAO,IAAI,IAAI;CAIhB;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,yBAAyB,EAAE,KAAK,EAAE,gBAAgB,GAAG,MAAM,IAAI,CA0B3G;AAED,kHAAkH;AAClH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAGrH"}
|
package/dist/dsh/commands.js
CHANGED
|
@@ -8,48 +8,68 @@ function parseMode(args) {
|
|
|
8
8
|
}
|
|
9
9
|
/** Own request-local Ponytail state; it never changes global configuration. */
|
|
10
10
|
export class DshPonytailModes {
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
begin(requestId) {
|
|
11
|
+
#modes = new Map();
|
|
12
|
+
#requestByOwner = new Map();
|
|
13
|
+
begin(requestId, owner) {
|
|
14
14
|
if (requestId.length === 0 || requestId.length > 256 || /[\p{Cc}]/u.test(requestId))
|
|
15
15
|
throw new KiokukoError('VALIDATION_ERROR', 'requestId is invalid');
|
|
16
|
-
if (this.#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
if (!this.#modes.has(requestId))
|
|
17
|
+
this.#modes.set(requestId, undefined);
|
|
18
|
+
if (owner !== undefined) {
|
|
19
|
+
const previous = this.#requestByOwner.get(owner);
|
|
20
|
+
if (previous !== undefined && previous !== requestId)
|
|
21
|
+
this.end(previous);
|
|
22
|
+
this.#requestByOwner.set(owner, requestId);
|
|
23
|
+
}
|
|
20
24
|
}
|
|
21
25
|
isActive(requestId) {
|
|
22
|
-
return this.#
|
|
26
|
+
return this.#modes.has(requestId);
|
|
23
27
|
}
|
|
24
28
|
set(requestId, mode) {
|
|
25
|
-
if (this.#
|
|
29
|
+
if (!this.#modes.has(requestId))
|
|
26
30
|
throw new KiokukoError('CONFLICT', 'ponytail is available only for the active logical request');
|
|
27
31
|
if (!PONYTAIL_MODES.includes(mode))
|
|
28
32
|
throw new KiokukoError('VALIDATION_ERROR', 'Unknown ponytail mode');
|
|
29
|
-
this.#
|
|
33
|
+
this.#modes.set(requestId, mode);
|
|
30
34
|
return mode;
|
|
31
35
|
}
|
|
32
|
-
execute(args) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
execute(args, owner) {
|
|
37
|
+
const requestId = owner === undefined
|
|
38
|
+
? this.#modes.size === 1 ? this.#modes.keys().next().value : undefined
|
|
39
|
+
: this.#requestByOwner.get(owner);
|
|
40
|
+
if (requestId === undefined) {
|
|
41
|
+
const message = this.#modes.size === 0
|
|
42
|
+
? 'ponytail is available only for an active logical request'
|
|
43
|
+
: owner === undefined && this.#modes.size > 1
|
|
44
|
+
? 'ponytail requires the current request scope when multiple requests are active'
|
|
45
|
+
: 'ponytail is not active for the current request';
|
|
46
|
+
throw new KiokukoError('CONFLICT', message);
|
|
47
|
+
}
|
|
48
|
+
const mode = this.set(requestId, parseMode(args));
|
|
36
49
|
return `Ponytail mode set to ${mode} for the active request.`;
|
|
37
50
|
}
|
|
38
51
|
mode(requestId) {
|
|
39
|
-
return this.#
|
|
52
|
+
return this.#modes.get(requestId);
|
|
40
53
|
}
|
|
41
54
|
end(requestId) {
|
|
42
|
-
|
|
55
|
+
const deleted = this.#modes.delete(requestId);
|
|
56
|
+
if (!deleted)
|
|
43
57
|
return false;
|
|
44
|
-
this.#
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
for (const [owner, activeRequestId] of this.#requestByOwner) {
|
|
59
|
+
if (activeRequestId === requestId)
|
|
60
|
+
this.#requestByOwner.delete(owner);
|
|
61
|
+
}
|
|
62
|
+
return deleted;
|
|
47
63
|
}
|
|
48
64
|
dispose() {
|
|
49
|
-
this.#
|
|
50
|
-
this.#
|
|
65
|
+
this.#modes.clear();
|
|
66
|
+
this.#requestByOwner.clear();
|
|
51
67
|
}
|
|
52
68
|
}
|
|
69
|
+
/** Stable owner key shared by turn admission and native command dispatch. */
|
|
70
|
+
export function dshPonytailOwnerKey(agentId, sessionId) {
|
|
71
|
+
return `${agentId}\u0000${sessionId}`;
|
|
72
|
+
}
|
|
53
73
|
export function mountDshPonytailCommand(ctx, modes) {
|
|
54
74
|
// Cordis test doubles and early dsh adapters used the two-argument helper;
|
|
55
75
|
// dsh-commands uses one immutable definition object. Supporting both keeps
|
|
@@ -66,7 +86,11 @@ export function mountDshPonytailCommand(ctx, modes) {
|
|
|
66
86
|
handler: (invocation) => {
|
|
67
87
|
try {
|
|
68
88
|
const args = invocation.rawInput.trim().length === 0 ? [] : invocation.rawInput.trim().split(/\s+/u);
|
|
69
|
-
|
|
89
|
+
const sessionId = invocation.agent?.session?.id ?? invocation.agent?.sessionId;
|
|
90
|
+
const owner = invocation.agent === undefined || sessionId === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: dshPonytailOwnerKey(invocation.agent.id, sessionId);
|
|
93
|
+
return { kind: 'success', text: modes.execute(args, owner) };
|
|
70
94
|
}
|
|
71
95
|
catch (error) {
|
|
72
96
|
return { kind: 'error', text: error instanceof Error ? error.message : 'Invalid Ponytail command.' };
|
package/dist/dsh/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/dsh/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/dsh/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,13 @@ export interface DshCompositionHost {
|
|
|
68
68
|
readonly runId: string;
|
|
69
69
|
readonly status: 'completed' | 'failed' | 'cancelled';
|
|
70
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;
|
|
71
78
|
}
|
|
72
79
|
type DshToolHostRegistration = DshToolRegistrationContext['tools']['register'];
|
|
73
80
|
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 { mountDshDurabilityBarriers, mountDshIdleLifecycle, mountDshSessionBridge } from './session-bridge.js';
|
|
2
|
+
import { mountDshDurabilityBarriers, mountDshIdleLifecycle, mountDshSessionBridge, 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';
|
|
@@ -165,6 +165,9 @@ export async function mountDshComposition(ctx, host) {
|
|
|
165
165
|
if (host.resolveIdleClose === undefined)
|
|
166
166
|
throw new Error('kiokuko-dsh idle lifecycle requires a close resolver');
|
|
167
167
|
ingressDisposers.push(mountDshIdleLifecycle(ctx, host.lifecycle, host.resolveIdleClose));
|
|
168
|
+
if (host.resolveSessionClose !== undefined) {
|
|
169
|
+
ingressDisposers.push(mountDshSessionLifecycle(ctx, host.lifecycle, host.resolveSessionClose));
|
|
170
|
+
}
|
|
168
171
|
}
|
|
169
172
|
}
|
|
170
173
|
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,0BAA0B,EAAE,qBAAqB,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/dsh/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAczB,OAAO,EAAqB,KAAK,eAAe,EAA+B,MAAM,sBAAsB,CAAA;AAmC3G,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,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;AAoID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CA8jBtG;AAkBD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}
|
package/dist/dsh/host-adapter.js
CHANGED
|
@@ -4,16 +4,18 @@ import { randomUUID } from 'node:crypto';
|
|
|
4
4
|
import { KIOKUKO_DSH_HOST_SERVICE, } from './composition.js';
|
|
5
5
|
import { DshRuntime } from './runtime.js';
|
|
6
6
|
import { DshIntakeGate } from './intake-gate.js';
|
|
7
|
+
import { resolveGroundedIntakeProfile } from './intake-profile-resolver.js';
|
|
7
8
|
import { DshToolPolicy } from './tool-policy.js';
|
|
8
9
|
import { DSH_MODEL_FACING_OPERATIONS, } from './tools.js';
|
|
9
10
|
import { DshSessionBridge, DshRunLifecycle } from './session-bridge.js';
|
|
10
11
|
import { DshEnnoController } from './enno-controller.js';
|
|
11
12
|
import { DshAdvisoryRunner } from './advisory-runner.js';
|
|
12
|
-
import { DshPonytailModes } from './commands.js';
|
|
13
|
+
import { DshPonytailModes, dshPonytailOwnerKey } from './commands.js';
|
|
13
14
|
import { createDshIntakeAnswerer, createDshConfirmationAnswerer } from './user-interaction.js';
|
|
14
15
|
import { createDshCapabilityCatalog } from './capability-catalog.js';
|
|
15
16
|
import { STANDARD_SKILL_MANIFESTS } from '../setup/standard-skills.js';
|
|
16
17
|
import { canonicalContentHash, compareCanonicalStrings } from '../serialization/validate.js';
|
|
18
|
+
import { KiokukoError } from '../errors.js';
|
|
17
19
|
import { injectDshContext, selectDshDirectiveSources } from './context-injection.js';
|
|
18
20
|
import { projectDshDirective } from './directive-projection.js';
|
|
19
21
|
import { submitOdunoIdeal, submitEnnoPlan, submitEnnoAdvice, reportEnnoWork, finishEnno, submitOdunoMeditation, answerEnno, prepareEnnoVerification, stateForSnapshot } from '../enno-oduno/service.js';
|
|
@@ -23,13 +25,23 @@ import { curateMemoryCandidates } from '../memory/curator.js';
|
|
|
23
25
|
import { checkpointScopedMemoryWithProvenance } from '../memory/scoped-memory.js';
|
|
24
26
|
import { LedgerStore } from '../ledger/store.js';
|
|
25
27
|
function textFromMessages(messages) {
|
|
26
|
-
const
|
|
28
|
+
const userTexts = [];
|
|
29
|
+
const legacyTexts = [];
|
|
27
30
|
for (const value of messages) {
|
|
28
31
|
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
29
32
|
continue;
|
|
30
33
|
const message = value;
|
|
31
34
|
if (message.role !== undefined && message.role !== 'user')
|
|
32
35
|
continue;
|
|
36
|
+
const source = message.source;
|
|
37
|
+
const sourceKind = typeof source === 'object' && source !== null && !Array.isArray(source)
|
|
38
|
+
? source.kind
|
|
39
|
+
: undefined;
|
|
40
|
+
// File/session context and other host instructions may intentionally use
|
|
41
|
+
// the user role so the model sees them. They are still not the human's
|
|
42
|
+
// request and must not influence intake classification or task identity.
|
|
43
|
+
if (sourceKind !== undefined && sourceKind !== 'user')
|
|
44
|
+
continue;
|
|
33
45
|
const content = message.content;
|
|
34
46
|
if (!Array.isArray(content))
|
|
35
47
|
continue;
|
|
@@ -37,10 +49,18 @@ function textFromMessages(messages) {
|
|
|
37
49
|
if (typeof block !== 'object' || block === null || Array.isArray(block))
|
|
38
50
|
continue;
|
|
39
51
|
const text = block.text;
|
|
40
|
-
if (typeof text
|
|
41
|
-
|
|
52
|
+
if (typeof text !== 'string' || text.length === 0)
|
|
53
|
+
continue;
|
|
54
|
+
if (sourceKind === 'user')
|
|
55
|
+
userTexts.push(text);
|
|
56
|
+
else
|
|
57
|
+
legacyTexts.push(text);
|
|
42
58
|
}
|
|
43
59
|
}
|
|
60
|
+
// Current DSH messages carry provenance. Keep the legacy fallback only for
|
|
61
|
+
// older host doubles/adapters, and never merge it with authenticated user
|
|
62
|
+
// text when both are present.
|
|
63
|
+
const texts = userTexts.length > 0 ? userTexts : legacyTexts;
|
|
44
64
|
const task = texts.join('\n').trim();
|
|
45
65
|
if (task.length === 0)
|
|
46
66
|
throw new Error('dsh pre-step did not contain a user task');
|
|
@@ -156,7 +176,9 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
156
176
|
const modes = new DshPonytailModes();
|
|
157
177
|
const confirmation = userQuestions === undefined ? undefined : createDshConfirmationAnswerer(userQuestions);
|
|
158
178
|
let prepareGeneration = 0;
|
|
159
|
-
const
|
|
179
|
+
const continuedTurns = new Map();
|
|
180
|
+
let retireSupersededRun;
|
|
181
|
+
const identityKey = (agentId, sessionId) => dshPonytailOwnerKey(agentId, sessionId);
|
|
160
182
|
const turnKey = (agentId, sessionId, turn) => `${identityKey(agentId, sessionId)}\u0000${turn}`;
|
|
161
183
|
const record = (event, result, generation) => {
|
|
162
184
|
const run = result.prepared.run.runId;
|
|
@@ -189,6 +211,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
189
211
|
task: event.task,
|
|
190
212
|
turn: event.turn,
|
|
191
213
|
prepared: result.prepared,
|
|
214
|
+
catalog: result.catalog,
|
|
192
215
|
prepareGeneration: generation,
|
|
193
216
|
failed: false,
|
|
194
217
|
closed: false,
|
|
@@ -210,6 +233,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
210
233
|
}
|
|
211
234
|
item.prepareGeneration = generation;
|
|
212
235
|
item.task = event.task;
|
|
236
|
+
item.catalog = result.catalog;
|
|
213
237
|
turns.set(key, item);
|
|
214
238
|
latestBySession.set(event.sessionId, item);
|
|
215
239
|
const modeRequest = `dsh:${event.agent.id}:${event.sessionId}:${event.turn}`;
|
|
@@ -218,7 +242,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
218
242
|
if (activeModeRequest !== modeRequest) {
|
|
219
243
|
if (activeModeRequest !== undefined)
|
|
220
244
|
modes.end(activeModeRequest);
|
|
221
|
-
modes.begin(modeRequest);
|
|
245
|
+
modes.begin(modeRequest, modeKey);
|
|
222
246
|
activeModeRequests.set(modeKey, modeRequest);
|
|
223
247
|
}
|
|
224
248
|
const existingState = states.get(item.runId);
|
|
@@ -244,6 +268,60 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
244
268
|
// context deliveries that finish out of order.
|
|
245
269
|
const generation = ++prepareGeneration;
|
|
246
270
|
await runtime.withDatabase((database) => resolveProjectWorkspaceReadOnly(database, event.cwd));
|
|
271
|
+
const cacheKey = `${event.sessionId}\u0000${event.turn}`;
|
|
272
|
+
const fingerprint = canonicalContentHash({
|
|
273
|
+
sessionId: event.sessionId,
|
|
274
|
+
agentId: event.agent.id,
|
|
275
|
+
turn: event.turn,
|
|
276
|
+
task: event.task,
|
|
277
|
+
cwd: event.cwd,
|
|
278
|
+
profileHints: event.profileHints ?? null,
|
|
279
|
+
evidence: event.evidence ?? null,
|
|
280
|
+
skillDiscoveryMode: event.skillDiscoveryMode ?? null,
|
|
281
|
+
catalogDigest: event.capabilities.digest,
|
|
282
|
+
});
|
|
283
|
+
const cached = continuedTurns.get(cacheKey);
|
|
284
|
+
if (cached !== undefined) {
|
|
285
|
+
if (cached.fingerprint !== fingerprint
|
|
286
|
+
|| cached.nativeAgent !== event.nativeAgent
|
|
287
|
+
|| cached.nativeSession !== event.nativeSession) {
|
|
288
|
+
throw new KiokukoError('CONFLICT', 'dsh continued turn was reused with different bound input');
|
|
289
|
+
}
|
|
290
|
+
this.assertCatalog(cached.result.catalog, event.capabilities);
|
|
291
|
+
return event.signal.aborted ? { ...cached.result, admitted: false } : cached.result;
|
|
292
|
+
}
|
|
293
|
+
const previous = currentForAgentEvent(event.agent.id, event.sessionId, undefined, event.nativeSession, event.nativeAgent);
|
|
294
|
+
if (previous !== undefined && previous.turn < event.turn) {
|
|
295
|
+
if (event.signal.aborted)
|
|
296
|
+
return { admitted: false, prepared: previous.prepared, catalog: event.capabilities };
|
|
297
|
+
const previousState = await runtime.withDatabase((database) => stateForRun(database, previous));
|
|
298
|
+
const previousWasChat = previous.prepared.intake.profile.taskType === 'chat';
|
|
299
|
+
const continuePrevious = previousWasChat
|
|
300
|
+
? event.profileHints?.taskType === 'chat'
|
|
301
|
+
: previousState.status !== 'completed'
|
|
302
|
+
&& previousState.status !== 'blocked'
|
|
303
|
+
&& previousState.status !== 'cancelled'
|
|
304
|
+
&& previousState.nextAction !== 'complete';
|
|
305
|
+
if (continuePrevious) {
|
|
306
|
+
this.assertCatalog(previous.catalog, event.capabilities);
|
|
307
|
+
const continued = { admitted: !event.signal.aborted, prepared: previous.prepared, catalog: event.capabilities };
|
|
308
|
+
if (continued.admitted) {
|
|
309
|
+
continuedTurns.set(cacheKey, {
|
|
310
|
+
fingerprint,
|
|
311
|
+
result: continued,
|
|
312
|
+
...(event.nativeAgent === undefined ? {} : { nativeAgent: event.nativeAgent }),
|
|
313
|
+
...(event.nativeSession === undefined ? {} : { nativeSession: event.nativeSession }),
|
|
314
|
+
});
|
|
315
|
+
record(event, continued, generation);
|
|
316
|
+
}
|
|
317
|
+
return continued;
|
|
318
|
+
}
|
|
319
|
+
if (event.signal.aborted)
|
|
320
|
+
return { admitted: false, prepared: previous.prepared, catalog: event.capabilities };
|
|
321
|
+
if (retireSupersededRun === undefined)
|
|
322
|
+
throw new Error('kiokuko-dsh run lifecycle is unavailable');
|
|
323
|
+
await retireSupersededRun(previous, previousState.status === 'cancelled' ? 'cancelled' : previousState.status === 'blocked' ? 'failed' : 'completed');
|
|
324
|
+
}
|
|
247
325
|
const prepared = await super.prepare(event);
|
|
248
326
|
if (prepared.admitted)
|
|
249
327
|
record(event, prepared, generation);
|
|
@@ -259,6 +337,10 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
259
337
|
const messages = await contextMessages(event, result);
|
|
260
338
|
return { ...decision, messages: [...decision.messages, ...messages] };
|
|
261
339
|
}
|
|
340
|
+
clearTurn(sessionId, turn) {
|
|
341
|
+
super.clearTurn(sessionId, turn);
|
|
342
|
+
continuedTurns.delete(`${sessionId}\u0000${turn}`);
|
|
343
|
+
}
|
|
262
344
|
}
|
|
263
345
|
const gate = new CapturingGate(runtime, userQuestions === undefined ? undefined : createDshIntakeAnswerer(userQuestions), (context) => capabilityCatalog(skills, tools, context));
|
|
264
346
|
const currentSession = (sessionId) => latestBySession.get(sessionId);
|
|
@@ -306,6 +388,9 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
306
388
|
signal: payload.signal,
|
|
307
389
|
});
|
|
308
390
|
const bound = currentForAgentEvent(payload.agent.id, sessionId, payload.turn, boundSession, payload.agent);
|
|
391
|
+
const previous = bound === undefined
|
|
392
|
+
? currentForAgentEvent(payload.agent.id, sessionId, undefined, boundSession, payload.agent)
|
|
393
|
+
: undefined;
|
|
309
394
|
// DSH supplies only the messages claimed for this particular step. After
|
|
310
395
|
// the first step that batch may contain steering/injected context rather
|
|
311
396
|
// than the original user task, so the established logical-turn record is
|
|
@@ -320,6 +405,21 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
320
405
|
step: payload.step,
|
|
321
406
|
task,
|
|
322
407
|
cwd,
|
|
408
|
+
...(() => {
|
|
409
|
+
if (bound !== undefined) {
|
|
410
|
+
return continuedTurns.has(`${sessionId}\u0000${payload.turn}`)
|
|
411
|
+
? { profileHints: { taskType: bound.prepared.intake.profile.taskType } }
|
|
412
|
+
: {};
|
|
413
|
+
}
|
|
414
|
+
if (previous === undefined)
|
|
415
|
+
return {};
|
|
416
|
+
const inferred = resolveGroundedIntakeProfile({ task, cwd }).profileHints.taskType;
|
|
417
|
+
const previousType = previous.prepared.intake.profile.taskType;
|
|
418
|
+
if (inferred === null || previousType === 'chat' && inferred === 'chat') {
|
|
419
|
+
return { profileHints: { taskType: previousType } };
|
|
420
|
+
}
|
|
421
|
+
return {};
|
|
422
|
+
})(),
|
|
323
423
|
capabilities: catalog,
|
|
324
424
|
signal: payload.signal,
|
|
325
425
|
};
|
|
@@ -548,12 +648,35 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
548
648
|
return { runId: item.runId, status: 'failed' };
|
|
549
649
|
if (state.status === 'cancelled')
|
|
550
650
|
return { runId: item.runId, status: 'cancelled' };
|
|
651
|
+
if (state.status === 'blocked' || state.nextAction === 'report_blocker')
|
|
652
|
+
return { runId: item.runId, status: 'failed' };
|
|
653
|
+
// A chat run spans the quiet time between user messages. Enno's
|
|
654
|
+
// inapplicable `complete` means that no orchestration is required for this
|
|
655
|
+
// turn; it does not mean that the persistent conversation has ended.
|
|
656
|
+
if (item.prepared.intake.profile.taskType === 'chat')
|
|
657
|
+
return undefined;
|
|
551
658
|
if (state.status === 'completed' || state.nextAction === 'complete')
|
|
552
659
|
return { runId: item.runId, status: 'completed' };
|
|
553
660
|
// Idle means the driver has no active work, not that Enno reached a
|
|
554
|
-
// terminal state. Keep
|
|
661
|
+
// terminal state. Keep only genuinely resumable active states open.
|
|
555
662
|
return undefined;
|
|
556
663
|
};
|
|
664
|
+
const resolveSessionClose = async (sessionId, nativeSession) => {
|
|
665
|
+
const item = currentSession(sessionId);
|
|
666
|
+
if (item === undefined || item.closed || item.nativeSession !== nativeSession)
|
|
667
|
+
return undefined;
|
|
668
|
+
if (item.failed)
|
|
669
|
+
return { runId: item.runId, status: 'failed' };
|
|
670
|
+
const state = await runtime.withDatabase((database) => stateForRun(database, item));
|
|
671
|
+
if (state.status === 'cancelled')
|
|
672
|
+
return { runId: item.runId, status: 'cancelled' };
|
|
673
|
+
if (state.status === 'blocked' || state.nextAction === 'report_blocker')
|
|
674
|
+
return { runId: item.runId, status: 'failed' };
|
|
675
|
+
if (item.prepared.intake.profile.taskType === 'chat' || state.status === 'completed' || state.nextAction === 'complete') {
|
|
676
|
+
return { runId: item.runId, status: 'completed' };
|
|
677
|
+
}
|
|
678
|
+
return { runId: item.runId, status: 'cancelled' };
|
|
679
|
+
};
|
|
557
680
|
const closeRun = async (input) => {
|
|
558
681
|
await lifecycleClose(runtime)(input);
|
|
559
682
|
const items = [...turns.values()].filter((candidate) => candidate.runId === input.runId);
|
|
@@ -587,6 +710,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
587
710
|
item.failed = true;
|
|
588
711
|
});
|
|
589
712
|
const bridgeLifecycle = new DshRunLifecycle({ bridge, closeRun });
|
|
713
|
+
retireSupersededRun = (item, status) => bridgeLifecycle.closeTurn({ runId: item.runId, status });
|
|
590
714
|
const host = {
|
|
591
715
|
...(skills === undefined ? {} : { skills: skills }),
|
|
592
716
|
...(systemPrompt === undefined ? {} : { systemPrompt }),
|
|
@@ -607,6 +731,7 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
607
731
|
ennoController,
|
|
608
732
|
lifecycle: bridgeLifecycle,
|
|
609
733
|
resolveIdleClose,
|
|
734
|
+
resolveSessionClose,
|
|
610
735
|
};
|
|
611
736
|
return {
|
|
612
737
|
host,
|
|
@@ -636,6 +761,17 @@ export function createDshHostAdapter(ctx, options = {}) {
|
|
|
636
761
|
catch (error) {
|
|
637
762
|
failures.push(error);
|
|
638
763
|
}
|
|
764
|
+
const remainingChats = [...new Map([...turns.values()]
|
|
765
|
+
.filter((item) => !item.closed && item.prepared.intake.profile.taskType === 'chat')
|
|
766
|
+
.map((item) => [item.runId, item])).values()];
|
|
767
|
+
for (const item of remainingChats) {
|
|
768
|
+
try {
|
|
769
|
+
await bridgeLifecycle.closeTurn({ runId: item.runId, status: item.failed ? 'failed' : 'completed' });
|
|
770
|
+
}
|
|
771
|
+
catch (error) {
|
|
772
|
+
failures.push(error);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
639
775
|
try {
|
|
640
776
|
await bridgeLifecycle.dispose();
|
|
641
777
|
}
|