@moxt-ai/mobius 0.0.387 → 0.0.388
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/{chunk-A62FEGIN.js → chunk-7BSIM5AK.js} +123 -114
- package/dist/{chunk-A62FEGIN.js.map → chunk-7BSIM5AK.js.map} +3 -3
- package/dist/{chunk-S7PKNDIS.js → chunk-Z4WUPVBL.js} +2 -2
- package/dist/{chunk-S7PKNDIS.js.map → chunk-Z4WUPVBL.js.map} +1 -1
- package/dist/{cli-43LPJ5ID.js → cli-O57WJIFN.js} +3 -3
- package/dist/cli.js +2 -2
- package/dist/engine/runtime/command/registry/prompt.d.ts.map +1 -1
- package/dist/engine/runtime/command/registry/prompt.js +2 -3
- package/dist/engine/runtime/command/registry/prompt.js.map +1 -1
- package/dist/engine/runtime/relay/session-event-publisher.d.ts.map +1 -1
- package/dist/engine/runtime/relay/session-event-publisher.js +2 -4
- package/dist/engine/runtime/relay/session-event-publisher.js.map +1 -1
- package/dist/engine/session/api/session-layer.js +3 -3
- package/dist/engine/session/api/session-layer.js.map +1 -1
- package/dist/engine/session/live/agent-session.d.ts.map +1 -1
- package/dist/engine/session/live/agent-session.js +4 -3
- package/dist/engine/session/live/agent-session.js.map +1 -1
- package/dist/engine/session/prompt/execute-prompt.d.ts +8 -8
- package/dist/engine/session/prompt/execute-prompt.d.ts.map +1 -1
- package/dist/engine/session/prompt/execute-prompt.js +10 -10
- package/dist/engine/session/prompt/execute-prompt.js.map +1 -1
- package/dist/engine/session/prompt/prompt-lifecycle.d.ts +8 -4
- package/dist/engine/session/prompt/prompt-lifecycle.d.ts.map +1 -1
- package/dist/engine/session/prompt/prompt-lifecycle.js +18 -17
- package/dist/engine/session/prompt/prompt-lifecycle.js.map +1 -1
- package/dist/engine/session/turn/active-executions.d.ts +4 -2
- package/dist/engine/session/turn/active-executions.d.ts.map +1 -1
- package/dist/engine/session/turn/active-executions.js +4 -6
- package/dist/engine/session/turn/active-executions.js.map +1 -1
- package/dist/engine/session/turn/active-turn.d.ts +12 -8
- package/dist/engine/session/turn/active-turn.d.ts.map +1 -1
- package/dist/engine/session/turn/active-turn.js +47 -36
- package/dist/engine/session/turn/active-turn.js.map +1 -1
- package/dist/engine/session/turn/execution-receipts.d.ts +6 -2
- package/dist/engine/session/turn/execution-receipts.d.ts.map +1 -1
- package/dist/engine/session/turn/execution-receipts.js +18 -32
- package/dist/engine/session/turn/execution-receipts.js.map +1 -1
- package/dist/engine/session/turn/session-execution.d.ts +6 -2
- package/dist/engine/session/turn/session-execution.d.ts.map +1 -1
- package/dist/engine/session/turn/session-execution.js +10 -7
- package/dist/engine/session/turn/session-execution.js.map +1 -1
- package/dist/engine/session/turn/session-turns.d.ts +1 -1
- package/dist/engine/session/turn/session-turns.d.ts.map +1 -1
- package/dist/engine/session/turn/session-turns.js +1 -1
- package/dist/engine/session/turn/session-turns.js.map +1 -1
- package/dist/engine.js +2 -2
- package/package.json +2 -2
- /package/dist/{cli-43LPJ5ID.js.map → cli-O57WJIFN.js.map} +0 -0
|
@@ -4,12 +4,14 @@ import type { ExecutionReceipts } from "../turn/execution-receipts.ts";
|
|
|
4
4
|
export interface PromptRequestRecovery {
|
|
5
5
|
readonly queuedPromptRequests: readonly QueuedPromptRequestEventLog[];
|
|
6
6
|
}
|
|
7
|
+
/** Whether a command started or settled, as its execution receipt records it. */
|
|
8
|
+
type ExecutionProgress = Pick<ExecutionReceipts, "hasStarted" | "isTerminalExecution">;
|
|
7
9
|
export declare class PromptLifecycle {
|
|
8
10
|
#private;
|
|
9
|
-
constructor(sink: SessionEventSink, recordLifecycle: (sessionId: string, event: SessionEventPayload) => Promise<boolean>, recordActiveTurn: (event: SessionLiveEvent) => void,
|
|
11
|
+
constructor(sink: SessionEventSink, recordLifecycle: (sessionId: string, event: SessionEventPayload) => Promise<boolean>, recordActiveTurn: (event: SessionLiveEvent) => void, executions: ExecutionProgress);
|
|
10
12
|
readonly requested: (command: SessionPromptCommand) => void;
|
|
11
|
-
/**
|
|
12
|
-
readonly
|
|
13
|
+
/** The lifecycle metadata the Agent session records when it starts this claimed command. */
|
|
14
|
+
readonly lifecycle: (sessionId: string, commandId: string, attemptId: string, epoch: string, disposition: string) => {
|
|
13
15
|
readonly attemptId: string;
|
|
14
16
|
readonly content: readonly ContentBlock[];
|
|
15
17
|
readonly disposition?: string;
|
|
@@ -22,8 +24,10 @@ export declare class PromptLifecycle {
|
|
|
22
24
|
readonly replayOutcome: (sessionId: string, event: SessionEventPayload) => Promise<void>;
|
|
23
25
|
readonly queueChanged: (sessionId: string) => Promise<void>;
|
|
24
26
|
readonly completed: (sessionId: string, commandId: string, stopReason: string) => Promise<void>;
|
|
25
|
-
|
|
27
|
+
/** Settles a failed command; whether it failed before or after starting is its receipt's fact. */
|
|
28
|
+
readonly failed: (sessionId: string, commandId: string, attemptId: string, code: string, message: string) => Promise<void>;
|
|
26
29
|
readonly promptRequestRecovery: (sessionId: string) => PromptRequestRecovery;
|
|
27
30
|
}
|
|
28
31
|
export declare function settleAbandonedTurn(projection: PromptLifecycle, operations: ExecutionReceipts, cancellation: SessionCancelCommand): Promise<void>;
|
|
32
|
+
export {};
|
|
29
33
|
//# sourceMappingURL=prompt-lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/prompt/prompt-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAgBvE,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACzE;AA8BD,qBAAa,eAAe;;
|
|
1
|
+
{"version":3,"file":"prompt-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/prompt/prompt-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAgBvE,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACzE;AA8BD,iFAAiF;AACjF,KAAK,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,qBAAqB,CAAC,CAAC;AAEvF,qBAAa,eAAe;;IAUxB,YACI,IAAI,EAAE,gBAAgB,EACtB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,EACpF,gBAAgB,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,EACnD,UAAU,EAAE,iBAAiB,EAMhC;IAED,QAAQ,CAAC,SAAS,YAAa,oBAAoB,KAAG,IAAI,CAaxD;IAEF,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,cACH,MAAM,aACN,MAAM,aACN,MAAM,SACV,MAAM,eACA,MAAM,KACpB;QACC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;QAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;KACrC,CAaC;IAEF,QAAQ,CAAC,MAAM,aAAc,gBAAgB,KAAG,IAAI,CAiBlD;IAEF,QAAQ,CAAC,eAAe,cAAe,MAAM,aAAa,MAAM,KAAG,IAAI,CAyBrE;IAEF,QAAQ,CAAC,aAAa,cAAqB,MAAM,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAAC,CAM3F;IAEF,QAAQ,CAAC,YAAY,cAAqB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAK9D;IAEF,QAAQ,CAAC,SAAS,cAAqB,MAAM,aAAa,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAsBlG;IAEF,kGAAkG;IAClG,QAAQ,CAAC,MAAM,cACA,MAAM,aACN,MAAM,aACN,MAAM,QACX,MAAM,WACH,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAcd;IAEF,QAAQ,CAAC,qBAAqB,cAAe,MAAM,KAAG,qBAAqB,CAYxE;CACN;AAED,wBAAsB,mBAAmB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,oBAAoB,GACnC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SESSION_CLOSED_ERROR_CODE } from "@moxt-ai/mobius-sdk/protocol";
|
|
1
|
+
import { isPromptTerminal, SESSION_CLOSED_ERROR_CODE } from "@moxt-ai/mobius-sdk/protocol";
|
|
2
2
|
import { isTextPromptResourceMediaType } from "./prompt-artifacts.js";
|
|
3
3
|
function promptContent(command) {
|
|
4
4
|
const content = [];
|
|
@@ -27,16 +27,17 @@ function promptContent(command) {
|
|
|
27
27
|
}
|
|
28
28
|
export class PromptLifecycle {
|
|
29
29
|
#sink;
|
|
30
|
+
/** Terminal events held until their command's admission and execution state are released. */
|
|
30
31
|
#terminal = new Map();
|
|
31
32
|
#publications = new Map();
|
|
32
33
|
#queued = new Map();
|
|
33
34
|
#recordActiveTurn;
|
|
34
|
-
#
|
|
35
|
+
#executions;
|
|
35
36
|
#recordLifecycle;
|
|
36
|
-
constructor(sink, recordLifecycle, recordActiveTurn,
|
|
37
|
+
constructor(sink, recordLifecycle, recordActiveTurn, executions) {
|
|
37
38
|
this.#recordLifecycle = recordLifecycle;
|
|
38
39
|
this.#recordActiveTurn = recordActiveTurn;
|
|
39
|
-
this.#
|
|
40
|
+
this.#executions = executions;
|
|
40
41
|
this.#sink = sink;
|
|
41
42
|
}
|
|
42
43
|
requested = (command) => {
|
|
@@ -53,8 +54,8 @@ export class PromptLifecycle {
|
|
|
53
54
|
...(command.targetCommandId.length === 0 ? {} : { targetCommandId: command.targetCommandId }),
|
|
54
55
|
});
|
|
55
56
|
};
|
|
56
|
-
/**
|
|
57
|
-
|
|
57
|
+
/** The lifecycle metadata the Agent session records when it starts this claimed command. */
|
|
58
|
+
lifecycle = (sessionId, commandId, attemptId, epoch, disposition) => {
|
|
58
59
|
const request = this.#queued.get(commandId);
|
|
59
60
|
if (request?.sessionId === sessionId) {
|
|
60
61
|
return {
|
|
@@ -71,10 +72,7 @@ export class PromptLifecycle {
|
|
|
71
72
|
record = (recorded) => {
|
|
72
73
|
this.#recordActiveTurn(recorded);
|
|
73
74
|
const sessionId = recorded.sessionId;
|
|
74
|
-
if (recorded.type === "lifecycle-metadata" &&
|
|
75
|
-
(recorded.payload.kind === "prompt.completed" ||
|
|
76
|
-
recorded.payload.kind === "prompt.failed" ||
|
|
77
|
-
recorded.payload.kind === "prompt.failed-before-start")) {
|
|
75
|
+
if (recorded.type === "lifecycle-metadata" && isPromptTerminal(recorded.payload)) {
|
|
78
76
|
// Publish termination after prompt admission and execution state are settled.
|
|
79
77
|
this.#terminal.set(recorded.payload.commandId, recorded);
|
|
80
78
|
const pending = this.#publications.get(sessionId) ?? [];
|
|
@@ -129,7 +127,7 @@ export class PromptLifecycle {
|
|
|
129
127
|
};
|
|
130
128
|
completed = async (sessionId, commandId, stopReason) => {
|
|
131
129
|
const request = this.#queued.get(commandId);
|
|
132
|
-
if (request?.sessionId !== sessionId || this.#
|
|
130
|
+
if (request?.sessionId !== sessionId || this.#executions.isTerminalExecution(commandId, sessionId)) {
|
|
133
131
|
return;
|
|
134
132
|
}
|
|
135
133
|
const recorded = await this.#recordLifecycle(sessionId, {
|
|
@@ -138,21 +136,24 @@ export class PromptLifecycle {
|
|
|
138
136
|
kind: "prompt.completed",
|
|
139
137
|
commandId,
|
|
140
138
|
stopReason,
|
|
141
|
-
...(this.#hasStarted(commandId, sessionId) ? {} : { execution: "not-started" }),
|
|
139
|
+
...(this.#executions.hasStarted(commandId, sessionId) ? {} : { execution: "not-started" }),
|
|
142
140
|
},
|
|
143
141
|
});
|
|
144
142
|
if (!recorded) {
|
|
145
143
|
this.#sink.publishOperationFailure(sessionId, commandId, "cancelled", "The prompt was cancelled before execution");
|
|
146
144
|
}
|
|
147
145
|
};
|
|
148
|
-
failed
|
|
146
|
+
/** Settles a failed command; whether it failed before or after starting is its receipt's fact. */
|
|
147
|
+
failed = async (sessionId, commandId, attemptId, code, message) => {
|
|
149
148
|
const request = this.#queued.get(commandId);
|
|
150
|
-
if (request?.sessionId !== sessionId || this.#
|
|
149
|
+
if (request?.sessionId !== sessionId || this.#executions.isTerminalExecution(commandId, sessionId)) {
|
|
151
150
|
return;
|
|
152
151
|
}
|
|
153
152
|
const recorded = await this.#recordLifecycle(sessionId, {
|
|
154
153
|
type: "lifecycle-metadata",
|
|
155
|
-
payload:
|
|
154
|
+
payload: this.#executions.hasStarted(commandId, sessionId)
|
|
155
|
+
? { kind: "prompt.failed", attemptId, commandId, code, message }
|
|
156
|
+
: { kind: "prompt.failed-before-start", commandId, code, message },
|
|
156
157
|
});
|
|
157
158
|
if (!recorded || code === SESSION_CLOSED_ERROR_CODE) {
|
|
158
159
|
this.#sink.publishOperationFailure(sessionId, commandId, code, message);
|
|
@@ -160,7 +161,7 @@ export class PromptLifecycle {
|
|
|
160
161
|
};
|
|
161
162
|
promptRequestRecovery = (sessionId) => ({
|
|
162
163
|
queuedPromptRequests: [...this.#queued.values()]
|
|
163
|
-
.filter((request) => request.sessionId === sessionId && !this.#hasStarted(request.commandId, sessionId))
|
|
164
|
+
.filter((request) => request.sessionId === sessionId && !this.#executions.hasStarted(request.commandId, sessionId))
|
|
164
165
|
.map(({ commandId, content, disposition, targetCommandId }) => ({
|
|
165
166
|
commandId,
|
|
166
167
|
content,
|
|
@@ -180,7 +181,7 @@ export async function settleAbandonedTurn(projection, operations, cancellation)
|
|
|
180
181
|
console.warn("Mobius daemon ignored cancellation for an inactive turn");
|
|
181
182
|
return;
|
|
182
183
|
}
|
|
183
|
-
await projection.failed(cancellation.sessionId, cancellation.commandId, "agent_execution_abandoned", "The local Agent execution was abandoned before it completed");
|
|
184
|
+
await projection.failed(cancellation.sessionId, cancellation.commandId, attemptId, "agent_execution_abandoned", "The local Agent execution was abandoned before it completed");
|
|
184
185
|
projection.publishTerminal(cancellation.sessionId, cancellation.commandId);
|
|
185
186
|
}
|
|
186
187
|
//# sourceMappingURL=prompt-lifecycle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-lifecycle.js","sourceRoot":"","sources":["../../../../src/engine/session/prompt/prompt-lifecycle.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-lifecycle.js","sourceRoot":"","sources":["../../../../src/engine/session/prompt/prompt-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The prompt
|
|
3
|
-
*
|
|
2
|
+
* The prompt each Session's Agent process is driving, and the cancellation sent to it. Session admission is the only
|
|
3
|
+
* owner of whether a Session is busy and admits one execution at a time, so this records that execution without
|
|
4
|
+
* deciding it again. Cancellation names the command it stops and never outlives that command's execution; a command
|
|
5
|
+
* cancelled before its execution begins is withdrawn by its own turn instead.
|
|
4
6
|
*/
|
|
5
7
|
export declare class ActiveExecutions {
|
|
6
8
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-executions.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-executions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"active-executions.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-executions.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,qBAAa,gBAAgB;;IAEzB,QAAQ,CAAC,OAAO,OAAQ,MAAM,KAAG,MAAM,GAAG,SAAS,CAAqC;IACxF,QAAQ,CAAC,YAAY,OAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAG7D;IACF,QAAQ,CAAC,MAAM,OAAQ,MAAM,KAAG,OAAO,CAA0B;IACjE,QAAQ,CAAC,KAAK,OAAQ,MAAM,aAAa,MAAM,KAAG,IAAI,CAEpD;IACF,QAAQ,CAAC,MAAM,OAAQ,MAAM,aAAa,MAAM,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAYzF;IACF,QAAQ,CAAC,MAAM,OAAQ,MAAM,aAAa,MAAM,KAAG,IAAI,CAIrD;CACL"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { AcpExecutionError } from "../../acp/acp-error.js";
|
|
2
1
|
/**
|
|
3
|
-
* The prompt
|
|
4
|
-
*
|
|
2
|
+
* The prompt each Session's Agent process is driving, and the cancellation sent to it. Session admission is the only
|
|
3
|
+
* owner of whether a Session is busy and admits one execution at a time, so this records that execution without
|
|
4
|
+
* deciding it again. Cancellation names the command it stops and never outlives that command's execution; a command
|
|
5
|
+
* cancelled before its execution begins is withdrawn by its own turn instead.
|
|
5
6
|
*/
|
|
6
7
|
export class ActiveExecutions {
|
|
7
8
|
#entries = new Map();
|
|
@@ -12,9 +13,6 @@ export class ActiveExecutions {
|
|
|
12
13
|
};
|
|
13
14
|
isBusy = (id) => this.#entries.has(id);
|
|
14
15
|
begin = (id, commandId) => {
|
|
15
|
-
if (this.#entries.has(id)) {
|
|
16
|
-
throw new AcpExecutionError("Another prompt is already running in this conversation", {}, "session_busy");
|
|
17
|
-
}
|
|
18
16
|
this.#entries.set(id, { kind: "running", commandId });
|
|
19
17
|
};
|
|
20
18
|
cancel = (id, commandId, stop) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-executions.js","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-executions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"active-executions.js","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-executions.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAChB,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IACxC,OAAO,GAAG,CAAC,EAAU,EAAsB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IAC/E,YAAY,GAAG,CAAC,EAAU,EAA6B,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,OAAO,KAAK,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC,CAAC;IACO,MAAM,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,KAAK,GAAG,CAAC,EAAU,EAAE,SAAiB,EAAQ,EAAE;QACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;IACO,MAAM,GAAG,CAAC,EAAU,EAAE,SAAiB,EAAE,IAAyB,EAAiB,EAAE;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,UAAU,CAAC;QAC5B,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9E,OAAO,UAAU,CAAC,OAAO,CAAC;IAC9B,CAAC,CAAC;IACO,MAAM,GAAG,CAAC,EAAU,EAAE,SAAiB,EAAQ,EAAE;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC,CAAC;CACL"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type NativeSessionResult, type
|
|
1
|
+
import { type NativeSessionResult, type SessionElicitationRequestedEvent, type SessionElicitationResolvedEvent, type SessionPermissionRequestedEvent, type SessionPermissionResolvedEvent, type SessionPromptCommand, type SessionPromptDispositionCommand } from "@moxt-ai/mobius-sdk/protocol";
|
|
2
2
|
type ActiveTurnSnapshot = Extract<NativeSessionResult, {
|
|
3
3
|
readonly action: "active-turn";
|
|
4
4
|
}>["turn"];
|
|
@@ -16,24 +16,28 @@ export declare class ActiveRuntimeTurn {
|
|
|
16
16
|
#private;
|
|
17
17
|
readonly attemptId: string;
|
|
18
18
|
readonly command: SessionPromptCommand;
|
|
19
|
-
|
|
19
|
+
readonly epoch: string & import("zod").$brand<"Identifier">;
|
|
20
|
+
/** `started` reads the command's execution receipt, the single owner of whether the command started. */
|
|
21
|
+
constructor(command: SessionPromptCommand, attemptId: string, started: () => boolean);
|
|
20
22
|
readonly enqueue: () => void;
|
|
21
23
|
readonly isQueued: () => boolean;
|
|
24
|
+
/** Whether the command's execution was handed to the Agent. */
|
|
25
|
+
readonly hasStarted: () => boolean;
|
|
22
26
|
readonly abortRuntime: () => void;
|
|
23
27
|
readonly finish: () => void;
|
|
24
|
-
readonly activate: (execution: string) => {
|
|
25
|
-
readonly epoch: string;
|
|
26
|
-
readonly sequence: 0;
|
|
27
|
-
};
|
|
28
28
|
readonly promoteQueuedPrompt: (command: SessionPromptDispositionCommand) => "accepted" | "already-started" | "unavailable";
|
|
29
29
|
readonly admit: () => string;
|
|
30
30
|
readonly queuePromotion: () => Promise<void> | null;
|
|
31
31
|
readonly effectiveDisposition: () => string;
|
|
32
|
+
/** A steering prompt joins the execution of the turn it steers; every other prompt owns its execution. */
|
|
33
|
+
readonly execution: () => string;
|
|
32
34
|
readonly recordEvent: (event: RecordedSessionEvent) => RecordedSessionEvent;
|
|
33
|
-
readonly recordSteeringPrompt: (command: SessionPromptCommand) => boolean;
|
|
34
35
|
readonly snapshot: () => ActiveTurnSnapshot;
|
|
35
|
-
readonly matches: (cancellation: SessionCancelCommand) => boolean;
|
|
36
36
|
readonly matchesInteraction: (interactionId: string, sessionId: string) => boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Before the command starts, cancellation withdraws it by aborting its own admission and preparation. Once it
|
|
39
|
+
* started, the Agent execution it belongs to must be asked to stop.
|
|
40
|
+
*/
|
|
37
41
|
readonly requestCancellation: () => TurnCancellation;
|
|
38
42
|
readonly cancellationRequested: () => boolean;
|
|
39
43
|
get signal(): AbortSignal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-turn.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-turn.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,mBAAmB,EAKxB,KAAK,
|
|
1
|
+
{"version":3,"file":"active-turn.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-turn.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,mBAAmB,EAKxB,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EAEzB,KAAK,+BAA+B,EACvC,MAAM,8BAA8B,CAAC;AAEtC,KAAK,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnG,yEAAyE;AACzE,MAAM,MAAM,oBAAoB,GAC1B,gCAAgC,GAChC,+BAA+B,GAC/B,+BAA+B,GAC/B,8BAA8B,CAAC;AAYrC,MAAM,MAAM,gBAAgB,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GACtC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,qBAAa,iBAAiB;;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,KAAK,8CAAkC;IAYhD,wGAAwG;IACxG,YAAY,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,EAKnF;IAED,QAAQ,CAAC,OAAO,QAAO,IAAI,CAKzB;IAEF,QAAQ,CAAC,QAAQ,QAAO,OAAO,CAIM;IAErC,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,QAAO,OAAO,CAAoB;IAErD,QAAQ,CAAC,YAAY,QAAO,IAAI,CAE9B;IAEF,QAAQ,CAAC,MAAM,QAAO,IAAI,CAExB;IAEF,QAAQ,CAAC,mBAAmB,YACf,+BAA+B,KACzC,UAAU,GAAG,iBAAiB,GAAG,aAAa,CAsB/C;IAEF,QAAQ,CAAC,KAAK,QAAO,MAAM,CAMzB;IAEF,QAAQ,CAAC,cAAc,QAAO,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAKhD;IAEF,QAAQ,CAAC,oBAAoB,QAAO,MAAM,CAUxC;IAEF,0GAA0G;IAC1G,QAAQ,CAAC,SAAS,QAAO,MAAM,CAGE;IAEjC,QAAQ,CAAC,WAAW,UAAW,oBAAoB,KAAG,oBAAoB,CAgBxE;IAEF,QAAQ,CAAC,QAAQ,QAAO,kBAAkB,CAWxC;IAEF,QAAQ,CAAC,kBAAkB,kBAAmB,MAAM,aAAa,MAAM,KAAG,OAAO,CACc;IAE/F;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,QAAO,gBAAgB,CAUjD;IAEF,QAAQ,CAAC,qBAAqB,QAAO,OAAO,CAAgC;IAE5E,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,IAAI,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9B;CACJ"}
|
|
@@ -3,58 +3,57 @@ import { decodeIdentifier, SESSION_ELICITATION_REQUESTED_KIND, SESSION_ELICITATI
|
|
|
3
3
|
export class ActiveRuntimeTurn {
|
|
4
4
|
attemptId;
|
|
5
5
|
command;
|
|
6
|
+
epoch = decodeIdentifier(randomUUID());
|
|
6
7
|
#controller;
|
|
7
8
|
#finished = Promise.withResolvers();
|
|
9
|
+
#started;
|
|
8
10
|
#cancellationRequested = false;
|
|
9
|
-
#
|
|
11
|
+
#admission = { kind: "waiting" };
|
|
10
12
|
#sequence = 0;
|
|
11
13
|
#interaction = null;
|
|
12
|
-
|
|
13
|
-
constructor(command, attemptId) {
|
|
14
|
+
/** `started` reads the command's execution receipt, the single owner of whether the command started. */
|
|
15
|
+
constructor(command, attemptId, started) {
|
|
14
16
|
this.attemptId = attemptId;
|
|
15
17
|
this.command = command;
|
|
16
18
|
this.#controller = new AbortController();
|
|
17
|
-
this.#
|
|
19
|
+
this.#started = started;
|
|
18
20
|
}
|
|
19
21
|
enqueue = () => {
|
|
20
|
-
if (this.#
|
|
21
|
-
throw new Error("Only a
|
|
22
|
+
if (this.#admission.kind !== "waiting") {
|
|
23
|
+
throw new Error("Only a waiting prompt can enter the queue");
|
|
22
24
|
}
|
|
23
|
-
this.#
|
|
25
|
+
this.#admission = { kind: "queued", promotion: Promise.withResolvers() };
|
|
24
26
|
};
|
|
25
|
-
isQueued = () => (this.#
|
|
26
|
-
(this.#
|
|
27
|
+
isQueued = () => (this.#admission.kind === "queued" ||
|
|
28
|
+
(this.#admission.kind === "admitted" && this.#admission.disposition === SessionPromptDisposition.Queue)) &&
|
|
29
|
+
!this.#started() &&
|
|
27
30
|
!this.#controller.signal.aborted;
|
|
31
|
+
/** Whether the command's execution was handed to the Agent. */
|
|
32
|
+
hasStarted = () => this.#started();
|
|
28
33
|
abortRuntime = () => {
|
|
29
34
|
this.#controller.abort();
|
|
30
35
|
};
|
|
31
36
|
finish = () => {
|
|
32
37
|
this.#finished.resolve();
|
|
33
38
|
};
|
|
34
|
-
activate = (execution) => {
|
|
35
|
-
this.#dispatch = { kind: "running", execution };
|
|
36
|
-
return { epoch: this.#epoch, sequence: 0 };
|
|
37
|
-
};
|
|
38
39
|
promoteQueuedPrompt = (command) => {
|
|
39
40
|
if (command.commandId !== this.command.commandId ||
|
|
40
41
|
command.sessionId !== this.command.sessionId ||
|
|
41
42
|
this.#controller.signal.aborted) {
|
|
42
43
|
return "unavailable";
|
|
43
44
|
}
|
|
44
|
-
switch (this.#
|
|
45
|
+
switch (this.#admission.kind) {
|
|
45
46
|
case "queued": {
|
|
46
|
-
const promotion = this.#
|
|
47
|
-
this.#
|
|
47
|
+
const promotion = this.#admission.promotion;
|
|
48
|
+
this.#admission = { kind: "promoted" };
|
|
48
49
|
promotion.resolve();
|
|
49
50
|
return "accepted";
|
|
50
51
|
}
|
|
51
52
|
case "promoted":
|
|
52
53
|
return "accepted";
|
|
53
54
|
case "admitted":
|
|
54
|
-
return this.#
|
|
55
|
-
case "
|
|
56
|
-
return "already-started";
|
|
57
|
-
case "pending":
|
|
55
|
+
return this.#admission.disposition === SessionPromptDisposition.Steer ? "accepted" : "already-started";
|
|
56
|
+
case "waiting":
|
|
58
57
|
return "unavailable";
|
|
59
58
|
}
|
|
60
59
|
};
|
|
@@ -62,16 +61,30 @@ export class ActiveRuntimeTurn {
|
|
|
62
61
|
const disposition = this.effectiveDisposition();
|
|
63
62
|
// Claim the dispatch before asynchronous Agent preparation so a late promotion
|
|
64
63
|
// cannot change a disposition that execution has already selected.
|
|
65
|
-
this.#
|
|
64
|
+
this.#admission = { kind: "admitted", disposition };
|
|
66
65
|
return disposition;
|
|
67
66
|
};
|
|
68
67
|
queuePromotion = () => {
|
|
69
|
-
if (this.#
|
|
70
|
-
return this.#
|
|
68
|
+
if (this.#admission.kind === "queued") {
|
|
69
|
+
return this.#admission.promotion.promise;
|
|
70
|
+
}
|
|
71
|
+
return this.#admission.kind === "promoted" ? Promise.resolve() : null;
|
|
72
|
+
};
|
|
73
|
+
effectiveDisposition = () => {
|
|
74
|
+
switch (this.#admission.kind) {
|
|
75
|
+
case "waiting":
|
|
76
|
+
case "queued":
|
|
77
|
+
return this.command.disposition;
|
|
78
|
+
case "promoted":
|
|
79
|
+
return SessionPromptDisposition.Steer;
|
|
80
|
+
case "admitted":
|
|
81
|
+
return this.#admission.disposition;
|
|
71
82
|
}
|
|
72
|
-
return this.#dispatch.kind === "promoted" ? Promise.resolve() : null;
|
|
73
83
|
};
|
|
74
|
-
|
|
84
|
+
/** A steering prompt joins the execution of the turn it steers; every other prompt owns its execution. */
|
|
85
|
+
execution = () => this.effectiveDisposition() === SessionPromptDisposition.Steer
|
|
86
|
+
? this.command.targetCommandId
|
|
87
|
+
: this.command.commandId;
|
|
75
88
|
recordEvent = (event) => {
|
|
76
89
|
if (event.sessionId !== this.command.sessionId ||
|
|
77
90
|
("commandId" in event && event.commandId !== this.command.commandId)) {
|
|
@@ -86,35 +99,33 @@ export class ActiveRuntimeTurn {
|
|
|
86
99
|
}
|
|
87
100
|
return event;
|
|
88
101
|
};
|
|
89
|
-
recordSteeringPrompt = (command) => {
|
|
90
|
-
return (this.#dispatch.kind === "running" &&
|
|
91
|
-
command.sessionId === this.command.sessionId &&
|
|
92
|
-
command.targetCommandId === this.command.commandId);
|
|
93
|
-
};
|
|
94
102
|
snapshot = () => {
|
|
95
|
-
if (this.#
|
|
103
|
+
if (!this.#started()) {
|
|
96
104
|
return null;
|
|
97
105
|
}
|
|
98
106
|
return {
|
|
99
107
|
commandId: decodeIdentifier(this.command.commandId),
|
|
100
|
-
epoch: this
|
|
108
|
+
epoch: this.epoch,
|
|
101
109
|
interaction: this.#interaction,
|
|
102
110
|
sequence: this.#sequence,
|
|
103
111
|
state: "running",
|
|
104
112
|
};
|
|
105
113
|
};
|
|
106
|
-
matches = (cancellation) => cancellation.commandId === this.command.commandId && cancellation.sessionId === this.command.sessionId;
|
|
107
114
|
matchesInteraction = (interactionId, sessionId) => this.command.sessionId === sessionId && this.#interaction?.interactionId === interactionId;
|
|
115
|
+
/**
|
|
116
|
+
* Before the command starts, cancellation withdraws it by aborting its own admission and preparation. Once it
|
|
117
|
+
* started, the Agent execution it belongs to must be asked to stop.
|
|
118
|
+
*/
|
|
108
119
|
requestCancellation = () => {
|
|
109
120
|
if (this.#cancellationRequested) {
|
|
110
121
|
return { kind: "already-requested" };
|
|
111
122
|
}
|
|
112
123
|
this.#cancellationRequested = true;
|
|
113
|
-
if (this.#
|
|
114
|
-
this.#controller.abort(new Error("The
|
|
124
|
+
if (!this.#started()) {
|
|
125
|
+
this.#controller.abort(new Error("The Agent turn was cancelled before it started"));
|
|
115
126
|
return { kind: "pending" };
|
|
116
127
|
}
|
|
117
|
-
return { kind: "running", execution: this
|
|
128
|
+
return { kind: "running", execution: this.execution() };
|
|
118
129
|
};
|
|
119
130
|
cancellationRequested = () => this.#cancellationRequested;
|
|
120
131
|
get signal() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-turn.js","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-turn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACH,gBAAgB,EAEhB,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,
|
|
1
|
+
{"version":3,"file":"active-turn.js","sourceRoot":"","sources":["../../../../src/engine/session/turn/active-turn.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,14 +31,18 @@ export declare class ExecutionReceipts {
|
|
|
31
31
|
readonly hasStarted: (commandId: string, sessionId: string) => boolean;
|
|
32
32
|
/** Reserves an unseen command for cancellation before a delayed prompt can claim its identity. */
|
|
33
33
|
readonly recordCancellationBeforeAdmission: (commandId: string, sessionId: string) => SessionEventPayload | undefined;
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Receipts follow their command's recorded lifecycle. `prompt.started` is recorded where the command is handed
|
|
36
|
+
* to the Agent, so the started mark and the event clients see are one transition; a terminal event settles the
|
|
37
|
+
* receipt. Nothing else marks a command started.
|
|
38
|
+
*/
|
|
39
|
+
readonly record: (event: SessionLiveEvent) => void;
|
|
35
40
|
readonly recover: () => readonly {
|
|
36
41
|
readonly sessionId: string;
|
|
37
42
|
readonly event: SessionEventPayload;
|
|
38
43
|
readonly recordedAt: string;
|
|
39
44
|
}[];
|
|
40
45
|
readonly claimExecution: (commandId: string, sessionId: string, commandJson: string) => RuntimeExecutionReceipt;
|
|
41
|
-
readonly markExecutionStarted: (commandId: string) => void;
|
|
42
46
|
/** Only commands without a terminal result can still be cancelled. */
|
|
43
47
|
readonly findUnsettledAttemptId: (commandId: string, sessionId: string) => string | null;
|
|
44
48
|
readonly isTerminalExecution: (commandId: string, sessionId: string) => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-receipts.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/execution-receipts.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"execution-receipts.d.ts","sourceRoot":"","sources":["../../../../src/engine/session/turn/execution-receipts.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,eAAe,EAIpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AAI9F,MAAM,MAAM,uBAAuB,GAC7B,QAAQ,CAAC;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;CACpB,CAAC,GACF,QAAQ,CAAC;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC5C,CAAC,GACF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAmDnC,qBAAa,iBAAiB;;IAO1B,YAAY,KAAK,EAAE,qBAAqB,EAAE,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAsB,EAW3F;IAwCD,QAAQ,CAAC,aAAa,QAAO,IAAI,CAE/B;IACF,QAAQ,CAAC,OAAO,cAAe,MAAM,KAAG,mBAAmB,GAAG,SAAS,CAIrE;IACF,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,cAAe,MAAM,aAAa,MAAM,KAAG,eAAe,CAwBzE;IACF;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,cAAe,MAAM,KAAG,eAAe,GAAG,SAAS,CA+BlE;IACF,uFAAuF;IACvF,QAAQ,CAAC,UAAU,cAAe,MAAM,aAAa,MAAM,KAAG,OAAO,CAMnE;IAEF,kGAAkG;IAClG,QAAQ,CAAC,iCAAiC,cAC3B,MAAM,aACN,MAAM,KAClB,mBAAmB,GAAG,SAAS,CAyChC;IACF;;;;OAIG;IACH,QAAQ,CAAC,MAAM,UAAW,gBAAgB,KAAG,IAAI,CA8B/C;IACF,QAAQ,CAAC,OAAO,QAAO,SAAS;QAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;QACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC/B,EAAE,CAwCD;IAEF,QAAQ,CAAC,cAAc,cAAe,MAAM,aAAa,MAAM,eAAe,MAAM,KAAG,uBAAuB,CA0C5G;IAEF,sEAAsE;IACtE,QAAQ,CAAC,sBAAsB,cAAe,MAAM,aAAa,MAAM,KAAG,MAAM,GAAG,IAAI,CAGrF;IAEF,QAAQ,CAAC,mBAAmB,cAAe,MAAM,aAAa,MAAM,KAAG,OAAO,CAG5E;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAGvB;CACL"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
-
import { decodeKnownSessionEventPayload, encodeSessionCancelBeforeStartCommand, } from "@moxt-ai/mobius-sdk/protocol";
|
|
2
|
+
import { decodeKnownSessionEventPayload, encodeSessionCancelBeforeStartCommand, isPromptTerminal, } from "@moxt-ai/mobius-sdk/protocol";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
const MAX_TERMINAL_RECEIPTS = 1_024;
|
|
5
5
|
// Keep the execution claim after settlement: the outcome alone cannot decide replay safety.
|
|
@@ -107,7 +107,7 @@ export class ExecutionReceipts {
|
|
|
107
107
|
return { state: "accepted" };
|
|
108
108
|
}
|
|
109
109
|
const outcome = this.outcome(commandId);
|
|
110
|
-
if (outcome?.type !== "lifecycle-metadata") {
|
|
110
|
+
if (outcome?.type !== "lifecycle-metadata" || !isPromptTerminal(outcome.payload)) {
|
|
111
111
|
return { state: "expired" };
|
|
112
112
|
}
|
|
113
113
|
switch (outcome.payload.kind) {
|
|
@@ -116,8 +116,6 @@ export class ExecutionReceipts {
|
|
|
116
116
|
case "prompt.failed":
|
|
117
117
|
case "prompt.failed-before-start":
|
|
118
118
|
return { code: outcome.payload.code, state: "failed" };
|
|
119
|
-
default:
|
|
120
|
-
return { state: "expired" };
|
|
121
119
|
}
|
|
122
120
|
};
|
|
123
121
|
/**
|
|
@@ -140,7 +138,7 @@ export class ExecutionReceipts {
|
|
|
140
138
|
}
|
|
141
139
|
}
|
|
142
140
|
const outcome = last === undefined ? undefined : this.outcome(last);
|
|
143
|
-
if (last === undefined || outcome?.type !== "lifecycle-metadata") {
|
|
141
|
+
if (last === undefined || outcome?.type !== "lifecycle-metadata" || !isPromptTerminal(outcome.payload)) {
|
|
144
142
|
return undefined;
|
|
145
143
|
}
|
|
146
144
|
switch (outcome.payload.kind) {
|
|
@@ -154,8 +152,6 @@ export class ExecutionReceipts {
|
|
|
154
152
|
message: outcome.payload.message,
|
|
155
153
|
state: "failed",
|
|
156
154
|
};
|
|
157
|
-
default:
|
|
158
|
-
return undefined;
|
|
159
155
|
}
|
|
160
156
|
};
|
|
161
157
|
/** Started identities remain authoritative after their detailed receipt is evicted. */
|
|
@@ -205,14 +201,25 @@ export class ExecutionReceipts {
|
|
|
205
201
|
});
|
|
206
202
|
return outcome;
|
|
207
203
|
};
|
|
208
|
-
|
|
204
|
+
/**
|
|
205
|
+
* Receipts follow their command's recorded lifecycle. `prompt.started` is recorded where the command is handed
|
|
206
|
+
* to the Agent, so the started mark and the event clients see are one transition; a terminal event settles the
|
|
207
|
+
* receipt. Nothing else marks a command started.
|
|
208
|
+
*/
|
|
209
|
+
record = (event) => {
|
|
209
210
|
if (event.type !== "lifecycle-metadata") {
|
|
210
211
|
return;
|
|
211
212
|
}
|
|
212
213
|
const payload = event.payload;
|
|
213
|
-
if (payload.kind
|
|
214
|
-
|
|
215
|
-
|
|
214
|
+
if (payload.kind === "prompt.started") {
|
|
215
|
+
const receipt = this.#executions.get(payload.commandId);
|
|
216
|
+
// A start reported after settlement does not reopen the execution.
|
|
217
|
+
if (receipt?.state.kind === "pending") {
|
|
218
|
+
this.#save(payload.commandId, { ...receipt, state: { kind: "started" } });
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (!isPromptTerminal(payload)) {
|
|
216
223
|
return;
|
|
217
224
|
}
|
|
218
225
|
const receipt = this.#executions.get(payload.commandId);
|
|
@@ -305,27 +312,6 @@ export class ExecutionReceipts {
|
|
|
305
312
|
});
|
|
306
313
|
return { attemptId, commandId, kind: "accepted" };
|
|
307
314
|
};
|
|
308
|
-
markExecutionStarted = (commandId) => {
|
|
309
|
-
const current = this.#executions.get(commandId);
|
|
310
|
-
if (current === undefined) {
|
|
311
|
-
throw new Error("The runtime execution receipt does not exist");
|
|
312
|
-
}
|
|
313
|
-
const state = current.state;
|
|
314
|
-
switch (state.kind) {
|
|
315
|
-
case "pending":
|
|
316
|
-
this.#save(commandId, { ...current, state: { kind: "started" } });
|
|
317
|
-
return;
|
|
318
|
-
case "started":
|
|
319
|
-
return;
|
|
320
|
-
case "settled-before-start":
|
|
321
|
-
case "settled-after-start":
|
|
322
|
-
throw new Error("The runtime execution transition is invalid");
|
|
323
|
-
default: {
|
|
324
|
-
const unreachable = state;
|
|
325
|
-
throw new Error("Unexpected execution state", { cause: unreachable });
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
};
|
|
329
315
|
/** Only commands without a terminal result can still be cancelled. */
|
|
330
316
|
findUnsettledAttemptId = (commandId, sessionId) => {
|
|
331
317
|
const receipt = this.#executions.get(commandId);
|