@moxt-ai/mobius 0.0.20 → 0.0.22

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 (37) hide show
  1. package/dist/bots/bot-context-applicator.d.ts +14 -0
  2. package/dist/bots/bot-context-applicator.d.ts.map +1 -0
  3. package/dist/bots/bot-context-applicator.js +32 -0
  4. package/dist/bots/bot-context-applicator.js.map +1 -0
  5. package/dist/bots/bot-execution-context.d.ts +20 -0
  6. package/dist/bots/bot-execution-context.d.ts.map +1 -0
  7. package/dist/bots/bot-execution-context.js +82 -0
  8. package/dist/bots/bot-execution-context.js.map +1 -0
  9. package/dist/bots/bot-message-command.d.ts +6 -0
  10. package/dist/bots/bot-message-command.d.ts.map +1 -0
  11. package/dist/bots/bot-message-command.js +140 -0
  12. package/dist/bots/bot-message-command.js.map +1 -0
  13. package/dist/bots/bot-outbound-ipc.d.ts +12 -0
  14. package/dist/bots/bot-outbound-ipc.d.ts.map +1 -0
  15. package/dist/bots/bot-outbound-ipc.js +245 -0
  16. package/dist/bots/bot-outbound-ipc.js.map +1 -0
  17. package/dist/bots/local-bot-grant-store.d.ts +34 -0
  18. package/dist/bots/local-bot-grant-store.d.ts.map +1 -0
  19. package/dist/bots/local-bot-grant-store.js +263 -0
  20. package/dist/bots/local-bot-grant-store.js.map +1 -0
  21. package/dist/cli.js +1924 -209
  22. package/dist/cli.js.map +4 -4
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1970 -264
  26. package/dist/index.js.map +4 -4
  27. package/dist/prompt-artifact-resolver.d.ts +8 -2
  28. package/dist/prompt-artifact-resolver.d.ts.map +1 -1
  29. package/dist/prompt-artifact-resolver.js.map +1 -1
  30. package/dist/relay-connection/session-event-outbox.d.ts +2 -1
  31. package/dist/relay-connection/session-event-outbox.d.ts.map +1 -1
  32. package/dist/relay-connection/session-event-outbox.js +39 -0
  33. package/dist/relay-connection/session-event-outbox.js.map +1 -1
  34. package/dist/run-daemon.d.ts.map +1 -1
  35. package/dist/run-daemon.js +246 -8
  36. package/dist/run-daemon.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import { type BotExecutionBindingApprovalRequest, BotExecutionBindingApprovedEvent, type BotSessionPromptCommand } from "@moxt-ai/mobius-protocol";
2
+ import type { LocalAgentCatalog, LocalAgentDefinition } from "../agent-catalog/local-agent.ts";
3
+ import type { WorkspaceDirectoryService } from "../authorization/workspace-directory.ts";
4
+ export declare class LocalBotAuthorizationError extends Error {
5
+ readonly code: string;
6
+ constructor(code: string, message: string, options?: ErrorOptions);
7
+ }
8
+ export declare class LocalBotGrant {
9
+ readonly agent: LocalAgentDefinition;
10
+ readonly agentIdentityDigest: string;
11
+ readonly allowedDeliveryTargetIds: readonly string[];
12
+ readonly behaviorDigest: string;
13
+ readonly behaviorRevisionId: string;
14
+ readonly bindingId: string;
15
+ readonly bindingRevision: number;
16
+ readonly botId: string;
17
+ readonly expiresAt: number;
18
+ readonly localGrantId: string;
19
+ readonly revocationEpoch: number;
20
+ readonly workspaceIdentityDigest: string;
21
+ readonly workspacePath: string;
22
+ constructor(localGrantId: string, botId: string, behaviorRevisionId: string, behaviorDigest: string, bindingId: string, bindingRevision: number, agent: LocalAgentDefinition, agentIdentityDigest: string, workspacePath: string, workspaceIdentityDigest: string, allowedDeliveryTargetIds: readonly string[], expiresAt: number, revocationEpoch: number);
23
+ }
24
+ export declare class LocalBotGrantStore {
25
+ #private;
26
+ constructor(path: string);
27
+ readonly approve: (request: BotExecutionBindingApprovalRequest, catalog: LocalAgentCatalog, directories: WorkspaceDirectoryService, bindingAuthorityId: string, now: number, signal: AbortSignal) => Promise<BotExecutionBindingApprovedEvent>;
28
+ readonly resolveExecution: (command: BotSessionPromptCommand, catalog: LocalAgentCatalog, directories: WorkspaceDirectoryService, bindingAuthorityId: string, now: number, signal: AbortSignal) => Promise<LocalBotGrant>;
29
+ readonly recordUnavailable: (request: BotExecutionBindingApprovalRequest, code: string, message: string, now: number) => void;
30
+ readonly close: () => void;
31
+ private readonly resolveProposal;
32
+ private readonly revoke;
33
+ }
34
+ //# sourceMappingURL=local-bot-grant-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-bot-grant-store.d.ts","sourceRoot":"","sources":["../../src/bots/local-bot-grant-store.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,kCAAkC,EACvC,gCAAgC,EAChC,KAAK,uBAAuB,EAC/B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAKzF,qBAAa,0BAA2B,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAIpE;CACJ;AAED,qBAAa,aAAa;IACtB,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,YACI,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,oBAAoB,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,aAAa,EAAE,MAAM,EACrB,uBAAuB,EAAE,MAAM,EAC/B,wBAAwB,EAAE,SAAS,MAAM,EAAE,EAC3C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EAe1B;CACJ;AA8ED,qBAAa,kBAAkB;;IAG3B,YAAY,IAAI,EAAE,MAAM,EAgCvB;IAED,QAAQ,CAAC,OAAO,YACH,kCAAkC,WAClC,iBAAiB,eACb,yBAAyB,sBAClB,MAAM,OACrB,MAAM,UACH,WAAW,KACpB,OAAO,CAAC,gCAAgC,CAAC,CA8E1C;IAEF,QAAQ,CAAC,gBAAgB,YACZ,uBAAuB,WACvB,iBAAiB,eACb,yBAAyB,sBAClB,MAAM,OACrB,MAAM,UACH,WAAW,KACpB,OAAO,CAAC,aAAa,CAAC,CAgFvB;IAEF,QAAQ,CAAC,iBAAiB,YACb,kCAAkC,QACrC,MAAM,WACH,MAAM,OACV,MAAM,KACZ,IAAI,CASL;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAEvB;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAsC9B;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAQrB;CACL"}
@@ -0,0 +1,263 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { stat } from "node:fs/promises";
3
+ import { DatabaseSync } from "node:sqlite";
4
+ import { BotExecutionBindingApprovedEvent, } from "@moxt-ai/mobius-protocol";
5
+ import { revalidateExecutable } from "../process/executable.js";
6
+ const LOCAL_BOT_GRANT_LIFETIME_MILLISECONDS = 90 * 24 * 60 * 60 * 1_000;
7
+ export class LocalBotAuthorizationError extends Error {
8
+ code;
9
+ constructor(code, message, options = {}) {
10
+ super(message, options);
11
+ this.code = code;
12
+ this.name = "LocalBotAuthorizationError";
13
+ }
14
+ }
15
+ export class LocalBotGrant {
16
+ agent;
17
+ agentIdentityDigest;
18
+ allowedDeliveryTargetIds;
19
+ behaviorDigest;
20
+ behaviorRevisionId;
21
+ bindingId;
22
+ bindingRevision;
23
+ botId;
24
+ expiresAt;
25
+ localGrantId;
26
+ revocationEpoch;
27
+ workspaceIdentityDigest;
28
+ workspacePath;
29
+ constructor(localGrantId, botId, behaviorRevisionId, behaviorDigest, bindingId, bindingRevision, agent, agentIdentityDigest, workspacePath, workspaceIdentityDigest, allowedDeliveryTargetIds, expiresAt, revocationEpoch) {
30
+ this.localGrantId = localGrantId;
31
+ this.botId = botId;
32
+ this.behaviorRevisionId = behaviorRevisionId;
33
+ this.behaviorDigest = behaviorDigest;
34
+ this.bindingId = bindingId;
35
+ this.bindingRevision = bindingRevision;
36
+ this.agent = agent;
37
+ this.agentIdentityDigest = agentIdentityDigest;
38
+ this.workspacePath = workspacePath;
39
+ this.workspaceIdentityDigest = workspaceIdentityDigest;
40
+ this.allowedDeliveryTargetIds = Object.freeze([...allowedDeliveryTargetIds]);
41
+ this.expiresAt = expiresAt;
42
+ this.revocationEpoch = revocationEpoch;
43
+ }
44
+ }
45
+ function digest(value) {
46
+ return createHash("sha256").update(value, "utf8").digest("hex");
47
+ }
48
+ function agentDigest(agent) {
49
+ return digest(JSON.stringify({
50
+ adapter: agent.adapterIdentity,
51
+ agent: agent.agentIdentity,
52
+ agentVersion: agent.agentVersion,
53
+ arguments: agent.arguments,
54
+ id: agent.id,
55
+ }));
56
+ }
57
+ async function workspaceDigest(path) {
58
+ const metadata = await stat(path);
59
+ if (!metadata.isDirectory()) {
60
+ throw new LocalBotAuthorizationError("binding_incompatible", "The Bot workspace is not a directory");
61
+ }
62
+ return digest(JSON.stringify({
63
+ changedAtMilliseconds: metadata.ctimeMs,
64
+ device: metadata.dev,
65
+ inode: metadata.ino,
66
+ path,
67
+ }));
68
+ }
69
+ function exactTargets(left, right) {
70
+ if (left.length !== right.length) {
71
+ return false;
72
+ }
73
+ const expected = [...left].sort();
74
+ const actual = [...right].sort();
75
+ return expected.every((target, index) => target === actual[index]);
76
+ }
77
+ function rowString(row, key) {
78
+ const value = Reflect.get(row, key);
79
+ if (typeof value !== "string") {
80
+ throw new LocalBotAuthorizationError("local_grant_invalid", "The local Bot grant is invalid");
81
+ }
82
+ return value;
83
+ }
84
+ function rowInteger(row, key) {
85
+ const value = Reflect.get(row, key);
86
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) {
87
+ throw new LocalBotAuthorizationError("local_grant_invalid", "The local Bot grant is invalid");
88
+ }
89
+ return value;
90
+ }
91
+ function parseTargets(encoded) {
92
+ let value;
93
+ try {
94
+ value = JSON.parse(encoded);
95
+ }
96
+ catch (cause) {
97
+ throw new LocalBotAuthorizationError("local_grant_invalid", "The local Bot grant is invalid", { cause });
98
+ }
99
+ if (!Array.isArray(value) || value.some((target) => typeof target !== "string")) {
100
+ throw new LocalBotAuthorizationError("local_grant_invalid", "The local Bot grant is invalid");
101
+ }
102
+ return value.filter((target) => typeof target === "string");
103
+ }
104
+ export class LocalBotGrantStore {
105
+ #database;
106
+ constructor(path) {
107
+ this.#database = new DatabaseSync(path);
108
+ this.#database.exec(`
109
+ CREATE TABLE IF NOT EXISTS local_bot_grants (
110
+ local_grant_id TEXT PRIMARY KEY,
111
+ bot_id TEXT NOT NULL,
112
+ behavior_revision_id TEXT NOT NULL,
113
+ behavior_digest TEXT NOT NULL,
114
+ binding_id TEXT NOT NULL UNIQUE,
115
+ binding_revision INTEGER NOT NULL,
116
+ agent_ref TEXT NOT NULL,
117
+ agent_identity_digest TEXT NOT NULL,
118
+ workspace_ref TEXT NOT NULL,
119
+ workspace_path TEXT NOT NULL,
120
+ workspace_identity_digest TEXT NOT NULL,
121
+ allowed_delivery_target_ids_json TEXT NOT NULL,
122
+ unattended_policy_json TEXT NOT NULL,
123
+ created_at INTEGER NOT NULL,
124
+ expires_at INTEGER NOT NULL,
125
+ revocation_epoch INTEGER NOT NULL DEFAULT 0,
126
+ revoked_at INTEGER
127
+ ) STRICT;
128
+ CREATE TABLE IF NOT EXISTS local_bot_binding_resolutions (
129
+ request_id TEXT PRIMARY KEY,
130
+ binding_id TEXT NOT NULL,
131
+ local_grant_id TEXT NOT NULL,
132
+ resolved_at INTEGER NOT NULL,
133
+ result TEXT NOT NULL CHECK (result IN ('approved', 'unavailable')),
134
+ error_code TEXT,
135
+ error_message TEXT
136
+ ) STRICT;
137
+ `);
138
+ }
139
+ approve = async (request, catalog, directories, bindingAuthorityId, now, signal) => {
140
+ signal.throwIfAborted();
141
+ const existing = this.#database
142
+ .prepare(`SELECT grants.* FROM local_bot_binding_resolutions AS resolutions
143
+ INNER JOIN local_bot_grants AS grants
144
+ ON grants.local_grant_id = resolutions.local_grant_id
145
+ WHERE resolutions.request_id = ? AND resolutions.binding_id = ?
146
+ AND resolutions.result = 'approved'`)
147
+ .get(request.requestId, request.bindingId);
148
+ if (existing !== undefined) {
149
+ return new BotExecutionBindingApprovedEvent(request.requestId, request.botId, request.behaviorRevisionId, request.bindingId, request.bindingRevision, rowString(existing, "local_grant_id"), rowString(existing, "agent_identity_digest"), rowString(existing, "workspace_identity_digest"));
150
+ }
151
+ const resolved = await this.resolveProposal(request, catalog, directories, bindingAuthorityId, signal);
152
+ const localGrantId = `lbg_${randomUUID()}`;
153
+ const expiresAt = now + LOCAL_BOT_GRANT_LIFETIME_MILLISECONDS;
154
+ this.#database.exec("BEGIN IMMEDIATE");
155
+ try {
156
+ this.#database
157
+ .prepare(`INSERT INTO local_bot_grants (
158
+ local_grant_id, bot_id, behavior_revision_id, behavior_digest,
159
+ binding_id, binding_revision, agent_ref,
160
+ agent_identity_digest, workspace_ref, workspace_path,
161
+ workspace_identity_digest, allowed_delivery_target_ids_json,
162
+ unattended_policy_json, created_at, expires_at
163
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
164
+ .run(localGrantId, request.botId, request.behaviorRevisionId, request.behaviorDigest, request.bindingId, request.bindingRevision, request.agentRef, resolved.agentIdentityDigest, request.workspaceRef, resolved.workspacePath, resolved.workspaceIdentityDigest, JSON.stringify(request.allowedDeliveryTargets.map((target) => target.deliveryTargetId)), JSON.stringify({ localSideEffects: "owner-approval-required" }), now, expiresAt);
165
+ this.#database
166
+ .prepare(`INSERT INTO local_bot_binding_resolutions (
167
+ request_id, binding_id, local_grant_id, resolved_at, result
168
+ ) VALUES (?, ?, ?, ?, 'approved')`)
169
+ .run(request.requestId, request.bindingId, localGrantId, now);
170
+ this.#database.exec("COMMIT");
171
+ }
172
+ catch (cause) {
173
+ this.#database.exec("ROLLBACK");
174
+ throw cause;
175
+ }
176
+ signal.throwIfAborted();
177
+ return new BotExecutionBindingApprovedEvent(request.requestId, request.botId, request.behaviorRevisionId, request.bindingId, request.bindingRevision, localGrantId, resolved.agentIdentityDigest, resolved.workspaceIdentityDigest);
178
+ };
179
+ resolveExecution = async (command, catalog, directories, bindingAuthorityId, now, signal) => {
180
+ signal.throwIfAborted();
181
+ const row = this.#database
182
+ .prepare(`SELECT * FROM local_bot_grants
183
+ WHERE local_grant_id = ? AND bot_id = ?
184
+ AND behavior_revision_id = ? AND behavior_digest = ?
185
+ AND binding_id = ? AND binding_revision = ?
186
+ AND agent_ref = ? AND workspace_ref = ?
187
+ AND revoked_at IS NULL AND expires_at > ?`)
188
+ .get(command.localGrantId, command.botId, command.behaviorRevisionId, command.behaviorDigest, command.bindingId, command.bindingRevision, command.agentId, command.directoryId, now);
189
+ if (row === undefined) {
190
+ throw new LocalBotAuthorizationError("binding_not_approved", "The Bot execution binding is not locally approved");
191
+ }
192
+ const approvedTargets = parseTargets(rowString(row, "allowed_delivery_target_ids_json"));
193
+ const requestedTargets = command.allowedDeliveryTargets.map((target) => target.deliveryTargetId);
194
+ if (!exactTargets(approvedTargets, requestedTargets)) {
195
+ throw new LocalBotAuthorizationError("binding_not_approved", "The Bot execution target policy changed after local approval");
196
+ }
197
+ const agent = catalog.find(command.agentId);
198
+ const [adapterUnchanged, agentUnchanged] = await Promise.all([
199
+ revalidateExecutable(agent.adapterIdentity),
200
+ revalidateExecutable(agent.agentIdentity),
201
+ ]);
202
+ signal.throwIfAborted();
203
+ const workspacePath = await directories.resolve(bindingAuthorityId, command.directoryId, signal);
204
+ const currentAgentDigest = agentDigest(agent);
205
+ const currentWorkspaceDigest = await workspaceDigest(workspacePath);
206
+ signal.throwIfAborted();
207
+ if (!adapterUnchanged ||
208
+ !agentUnchanged ||
209
+ currentAgentDigest !== rowString(row, "agent_identity_digest") ||
210
+ currentWorkspaceDigest !== rowString(row, "workspace_identity_digest") ||
211
+ workspacePath !== rowString(row, "workspace_path")) {
212
+ this.revoke(rowString(row, "local_grant_id"), now);
213
+ throw new LocalBotAuthorizationError("binding_not_approved", "The Bot execution target changed and requires local approval");
214
+ }
215
+ if (command.behaviorInstructions.length > 0 && !agent.capabilities.embeddedContextPrompt) {
216
+ throw new LocalBotAuthorizationError("binding_incompatible", "The local Agent cannot apply the approved Bot behavior");
217
+ }
218
+ return new LocalBotGrant(rowString(row, "local_grant_id"), command.botId, command.behaviorRevisionId, command.behaviorDigest, command.bindingId, command.bindingRevision, agent, currentAgentDigest, workspacePath, currentWorkspaceDigest, approvedTargets, rowInteger(row, "expires_at"), rowInteger(row, "revocation_epoch"));
219
+ };
220
+ recordUnavailable = (request, code, message, now) => {
221
+ this.#database
222
+ .prepare(`INSERT OR IGNORE INTO local_bot_binding_resolutions (
223
+ request_id, binding_id, local_grant_id, resolved_at,
224
+ result, error_code, error_message
225
+ ) VALUES (?, ?, '', ?, 'unavailable', ?, ?)`)
226
+ .run(request.requestId, request.bindingId, now, code, message);
227
+ };
228
+ close = () => {
229
+ this.#database.close();
230
+ };
231
+ resolveProposal = async (request, catalog, directories, bindingAuthorityId, signal) => {
232
+ const agent = catalog.find(request.agentRef);
233
+ if (request.requiredCapabilities.includes("embedded-context") && !agent.capabilities.embeddedContextPrompt) {
234
+ throw new LocalBotAuthorizationError("binding_incompatible", "The local Agent cannot apply embedded Bot context");
235
+ }
236
+ if (request.requiredCapabilities.some((capability) => capability !== "embedded-context")) {
237
+ throw new LocalBotAuthorizationError("binding_incompatible", "The Bot requires an unsupported local Agent capability");
238
+ }
239
+ const [adapterUnchanged, agentUnchanged] = await Promise.all([
240
+ revalidateExecutable(agent.adapterIdentity),
241
+ revalidateExecutable(agent.agentIdentity),
242
+ ]);
243
+ signal.throwIfAborted();
244
+ if (!adapterUnchanged || !agentUnchanged) {
245
+ throw new LocalBotAuthorizationError("binding_incompatible", "The local Agent executable changed before approval");
246
+ }
247
+ const workspacePath = await directories.resolve(bindingAuthorityId, request.workspaceRef, signal);
248
+ return {
249
+ agent,
250
+ agentIdentityDigest: agentDigest(agent),
251
+ workspaceIdentityDigest: await workspaceDigest(workspacePath),
252
+ workspacePath,
253
+ };
254
+ };
255
+ revoke = (localGrantId, now) => {
256
+ this.#database
257
+ .prepare(`UPDATE local_bot_grants
258
+ SET revoked_at = COALESCE(revoked_at, ?), revocation_epoch = revocation_epoch + 1
259
+ WHERE local_grant_id = ? AND revoked_at IS NULL`)
260
+ .run(now, localGrantId);
261
+ };
262
+ }
263
+ //# sourceMappingURL=local-bot-grant-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-bot-grant-store.js","sourceRoot":"","sources":["../../src/bots/local-bot-grant-store.ts"],"names":[],"mappings":"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"}