@moxt-ai/mobius 0.0.1

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 (49) hide show
  1. package/dist/acp/activity.d.ts +29 -0
  2. package/dist/acp/activity.d.ts.map +1 -0
  3. package/dist/acp/activity.js +253 -0
  4. package/dist/acp/activity.js.map +1 -0
  5. package/dist/acp/create-client.d.ts +3 -0
  6. package/dist/acp/create-client.d.ts.map +1 -0
  7. package/dist/acp/create-client.js +3 -0
  8. package/dist/acp/create-client.js.map +1 -0
  9. package/dist/acp/run-prompt.d.ts +15 -0
  10. package/dist/acp/run-prompt.d.ts.map +1 -0
  11. package/dist/acp/run-prompt.js +21 -0
  12. package/dist/acp/run-prompt.js.map +1 -0
  13. package/dist/acp/session-manager.d.ts +25 -0
  14. package/dist/acp/session-manager.d.ts.map +1 -0
  15. package/dist/acp/session-manager.js +301 -0
  16. package/dist/acp/session-manager.js.map +1 -0
  17. package/dist/audit/audit-store.d.ts +12 -0
  18. package/dist/audit/audit-store.d.ts.map +1 -0
  19. package/dist/audit/audit-store.js +35 -0
  20. package/dist/audit/audit-store.js.map +1 -0
  21. package/dist/authorization/authorize-binding.d.ts +6 -0
  22. package/dist/authorization/authorize-binding.d.ts.map +1 -0
  23. package/dist/authorization/authorize-binding.js +30 -0
  24. package/dist/authorization/authorize-binding.js.map +1 -0
  25. package/dist/cli.d.ts +3 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +1792 -0
  28. package/dist/cli.js.map +7 -0
  29. package/dist/config.d.ts +26 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +85 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/index.d.ts +8 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +1784 -0
  36. package/dist/index.js.map +7 -0
  37. package/dist/pairing/pair-local-machine.d.ts +13 -0
  38. package/dist/pairing/pair-local-machine.d.ts.map +1 -0
  39. package/dist/pairing/pair-local-machine.js +302 -0
  40. package/dist/pairing/pair-local-machine.js.map +1 -0
  41. package/dist/relay-connection/connect.d.ts +2 -0
  42. package/dist/relay-connection/connect.d.ts.map +1 -0
  43. package/dist/relay-connection/connect.js +61 -0
  44. package/dist/relay-connection/connect.js.map +1 -0
  45. package/dist/run-daemon.d.ts +4 -0
  46. package/dist/run-daemon.d.ts.map +1 -0
  47. package/dist/run-daemon.js +274 -0
  48. package/dist/run-daemon.js.map +1 -0
  49. package/package.json +46 -0
@@ -0,0 +1,61 @@
1
+ const CONNECTION_TIMEOUT_MILLISECONDS = 15_000;
2
+ class RelayConnectionError extends Error {
3
+ code;
4
+ constructor(code, message, options = {}) {
5
+ super(message, options);
6
+ this.code = code;
7
+ this.name = "RelayConnectionError";
8
+ }
9
+ }
10
+ export function connectRelay(url, signal) {
11
+ signal.throwIfAborted();
12
+ return new Promise((resolve, reject) => {
13
+ const socket = new WebSocket(url);
14
+ let finished = false;
15
+ const timeout = setTimeout(onTimeout, CONNECTION_TIMEOUT_MILLISECONDS);
16
+ const cleanup = () => {
17
+ clearTimeout(timeout);
18
+ signal.removeEventListener("abort", onAbort);
19
+ socket.removeEventListener("close", onClose);
20
+ socket.removeEventListener("error", onError);
21
+ socket.removeEventListener("open", onOpen);
22
+ };
23
+ const fail = (error) => {
24
+ if (finished) {
25
+ return;
26
+ }
27
+ finished = true;
28
+ cleanup();
29
+ socket.close();
30
+ reject(error);
31
+ };
32
+ const onAbort = () => {
33
+ fail(new RelayConnectionError("relay_connection_cancelled", "Relay connection was cancelled", { cause: signal.reason }));
34
+ };
35
+ const onClose = () => {
36
+ fail(new RelayConnectionError("relay_connection_closed", "Relay connection closed before it was ready"));
37
+ };
38
+ const onError = () => {
39
+ fail(new RelayConnectionError("relay_connection_failed", "Relay connection failed"));
40
+ };
41
+ const onOpen = () => {
42
+ if (finished) {
43
+ return;
44
+ }
45
+ finished = true;
46
+ cleanup();
47
+ resolve(socket);
48
+ };
49
+ function onTimeout() {
50
+ fail(new RelayConnectionError("relay_connection_timeout", "Relay connection timed out"));
51
+ }
52
+ signal.addEventListener("abort", onAbort, { once: true });
53
+ socket.addEventListener("close", onClose, { once: true });
54
+ socket.addEventListener("error", onError, { once: true });
55
+ socket.addEventListener("open", onOpen, { once: true });
56
+ if (signal.aborted) {
57
+ onAbort();
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/relay-connection/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuditStore } from "./audit/audit-store.ts";
2
+ import { type DaemonConfig } from "./config.ts";
3
+ export declare function runDaemon(config: DaemonConfig, audit: AuditStore, signal: AbortSignal): Promise<void>;
4
+ //# sourceMappingURL=run-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-daemon.d.ts","sourceRoot":"","sources":["../src/run-daemon.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,aAAa,CAAC;AA4UhE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,274 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AGENT_ACTIVITY_KIND, AGENT_MESSAGE_DELTA_KIND, decodeMessageKind, decodeSessionCancelCommand, decodeSessionPromptCommand, encodeAgentActivityEvent, encodeAgentMessageDeltaEvent, encodeSessionCompletedEvent, encodeSessionFailedEvent, encodeSessionStartedEvent, MOBIUS_PROTOCOL_VERSION, SESSION_CANCEL_KIND, SESSION_COMPLETED_KIND, SESSION_FAILED_KIND, SESSION_PROMPT_KIND, SESSION_STARTED_KIND, } from "@moxt-ai/mobius-protocol";
3
+ import { AcpSessionManager } from "./acp/session-manager.js";
4
+ import { authorizeBinding } from "./authorization/authorize-binding.js";
5
+ import { findLocalAgent } from "./config.js";
6
+ import { connectRelay } from "./relay-connection/connect.js";
7
+ const RELAY_RECONNECT_DELAY_MILLISECONDS = 500;
8
+ class ActiveDaemonTurn {
9
+ command;
10
+ #connectionController;
11
+ #cancellationRequested = false;
12
+ constructor(command, connectionController) {
13
+ this.command = command;
14
+ this.#connectionController = connectionController;
15
+ }
16
+ abortConnection = () => {
17
+ this.#connectionController.abort();
18
+ };
19
+ matches = (cancellation) => cancellation.commandId === this.command.commandId &&
20
+ cancellation.sessionId === this.command.sessionId;
21
+ requestCancellation = () => {
22
+ if (this.#cancellationRequested) {
23
+ return false;
24
+ }
25
+ this.#cancellationRequested = true;
26
+ return true;
27
+ };
28
+ get signal() {
29
+ return this.#connectionController.signal;
30
+ }
31
+ }
32
+ function send(socket, message) {
33
+ if (socket.readyState !== WebSocket.OPEN) {
34
+ throw new Error("Relay connection is not open");
35
+ }
36
+ socket.send(message);
37
+ }
38
+ function reportFailure(socket, command, code, message) {
39
+ if (socket.readyState !== WebSocket.OPEN) {
40
+ return;
41
+ }
42
+ send(socket, encodeSessionFailedEvent({
43
+ code,
44
+ commandId: command.commandId,
45
+ kind: SESSION_FAILED_KIND,
46
+ message,
47
+ protocolVersion: MOBIUS_PROTOCOL_VERSION,
48
+ sessionId: command.sessionId,
49
+ }));
50
+ }
51
+ async function executePrompt(socket, command, config, audit, sessions, signal) {
52
+ try {
53
+ const approvedRoot = await authorizeBinding(command.bindingId, config.bindingId, config.approvedRoot);
54
+ const agent = findLocalAgent(config.agents, command.agentId);
55
+ const processAttemptId = randomUUID();
56
+ audit.record({
57
+ commandId: command.commandId,
58
+ event: "session_authorized",
59
+ sessionId: command.sessionId,
60
+ });
61
+ send(socket, encodeSessionStartedEvent({
62
+ commandId: command.commandId,
63
+ kind: SESSION_STARTED_KIND,
64
+ processAttemptId,
65
+ protocolVersion: MOBIUS_PROTOCOL_VERSION,
66
+ sessionId: command.sessionId,
67
+ }));
68
+ const result = await sessions.runPrompt({
69
+ agent,
70
+ cwd: approvedRoot,
71
+ onActivity: (activity) => {
72
+ send(socket, encodeAgentActivityEvent({
73
+ activityId: activity.activityId,
74
+ activityType: activity.activityType,
75
+ commandId: command.commandId,
76
+ input: activity.input,
77
+ kind: AGENT_ACTIVITY_KIND,
78
+ locations: activity.locations,
79
+ name: activity.name,
80
+ output: activity.output,
81
+ protocolVersion: MOBIUS_PROTOCOL_VERSION,
82
+ sequence: activity.sequence,
83
+ sessionId: command.sessionId,
84
+ status: activity.status,
85
+ title: activity.title,
86
+ toolKind: activity.toolKind,
87
+ }));
88
+ return Promise.resolve();
89
+ },
90
+ onText: (text) => {
91
+ send(socket, encodeAgentMessageDeltaEvent({
92
+ commandId: command.commandId,
93
+ kind: AGENT_MESSAGE_DELTA_KIND,
94
+ protocolVersion: MOBIUS_PROTOCOL_VERSION,
95
+ sessionId: command.sessionId,
96
+ text,
97
+ }));
98
+ return Promise.resolve();
99
+ },
100
+ prompt: command.prompt,
101
+ sessionId: command.sessionId,
102
+ signal,
103
+ });
104
+ send(socket, encodeSessionCompletedEvent({
105
+ commandId: command.commandId,
106
+ kind: SESSION_COMPLETED_KIND,
107
+ protocolVersion: MOBIUS_PROTOCOL_VERSION,
108
+ sessionId: command.sessionId,
109
+ stopReason: result.stopReason,
110
+ }));
111
+ audit.record({
112
+ commandId: command.commandId,
113
+ event: result.stopReason === "cancelled"
114
+ ? "session_cancelled"
115
+ : "session_completed",
116
+ sessionId: command.sessionId,
117
+ });
118
+ }
119
+ catch (error) {
120
+ audit.record({
121
+ commandId: command.commandId,
122
+ event: "session_failed",
123
+ sessionId: command.sessionId,
124
+ });
125
+ reportFailure(socket, command, "agent_execution_failed", "The local agent could not complete the request");
126
+ console.error("Mobius daemon command failed", error);
127
+ }
128
+ }
129
+ function waitForRelayRetry(signal) {
130
+ if (signal.aborted) {
131
+ return Promise.resolve();
132
+ }
133
+ return new Promise((resolve) => {
134
+ const timeout = setTimeout(finish, RELAY_RECONNECT_DELAY_MILLISECONDS);
135
+ function finish() {
136
+ clearTimeout(timeout);
137
+ signal.removeEventListener("abort", finish);
138
+ resolve();
139
+ }
140
+ signal.addEventListener("abort", finish, { once: true });
141
+ });
142
+ }
143
+ async function runRelayConnection(config, audit, sessions, signal) {
144
+ const socket = await connectRelay(config.relayUrl, signal);
145
+ const activeTurns = new Map();
146
+ await new Promise((resolve, reject) => {
147
+ let finished = false;
148
+ const cleanup = () => {
149
+ signal.removeEventListener("abort", stop);
150
+ socket.removeEventListener("close", handleClose);
151
+ socket.removeEventListener("error", handleError);
152
+ socket.removeEventListener("message", handleMessage);
153
+ for (const turn of activeTurns.values()) {
154
+ turn.abortConnection();
155
+ }
156
+ activeTurns.clear();
157
+ };
158
+ const resolveConnection = () => {
159
+ if (finished) {
160
+ return;
161
+ }
162
+ finished = true;
163
+ cleanup();
164
+ resolve();
165
+ };
166
+ const rejectConnection = () => {
167
+ if (finished) {
168
+ return;
169
+ }
170
+ finished = true;
171
+ cleanup();
172
+ reject(new Error("Relay WebSocket failed"));
173
+ };
174
+ const stop = () => {
175
+ socket.close(1000, "Daemon stopped");
176
+ resolveConnection();
177
+ };
178
+ signal.addEventListener("abort", stop, { once: true });
179
+ const handleClose = () => {
180
+ resolveConnection();
181
+ };
182
+ const handleError = () => {
183
+ if (signal.aborted) {
184
+ resolveConnection();
185
+ return;
186
+ }
187
+ rejectConnection();
188
+ };
189
+ const handleMessage = (event) => {
190
+ const encoded = event.data;
191
+ if (typeof encoded !== "string") {
192
+ socket.close(1003, "Text message required");
193
+ return;
194
+ }
195
+ try {
196
+ const kind = decodeMessageKind(encoded);
197
+ if (kind === SESSION_CANCEL_KIND) {
198
+ const cancellation = decodeSessionCancelCommand(encoded);
199
+ const turn = activeTurns.get(cancellation.commandId);
200
+ if (turn === undefined || !turn.matches(cancellation)) {
201
+ console.warn("Mobius daemon ignored cancellation for an inactive turn");
202
+ return;
203
+ }
204
+ if (!turn.requestCancellation()) {
205
+ return;
206
+ }
207
+ audit.record({
208
+ commandId: cancellation.commandId,
209
+ event: "session_cancellation_requested",
210
+ sessionId: cancellation.sessionId,
211
+ });
212
+ void sessions.cancelPrompt(cancellation.sessionId).catch((error) => {
213
+ console.error("Mobius daemon could not cancel the agent turn", error);
214
+ });
215
+ return;
216
+ }
217
+ if (kind !== SESSION_PROMPT_KIND) {
218
+ socket.close(1008, "Unsupported protocol message");
219
+ return;
220
+ }
221
+ const command = decodeSessionPromptCommand(encoded);
222
+ if (activeTurns.has(command.commandId)) {
223
+ reportFailure(socket, command, "duplicate_command", "The command is already running");
224
+ return;
225
+ }
226
+ const turn = new ActiveDaemonTurn(command, new AbortController());
227
+ activeTurns.set(command.commandId, turn);
228
+ void executePrompt(socket, command, config, audit, sessions, turn.signal)
229
+ .catch((error) => {
230
+ console.error("Mobius daemon turn failed", error);
231
+ })
232
+ .finally(() => {
233
+ activeTurns.delete(command.commandId);
234
+ });
235
+ }
236
+ catch (error) {
237
+ console.error("Mobius daemon rejected a message", error);
238
+ socket.close(1008, "Invalid protocol message");
239
+ }
240
+ };
241
+ socket.addEventListener("close", handleClose);
242
+ socket.addEventListener("error", handleError);
243
+ socket.addEventListener("message", handleMessage);
244
+ if (signal.aborted) {
245
+ stop();
246
+ }
247
+ });
248
+ }
249
+ export async function runDaemon(config, audit, signal) {
250
+ const sessions = new AcpSessionManager();
251
+ let retryAnnounced = false;
252
+ try {
253
+ while (!signal.aborted) {
254
+ try {
255
+ await runRelayConnection(config, audit, sessions, signal);
256
+ retryAnnounced = false;
257
+ }
258
+ catch {
259
+ if (signal.aborted) {
260
+ return;
261
+ }
262
+ if (!retryAnnounced) {
263
+ console.warn("Mobius daemon is waiting for the relay");
264
+ retryAnnounced = true;
265
+ }
266
+ }
267
+ await waitForRelayRetry(signal);
268
+ }
269
+ }
270
+ finally {
271
+ await sessions.close();
272
+ }
273
+ }
274
+ //# sourceMappingURL=run-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-daemon.js","sourceRoot":"","sources":["../src/run-daemon.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@moxt-ai/mobius",
3
+ "version": "0.0.1",
4
+ "description": "Mobius CLI for pairing and running local AI agent services.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mobius": "dist/cli.js"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "engines": {
19
+ "node": ">=24.20.0 <25"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/moxt-ai/mobius.git",
27
+ "directory": "packages/cli"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc --project tsconfig.build.json && esbuild src/cli.ts src/index.ts --bundle --platform=node --format=esm --sourcemap --outdir=dist --external:@agentclientprotocol/*",
31
+ "dev": "node --watch src/cli.ts",
32
+ "prepack": "pnpm build",
33
+ "start": "node dist/cli.js",
34
+ "typecheck": "tsc --project tsconfig.json"
35
+ },
36
+ "dependencies": {
37
+ "@agentclientprotocol/claude-agent-acp": "0.73.0",
38
+ "@agentclientprotocol/codex-acp": "1.8.0",
39
+ "@agentclientprotocol/sdk": "^1.4.0"
40
+ },
41
+ "devDependencies": {
42
+ "@moxt-ai/mobius-protocol": "workspace:*",
43
+ "@types/node": "^24.13.3",
44
+ "esbuild": "0.28.1"
45
+ }
46
+ }