@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.
- package/dist/bots/bot-context-applicator.d.ts +14 -0
- package/dist/bots/bot-context-applicator.d.ts.map +1 -0
- package/dist/bots/bot-context-applicator.js +32 -0
- package/dist/bots/bot-context-applicator.js.map +1 -0
- package/dist/bots/bot-execution-context.d.ts +20 -0
- package/dist/bots/bot-execution-context.d.ts.map +1 -0
- package/dist/bots/bot-execution-context.js +82 -0
- package/dist/bots/bot-execution-context.js.map +1 -0
- package/dist/bots/bot-message-command.d.ts +6 -0
- package/dist/bots/bot-message-command.d.ts.map +1 -0
- package/dist/bots/bot-message-command.js +140 -0
- package/dist/bots/bot-message-command.js.map +1 -0
- package/dist/bots/bot-outbound-ipc.d.ts +12 -0
- package/dist/bots/bot-outbound-ipc.d.ts.map +1 -0
- package/dist/bots/bot-outbound-ipc.js +245 -0
- package/dist/bots/bot-outbound-ipc.js.map +1 -0
- package/dist/bots/local-bot-grant-store.d.ts +34 -0
- package/dist/bots/local-bot-grant-store.d.ts.map +1 -0
- package/dist/bots/local-bot-grant-store.js +263 -0
- package/dist/bots/local-bot-grant-store.js.map +1 -0
- package/dist/cli.js +1924 -209
- package/dist/cli.js.map +4 -4
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1970 -264
- package/dist/index.js.map +4 -4
- package/dist/prompt-artifact-resolver.d.ts +8 -2
- package/dist/prompt-artifact-resolver.d.ts.map +1 -1
- package/dist/prompt-artifact-resolver.js.map +1 -1
- package/dist/relay-connection/session-event-outbox.d.ts +2 -1
- package/dist/relay-connection/session-event-outbox.d.ts.map +1 -1
- package/dist/relay-connection/session-event-outbox.js +39 -0
- package/dist/relay-connection/session-event-outbox.js.map +1 -1
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +246 -8
- package/dist/run-daemon.js.map +1 -1
- 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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"}
|