@moxt-ai/mobius 0.0.156 → 0.0.157
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/acp/agent-session.d.ts.map +1 -1
- package/dist/acp/agent-session.js +14 -1
- package/dist/acp/agent-session.js.map +1 -1
- package/dist/acp/session-store.d.ts +12 -6
- package/dist/acp/session-store.d.ts.map +1 -1
- package/dist/acp/session-store.js +36 -5
- package/dist/acp/session-store.js.map +1 -1
- package/dist/cli.js +241 -106
- package/dist/cli.js.map +3 -3
- package/dist/daemon-command-handler.d.ts.map +1 -1
- package/dist/daemon-command-handler.js +5 -2
- package/dist/daemon-command-handler.js.map +1 -1
- package/dist/daemon-history-commands.d.ts +1 -1
- package/dist/daemon-history-commands.d.ts.map +1 -1
- package/dist/daemon-history-commands.js +3 -12
- package/dist/daemon-history-commands.js.map +1 -1
- package/dist/daemon-observers.d.ts +2 -2
- package/dist/daemon-observers.d.ts.map +1 -1
- package/dist/daemon-observers.js +17 -1
- package/dist/daemon-observers.js.map +1 -1
- package/dist/index.js +240 -105
- package/dist/index.js.map +3 -3
- package/dist/run-daemon.js +1 -1
- package/dist/run-daemon.js.map +1 -1
- package/dist/runtime.js +240 -105
- package/dist/runtime.js.map +3 -3
- package/dist/session-event-log-v2.d.ts +3 -3
- package/dist/session-event-log-v2.d.ts.map +1 -1
- package/dist/session-event-log-v2.js +103 -84
- package/dist/session-event-log-v2.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ExecutingPromptRequestEventLogV2, SessionEventPayloadV2, SessionPromptCommand } from "@moxt-ai/mobius-protocol";
|
|
2
2
|
import type { AcpSessionStore } from "./acp/session-store.ts";
|
|
3
3
|
import type { DaemonSessionEventPublisher } from "./relay-connection/session-event-publisher.ts";
|
|
4
4
|
export declare class DaemonSessionEventLogV2 {
|
|
@@ -6,10 +6,10 @@ export declare class DaemonSessionEventLogV2 {
|
|
|
6
6
|
constructor(publisher: DaemonSessionEventPublisher, store: AcpSessionStore);
|
|
7
7
|
readonly requested: (command: SessionPromptCommand) => void;
|
|
8
8
|
readonly started: (sessionId: string, commandId: string, attemptId: string, epoch: string) => void;
|
|
9
|
-
readonly
|
|
9
|
+
readonly record: (sessionId: string, payload: SessionEventPayloadV2) => void;
|
|
10
|
+
readonly queueChanged: (sessionId: string) => void;
|
|
10
11
|
readonly completed: (sessionId: string, commandId: string, stopReason: string) => void;
|
|
11
12
|
readonly failed: (sessionId: string, commandId: string, code: string, message: string) => void;
|
|
12
13
|
readonly executingPromptRequest: (sessionId: string) => ExecutingPromptRequestEventLogV2 | null;
|
|
13
|
-
readonly recovery: (sessionId: string, eventLimit: number, cursor: string | null) => NativeSessionEventsV2 | null;
|
|
14
14
|
}
|
|
15
15
|
//# sourceMappingURL=session-event-log-v2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-event-log-v2.d.ts","sourceRoot":"","sources":["../src/session-event-log-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session-event-log-v2.d.ts","sourceRoot":"","sources":["../src/session-event-log-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAER,gCAAgC,EAChC,qBAAqB,EAErB,oBAAoB,EACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AA6DjG,qBAAa,uBAAuB;;IAOhC,YAAY,SAAS,EAAE,2BAA2B,EAAE,KAAK,EAAE,eAAe,EAGzE;IA6FD,QAAQ,CAAC,SAAS,YAAa,oBAAoB,KAAG,IAAI,CAwBxD;IAEF,QAAQ,CAAC,OAAO,cAAe,MAAM,aAAa,MAAM,aAAa,MAAM,SAAS,MAAM,KAAG,IAAI,CAmB/F;IAEF,QAAQ,CAAC,MAAM,cAAe,MAAM,WAAW,qBAAqB,KAAG,IAAI,CAIzE;IAeF,QAAQ,CAAC,YAAY,cAAe,MAAM,KAAG,IAAI,CAM/C;IAEF,QAAQ,CAAC,SAAS,cAAe,MAAM,aAAa,MAAM,cAAc,MAAM,KAAG,IAAI,CAanF;IAEF,QAAQ,CAAC,MAAM,cAAe,MAAM,aAAa,MAAM,QAAQ,MAAM,WAAW,MAAM,KAAG,IAAI,CA2B3F;IAEF,QAAQ,CAAC,sBAAsB,cAAe,MAAM,KAAG,gCAAgC,GAAG,IAAI,CAkB5F;CACL"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import { AcpExecutionError } from "./acp/acp-error.js";
|
|
2
1
|
const EXECUTING_PROMPT_EVENT_LIMIT = 10_000;
|
|
2
|
+
function eventArray(tail) {
|
|
3
|
+
const reversed = [];
|
|
4
|
+
let node = tail;
|
|
5
|
+
while (node !== null) {
|
|
6
|
+
reversed.push(node.event);
|
|
7
|
+
node = node.previous;
|
|
8
|
+
}
|
|
9
|
+
return reversed.reverse();
|
|
10
|
+
}
|
|
3
11
|
function promptContent(command) {
|
|
4
12
|
const content = [];
|
|
5
13
|
if (command.prompt.length > 0) {
|
|
@@ -23,32 +31,8 @@ function promptContent(command) {
|
|
|
23
31
|
}
|
|
24
32
|
return content;
|
|
25
33
|
}
|
|
26
|
-
function encodeLocalEventCursor(cursor) {
|
|
27
|
-
return Buffer.from(JSON.stringify(cursor), "utf8").toString("base64url");
|
|
28
|
-
}
|
|
29
|
-
function decodeLocalEventCursor(sessionId, cursor) {
|
|
30
|
-
try {
|
|
31
|
-
const value = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
|
|
32
|
-
if (typeof value !== "object" ||
|
|
33
|
-
value === null ||
|
|
34
|
-
Array.isArray(value) ||
|
|
35
|
-
Object.keys(value).sort().join(",") !== "endEvent,sessionId" ||
|
|
36
|
-
Reflect.get(value, "sessionId") !== sessionId) {
|
|
37
|
-
throw new Error("Invalid V2 event cursor target");
|
|
38
|
-
}
|
|
39
|
-
const endEvent = Reflect.get(value, "endEvent");
|
|
40
|
-
if (typeof endEvent !== "number" || !Number.isSafeInteger(endEvent) || endEvent < 0) {
|
|
41
|
-
throw new Error("Invalid V2 event cursor boundary");
|
|
42
|
-
}
|
|
43
|
-
return { endEvent, sessionId };
|
|
44
|
-
}
|
|
45
|
-
catch (cause) {
|
|
46
|
-
throw new AcpExecutionError("The native Session event cursor is invalid", { cause }, "invalid_cursor");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
34
|
export class DaemonSessionEventLogV2 {
|
|
50
35
|
#positions = new Map();
|
|
51
|
-
#events = new Map();
|
|
52
36
|
#requests = new Map();
|
|
53
37
|
#loadedRequestSessions = new Set();
|
|
54
38
|
#publisher;
|
|
@@ -57,13 +41,8 @@ export class DaemonSessionEventLogV2 {
|
|
|
57
41
|
this.#publisher = publisher;
|
|
58
42
|
this.#store = store;
|
|
59
43
|
}
|
|
60
|
-
#
|
|
61
|
-
const
|
|
62
|
-
if (cached !== undefined) {
|
|
63
|
-
return cached;
|
|
64
|
-
}
|
|
65
|
-
const stored = this.#store.readEventsV2(sessionId);
|
|
66
|
-
this.#events.set(sessionId, stored);
|
|
44
|
+
#loadStoredEvents = (sessionId) => {
|
|
45
|
+
const stored = this.#store.readExecutingPromptEventsV2(sessionId);
|
|
67
46
|
const lastPosition = stored.at(-1)?.position;
|
|
68
47
|
if (lastPosition !== undefined) {
|
|
69
48
|
this.#positions.set(sessionId, Number(lastPosition));
|
|
@@ -74,23 +53,33 @@ export class DaemonSessionEventLogV2 {
|
|
|
74
53
|
if (this.#loadedRequestSessions.has(sessionId)) {
|
|
75
54
|
return;
|
|
76
55
|
}
|
|
77
|
-
for (const event of this.#
|
|
56
|
+
for (const event of this.#loadStoredEvents(sessionId)) {
|
|
57
|
+
if (event.type === "acp") {
|
|
58
|
+
const executing = [...this.#requests.values()].find((request) => request.sessionId === sessionId && request.kind === "executing");
|
|
59
|
+
if (executing !== undefined) {
|
|
60
|
+
this.#requests.set(executing.commandId, {
|
|
61
|
+
...executing,
|
|
62
|
+
eventTail: { event, previous: executing.eventTail },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
78
67
|
const payload = event.payload;
|
|
79
68
|
if (payload.kind === "prompt.requested") {
|
|
80
69
|
this.#requests.set(payload.commandId, {
|
|
81
70
|
commandId: payload.commandId,
|
|
82
|
-
|
|
71
|
+
eventTail: { event, previous: null },
|
|
83
72
|
kind: "requested",
|
|
84
73
|
sessionId,
|
|
85
74
|
});
|
|
86
75
|
continue;
|
|
87
76
|
}
|
|
88
|
-
if (
|
|
77
|
+
if ("event" in payload) {
|
|
89
78
|
const executing = [...this.#requests.values()].find((request) => request.sessionId === sessionId && request.kind === "executing");
|
|
90
79
|
if (executing !== undefined) {
|
|
91
80
|
this.#requests.set(executing.commandId, {
|
|
92
81
|
...executing,
|
|
93
|
-
|
|
82
|
+
eventTail: { event, previous: executing.eventTail },
|
|
94
83
|
});
|
|
95
84
|
}
|
|
96
85
|
continue;
|
|
@@ -102,13 +91,12 @@ export class DaemonSessionEventLogV2 {
|
|
|
102
91
|
if (state === undefined) {
|
|
103
92
|
continue;
|
|
104
93
|
}
|
|
105
|
-
const events = [...state.events, event];
|
|
106
94
|
if (payload.kind === "prompt.started") {
|
|
107
95
|
this.#requests.set(payload.commandId, {
|
|
108
96
|
attemptId: payload.attemptId,
|
|
109
97
|
commandId: payload.commandId,
|
|
110
98
|
epoch: payload.epoch,
|
|
111
|
-
|
|
99
|
+
eventTail: { event, previous: state.eventTail },
|
|
112
100
|
kind: "executing",
|
|
113
101
|
sessionId,
|
|
114
102
|
});
|
|
@@ -122,31 +110,41 @@ export class DaemonSessionEventLogV2 {
|
|
|
122
110
|
this.#loadedRequestSessions.add(sessionId);
|
|
123
111
|
};
|
|
124
112
|
#append = (sessionId, payload) => {
|
|
125
|
-
this.#
|
|
113
|
+
this.#loadRequests(sessionId);
|
|
126
114
|
const position = (this.#positions.get(sessionId) ?? 0) + 1;
|
|
127
115
|
const event = {
|
|
128
116
|
eventId: `event-${crypto.randomUUID()}`,
|
|
129
|
-
payload,
|
|
117
|
+
...payload,
|
|
130
118
|
position: position.toString(),
|
|
131
119
|
provenance: { kind: "original" },
|
|
132
120
|
recordedAt: new Date().toISOString(),
|
|
133
121
|
sessionId,
|
|
134
122
|
};
|
|
135
|
-
this.#store.appendEventV2(event);
|
|
136
123
|
this.#positions.set(sessionId, position);
|
|
137
|
-
this.#events.set(sessionId, [...this.#eventsFor(sessionId), event]);
|
|
138
124
|
this.#publisher.publishV2(event);
|
|
139
125
|
return event;
|
|
140
126
|
};
|
|
141
127
|
requested = (command) => {
|
|
128
|
+
const content = promptContent(command);
|
|
142
129
|
const event = this.#append(command.sessionId, {
|
|
143
|
-
commandId: command.commandId,
|
|
144
|
-
|
|
145
|
-
kind: "prompt.requested",
|
|
130
|
+
payload: { commandId: command.commandId, content, kind: "prompt.requested" },
|
|
131
|
+
type: "lifecycle-metadata",
|
|
146
132
|
});
|
|
133
|
+
let eventTail = { event, previous: null };
|
|
134
|
+
for (const block of content) {
|
|
135
|
+
const userMessageEvent = this.#append(command.sessionId, {
|
|
136
|
+
payload: {
|
|
137
|
+
content: block,
|
|
138
|
+
messageId: command.commandId,
|
|
139
|
+
sessionUpdate: "user_message_chunk",
|
|
140
|
+
},
|
|
141
|
+
type: "acp",
|
|
142
|
+
});
|
|
143
|
+
eventTail = { event: userMessageEvent, previous: eventTail };
|
|
144
|
+
}
|
|
147
145
|
this.#requests.set(command.commandId, {
|
|
148
146
|
commandId: command.commandId,
|
|
149
|
-
|
|
147
|
+
eventTail,
|
|
150
148
|
kind: "requested",
|
|
151
149
|
sessionId: command.sessionId,
|
|
152
150
|
});
|
|
@@ -157,38 +155,86 @@ export class DaemonSessionEventLogV2 {
|
|
|
157
155
|
if (request?.sessionId !== sessionId) {
|
|
158
156
|
return;
|
|
159
157
|
}
|
|
160
|
-
const event = this.#append(sessionId, {
|
|
158
|
+
const event = this.#append(sessionId, {
|
|
159
|
+
payload: { attemptId, commandId, epoch, kind: "prompt.started" },
|
|
160
|
+
type: "lifecycle-metadata",
|
|
161
|
+
});
|
|
161
162
|
this.#requests.set(commandId, {
|
|
162
163
|
attemptId,
|
|
163
164
|
commandId,
|
|
164
165
|
epoch,
|
|
165
|
-
|
|
166
|
+
eventTail: { event, previous: request.eventTail },
|
|
166
167
|
kind: "executing",
|
|
167
168
|
sessionId,
|
|
168
169
|
});
|
|
170
|
+
this.#store.startExecutingPromptEventsV2(sessionId, eventArray({ event, previous: request.eventTail }));
|
|
169
171
|
};
|
|
170
|
-
|
|
172
|
+
record = (sessionId, payload) => {
|
|
171
173
|
this.#loadRequests(sessionId);
|
|
172
|
-
const event = this.#append(sessionId,
|
|
174
|
+
const event = this.#append(sessionId, payload);
|
|
175
|
+
this.#appendToExecutingRequest(sessionId, event);
|
|
176
|
+
};
|
|
177
|
+
#appendToExecutingRequest = (sessionId, event) => {
|
|
173
178
|
const executing = [...this.#requests.values()].find((request) => request.sessionId === sessionId && request.kind === "executing");
|
|
174
179
|
if (executing !== undefined) {
|
|
175
|
-
this.#requests.set(executing.commandId, {
|
|
180
|
+
this.#requests.set(executing.commandId, {
|
|
181
|
+
...executing,
|
|
182
|
+
eventTail: { event, previous: executing.eventTail },
|
|
183
|
+
});
|
|
184
|
+
this.#store.appendExecutingPromptEventV2(event);
|
|
176
185
|
}
|
|
177
186
|
};
|
|
187
|
+
queueChanged = (sessionId) => {
|
|
188
|
+
const event = this.#append(sessionId, {
|
|
189
|
+
payload: { kind: "session.queue.changed" },
|
|
190
|
+
type: "lifecycle-metadata",
|
|
191
|
+
});
|
|
192
|
+
this.#appendToExecutingRequest(sessionId, event);
|
|
193
|
+
};
|
|
178
194
|
completed = (sessionId, commandId, stopReason) => {
|
|
179
|
-
this.#
|
|
195
|
+
this.#loadRequests(sessionId);
|
|
196
|
+
const request = this.#requests.get(commandId);
|
|
197
|
+
const event = this.#append(sessionId, {
|
|
198
|
+
payload: { commandId, kind: "prompt.completed", stopReason },
|
|
199
|
+
type: "lifecycle-metadata",
|
|
200
|
+
});
|
|
180
201
|
this.#requests.delete(commandId);
|
|
202
|
+
if (request?.kind === "executing" && request.sessionId === sessionId) {
|
|
203
|
+
this.#store.clearExecutingPromptEventsV2(sessionId);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this.#appendToExecutingRequest(sessionId, event);
|
|
207
|
+
}
|
|
181
208
|
};
|
|
182
209
|
failed = (sessionId, commandId, code, message) => {
|
|
183
210
|
this.#loadRequests(sessionId);
|
|
184
211
|
const request = this.#requests.get(commandId);
|
|
212
|
+
let event;
|
|
185
213
|
if (request?.kind === "executing" && request.commandId === commandId) {
|
|
186
|
-
this.#append(sessionId, {
|
|
214
|
+
event = this.#append(sessionId, {
|
|
215
|
+
payload: {
|
|
216
|
+
attemptId: request.attemptId,
|
|
217
|
+
code,
|
|
218
|
+
commandId,
|
|
219
|
+
kind: "prompt.failed",
|
|
220
|
+
message,
|
|
221
|
+
},
|
|
222
|
+
type: "lifecycle-metadata",
|
|
223
|
+
});
|
|
187
224
|
}
|
|
188
225
|
else {
|
|
189
|
-
this.#append(sessionId, {
|
|
226
|
+
event = this.#append(sessionId, {
|
|
227
|
+
payload: { code, commandId, kind: "prompt.failed-before-start", message },
|
|
228
|
+
type: "lifecycle-metadata",
|
|
229
|
+
});
|
|
190
230
|
}
|
|
191
231
|
this.#requests.delete(commandId);
|
|
232
|
+
if (request?.kind === "executing" && request.sessionId === sessionId) {
|
|
233
|
+
this.#store.clearExecutingPromptEventsV2(sessionId);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.#appendToExecutingRequest(sessionId, event);
|
|
237
|
+
}
|
|
192
238
|
};
|
|
193
239
|
executingPromptRequest = (sessionId) => {
|
|
194
240
|
this.#loadRequests(sessionId);
|
|
@@ -196,42 +242,15 @@ export class DaemonSessionEventLogV2 {
|
|
|
196
242
|
if (request?.kind !== "executing") {
|
|
197
243
|
return null;
|
|
198
244
|
}
|
|
199
|
-
const
|
|
245
|
+
const requestEvents = eventArray(request.eventTail);
|
|
246
|
+
const events = requestEvents.slice(-EXECUTING_PROMPT_EVENT_LIMIT);
|
|
200
247
|
return {
|
|
201
248
|
attemptId: request.attemptId,
|
|
202
249
|
commandId: request.commandId,
|
|
203
250
|
epoch: request.epoch,
|
|
204
251
|
events,
|
|
205
252
|
tailCursor: events.at(-1)?.eventId ?? "",
|
|
206
|
-
truncated: events.length <
|
|
207
|
-
};
|
|
208
|
-
};
|
|
209
|
-
recovery = (sessionId, eventLimit, cursor) => {
|
|
210
|
-
const events = this.#eventsFor(sessionId);
|
|
211
|
-
if (events.length === 0) {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
const executingPromptRequest = this.executingPromptRequest(sessionId);
|
|
215
|
-
const executingRequestState = [...this.#requests.values()].find((request) => request.sessionId === sessionId && request.kind === "executing");
|
|
216
|
-
const firstExecutingPosition = executingRequestState?.events[0]?.position;
|
|
217
|
-
const historyEvents = firstExecutingPosition === undefined
|
|
218
|
-
? events
|
|
219
|
-
: events.filter((event) => BigInt(event.position) < BigInt(firstExecutingPosition));
|
|
220
|
-
const endEvent = cursor === null ? historyEvents.length : decodeLocalEventCursor(sessionId, cursor).endEvent;
|
|
221
|
-
if (endEvent > historyEvents.length) {
|
|
222
|
-
throw new AcpExecutionError("The native Session event cursor is invalid", {}, "invalid_cursor");
|
|
223
|
-
}
|
|
224
|
-
const startEvent = Math.max(0, endEvent - eventLimit);
|
|
225
|
-
const pageEvents = historyEvents.slice(startEvent, endEvent);
|
|
226
|
-
return {
|
|
227
|
-
executingPromptRequest,
|
|
228
|
-
history: {
|
|
229
|
-
events: pageEvents,
|
|
230
|
-
nextCursor: startEvent === 0 ? null : encodeLocalEventCursor({ endEvent: startEvent, sessionId }),
|
|
231
|
-
tailCursor: pageEvents.at(-1)?.eventId ?? "",
|
|
232
|
-
truncated: startEvent > 0,
|
|
233
|
-
version: 2,
|
|
234
|
-
},
|
|
253
|
+
truncated: events.length < requestEvents.length,
|
|
235
254
|
};
|
|
236
255
|
};
|
|
237
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-event-log-v2.js","sourceRoot":"","sources":["../src/session-event-log-v2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-event-log-v2.js","sourceRoot":"","sources":["../src/session-event-log-v2.ts"],"names":[],"mappings":"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"}
|