@moxt-ai/mobius 0.0.359 → 0.0.360
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/cli.js +935 -490
- package/dist/cli.js.map +4 -4
- package/dist/engine/acp/adapter/agent-initialization.d.ts +2 -2
- package/dist/engine/acp/adapter/agent-initialization.d.ts.map +1 -1
- package/dist/engine/acp/adapter/agent-initialization.js.map +1 -1
- package/dist/engine/acp/adapter/claude/adapter.d.ts +21 -4
- package/dist/engine/acp/adapter/claude/adapter.d.ts.map +1 -1
- package/dist/engine/acp/adapter/claude/adapter.js +52 -15
- package/dist/engine/acp/adapter/claude/adapter.js.map +1 -1
- package/dist/engine/acp/adapter/codex/adapter.d.ts +22 -5
- package/dist/engine/acp/adapter/codex/adapter.d.ts.map +1 -1
- package/dist/engine/acp/adapter/codex/adapter.js +70 -20
- package/dist/engine/acp/adapter/codex/adapter.js.map +1 -1
- package/dist/engine/acp/adapter/configuration-changes.d.ts +25 -0
- package/dist/engine/acp/adapter/configuration-changes.d.ts.map +1 -0
- package/dist/engine/acp/adapter/configuration-changes.js +47 -0
- package/dist/engine/acp/adapter/configuration-changes.js.map +1 -0
- package/dist/engine/acp/adapter/execution-connections.d.ts +26 -0
- package/dist/engine/acp/adapter/execution-connections.d.ts.map +1 -0
- package/dist/engine/acp/adapter/{live-sessions.js → execution-connections.js} +92 -24
- package/dist/engine/acp/adapter/execution-connections.js.map +1 -0
- package/dist/engine/acp/adapter/lifecycle-output.d.ts +10 -0
- package/dist/engine/acp/adapter/lifecycle-output.d.ts.map +1 -0
- package/dist/engine/acp/adapter/lifecycle-output.js +26 -0
- package/dist/engine/acp/adapter/lifecycle-output.js.map +1 -0
- package/dist/engine/acp/adapter/native-session-lookup.d.ts +2 -2
- package/dist/engine/acp/adapter/native-session-lookup.d.ts.map +1 -1
- package/dist/engine/acp/adapter/native-session-lookup.js +4 -4
- package/dist/engine/acp/adapter/native-session-lookup.js.map +1 -1
- package/dist/engine/acp/adapter/pi/adapter.d.ts +21 -4
- package/dist/engine/acp/adapter/pi/adapter.d.ts.map +1 -1
- package/dist/engine/acp/adapter/pi/adapter.js +52 -15
- package/dist/engine/acp/adapter/pi/adapter.js.map +1 -1
- package/dist/engine/acp/adapter/query-processes.d.ts +6 -5
- package/dist/engine/acp/adapter/query-processes.d.ts.map +1 -1
- package/dist/engine/acp/adapter/query-processes.js +36 -36
- package/dist/engine/acp/adapter/query-processes.js.map +1 -1
- package/dist/engine/acp/adapter/query-scope.d.ts +8 -0
- package/dist/engine/acp/adapter/query-scope.d.ts.map +1 -0
- package/dist/engine/acp/adapter/query-scope.js +16 -0
- package/dist/engine/acp/adapter/query-scope.js.map +1 -0
- package/dist/engine/acp/adapter/query-session.d.ts +3 -4
- package/dist/engine/acp/adapter/query-session.d.ts.map +1 -1
- package/dist/engine/acp/adapter/query-session.js +26 -31
- package/dist/engine/acp/adapter/query-session.js.map +1 -1
- package/dist/engine/acp/adapter/session-events.d.ts +34 -6
- package/dist/engine/acp/adapter/session-events.d.ts.map +1 -1
- package/dist/engine/acp/adapter/session-events.js +95 -3
- package/dist/engine/acp/adapter/session-events.js.map +1 -1
- package/dist/engine/acp/content/content-externalizer.d.ts +1 -0
- package/dist/engine/acp/content/content-externalizer.d.ts.map +1 -1
- package/dist/engine/acp/content/content-externalizer.js.map +1 -1
- package/dist/engine/acp/native-history/preview-contract.d.ts +73 -16
- package/dist/engine/acp/native-history/preview-contract.d.ts.map +1 -1
- package/dist/engine/acp/protocol/session-config-protocol.d.ts +1 -0
- package/dist/engine/acp/protocol/session-config-protocol.d.ts.map +1 -1
- package/dist/engine/acp/protocol/session-config-protocol.js +1 -1
- package/dist/engine/acp/protocol/session-config-protocol.js.map +1 -1
- package/dist/engine/agent/runtime-agents.d.ts +4 -1
- package/dist/engine/agent/runtime-agents.d.ts.map +1 -1
- package/dist/engine/agent/runtime-agents.js +6 -4
- package/dist/engine/agent/runtime-agents.js.map +1 -1
- package/dist/engine/runtime/run.d.ts.map +1 -1
- package/dist/engine/runtime/run.js +6 -2
- package/dist/engine/runtime/run.js.map +1 -1
- package/dist/engine/session/api/session-api.d.ts +3 -0
- package/dist/engine/session/api/session-api.d.ts.map +1 -1
- package/dist/engine/session/api/session-api.js.map +1 -1
- package/dist/engine/session/live/agent-session-restore.d.ts +6 -16
- package/dist/engine/session/live/agent-session-restore.d.ts.map +1 -1
- package/dist/engine/session/live/agent-session.d.ts +7 -14
- package/dist/engine/session/live/agent-session.d.ts.map +1 -1
- package/dist/engine/session/live/agent-session.js +108 -87
- package/dist/engine/session/live/agent-session.js.map +1 -1
- package/dist/engine/session/live/session-restore.d.ts.map +1 -1
- package/dist/engine/session/live/session-restore.js +12 -35
- package/dist/engine/session/live/session-restore.js.map +1 -1
- package/dist/engine/session/manager/session-manager.d.ts.map +1 -1
- package/dist/engine/session/manager/session-manager.js +13 -5
- package/dist/engine/session/manager/session-manager.js.map +1 -1
- package/dist/engine/session/native/native-query.d.ts +5 -0
- package/dist/engine/session/native/native-query.d.ts.map +1 -0
- package/dist/engine/session/native/native-query.js +14 -0
- package/dist/engine/session/native/native-query.js.map +1 -0
- package/dist/engine/session/native/native-session-browser.d.ts.map +1 -1
- package/dist/engine/session/native/native-session-browser.js +27 -16
- package/dist/engine/session/native/native-session-browser.js.map +1 -1
- package/dist/engine/session/process/retained-agent-processes.d.ts +10 -10
- package/dist/engine/session/process/retained-agent-processes.d.ts.map +1 -1
- package/dist/engine/session/process/retained-agent-processes.js.map +1 -1
- package/dist/engine/session/prompt/execute-prompt.d.ts.map +1 -1
- package/dist/engine/session/prompt/execute-prompt.js +4 -1
- package/dist/engine/session/prompt/execute-prompt.js.map +1 -1
- package/dist/engine/util/branded-type.d.ts +4 -0
- package/dist/engine/util/branded-type.d.ts.map +1 -0
- package/dist/engine/util/branded-type.js +2 -0
- package/dist/engine/util/branded-type.js.map +1 -0
- package/dist/engine.js +874 -471
- package/dist/engine.js.map +4 -4
- package/package.json +1 -1
- package/dist/engine/acp/adapter/live-sessions.d.ts +0 -26
- package/dist/engine/acp/adapter/live-sessions.d.ts.map +0 -1
- package/dist/engine/acp/adapter/live-sessions.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { MemorySessionEventStore } from "../../session/history/session-event-store.js";
|
|
3
2
|
import { waitForSharedOperation } from "../../session/manager/operation-drain.js";
|
|
4
3
|
import { RetainedAgentProcesses } from "../../session/process/retained-agent-processes.js";
|
|
4
|
+
import { nativeSessionPreviewKey, nativeSessionQueryKey, } from "./query-scope.js";
|
|
5
5
|
import { AcpQuerySession } from "./query-session.js";
|
|
6
6
|
/** Owns workspace-scoped readers, independently of execution conversations. */
|
|
7
7
|
export class AgentQueryProcesses {
|
|
@@ -19,8 +19,8 @@ export class AgentQueryProcesses {
|
|
|
19
19
|
refreshAgent = (agent) => {
|
|
20
20
|
this.#agent = agent;
|
|
21
21
|
};
|
|
22
|
-
retire = async (readers,
|
|
23
|
-
readers.detach(
|
|
22
|
+
retire = async (readers, key, runtime) => {
|
|
23
|
+
readers.detach(key, runtime);
|
|
24
24
|
try {
|
|
25
25
|
await this.#processes.retire(runtime, () => runtime.closeProcess());
|
|
26
26
|
}
|
|
@@ -28,35 +28,35 @@ export class AgentQueryProcesses {
|
|
|
28
28
|
runtime.discardEvents();
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
-
async #ensure(
|
|
32
|
-
signal.throwIfAborted();
|
|
33
|
-
const
|
|
31
|
+
async #ensure(readers, query) {
|
|
32
|
+
query.signal.throwIfAborted();
|
|
33
|
+
const key = nativeSessionQueryKey(query);
|
|
34
|
+
const pending = readers.pending(key);
|
|
34
35
|
if (pending !== undefined) {
|
|
35
|
-
return await waitForSharedOperation(pending, signal);
|
|
36
|
+
return await waitForSharedOperation(pending, query.signal);
|
|
36
37
|
}
|
|
37
|
-
const existing = readers.get(
|
|
38
|
+
const existing = readers.get(key);
|
|
38
39
|
if (existing !== undefined && !existing.hasTerminated()) {
|
|
39
|
-
readers.touch(
|
|
40
|
+
readers.touch(key, existing);
|
|
40
41
|
return existing;
|
|
41
42
|
}
|
|
42
|
-
return await readers.prepare(
|
|
43
|
+
return await readers.prepare(key, async () => {
|
|
43
44
|
if (existing !== undefined) {
|
|
44
|
-
await this.retire(readers,
|
|
45
|
+
await this.retire(readers, key, existing);
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
retire: (runtime) => this.retire(readers, cwd, runtime),
|
|
51
|
-
retireIdle: (runtime) => this.retire(readers, cwd, runtime),
|
|
47
|
+
const runtime = await this.#processes.startRetained(query.signal, () => AcpQuerySession.start(query, this.#store, this.#connector), {
|
|
48
|
+
isBusy: () => readers.isBusy(key),
|
|
49
|
+
retire: (runtime) => this.retire(readers, key, runtime),
|
|
50
|
+
retireIdle: (runtime) => this.retire(readers, key, runtime),
|
|
52
51
|
});
|
|
53
|
-
readers.retain(
|
|
52
|
+
readers.retain(key, runtime);
|
|
54
53
|
return runtime;
|
|
55
54
|
});
|
|
56
55
|
}
|
|
57
|
-
#use = async (
|
|
58
|
-
// Capture one immutable definition
|
|
56
|
+
#use = async (query, operation) => {
|
|
57
|
+
// Capture one immutable catalog definition while waiting for capacity.
|
|
59
58
|
const agent = this.#agent;
|
|
59
|
+
const scoped = { ...query, agent };
|
|
60
60
|
let readers = this.#processesByAgent.get(agent);
|
|
61
61
|
if (readers === undefined) {
|
|
62
62
|
readers = new RetainedAgentProcesses({
|
|
@@ -66,38 +66,38 @@ export class AgentQueryProcesses {
|
|
|
66
66
|
this.#processesByAgent.set(agent, readers);
|
|
67
67
|
}
|
|
68
68
|
const current = readers;
|
|
69
|
-
return await current.use(
|
|
69
|
+
return await current.use(nativeSessionQueryKey(scoped), async () => await operation(await this.#ensure(current, scoped)));
|
|
70
70
|
};
|
|
71
|
-
capabilities = async (
|
|
72
|
-
listNativeSessions = async (
|
|
73
|
-
previewSessionEvents = async (
|
|
74
|
-
signal.throwIfAborted();
|
|
75
|
-
const
|
|
76
|
-
const { nativeSessionId, eventLimit, cursor
|
|
71
|
+
capabilities = async (query) => await this.#use(query, async (runtime) => runtime.capabilities());
|
|
72
|
+
listNativeSessions = async (query, cursor) => await this.#use(query, async (runtime) => await runtime.listNativeSessions(cursor, query.signal));
|
|
73
|
+
previewSessionEvents = async (query, request) => {
|
|
74
|
+
query.signal.throwIfAborted();
|
|
75
|
+
const scoped = { ...query, agent: this.#agent };
|
|
76
|
+
const { nativeSessionId, eventLimit, cursor } = request;
|
|
77
|
+
const key = nativeSessionPreviewKey(nativeSessionQueryKey(scoped), nativeSessionId);
|
|
77
78
|
if (cursor !== null) {
|
|
78
|
-
const preview = this.#eventPreviewsBySession.get(
|
|
79
|
+
const preview = this.#eventPreviewsBySession.get(key);
|
|
79
80
|
if (preview === undefined || preview.nativeSessionId !== nativeSessionId) {
|
|
80
81
|
throw new Error("The native event cursor is invalid");
|
|
81
82
|
}
|
|
82
|
-
return preview.store.page(
|
|
83
|
+
return preview.store.page(nativeSessionId, eventLimit, cursor);
|
|
83
84
|
}
|
|
84
85
|
const store = new MemorySessionEventStore();
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.#eventPreviewsBySession.set(sessionId, { nativeSessionId, store });
|
|
86
|
+
this.#eventPreviewsBySession.get(key)?.store.close();
|
|
87
|
+
this.#eventPreviewsBySession.set(key, { nativeSessionId, store });
|
|
88
88
|
try {
|
|
89
|
-
return await this.#processes.runTransient(signal,
|
|
89
|
+
return await this.#processes.runTransient(query.signal, () => AcpQuerySession.start(scoped, store, this.#connector), (runtime) => runtime.previewEvents(nativeSessionId, eventLimit, query.signal), (runtime) => runtime.closeProcess());
|
|
90
90
|
}
|
|
91
91
|
catch (error) {
|
|
92
|
-
if (this.#eventPreviewsBySession.get(
|
|
93
|
-
this.#eventPreviewsBySession.delete(
|
|
92
|
+
if (this.#eventPreviewsBySession.get(key)?.store === store) {
|
|
93
|
+
this.#eventPreviewsBySession.delete(key);
|
|
94
94
|
}
|
|
95
95
|
store.close();
|
|
96
96
|
throw error;
|
|
97
97
|
}
|
|
98
98
|
};
|
|
99
99
|
close = async () => {
|
|
100
|
-
await Promise.all([...this.#processesByAgent.values()].flatMap((readers) => readers.entries().map(async ([
|
|
100
|
+
await Promise.all([...this.#processesByAgent.values()].flatMap((readers) => readers.entries().map(async ([key, runtime]) => await this.retire(readers, key, runtime))));
|
|
101
101
|
this.#processesByAgent.clear();
|
|
102
102
|
for (const preview of this.#eventPreviewsBySession.values()) {
|
|
103
103
|
preview.store.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-processes.js","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-processes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-processes.js","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BrandedType } from "../../util/branded-type.ts";
|
|
2
|
+
import type { NativeSessionQuery } from "../native-history/preview-contract.ts";
|
|
3
|
+
export type NativeSessionQueryKey = BrandedType<string, "NativeSessionQueryKey">;
|
|
4
|
+
export type NativeSessionPreviewKey = BrandedType<string, "NativeSessionPreviewKey">;
|
|
5
|
+
/** Query-process identity is native workspace scope, never a product conversation. */
|
|
6
|
+
export declare function nativeSessionQueryKey(query: NativeSessionQuery): NativeSessionQueryKey;
|
|
7
|
+
export declare function nativeSessionPreviewKey(queryKey: NativeSessionQueryKey, nativeSessionId: string): NativeSessionPreviewKey;
|
|
8
|
+
//# sourceMappingURL=query-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-scope.d.ts","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAKhF,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACjF,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;AAErF,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,qBAAqB,CAStF;AAED,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,qBAAqB,EAC/B,eAAe,EAAE,MAAM,GACxB,uBAAuB,CAEzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const queryKeySchema = z.string().brand();
|
|
3
|
+
const previewKeySchema = z.string().brand();
|
|
4
|
+
/** Query-process identity is native workspace scope, never a product conversation. */
|
|
5
|
+
export function nativeSessionQueryKey(query) {
|
|
6
|
+
return queryKeySchema.parse(JSON.stringify([
|
|
7
|
+
query.agent.id,
|
|
8
|
+
query.cwd,
|
|
9
|
+
query.additionalDirectories,
|
|
10
|
+
Object.entries(query.agent.environment).sort(([left], [right]) => left.localeCompare(right)),
|
|
11
|
+
]));
|
|
12
|
+
}
|
|
13
|
+
export function nativeSessionPreviewKey(queryKey, nativeSessionId) {
|
|
14
|
+
return previewKeySchema.parse(JSON.stringify([queryKey, nativeSessionId]));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=query-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-scope.js","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAA2B,CAAC;AACnE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAA6B,CAAC;AAKvE,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC3D,OAAO,cAAc,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CAAC;QACX,KAAK,CAAC,KAAK,CAAC,EAAE;QACd,KAAK,CAAC,GAAG;QACT,KAAK,CAAC,qBAAqB;QAC3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC/F,CAAC,CACL,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,QAA+B,EAC/B,eAAuB;IAEvB,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import type { SessionCapabilities } from "@moxt-ai/mobius-sdk/protocol";
|
|
2
|
-
import type {
|
|
3
|
-
import type { SessionEventPage, SessionEventStore } from "../native-history/preview-contract.ts";
|
|
2
|
+
import type { NativeSessionQuery, SessionEventPage, SessionEventStore } from "../native-history/preview-contract.ts";
|
|
4
3
|
import { type NativeSessionPage } from "../protocol/native-session.ts";
|
|
5
4
|
import type { AcpSessionConnector } from "./session-events.ts";
|
|
6
5
|
/** Adapter-owned ACP reader. It has neither a live observer nor interactive-session state. */
|
|
7
6
|
export declare class AcpQuerySession {
|
|
8
7
|
#private;
|
|
9
8
|
private constructor();
|
|
10
|
-
static readonly start: (
|
|
9
|
+
static readonly start: (options: NativeSessionQuery, events: SessionEventStore, connector: AcpSessionConnector) => Promise<AcpQuerySession>;
|
|
11
10
|
readonly capabilities: () => SessionCapabilities;
|
|
12
11
|
readonly hasTerminated: () => boolean;
|
|
13
12
|
readonly listNativeSessions: (cursor: string | null, signal: AbortSignal) => Promise<NativeSessionPage>;
|
|
14
|
-
readonly previewEvents: (nativeSessionId: string, eventLimit: number,
|
|
13
|
+
readonly previewEvents: (nativeSessionId: string, eventLimit: number, signal: AbortSignal) => Promise<SessionEventPage>;
|
|
15
14
|
readonly closeProcess: () => Promise<void>;
|
|
16
15
|
readonly discardEvents: () => void;
|
|
17
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-session.d.ts","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"query-session.d.ts","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AACrH,OAAO,EAAE,KAAK,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAEhG,OAAO,KAAK,EAAE,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AAEzF,8FAA8F;AAC9F,qBAAa,eAAe;;IAOxB,OAAO,eAcN;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,YACR,kBAAkB,UACnB,iBAAiB,aACd,mBAAmB,KAC/B,OAAO,CAAC,eAAe,CAAC,CAsBzB;IAEF,QAAQ,CAAC,YAAY,QAAO,mBAAmB,CAA6C;IAC5F,QAAQ,CAAC,aAAa,QAAO,OAAO,CAWlC;IACF,QAAQ,CAAC,kBAAkB,WAAkB,MAAM,GAAG,IAAI,UAAU,WAAW,KAAG,OAAO,CAAC,iBAAiB,CAAC,CAwB1G;IAEF,QAAQ,CAAC,aAAa,oBACD,MAAM,cACX,MAAM,UACV,WAAW,KACpB,OAAO,CAAC,gBAAgB,CAAC,CA8B1B;IAEF,QAAQ,CAAC,YAAY,QAAa,OAAO,CAAC,IAAI,CAAC,CAA0C;IACzF,QAAQ,CAAC,aAAa,QAAO,IAAI,CAA0C;CAC9E"}
|
|
@@ -1,44 +1,36 @@
|
|
|
1
1
|
import { methods } from "@agentclientprotocol/sdk";
|
|
2
2
|
import { AcpExecutionError } from "../acp-error.js";
|
|
3
3
|
import { nativeSessionPageSchema } from "../protocol/native-session.js";
|
|
4
|
-
import {
|
|
5
|
-
import { initializeAgentConnection, RetryableAcpInitializationError, validateAgentRuntime, } from "./agent-initialization.js";
|
|
4
|
+
import { RetryableAcpInitializationError, validateAgentRuntime } from "./agent-initialization.js";
|
|
6
5
|
/** Adapter-owned ACP reader. It has neither a live observer nor interactive-session state. */
|
|
7
6
|
export class AcpQuerySession {
|
|
8
|
-
#
|
|
9
|
-
#sessionId;
|
|
7
|
+
#options;
|
|
10
8
|
#events;
|
|
11
9
|
#connection;
|
|
12
10
|
#lifecycle = { kind: "open" };
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.#cwd = cwd;
|
|
17
|
-
this.#sessionId = sessionId;
|
|
11
|
+
#eventScope = crypto.randomUUID();
|
|
12
|
+
constructor(options, events, connector) {
|
|
13
|
+
this.#options = options;
|
|
18
14
|
this.#events = events;
|
|
19
15
|
this.#connection = connector.connectQuerySession({
|
|
20
|
-
agent,
|
|
21
|
-
cwd,
|
|
22
|
-
|
|
23
|
-
configOptions: () => this.#configOptions,
|
|
16
|
+
agent: options.agent,
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
...(options.externalizeUpdate === undefined ? {} : { externalizeUpdate: options.externalizeUpdate }),
|
|
24
19
|
onEvent: async (event) => {
|
|
25
|
-
this.#events.append(
|
|
26
|
-
if (event.kind === "configuration") {
|
|
27
|
-
this.#configOptions = event.configOptions;
|
|
28
|
-
}
|
|
20
|
+
this.#events.append(this.#eventScope, { type: "acp", payload: event.payload });
|
|
29
21
|
},
|
|
30
22
|
});
|
|
31
23
|
void this.#connection.termination.then(() => {
|
|
32
24
|
this.#lifecycle = { kind: "terminated" };
|
|
33
25
|
});
|
|
34
26
|
}
|
|
35
|
-
static start = async (
|
|
27
|
+
static start = async (options, events, connector) => {
|
|
28
|
+
const { agent, signal } = options;
|
|
36
29
|
for (let attempt = 1; attempt <= 2; attempt += 1) {
|
|
37
30
|
await validateAgentRuntime(agent, signal);
|
|
38
|
-
const runtime = new AcpQuerySession(
|
|
31
|
+
const runtime = new AcpQuerySession(options, events, connector);
|
|
39
32
|
try {
|
|
40
|
-
|
|
41
|
-
runtime.#capabilities = initialized.capabilities;
|
|
33
|
+
await runtime.#connection.initializeAgent(options.signal);
|
|
42
34
|
return runtime;
|
|
43
35
|
}
|
|
44
36
|
catch (error) {
|
|
@@ -56,7 +48,7 @@ export class AcpQuerySession {
|
|
|
56
48
|
}
|
|
57
49
|
throw new AcpExecutionError("ACP agent initialization failed");
|
|
58
50
|
};
|
|
59
|
-
capabilities = () => this.#capabilities;
|
|
51
|
+
capabilities = () => this.#connection.snapshot().capabilities;
|
|
60
52
|
hasTerminated = () => {
|
|
61
53
|
switch (this.#lifecycle.kind) {
|
|
62
54
|
case "open":
|
|
@@ -70,7 +62,7 @@ export class AcpQuerySession {
|
|
|
70
62
|
}
|
|
71
63
|
};
|
|
72
64
|
listNativeSessions = async (cursor, signal) => {
|
|
73
|
-
if (!this
|
|
65
|
+
if (!this.capabilities().listSessions) {
|
|
74
66
|
throw new AcpExecutionError("This Agent does not support native session listing", {}, "native_session_unsupported");
|
|
75
67
|
}
|
|
76
68
|
const response = await this.#connection.race(this.#connection.connection.agent.request(methods.agent.session.list, cursor === null ? {} : { cursor }, {
|
|
@@ -82,23 +74,26 @@ export class AcpQuerySession {
|
|
|
82
74
|
}
|
|
83
75
|
return decoded.data;
|
|
84
76
|
};
|
|
85
|
-
previewEvents = async (nativeSessionId, eventLimit,
|
|
86
|
-
if (!this
|
|
77
|
+
previewEvents = async (nativeSessionId, eventLimit, signal) => {
|
|
78
|
+
if (!this.capabilities().loadSession) {
|
|
87
79
|
throw new AcpExecutionError("This Agent restores context but does not provide message history.", {}, "native_history_unsupported");
|
|
88
80
|
}
|
|
89
|
-
this.#
|
|
81
|
+
this.#eventScope = nativeSessionId;
|
|
82
|
+
this.#events.reset(nativeSessionId);
|
|
90
83
|
this.#connection.events.select(nativeSessionId);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
84
|
+
this.#connection.beginStateChange();
|
|
85
|
+
const response = await this.#connection.race(this.#connection.connection.agent.request(methods.agent.session.load, {
|
|
86
|
+
additionalDirectories: [...this.#options.additionalDirectories],
|
|
87
|
+
cwd: this.#options.cwd,
|
|
94
88
|
mcpServers: [],
|
|
95
89
|
sessionId: nativeSessionId,
|
|
96
90
|
}, { cancellationSignal: signal }), "ACP agent exited while loading history", signal);
|
|
97
91
|
await this.#connection.events.drained();
|
|
98
92
|
signal.throwIfAborted();
|
|
99
|
-
|
|
93
|
+
this.#connection.commitLifecycle(response);
|
|
94
|
+
return this.#events.page(nativeSessionId, eventLimit, null);
|
|
100
95
|
};
|
|
101
96
|
closeProcess = async () => await this.#connection.closeProcess();
|
|
102
|
-
discardEvents = () => this.#events.remove(this.#
|
|
97
|
+
discardEvents = () => this.#events.remove(this.#eventScope);
|
|
103
98
|
}
|
|
104
99
|
//# sourceMappingURL=query-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-session.js","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"query-session.js","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/query-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { AcpAgentDefinition } from "../agent/agent-definition.ts";
|
|
|
3
3
|
import type { BackgroundActivity } from "../agent/in-process-endpoint.ts";
|
|
4
4
|
import { AgentUpdateStream } from "../connection/agent-update-stream.ts";
|
|
5
5
|
import type { AcpClientHandler } from "../connection/create-client.ts";
|
|
6
|
-
import type { AcpContentExternalizer } from "../content/content-externalizer.ts";
|
|
6
|
+
import type { AcpContentExternalizer, ExternalizeSessionUpdate } from "../content/content-externalizer.ts";
|
|
7
7
|
type SessionInfoChange = {
|
|
8
8
|
readonly kind: "title";
|
|
9
9
|
readonly value: string;
|
|
@@ -35,22 +35,26 @@ export type AdapterSessionEvent = {
|
|
|
35
35
|
interface SessionConnectionScope {
|
|
36
36
|
readonly agent: AcpAgentDefinition;
|
|
37
37
|
readonly cwd: string;
|
|
38
|
-
readonly
|
|
39
|
-
readonly configOptions: () => readonly SessionConfigOption[];
|
|
38
|
+
readonly externalizeUpdate?: ExternalizeSessionUpdate;
|
|
40
39
|
readonly onEvent: (event: AdapterSessionEvent) => Promise<void>;
|
|
41
40
|
}
|
|
42
41
|
export interface AdapterSessionConnectionOptions extends SessionConnectionScope {
|
|
43
42
|
readonly onBackgroundActivity?: (activity: BackgroundActivity) => void;
|
|
44
43
|
readonly interactions: Pick<AcpClientHandler, "onPermission" | "onElicitation" | "onElicitationComplete">;
|
|
45
44
|
}
|
|
46
|
-
export interface
|
|
47
|
-
readonly
|
|
48
|
-
readonly
|
|
45
|
+
export interface AdapterSessionSubscriber {
|
|
46
|
+
readonly onSessionEvent: (nativeSessionId: string, event: AdapterSessionEvent) => Promise<void>;
|
|
47
|
+
readonly onBackgroundActivity?: (activity: BackgroundActivity) => void;
|
|
48
|
+
readonly interactions: AdapterSessionConnectionOptions["interactions"];
|
|
49
49
|
}
|
|
50
50
|
/** Internal execution port shared by the live session and adapter-owned history capture. */
|
|
51
51
|
export interface AdapterSessionConnector {
|
|
52
52
|
readonly connectSession: (options: AdapterSessionConnectionOptions) => AdapterSessionConnection;
|
|
53
53
|
}
|
|
54
|
+
export interface AdapterSessionSnapshot {
|
|
55
|
+
readonly capabilities: SessionCapabilities;
|
|
56
|
+
readonly configOptions: readonly SessionConfigOption[];
|
|
57
|
+
}
|
|
54
58
|
/** ACP subscription lifetime, ordered delivery and harness normalization belong to the adapter. */
|
|
55
59
|
export declare class AdapterSessionConnection {
|
|
56
60
|
#private;
|
|
@@ -59,7 +63,31 @@ export declare class AdapterSessionConnection {
|
|
|
59
63
|
constructor(options: AdapterSessionConnectionOptions, externalizer: Pick<AcpContentExternalizer, "update">, normalizeEvent: (event: unknown) => unknown, onClosed?: () => void);
|
|
60
64
|
get connection(): import("@agentclientprotocol/sdk").ClientConnection;
|
|
61
65
|
get termination(): Promise<import("../agent/in-process-endpoint.ts").AcpEndpointTermination>;
|
|
66
|
+
readonly snapshot: () => AdapterSessionSnapshot;
|
|
67
|
+
readonly beginStateChange: () => void;
|
|
68
|
+
readonly cancelStateChange: () => void;
|
|
69
|
+
readonly commitConfiguration: (options: readonly SessionConfigOption[]) => readonly SessionConfigOption[];
|
|
70
|
+
readonly commitLifecycle: (response: unknown) => AdapterSessionSnapshot;
|
|
62
71
|
readonly initialize: (signal: AbortSignal) => Promise<void>;
|
|
72
|
+
readonly initializeAgent: (signal: AbortSignal) => Promise<{
|
|
73
|
+
capabilities: Readonly<{
|
|
74
|
+
additionalDirectories: boolean;
|
|
75
|
+
audioPrompt: boolean;
|
|
76
|
+
closeSession: boolean;
|
|
77
|
+
deleteSession: boolean;
|
|
78
|
+
embeddedContextPrompt: boolean;
|
|
79
|
+
imagePrompt: boolean;
|
|
80
|
+
listSessions: boolean;
|
|
81
|
+
loadSession: boolean;
|
|
82
|
+
promptQueueing: boolean;
|
|
83
|
+
renameSession: boolean;
|
|
84
|
+
resumeSession: boolean;
|
|
85
|
+
steering: boolean;
|
|
86
|
+
unstableForkSession: boolean;
|
|
87
|
+
}>;
|
|
88
|
+
agentName: string;
|
|
89
|
+
agentVersion: string;
|
|
90
|
+
}>;
|
|
63
91
|
readonly agentSettingsModelEffort: () => Readonly<{
|
|
64
92
|
effortSettingId: string;
|
|
65
93
|
modelSettingId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/session-events.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../../src/engine/acp/adapter/session-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,10 @@ import { decodeAcpSessionUpdate, } from "@moxt-ai/mobius-sdk/protocol";
|
|
|
3
3
|
import { truncate } from "../../util/value-utils.js";
|
|
4
4
|
import { AcpExecutionError } from "../acp-error.js";
|
|
5
5
|
import { AgentUpdateStream } from "../connection/agent-update-stream.js";
|
|
6
|
+
import { restrictAcpSessionCapabilities } from "../protocol/session-capabilities.js";
|
|
6
7
|
import { sessionConfigProtocolForAgent } from "../protocol/session-config-protocol.js";
|
|
8
|
+
import { initializeAgentConnection } from "./agent-initialization.js";
|
|
9
|
+
import { applyConfigurationChanges, applyConfigurationMode, recordConfigurationMode, recordConfigurationOptions, } from "./configuration-changes.js";
|
|
7
10
|
/** ACP subscription lifetime, ordered delivery and harness normalization belong to the adapter. */
|
|
8
11
|
export class AdapterSessionConnection {
|
|
9
12
|
#connection;
|
|
@@ -13,18 +16,25 @@ export class AdapterSessionConnection {
|
|
|
13
16
|
#updates;
|
|
14
17
|
#lifetime = new AbortController();
|
|
15
18
|
#onClosed;
|
|
19
|
+
#agent;
|
|
20
|
+
#state = { kind: "uninitialized" };
|
|
21
|
+
#initialization = {
|
|
22
|
+
kind: "not-started",
|
|
23
|
+
};
|
|
16
24
|
events;
|
|
17
25
|
constructor(options, externalizer, normalizeEvent, onClosed = () => undefined) {
|
|
26
|
+
this.#agent = options.agent;
|
|
18
27
|
this.#onClosed = onClosed;
|
|
19
28
|
this.#onBackgroundActivity = options.onBackgroundActivity ?? (() => { });
|
|
20
|
-
const protocol = sessionConfigProtocolForAgent(options.agent.id);
|
|
21
29
|
this.#updates = new AgentUpdateStream(async (notification) => {
|
|
22
30
|
this.#lifetime.signal.throwIfAborted();
|
|
23
31
|
if (notification.sessionId !== this.#updates.sessionId()) {
|
|
24
32
|
throw new AcpExecutionError("ACP agent referenced an unknown session", {}, "invalid_agent_session");
|
|
25
33
|
}
|
|
26
34
|
const signal = AbortSignal.any([this.#lifetime.signal, AbortSignal.timeout(30_000)]);
|
|
27
|
-
const externalized =
|
|
35
|
+
const externalized = options.externalizeUpdate === undefined
|
|
36
|
+
? await externalizer.update(notification.sessionId, notification.update, signal)
|
|
37
|
+
: await options.externalizeUpdate(notification.update, signal);
|
|
28
38
|
signal.throwIfAborted();
|
|
29
39
|
const update = externalized.agent;
|
|
30
40
|
for (const eventUpdate of externalized.events) {
|
|
@@ -52,13 +62,15 @@ export class AdapterSessionConnection {
|
|
|
52
62
|
};
|
|
53
63
|
break;
|
|
54
64
|
case "config_option_update":
|
|
65
|
+
this.#applyConfigurationUpdate(update.configOptions);
|
|
55
66
|
event = {
|
|
56
67
|
kind: "configuration",
|
|
57
68
|
payload,
|
|
58
|
-
configOptions:
|
|
69
|
+
configOptions: this.snapshot().configOptions,
|
|
59
70
|
};
|
|
60
71
|
break;
|
|
61
72
|
case "current_mode_update":
|
|
73
|
+
this.#applyModeUpdate(update.currentModeId);
|
|
62
74
|
event = { kind: "mode", payload, modeId: update.currentModeId };
|
|
63
75
|
break;
|
|
64
76
|
case "session_info_update": {
|
|
@@ -135,10 +147,90 @@ export class AdapterSessionConnection {
|
|
|
135
147
|
get termination() {
|
|
136
148
|
return this.#connection.termination;
|
|
137
149
|
}
|
|
150
|
+
#ready = () => {
|
|
151
|
+
const state = this.#state;
|
|
152
|
+
if (state.kind !== "ready") {
|
|
153
|
+
throw new AcpExecutionError("The Agent session is not initialized or has closed", {}, "invalid_agent_session");
|
|
154
|
+
}
|
|
155
|
+
return state;
|
|
156
|
+
};
|
|
157
|
+
snapshot = () => this.#ready().snapshot;
|
|
158
|
+
beginStateChange = () => {
|
|
159
|
+
const state = this.#ready();
|
|
160
|
+
if (state.operation.kind !== "idle") {
|
|
161
|
+
throw new AcpExecutionError("Another session configuration operation is running", {}, "session_busy");
|
|
162
|
+
}
|
|
163
|
+
this.#state = { ...state, operation: { kind: "pending", changes: { kind: "unchanged" } } };
|
|
164
|
+
};
|
|
165
|
+
cancelStateChange = () => {
|
|
166
|
+
if (this.#state.kind === "ready") {
|
|
167
|
+
this.#state = { ...this.#state, operation: { kind: "idle" } };
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
commitConfiguration = (options) => {
|
|
171
|
+
const state = this.#ready();
|
|
172
|
+
if (state.operation.kind !== "pending") {
|
|
173
|
+
throw new AcpExecutionError("No session configuration operation is running", {}, "invalid_agent_session");
|
|
174
|
+
}
|
|
175
|
+
const configOptions = applyConfigurationChanges(options, state.operation.changes);
|
|
176
|
+
this.#state = { ...state, snapshot: { ...state.snapshot, configOptions }, operation: { kind: "idle" } };
|
|
177
|
+
return configOptions;
|
|
178
|
+
};
|
|
179
|
+
commitLifecycle = (response) => {
|
|
180
|
+
const state = this.#ready();
|
|
181
|
+
const capabilities = restrictAcpSessionCapabilities(state.snapshot.capabilities, response);
|
|
182
|
+
this.commitConfiguration(sessionConfigProtocolForAgent(this.#agent.id).normalizeLifecycle(response));
|
|
183
|
+
this.#state = { ...this.#ready(), snapshot: { capabilities, configOptions: this.snapshot().configOptions } };
|
|
184
|
+
return this.snapshot();
|
|
185
|
+
};
|
|
186
|
+
#applyConfigurationUpdate = (value) => {
|
|
187
|
+
const state = this.#ready();
|
|
188
|
+
const protocol = sessionConfigProtocolForAgent(this.#agent.id);
|
|
189
|
+
const configOptions = protocol.normalizeUpdate(state.snapshot.configOptions, value);
|
|
190
|
+
const operation = state.operation.kind === "pending"
|
|
191
|
+
? {
|
|
192
|
+
kind: "pending",
|
|
193
|
+
changes: recordConfigurationOptions(state.operation.changes, protocol.normalizeUpdate([], value)),
|
|
194
|
+
}
|
|
195
|
+
: state.operation;
|
|
196
|
+
this.#state = { ...state, snapshot: { ...state.snapshot, configOptions }, operation };
|
|
197
|
+
};
|
|
198
|
+
#applyModeUpdate = (modeId) => {
|
|
199
|
+
const state = this.#ready();
|
|
200
|
+
const operation = state.operation.kind === "pending"
|
|
201
|
+
? { kind: "pending", changes: recordConfigurationMode(state.operation.changes, modeId) }
|
|
202
|
+
: state.operation;
|
|
203
|
+
this.#state = {
|
|
204
|
+
...state,
|
|
205
|
+
snapshot: {
|
|
206
|
+
...state.snapshot,
|
|
207
|
+
configOptions: applyConfigurationMode(state.snapshot.configOptions, modeId),
|
|
208
|
+
},
|
|
209
|
+
operation,
|
|
210
|
+
};
|
|
211
|
+
};
|
|
138
212
|
initialize = (signal) => this.#connection.initialize(signal);
|
|
213
|
+
initializeAgent = (signal) => {
|
|
214
|
+
if (this.#initialization.kind === "not-started") {
|
|
215
|
+
this.#initialization = {
|
|
216
|
+
kind: "started",
|
|
217
|
+
result: initializeAgentConnection(this, this.#agent.id, this.#agent.agentVersion, signal).then((agent) => {
|
|
218
|
+
this.#lifetime.signal.throwIfAborted();
|
|
219
|
+
this.#state = {
|
|
220
|
+
kind: "ready",
|
|
221
|
+
snapshot: { capabilities: agent.capabilities, configOptions: [] },
|
|
222
|
+
operation: { kind: "idle" },
|
|
223
|
+
};
|
|
224
|
+
return agent;
|
|
225
|
+
}),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return this.#initialization.result;
|
|
229
|
+
};
|
|
139
230
|
agentSettingsModelEffort = () => this.#connection.agentSettingsModelEffort();
|
|
140
231
|
race = (operation, exitMessage, signal) => this.#connection.race(operation, exitMessage, signal);
|
|
141
232
|
closeProcess = async () => {
|
|
233
|
+
this.#state = { kind: "closed" };
|
|
142
234
|
this.#lifetime.abort(new DOMException("The adapter event subscription closed", "AbortError"));
|
|
143
235
|
try {
|
|
144
236
|
await this.#connection.closeProcess();
|