@moxt-ai/mobius 0.0.172 → 0.0.174

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.
Files changed (66) hide show
  1. package/dist/agent-catalog/agent-specification.js +1 -1
  2. package/dist/cli.js +129 -863
  3. package/dist/cli.js.map +4 -4
  4. package/dist/daemon-command-handler.d.ts +1 -2
  5. package/dist/daemon-command-handler.d.ts.map +1 -1
  6. package/dist/daemon-command-handler.js +6 -26
  7. package/dist/daemon-command-handler.js.map +1 -1
  8. package/dist/daemon-history-commands.d.ts +1 -3
  9. package/dist/daemon-history-commands.d.ts.map +1 -1
  10. package/dist/daemon-history-commands.js +1 -48
  11. package/dist/daemon-history-commands.js.map +1 -1
  12. package/dist/daemon-turn-registry.d.ts +13 -13
  13. package/dist/generated/acp-session-store-migrations.d.ts +3 -0
  14. package/dist/generated/acp-session-store-migrations.d.ts.map +1 -1
  15. package/dist/generated/acp-session-store-migrations.js +5 -1
  16. package/dist/generated/acp-session-store-migrations.js.map +1 -1
  17. package/dist/index.js +114 -848
  18. package/dist/index.js.map +4 -4
  19. package/dist/native-sessions/service.d.ts.map +1 -1
  20. package/dist/native-sessions/service.js +0 -55
  21. package/dist/native-sessions/service.js.map +1 -1
  22. package/dist/relay-connection/run-relay-connection.d.ts +1 -2
  23. package/dist/relay-connection/run-relay-connection.d.ts.map +1 -1
  24. package/dist/relay-connection/run-relay-connection.js +1 -2
  25. package/dist/relay-connection/run-relay-connection.js.map +1 -1
  26. package/dist/run-daemon.d.ts +0 -1
  27. package/dist/run-daemon.d.ts.map +1 -1
  28. package/dist/run-daemon.js +0 -6
  29. package/dist/run-daemon.js.map +1 -1
  30. package/dist/runtime.d.ts +0 -1
  31. package/dist/runtime.d.ts.map +1 -1
  32. package/dist/runtime.js +108 -842
  33. package/dist/runtime.js.map +4 -4
  34. package/dist/schema/acp-session-store/index.d.ts +0 -1
  35. package/dist/schema/acp-session-store/index.d.ts.map +1 -1
  36. package/dist/schema/acp-session-store/index.js +0 -1
  37. package/dist/schema/acp-session-store/index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/agent-catalog/handle-agent-catalog-refresh.d.ts +0 -21
  40. package/dist/agent-catalog/handle-agent-catalog-refresh.d.ts.map +0 -1
  41. package/dist/agent-catalog/handle-agent-catalog-refresh.js +0 -119
  42. package/dist/agent-catalog/handle-agent-catalog-refresh.js.map +0 -1
  43. package/dist/native-sessions/acp-adapter.d.ts +0 -3
  44. package/dist/native-sessions/acp-adapter.d.ts.map +0 -1
  45. package/dist/native-sessions/acp-adapter.js +0 -6
  46. package/dist/native-sessions/acp-adapter.js.map +0 -1
  47. package/dist/native-sessions/acp-history.d.ts +0 -6
  48. package/dist/native-sessions/acp-history.d.ts.map +0 -1
  49. package/dist/native-sessions/acp-history.js +0 -27
  50. package/dist/native-sessions/acp-history.js.map +0 -1
  51. package/dist/native-sessions/agent-adapter.d.ts +0 -16
  52. package/dist/native-sessions/agent-adapter.d.ts.map +0 -1
  53. package/dist/native-sessions/agent-adapter.js +0 -19
  54. package/dist/native-sessions/agent-adapter.js.map +0 -1
  55. package/dist/native-sessions/codex-adapter.d.ts +0 -3
  56. package/dist/native-sessions/codex-adapter.d.ts.map +0 -1
  57. package/dist/native-sessions/codex-adapter.js +0 -20
  58. package/dist/native-sessions/codex-adapter.js.map +0 -1
  59. package/dist/native-sessions/live-history-page.d.ts +0 -4
  60. package/dist/native-sessions/live-history-page.d.ts.map +0 -1
  61. package/dist/native-sessions/live-history-page.js +0 -258
  62. package/dist/native-sessions/live-history-page.js.map +0 -1
  63. package/dist/schema/acp-session-store/session-event-v2.d.ts +0 -72
  64. package/dist/schema/acp-session-store/session-event-v2.d.ts.map +0 -1
  65. package/dist/schema/acp-session-store/session-event-v2.js +0 -11
  66. package/dist/schema/acp-session-store/session-event-v2.js.map +0 -1
@@ -1,4 +1,3 @@
1
1
  export { acpSession } from "./acp-session.ts";
2
2
  export { deletedAcpSession } from "./deleted-acp-session.ts";
3
- export { sessionEventV2 } from "./session-event-v2.ts";
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/acp-session-store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/acp-session-store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,4 +1,3 @@
1
1
  export { acpSession } from "./acp-session.js";
2
2
  export { deletedAcpSession } from "./deleted-acp-session.js";
3
- export { sessionEventV2 } from "./session-event-v2.js";
4
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/acp-session-store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/acp-session-store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moxt-ai/mobius",
3
- "version": "0.0.172",
3
+ "version": "0.0.174",
4
4
  "description": "Mobius CLI for pairing and running local AI agent services.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,21 +0,0 @@
1
- import { type AgentCatalogRefreshCommand } from "@moxt-ai/mobius-protocol";
2
- import { WebSocket } from "undici";
3
- import type { AuditStore } from "../audit/audit-store.ts";
4
- import { type DaemonConfig } from "../config.ts";
5
- import type { RelayConnectionDiagnostics } from "../relay-connection/diagnostics.ts";
6
- import type { DaemonTimer } from "../relay-connection/timer.ts";
7
- interface CatalogRefreshDependencies {
8
- readonly config: DaemonConfig;
9
- readonly audit: AuditStore;
10
- readonly diagnostics: RelayConnectionDiagnostics;
11
- readonly socket: WebSocket;
12
- readonly signal: AbortSignal;
13
- readonly timer: DaemonTimer;
14
- readonly resolveEnvironment: (signal: AbortSignal) => Promise<Readonly<NodeJS.ProcessEnv>>;
15
- }
16
- export declare function createAgentCatalogRefreshHandler(dependencies: CatalogRefreshDependencies): {
17
- handle: (command: AgentCatalogRefreshCommand) => void;
18
- settle: () => Promise<void>;
19
- };
20
- export {};
21
- //# sourceMappingURL=handle-agent-catalog-refresh.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-agent-catalog-refresh.d.ts","sourceRoot":"","sources":["../../src/agent-catalog/handle-agent-catalog-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,0BAA0B,EAClC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAA6C,MAAM,cAAc,CAAC;AAG5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA4DhE,UAAU,0BAA0B;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC9F;AAED,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,0BAA0B;sBAS5D,0BAA0B,KAAG,IAAI;kBA4EjC,OAAO,CAAC,IAAI,CAAC;EAIzC"}
@@ -1,119 +0,0 @@
1
- import { AGENT_CATALOG_REFRESH_FAILED_KIND, AGENT_CATALOG_REFRESHED_KIND, } from "@moxt-ai/mobius-protocol";
2
- import { WebSocket } from "undici";
3
- import { AcpExecutionError } from "../acp/agent-runtime-manager.js";
4
- import { DaemonLocalContext, withDaemonEnvironment } from "../config.js";
5
- import { operationErrorCode, operationErrorMessage, send } from "../daemon-command-results.js";
6
- import { revalidateExecutable } from "../process/executable.js";
7
- import { discoverLocalAgentInventory } from "./discover-local-agents.js";
8
- import { publishAgentCatalog } from "./publish-agent-catalog.js";
9
- // A refresh observes the machine through executable discovery, which depends on ambient state such
10
- // as PATH and the managed state directory. An Agent that was verified a moment ago is therefore not
11
- // necessarily uninstalled just because one discovery attempt failed to re-verify it. Keep the last
12
- // verified definition while the exact executable it was verified against still exists unchanged on
13
- // disk, so a transient probe failure cannot silently drop a working Agent. A genuine removal, or a
14
- // replaced executable, stops satisfying that check and is still reflected in the catalog.
15
- async function retainStillInstalledAgents(previous, refreshed, signal) {
16
- const refreshedIdentifiers = new Set(refreshed.map((agent) => agent.id));
17
- const retained = [];
18
- for (const agent of previous) {
19
- if (refreshedIdentifiers.has(agent.id)) {
20
- continue;
21
- }
22
- signal.throwIfAborted();
23
- if (await revalidateExecutable(agent.agentIdentity)) {
24
- retained.push(agent);
25
- }
26
- }
27
- return Object.freeze([...refreshed, ...retained]);
28
- }
29
- async function refreshAgentCatalog(config, resolveEnvironment, signal) {
30
- signal.throwIfAborted();
31
- const shellEnvironment = await resolveEnvironment(signal);
32
- const environment = new DaemonLocalContext(config.localContext.stateDirectory, shellEnvironment).environment;
33
- signal.throwIfAborted();
34
- const inventory = await discoverLocalAgentInventory({
35
- defaultWorkspace: config.defaultWorkspace,
36
- environment,
37
- signal,
38
- });
39
- const previousCatalog = config.catalog.read();
40
- const refreshedAgents = inventory.readyAgents().map((agent) => withDaemonEnvironment(agent, environment));
41
- const agents = await retainStillInstalledAgents(previousCatalog.agents, refreshedAgents, signal);
42
- const verifiedIdentifiers = new Set(agents.map((agent) => agent.id));
43
- config.catalog.transition(agents, inventory.installable.filter((agent) => !verifiedIdentifiers.has(agent.id)));
44
- try {
45
- await publishAgentCatalog(config, signal);
46
- }
47
- catch (error) {
48
- config.catalog.transition(previousCatalog.agents, previousCatalog.installableAgents);
49
- throw error;
50
- }
51
- }
52
- export function createAgentCatalogRefreshHandler(dependencies) {
53
- const { config, audit, diagnostics, socket, signal, timer, resolveEnvironment } = dependencies;
54
- const agentCatalogRefreshes = new Map();
55
- const handle = (command) => {
56
- if (agentCatalogRefreshes.has(command.requestId) || agentCatalogRefreshes.size > 0) {
57
- if (socket.readyState === WebSocket.OPEN) {
58
- send(socket, {
59
- code: "agent_catalog_refresh_busy",
60
- kind: AGENT_CATALOG_REFRESH_FAILED_KIND,
61
- message: "Another local Agent catalog refresh is already running",
62
- requestId: command.requestId,
63
- });
64
- }
65
- return;
66
- }
67
- const controller = new AbortController();
68
- const operationSignal = AbortSignal.any([signal, controller.signal]);
69
- const timeout = timer.schedule(() => controller.abort(new AcpExecutionError("The local Agent catalog refresh timed out", {}, "agent_catalog_refresh_timeout")), 90_000);
70
- const completion = (async () => {
71
- try {
72
- await refreshAgentCatalog(config, resolveEnvironment, operationSignal);
73
- audit.record({
74
- commandId: command.requestId,
75
- event: "agent_catalog_refreshed",
76
- sessionId: "agent-catalog",
77
- });
78
- if (socket.readyState === WebSocket.OPEN) {
79
- send(socket, {
80
- kind: AGENT_CATALOG_REFRESHED_KIND,
81
- requestId: command.requestId,
82
- });
83
- }
84
- }
85
- catch (error) {
86
- const failure = operationSignal.aborted
87
- ? (controller.signal.reason ??
88
- new AcpExecutionError("The local Agent catalog refresh was cancelled", {}, "agent_catalog_refresh_cancelled"))
89
- : error;
90
- audit.record({
91
- commandId: command.requestId,
92
- details: { code: operationErrorCode(failure) },
93
- event: "agent_catalog_refresh_failed",
94
- sessionId: "agent-catalog",
95
- });
96
- diagnostics.daemonDiagnostic("agent_catalog_refresh_failed", command.requestId, { code: operationErrorCode(failure) }, failure);
97
- if (socket.readyState === WebSocket.OPEN) {
98
- send(socket, {
99
- code: operationErrorCode(failure),
100
- kind: AGENT_CATALOG_REFRESH_FAILED_KIND,
101
- message: operationErrorMessage(failure),
102
- requestId: command.requestId,
103
- });
104
- }
105
- }
106
- finally {
107
- timeout.cancel();
108
- agentCatalogRefreshes.delete(command.requestId);
109
- }
110
- })();
111
- agentCatalogRefreshes.set(command.requestId, { completion, controller });
112
- return;
113
- };
114
- const settle = async () => {
115
- await Promise.all([...agentCatalogRefreshes.values()].map((request) => request.completion));
116
- };
117
- return { handle, settle };
118
- }
119
- //# sourceMappingURL=handle-agent-catalog-refresh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-agent-catalog-refresh.js","sourceRoot":"","sources":["../../src/agent-catalog/handle-agent-catalog-refresh.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { NativeSessionAdapter } from "./agent-adapter.ts";
2
- export declare const acpSessionAdapter: NativeSessionAdapter;
3
- //# sourceMappingURL=acp-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-adapter.d.ts","sourceRoot":"","sources":["../../src/native-sessions/acp-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,EAAE,oBAK/B,CAAC"}
@@ -1,6 +0,0 @@
1
- import { readAcpHistory } from "./acp-history.js";
2
- export const acpSessionAdapter = {
3
- history: async ({ sessions, directories, bindingId, options, nativeSessionId }) => await readAcpHistory(sessions, directories, bindingId, options, nativeSessionId),
4
- preview: async ({ sessions, options, nativeSessionId }) => await sessions.previewNativeSession(options, nativeSessionId),
5
- };
6
- //# sourceMappingURL=acp-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-adapter.js","sourceRoot":"","sources":["../../src/native-sessions/acp-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,CAAC,MAAM,iBAAiB,GAAyB;IACnD,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAC9E,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC;IACpF,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CACtD,MAAM,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC;CACpE,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { NativeSessionHistory } from "@moxt-ai/mobius-protocol";
2
- import type { AcpPrepareOptions, AgentRuntimeManager } from "../acp/agent-runtime-manager.ts";
3
- import type { WorkspaceDirectoryService } from "../authorization/workspace-directory.ts";
4
- /** ACP session/list verifies ownership before session/load replays saved messages. */
5
- export declare function readAcpHistory(sessions: AgentRuntimeManager, directories: WorkspaceDirectoryService, bindingId: string, options: AcpPrepareOptions, nativeSessionId: string): Promise<NativeSessionHistory>;
6
- //# sourceMappingURL=acp-history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-history.d.ts","sourceRoot":"","sources":["../../src/native-sessions/acp-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE9F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAEzF,sFAAsF;AACtF,wBAAsB,cAAc,CAChC,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,yBAAyB,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAiC/B"}
@@ -1,27 +0,0 @@
1
- import { AcpExecutionError } from "../acp/agent-runtime-manager.js";
2
- /** ACP session/list verifies ownership before session/load replays saved messages. */
3
- export async function readAcpHistory(sessions, directories, bindingId, options, nativeSessionId) {
4
- let cursor = null;
5
- let inspected = 0;
6
- for (let pageNumber = 0; pageNumber < 500 && inspected < 500; pageNumber += 1) {
7
- const page = await sessions.listNativeSessions(options, cursor);
8
- inspected += page.sessions.length;
9
- const found = page.sessions.find((entry) => entry.sessionId === nativeSessionId);
10
- if (found !== undefined) {
11
- const primary = await directories.identify(bindingId, found.cwd, options.signal);
12
- const additional = await Promise.all(found.additionalDirectories.map(async (directory) => await directories.identify(bindingId, directory, options.signal)));
13
- if (primary.path !== options.cwd ||
14
- additional.length !== options.additionalDirectories.length ||
15
- additional.some((directory, index) => directory.path !== options.additionalDirectories[index])) {
16
- throw new AcpExecutionError("The native Session belongs to another workspace.", {}, "session_identity_mismatch");
17
- }
18
- return await sessions.previewNativeSession(options, nativeSessionId);
19
- }
20
- if (page.nextCursor === null || page.nextCursor === cursor) {
21
- break;
22
- }
23
- cursor = page.nextCursor ?? null;
24
- }
25
- throw new AcpExecutionError("The native Session was not found.", {}, "native_session_not_found");
26
- }
27
- //# sourceMappingURL=acp-history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-history.js","sourceRoot":"","sources":["../../src/native-sessions/acp-history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,QAA6B,EAC7B,WAAsC,EACtC,SAAiB,EACjB,OAA0B,EAC1B,eAAuB;IAEvB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChE,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC;QACjF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACjF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAC3B,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CACxF,CACJ,CAAC;YACF,IACI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG;gBAC5B,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,MAAM;gBAC1D,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAChG,CAAC;gBACC,MAAM,IAAI,iBAAiB,CACvB,kDAAkD,EAClD,EAAE,EACF,2BAA2B,CAC9B,CAAC;YACN,CAAC;YACD,OAAO,MAAM,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACzD,MAAM;QACV,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,iBAAiB,CAAC,mCAAmC,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC;AACrG,CAAC"}
@@ -1,16 +0,0 @@
1
- import type { NativeSessionHistory } from "@moxt-ai/mobius-protocol";
2
- import { type AcpPrepareOptions, type AgentRuntimeManager } from "../acp/agent-runtime-manager.ts";
3
- import type { WorkspaceDirectoryService } from "../authorization/workspace-directory.ts";
4
- export interface NativeSessionAdapterContext {
5
- readonly sessions: AgentRuntimeManager;
6
- readonly directories: WorkspaceDirectoryService;
7
- readonly bindingId: string;
8
- readonly options: AcpPrepareOptions;
9
- readonly nativeSessionId: string;
10
- }
11
- export interface NativeSessionAdapter {
12
- readonly history: (context: NativeSessionAdapterContext) => Promise<NativeSessionHistory>;
13
- readonly preview: (context: NativeSessionAdapterContext) => Promise<NativeSessionHistory>;
14
- }
15
- export declare function nativeSessionAdapter(agentId: string): NativeSessionAdapter;
16
- //# sourceMappingURL=agent-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-adapter.d.ts","sourceRoot":"","sources":["../../src/native-sessions/agent-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAIzF,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1F,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC7F;AAUD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAQ1E"}
@@ -1,19 +0,0 @@
1
- import { AcpExecutionError } from "../acp/agent-runtime-manager.js";
2
- import { acpSessionAdapter } from "./acp-adapter.js";
3
- import { codexSessionAdapter } from "./codex-adapter.js";
4
- const genericSessionAdapter = {
5
- history: async () => {
6
- throw new AcpExecutionError("Native history is unavailable for this Agent", {}, "native_session_unsupported");
7
- },
8
- preview: async ({ sessions, options, nativeSessionId }) => await sessions.previewNativeSession(options, nativeSessionId),
9
- };
10
- export function nativeSessionAdapter(agentId) {
11
- if (agentId === "codex") {
12
- return codexSessionAdapter;
13
- }
14
- if (agentId === "claude" || agentId === "opencode" || agentId === "pi") {
15
- return acpSessionAdapter;
16
- }
17
- return genericSessionAdapter;
18
- }
19
- //# sourceMappingURL=agent-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../src/native-sessions/agent-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoD,MAAM,iCAAiC,CAAC;AAEtH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAezD,MAAM,qBAAqB,GAAyB;IAChD,OAAO,EAAE,KAAK,IAAI,EAAE;QAChB,MAAM,IAAI,iBAAiB,CAAC,8CAA8C,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CACtD,MAAM,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC;CACpE,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAChD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IACD,OAAO,qBAAqB,CAAC;AACjC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { NativeSessionAdapter } from "./agent-adapter.ts";
2
- export declare const codexSessionAdapter: NativeSessionAdapter;
3
- //# sourceMappingURL=codex-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-adapter.d.ts","sourceRoot":"","sources":["../../src/native-sessions/codex-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAA+B,MAAM,oBAAoB,CAAC;AAmB5F,eAAO,MAAM,mBAAmB,EAAE,oBAKjC,CAAC"}
@@ -1,20 +0,0 @@
1
- import { AcpExecutionError } from "../acp/acp-error.js";
2
- import { readCodexFullHistory, readCodexHistory } from "./codex-history.js";
3
- async function verifiedHistory(context, full) {
4
- const { options, nativeSessionId, directories, bindingId } = context;
5
- const snapshot = full
6
- ? await readCodexFullHistory(options.agent, options.cwd, nativeSessionId, options.signal)
7
- : await readCodexHistory(options.agent, options.cwd, nativeSessionId, options.signal);
8
- const resolved = await directories.identify(bindingId, snapshot.cwd, options.signal);
9
- if (snapshot.nativeSessionId !== nativeSessionId || resolved.path !== options.cwd) {
10
- throw new AcpExecutionError("Codex returned history for a different session or workspace.", {}, "invalid_native_session_response");
11
- }
12
- return snapshot.history;
13
- }
14
- export const codexSessionAdapter = {
15
- history: async (context) => await verifiedHistory(context, true),
16
- // Codex enforces an exclusive writer per thread. Its read-only app-server
17
- // history path keeps externally owned conversations previewable.
18
- preview: async (context) => await verifiedHistory(context, false),
19
- };
20
- //# sourceMappingURL=codex-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../src/native-sessions/codex-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,KAAK,UAAU,eAAe,CAAC,OAAoC,EAAE,IAAa;IAC9E,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI;QACjB,CAAC,CAAC,MAAM,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC;QACzF,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF,IAAI,QAAQ,CAAC,eAAe,KAAK,eAAe,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QAChF,MAAM,IAAI,iBAAiB,CACvB,8DAA8D,EAC9D,EAAE,EACF,iCAAiC,CACpC,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACrD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;IAChE,0EAA0E;IAC1E,iEAAiE;IACjE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;CACpE,CAAC"}
@@ -1,4 +0,0 @@
1
- import { type NativeMessagePage, type NativeSessionHistory } from "@moxt-ai/mobius-protocol";
2
- import type { ActiveTurnRecovery } from "../daemon-active-turn.ts";
3
- export declare function paginateLiveSessionHistory(history: NativeSessionHistory, activeTurn: ActiveTurnRecovery | null, sessionId: string, encodedCursor: string | null, limit: number): NativeMessagePage;
4
- //# sourceMappingURL=live-history-page.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live-history-page.d.ts","sourceRoot":"","sources":["../../src/native-sessions/live-history-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAE5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAgVnE,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,kBAAkB,GAAG,IAAI,EACrC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,GACd,iBAAiB,CAkBnB"}
@@ -1,258 +0,0 @@
1
- import { SESSION_HISTORY_CHARACTER_LIMIT, } from "@moxt-ai/mobius-protocol";
2
- import { AcpExecutionError } from "../acp/agent-runtime-manager.js";
3
- function encodeLiveHistoryCursor(cursor) {
4
- return Buffer.from(JSON.stringify(cursor), "utf8").toString("base64url");
5
- }
6
- function decodeLiveHistoryCursor(cursor, sessionId) {
7
- try {
8
- if (!/^[A-Za-z0-9_-]{1,512}$/u.test(cursor)) {
9
- throw new Error("Invalid cursor alphabet");
10
- }
11
- const value = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
12
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
13
- throw new Error("Invalid cursor shape");
14
- }
15
- const record = Object.fromEntries(Object.entries(value));
16
- const keys = Object.keys(record).sort().join(",");
17
- const legacyNative = keys === "endIndex,sessionId";
18
- const kind = legacyNative ? "native" : record["kind"];
19
- if ((keys !== "endIndex,kind,sessionId" && keys !== "endIndex,epoch,kind,sessionId" && !legacyNative) ||
20
- record["sessionId"] !== sessionId ||
21
- (kind !== "active" && kind !== "native") ||
22
- typeof record["endIndex"] !== "number" ||
23
- !Number.isSafeInteger(record["endIndex"]) ||
24
- record["endIndex"] < 0) {
25
- throw new Error("Invalid cursor target");
26
- }
27
- if (kind === "active") {
28
- if (keys !== "endIndex,epoch,kind,sessionId" || typeof record["epoch"] !== "string") {
29
- throw new Error("Invalid active cursor target");
30
- }
31
- return { endIndex: record["endIndex"], epoch: record["epoch"], kind, sessionId };
32
- }
33
- if (keys !== "endIndex,kind,sessionId" && !legacyNative) {
34
- throw new Error("Invalid native cursor target");
35
- }
36
- return { endIndex: record["endIndex"], kind, sessionId };
37
- }
38
- catch (cause) {
39
- throw new AcpExecutionError("The native Session history cursor is invalid", { cause }, "invalid_cursor");
40
- }
41
- }
42
- function activeHistoryCursor(sessionId, epoch, endIndex) {
43
- return encodeLiveHistoryCursor({ endIndex, epoch, kind: "active", sessionId });
44
- }
45
- function nativeHistoryCursor(sessionId, endIndex) {
46
- return encodeLiveHistoryCursor({ endIndex, kind: "native", sessionId });
47
- }
48
- function liveHistoryCoveredTurnRanges(history) {
49
- const ranges = [];
50
- let historyIndex = history.messages.length;
51
- for (const commandId of history.coveredCommandIds) {
52
- let assistantStartIndex = historyIndex;
53
- while (assistantStartIndex > 0 && history.messages[assistantStartIndex - 1]?.role === "assistant") {
54
- assistantStartIndex -= 1;
55
- }
56
- const userIndex = assistantStartIndex - 1;
57
- if (assistantStartIndex === historyIndex || history.messages[userIndex]?.role !== "user") {
58
- break;
59
- }
60
- ranges.push({ assistantEndIndex: historyIndex, assistantStartIndex, commandId, userIndex });
61
- historyIndex = userIndex;
62
- }
63
- return ranges;
64
- }
65
- function historyMessageCharacters(message) {
66
- return (message.text.length +
67
- (message.role === "assistant"
68
- ? JSON.stringify(message.activities).length + JSON.stringify(message.content).length
69
- : 0));
70
- }
71
- function isNativeHistoryImageMimeType(mimeType) {
72
- return (mimeType === "image/png" || mimeType === "image/jpeg" || mimeType === "image/gif" || mimeType === "image/webp");
73
- }
74
- function selectMessagesBefore(messages, endIndex, messageLimit, characterLimit) {
75
- const selected = [];
76
- let remainingCharacters = characterLimit;
77
- let startIndex = endIndex;
78
- for (let index = endIndex - 1; index >= 0 && selected.length < messageLimit; index -= 1) {
79
- const message = messages[index];
80
- if (message === undefined) {
81
- break;
82
- }
83
- const characters = historyMessageCharacters(message);
84
- if (characters > remainingCharacters) {
85
- break;
86
- }
87
- selected.unshift(message);
88
- remainingCharacters -= characters;
89
- startIndex = index;
90
- }
91
- if (selected.length === 0 && endIndex > 0) {
92
- throw new AcpExecutionError("A native Session history item exceeds the page budget", {}, "history_item_too_large");
93
- }
94
- return { characters: characterLimit - remainingCharacters, messages: selected, startIndex };
95
- }
96
- function nativeActiveMessage(message) {
97
- if (message.role === "assistant") {
98
- return {
99
- activities: message.activities,
100
- content: message.content,
101
- role: "assistant",
102
- text: message.text,
103
- };
104
- }
105
- const images = (message.images ?? []).flatMap((image) => {
106
- if (image.data.length < 4 ||
107
- image.data.length % 4 !== 0 ||
108
- !/^[A-Za-z0-9+/]*={0,2}$/u.test(image.data) ||
109
- !isNativeHistoryImageMimeType(image.mimeType)) {
110
- return [];
111
- }
112
- return [{ data: image.data, mimeType: image.mimeType, name: image.name }];
113
- });
114
- return { ...(images.length === 0 ? {} : { images }), role: "user", text: message.text };
115
- }
116
- function nativeHistoryCoversCompletedRecovery(history, recovery) {
117
- const root = recovery.messages.find((message) => message.role === "user" && message.id === recovery.commandId);
118
- if (root === undefined) {
119
- return false;
120
- }
121
- const rootIndex = history.messages.findLastIndex((message) => message.role === "user" && message.text === root.text);
122
- if (rootIndex < 0) {
123
- return false;
124
- }
125
- const nativeAssistant = history.messages.slice(rootIndex + 1).filter((message) => message.role === "assistant");
126
- if (nativeAssistant.length === 0) {
127
- return false;
128
- }
129
- const recoveryAssistant = recovery.messages.filter((message) => message.role === "assistant");
130
- const recoveryText = recoveryAssistant.map((message) => message.text).join("");
131
- const nativeText = nativeAssistant.map((message) => message.text).join("");
132
- if (recoveryText.length > 0 && !nativeText.includes(recoveryText)) {
133
- return false;
134
- }
135
- const nativeContent = new Set(nativeAssistant.flatMap((message) => message.content).map((content) => JSON.stringify(content)));
136
- return recoveryAssistant
137
- .flatMap((message) => message.content)
138
- .every((content) => nativeContent.has(JSON.stringify(content)));
139
- }
140
- function historyBeforeActiveTurn(history, activeTurn) {
141
- if (history.status === "unavailable") {
142
- return history;
143
- }
144
- const activeRoot = activeTurn.messages.find((message) => message.role === "user" && message.id === activeTurn.commandId);
145
- const matchingActiveUserIndex = activeRoot === undefined
146
- ? -1
147
- : activeTurn.state === "completed" ||
148
- (history.messages.at(-1)?.role === "user" && history.messages.at(-1)?.text === activeRoot.text) ||
149
- history.coveredCommandIds.includes(activeTurn.commandId)
150
- ? history.messages.findLastIndex((message) => message.role === "user" && message.text === activeRoot.text)
151
- : -1;
152
- const activeUserIndex = matchingActiveUserIndex >= 0
153
- ? matchingActiveUserIndex
154
- : (liveHistoryCoveredTurnRanges(history).find((range) => range.commandId === activeTurn.commandId)
155
- ?.userIndex ?? -1);
156
- if (activeUserIndex < 0) {
157
- return history;
158
- }
159
- return {
160
- ...history,
161
- coveredCommandIds: history.coveredCommandIds.filter((id) => id !== activeTurn.commandId),
162
- coveredMessageIds: history.coveredMessageIds.filter((id) => id !== `${activeTurn.commandId}:user` && id !== `${activeTurn.commandId}:agent`),
163
- messages: history.messages.slice(0, activeUserIndex),
164
- };
165
- }
166
- function paginateAvailableNativeHistory(history, sessionId, endIndex, limit, characterLimit) {
167
- if (endIndex > history.messages.length) {
168
- throw new AcpExecutionError("The native Session history cursor is invalid", {}, "invalid_cursor");
169
- }
170
- const selected = selectMessagesBefore(history.messages, endIndex, limit, characterLimit);
171
- const coveredMessageIds = new Set(history.coveredMessageIds);
172
- const ranges = liveHistoryCoveredTurnRanges(history);
173
- return {
174
- coveredCommandIds: ranges
175
- .filter((range) => range.userIndex >= selected.startIndex && range.assistantEndIndex <= endIndex)
176
- .map((range) => range.commandId),
177
- coveredMessageIds: ranges.flatMap((range) => [
178
- ...(range.userIndex >= selected.startIndex &&
179
- range.userIndex < endIndex &&
180
- coveredMessageIds.has(`${range.commandId}:user`)
181
- ? [`${range.commandId}:user`]
182
- : []),
183
- ...(range.assistantStartIndex >= selected.startIndex &&
184
- range.assistantEndIndex <= endIndex &&
185
- coveredMessageIds.has(`${range.commandId}:agent`)
186
- ? [`${range.commandId}:agent`]
187
- : []),
188
- ]),
189
- messages: selected.messages,
190
- nextCursor: selected.startIndex > 0 ? nativeHistoryCursor(sessionId, selected.startIndex) : null,
191
- status: "available",
192
- truncated: history.truncated,
193
- };
194
- }
195
- function paginateNativeHistory(history, sessionId, cursor, limit) {
196
- if (cursor?.kind === "active") {
197
- throw new AcpExecutionError("The native Session history cursor is invalid", {}, "invalid_cursor");
198
- }
199
- if (history.status === "unavailable") {
200
- if (cursor !== null) {
201
- throw new AcpExecutionError("Unavailable native Session history has no cursor", {}, "invalid_cursor");
202
- }
203
- return { cause: history.cause, nextCursor: null, status: "unavailable" };
204
- }
205
- return paginateAvailableNativeHistory(history, sessionId, cursor?.endIndex ?? history.messages.length, limit, SESSION_HISTORY_CHARACTER_LIMIT);
206
- }
207
- function paginateActiveTurn(history, activeTurn, sessionId, endIndex, limit) {
208
- if (endIndex > activeTurn.messages.length) {
209
- throw new AcpExecutionError("The native Session history cursor is invalid", {}, "invalid_cursor");
210
- }
211
- const activeMessages = activeTurn.messages.map(nativeActiveMessage);
212
- const active = selectMessagesBefore(activeMessages, endIndex, limit, SESSION_HISTORY_CHARACTER_LIMIT);
213
- const historicalLimit = limit - active.messages.length;
214
- const historicalCharacterLimit = SESSION_HISTORY_CHARACTER_LIMIT - active.characters;
215
- const pendingHistoricalCursor = history.status === "available" && history.messages.length > 0
216
- ? nativeHistoryCursor(sessionId, history.messages.length)
217
- : null;
218
- const latestHistoricalMessage = history.status === "available" ? history.messages.at(-1) : undefined;
219
- const historicalPageFits = latestHistoricalMessage === undefined ||
220
- historyMessageCharacters(latestHistoricalMessage) <= historicalCharacterLimit;
221
- const historical = active.startIndex === 0 && history.status === "available" && historicalLimit > 0 && historicalPageFits
222
- ? paginateAvailableNativeHistory(history, sessionId, history.messages.length, historicalLimit, historicalCharacterLimit)
223
- : null;
224
- return {
225
- streamPosition: { commandId: activeTurn.commandId, epoch: activeTurn.epoch, sequence: activeTurn.sequence },
226
- coveredCommandIds: historical?.coveredCommandIds ?? [],
227
- coveredMessageIds: [
228
- ...(historical?.coveredMessageIds ?? []),
229
- ...(active.startIndex === 0 ? [`${activeTurn.commandId}:user`, `${activeTurn.commandId}:agent`] : []),
230
- ],
231
- messages: [...(historical?.messages ?? []), ...active.messages],
232
- nextCursor: active.startIndex > 0
233
- ? activeHistoryCursor(sessionId, activeTurn.epoch, active.startIndex)
234
- : historical === null
235
- ? pendingHistoricalCursor
236
- : historical.nextCursor,
237
- status: "available",
238
- truncated: activeTurn.truncated || (historical?.truncated ?? false),
239
- };
240
- }
241
- export function paginateLiveSessionHistory(history, activeTurn, sessionId, encodedCursor, limit) {
242
- const cursor = encodedCursor === null ? null : decodeLiveHistoryCursor(encodedCursor, sessionId);
243
- if (activeTurn === null ||
244
- (activeTurn.state === "completed" &&
245
- history.status === "available" &&
246
- nativeHistoryCoversCompletedRecovery(history, activeTurn))) {
247
- return paginateNativeHistory(history, sessionId, cursor, limit);
248
- }
249
- const historical = historyBeforeActiveTurn(history, activeTurn);
250
- if (cursor?.kind === "native") {
251
- return paginateNativeHistory(historical, sessionId, cursor, limit);
252
- }
253
- if (cursor !== null && cursor.epoch !== activeTurn.epoch) {
254
- throw new AcpExecutionError("The active Turn history cursor is stale", {}, "stale_cursor");
255
- }
256
- return paginateActiveTurn(historical, activeTurn, sessionId, cursor?.endIndex ?? activeTurn.messages.length, limit);
257
- }
258
- //# sourceMappingURL=live-history-page.js.map