sealbridge 0.0.1 → 0.2.0
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/NOTICE +43 -0
- package/README.ja.md +397 -0
- package/README.md +567 -1
- package/dist/cli/dist/acp.d.ts +2 -0
- package/dist/cli/dist/acp.js +6 -0
- package/dist/cli/dist/acp.js.map +1 -0
- package/dist/cli/dist/approval-summary.d.ts +2 -0
- package/dist/cli/dist/approval-summary.js +32 -0
- package/dist/cli/dist/approval-summary.js.map +1 -0
- package/dist/cli/dist/board.d.ts +47 -0
- package/dist/cli/dist/board.js +255 -0
- package/dist/cli/dist/board.js.map +1 -0
- package/dist/cli/dist/contacts.d.ts +18 -0
- package/dist/cli/dist/contacts.js +154 -0
- package/dist/cli/dist/contacts.js.map +1 -0
- package/dist/cli/dist/doctor.d.ts +13 -0
- package/dist/cli/dist/doctor.js +30 -0
- package/dist/cli/dist/doctor.js.map +1 -0
- package/dist/cli/dist/error-messages.d.ts +2 -0
- package/dist/cli/dist/error-messages.js +24 -0
- package/dist/cli/dist/error-messages.js.map +1 -0
- package/dist/cli/dist/index.d.ts +2 -0
- package/dist/cli/dist/index.js +194 -0
- package/dist/cli/dist/index.js.map +1 -0
- package/dist/cli/dist/invite-share.d.ts +16 -0
- package/dist/cli/dist/invite-share.js +163 -0
- package/dist/cli/dist/invite-share.js.map +1 -0
- package/dist/cli/dist/mcp.d.ts +17 -0
- package/dist/cli/dist/mcp.js +105 -0
- package/dist/cli/dist/mcp.js.map +1 -0
- package/dist/cli/dist/network.d.ts +1 -0
- package/dist/cli/dist/network.js +396 -0
- package/dist/cli/dist/network.js.map +1 -0
- package/dist/cli/dist/public-settings.d.ts +27 -0
- package/dist/cli/dist/public-settings.js +33 -0
- package/dist/cli/dist/public-settings.js.map +1 -0
- package/dist/cli/dist/receipt.d.ts +39 -0
- package/dist/cli/dist/receipt.js +90 -0
- package/dist/cli/dist/receipt.js.map +1 -0
- package/dist/cli/dist/receive-hook.d.ts +2 -0
- package/dist/cli/dist/receive-hook.js +35 -0
- package/dist/cli/dist/receive-hook.js.map +1 -0
- package/dist/cli/dist/task-input.d.ts +2 -0
- package/dist/cli/dist/task-input.js +19 -0
- package/dist/cli/dist/task-input.js.map +1 -0
- package/dist/cli/dist/wake-hook.d.ts +3 -0
- package/dist/cli/dist/wake-hook.js +32 -0
- package/dist/cli/dist/wake-hook.js.map +1 -0
- package/dist/examples/two-owner-demo/alice-policy.json +4 -0
- package/dist/examples/two-owner-demo/bob-policy.json +4 -0
- package/dist/examples/two-owner-demo/dist/run-demo.d.ts +71 -0
- package/dist/examples/two-owner-demo/dist/run-demo.js +383 -0
- package/dist/examples/two-owner-demo/dist/run-demo.js.map +1 -0
- package/dist/package.json +1 -0
- package/dist/packages/adapters/dist/command.d.ts +122 -0
- package/dist/packages/adapters/dist/command.js +378 -0
- package/dist/packages/adapters/dist/command.js.map +1 -0
- package/dist/packages/adapters/dist/credential-proxy.d.ts +37 -0
- package/dist/packages/adapters/dist/credential-proxy.js +363 -0
- package/dist/packages/adapters/dist/credential-proxy.js.map +1 -0
- package/dist/packages/adapters/dist/index.d.ts +6 -0
- package/dist/packages/adapters/dist/index.js +6 -0
- package/dist/packages/adapters/dist/index.js.map +1 -0
- package/dist/packages/adapters/dist/mcp.d.ts +32 -0
- package/dist/packages/adapters/dist/mcp.js +87 -0
- package/dist/packages/adapters/dist/mcp.js.map +1 -0
- package/dist/packages/adapters/dist/openai.d.ts +23 -0
- package/dist/packages/adapters/dist/openai.js +81 -0
- package/dist/packages/adapters/dist/openai.js.map +1 -0
- package/dist/packages/adapters/dist/sandbox.d.ts +45 -0
- package/dist/packages/adapters/dist/sandbox.js +60 -0
- package/dist/packages/adapters/dist/sandbox.js.map +1 -0
- package/dist/packages/core/dist/capability.d.ts +36 -0
- package/dist/packages/core/dist/capability.js +203 -0
- package/dist/packages/core/dist/capability.js.map +1 -0
- package/dist/packages/core/dist/contract.d.ts +33 -0
- package/dist/packages/core/dist/contract.js +97 -0
- package/dist/packages/core/dist/contract.js.map +1 -0
- package/dist/packages/core/dist/crypto.d.ts +34 -0
- package/dist/packages/core/dist/crypto.js +329 -0
- package/dist/packages/core/dist/crypto.js.map +1 -0
- package/dist/packages/core/dist/discovery.d.ts +129 -0
- package/dist/packages/core/dist/discovery.js +527 -0
- package/dist/packages/core/dist/discovery.js.map +1 -0
- package/dist/packages/core/dist/edge.d.ts +4 -0
- package/dist/packages/core/dist/edge.js +6 -0
- package/dist/packages/core/dist/edge.js.map +1 -0
- package/dist/packages/core/dist/index.d.ts +9 -0
- package/dist/packages/core/dist/index.js +10 -0
- package/dist/packages/core/dist/index.js.map +1 -0
- package/dist/packages/core/dist/receipts.d.ts +9 -0
- package/dist/packages/core/dist/receipts.js +67 -0
- package/dist/packages/core/dist/receipts.js.map +1 -0
- package/dist/packages/core/dist/relay-auth.d.ts +40 -0
- package/dist/packages/core/dist/relay-auth.js +106 -0
- package/dist/packages/core/dist/relay-auth.js.map +1 -0
- package/dist/packages/core/dist/revocation.d.ts +58 -0
- package/dist/packages/core/dist/revocation.js +112 -0
- package/dist/packages/core/dist/revocation.js.map +1 -0
- package/dist/packages/core/dist/schema.d.ts +11 -0
- package/dist/packages/core/dist/schema.js +48 -0
- package/dist/packages/core/dist/schema.js.map +1 -0
- package/dist/packages/core/dist/types.d.ts +172 -0
- package/dist/packages/core/dist/types.js +2 -0
- package/dist/packages/core/dist/types.js.map +1 -0
- package/dist/packages/ledger/dist/index.d.ts +84 -0
- package/dist/packages/ledger/dist/index.js +269 -0
- package/dist/packages/ledger/dist/index.js.map +1 -0
- package/dist/packages/relay/dist/fetch.d.ts +250 -0
- package/dist/packages/relay/dist/fetch.js +1401 -0
- package/dist/packages/relay/dist/fetch.js.map +1 -0
- package/dist/packages/relay/dist/index.d.ts +103 -0
- package/dist/packages/relay/dist/index.js +855 -0
- package/dist/packages/relay/dist/index.js.map +1 -0
- package/dist/packages/relay/dist/journal.d.ts +77 -0
- package/dist/packages/relay/dist/journal.js +339 -0
- package/dist/packages/relay/dist/journal.js.map +1 -0
- package/dist/packages/relay/dist/notifications.d.ts +63 -0
- package/dist/packages/relay/dist/notifications.js +55 -0
- package/dist/packages/relay/dist/notifications.js.map +1 -0
- package/dist/packages/relay/dist/retry.d.ts +12 -0
- package/dist/packages/relay/dist/retry.js +59 -0
- package/dist/packages/relay/dist/retry.js.map +1 -0
- package/dist/packages/relay/dist/ssrf.d.ts +32 -0
- package/dist/packages/relay/dist/ssrf.js +213 -0
- package/dist/packages/relay/dist/ssrf.js.map +1 -0
- package/dist/packages/relay/dist/worker.d.ts +92 -0
- package/dist/packages/relay/dist/worker.js +460 -0
- package/dist/packages/relay/dist/worker.js.map +1 -0
- package/dist/packages/runtime/dist/a2a.d.ts +8 -0
- package/dist/packages/runtime/dist/a2a.js +69 -0
- package/dist/packages/runtime/dist/a2a.js.map +1 -0
- package/dist/packages/runtime/dist/adapter.d.ts +51 -0
- package/dist/packages/runtime/dist/adapter.js +2 -0
- package/dist/packages/runtime/dist/adapter.js.map +1 -0
- package/dist/packages/runtime/dist/approval-providers.d.ts +99 -0
- package/dist/packages/runtime/dist/approval-providers.js +269 -0
- package/dist/packages/runtime/dist/approval-providers.js.map +1 -0
- package/dist/packages/runtime/dist/daily-limit.d.ts +2 -0
- package/dist/packages/runtime/dist/daily-limit.js +54 -0
- package/dist/packages/runtime/dist/daily-limit.js.map +1 -0
- package/dist/packages/runtime/dist/gateway.d.ts +35 -0
- package/dist/packages/runtime/dist/gateway.js +92 -0
- package/dist/packages/runtime/dist/gateway.js.map +1 -0
- package/dist/packages/runtime/dist/inbox.d.ts +10 -0
- package/dist/packages/runtime/dist/inbox.js +24 -0
- package/dist/packages/runtime/dist/inbox.js.map +1 -0
- package/dist/packages/runtime/dist/index.d.ts +13 -0
- package/dist/packages/runtime/dist/index.js +14 -0
- package/dist/packages/runtime/dist/index.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-server.d.ts +90 -0
- package/dist/packages/runtime/dist/mcp-server.js +647 -0
- package/dist/packages/runtime/dist/mcp-server.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +3 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.js +507 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -0
- package/dist/packages/runtime/dist/mcp.d.ts +73 -0
- package/dist/packages/runtime/dist/mcp.js +67 -0
- package/dist/packages/runtime/dist/mcp.js.map +1 -0
- package/dist/packages/runtime/dist/policy.d.ts +19 -0
- package/dist/packages/runtime/dist/policy.js +41 -0
- package/dist/packages/runtime/dist/policy.js.map +1 -0
- package/dist/packages/runtime/dist/quota.d.ts +39 -0
- package/dist/packages/runtime/dist/quota.js +147 -0
- package/dist/packages/runtime/dist/quota.js.map +1 -0
- package/dist/packages/runtime/dist/session-audit.d.ts +107 -0
- package/dist/packages/runtime/dist/session-audit.js +520 -0
- package/dist/packages/runtime/dist/session-audit.js.map +1 -0
- package/dist/packages/runtime/dist/session-timeouts.d.ts +33 -0
- package/dist/packages/runtime/dist/session-timeouts.js +62 -0
- package/dist/packages/runtime/dist/session-timeouts.js.map +1 -0
- package/dist/packages/runtime/dist/session.d.ts +323 -0
- package/dist/packages/runtime/dist/session.js +2252 -0
- package/dist/packages/runtime/dist/session.js.map +1 -0
- package/dist/packages/runtime/dist/task-journal.d.ts +36 -0
- package/dist/packages/runtime/dist/task-journal.js +104 -0
- package/dist/packages/runtime/dist/task-journal.js.map +1 -0
- package/dist/packages/runtime/dist/verifier.d.ts +64 -0
- package/dist/packages/runtime/dist/verifier.js +109 -0
- package/dist/packages/runtime/dist/verifier.js.map +1 -0
- package/dist/packages/sandbox/dist/container.d.ts +33 -0
- package/dist/packages/sandbox/dist/container.js +189 -0
- package/dist/packages/sandbox/dist/container.js.map +1 -0
- package/dist/packages/sandbox/dist/index.d.ts +34 -0
- package/dist/packages/sandbox/dist/index.js +179 -0
- package/dist/packages/sandbox/dist/index.js.map +1 -0
- package/dist/packages/sandbox/dist/permission.d.ts +58 -0
- package/dist/packages/sandbox/dist/permission.js +90 -0
- package/dist/packages/sandbox/dist/permission.js.map +1 -0
- package/dist/spec/README.ja.md +76 -0
- package/dist/spec/README.md +135 -0
- package/dist/spec/ack-receipt.schema.json +77 -0
- package/dist/spec/agent-card.schema.json +83 -0
- package/dist/spec/approval-receipt.schema.json +94 -0
- package/dist/spec/audit-entry.schema.json +101 -0
- package/dist/spec/capability-token.schema.json +133 -0
- package/dist/spec/envelope.schema.json +197 -0
- package/dist/spec/examples/sample-ack-receipt.json +16 -0
- package/dist/spec/examples/sample-agent-card.json +35 -0
- package/dist/spec/examples/sample-approval-receipt.json +18 -0
- package/dist/spec/examples/sample-audit-entry.json +37 -0
- package/dist/spec/examples/sample-capability-token.json +39 -0
- package/dist/spec/examples/sample-envelope.json +21 -0
- package/dist/spec/examples/sample-task-manifest.json +141 -0
- package/dist/spec/examples/sample-usage-receipt.json +19 -0
- package/dist/spec/task-manifest.schema.json +422 -0
- package/dist/spec/usage-receipt.schema.json +91 -0
- package/package.json +61 -5
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import type { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
3
|
+
import { CapabilityGuard } from '@acp/core';
|
|
4
|
+
import type { CapabilityToken, CapabilityContext, ApprovalReceipt } from '@acp/core';
|
|
5
|
+
import { ApprovalGate } from './policy.js';
|
|
6
|
+
import type { QuotaMeter } from './quota.js';
|
|
7
|
+
export interface ToolBackend {
|
|
8
|
+
callTool(params: {
|
|
9
|
+
name: string;
|
|
10
|
+
arguments: Record<string, unknown>;
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface ToolDefinition {
|
|
14
|
+
resource: (args: Record<string, unknown>) => string;
|
|
15
|
+
readOnly: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class MCPProxy {
|
|
18
|
+
readonly guard: CapabilityGuard;
|
|
19
|
+
private chain;
|
|
20
|
+
private context;
|
|
21
|
+
constructor(options: {
|
|
22
|
+
chain: CapabilityToken[];
|
|
23
|
+
context: CapabilityContext;
|
|
24
|
+
backend: ToolBackend | Client;
|
|
25
|
+
tools: Record<string, ToolDefinition>;
|
|
26
|
+
gate: ApprovalGate;
|
|
27
|
+
meter: QuotaMeter;
|
|
28
|
+
isActive: () => boolean;
|
|
29
|
+
onAudit?: (event: string, details: Record<string, string>) => void;
|
|
30
|
+
guard?: CapabilityGuard;
|
|
31
|
+
});
|
|
32
|
+
private options;
|
|
33
|
+
callTool(name: string, args: Record<string, unknown>, approval?: ApprovalReceipt): Promise<unknown>;
|
|
34
|
+
createServer(): Server;
|
|
35
|
+
}
|
|
36
|
+
/** Connect a genuine SDK client/server pair without sockets or credentials. */
|
|
37
|
+
export declare function connectMCPTools(handler: (name: string, args: Record<string, unknown>) => Promise<unknown>): Promise<{
|
|
38
|
+
client: Client<{
|
|
39
|
+
method: string;
|
|
40
|
+
params?: {
|
|
41
|
+
[x: string]: unknown;
|
|
42
|
+
_meta?: {
|
|
43
|
+
[x: string]: unknown;
|
|
44
|
+
progressToken?: string | number | undefined;
|
|
45
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
46
|
+
taskId: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
} | undefined;
|
|
49
|
+
} | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
method: string;
|
|
52
|
+
params?: {
|
|
53
|
+
[x: string]: unknown;
|
|
54
|
+
_meta?: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
progressToken?: string | number | undefined;
|
|
57
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
58
|
+
taskId: string;
|
|
59
|
+
} | undefined;
|
|
60
|
+
} | undefined;
|
|
61
|
+
} | undefined;
|
|
62
|
+
}, {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
_meta?: {
|
|
65
|
+
[x: string]: unknown;
|
|
66
|
+
progressToken?: string | number | undefined;
|
|
67
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
68
|
+
taskId: string;
|
|
69
|
+
} | undefined;
|
|
70
|
+
} | undefined;
|
|
71
|
+
}>;
|
|
72
|
+
close: () => Promise<void>;
|
|
73
|
+
}>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0 AND MIT
|
|
2
|
+
// Adapted from newtro/delegateos src/mcp/plugin.ts (MIT), Scott Smith.
|
|
3
|
+
// ACP denies every unconfigured tool; no metadata-free passthrough is supported.
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { CallToolRequestSchema, CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import { CapabilityGuard, digest } from '../../core/dist/index.js';
|
|
7
|
+
export class MCPProxy {
|
|
8
|
+
guard;
|
|
9
|
+
chain;
|
|
10
|
+
context;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.chain = structuredClone(options.chain);
|
|
14
|
+
this.context = structuredClone(options.context);
|
|
15
|
+
this.guard = options.guard ?? new CapabilityGuard();
|
|
16
|
+
}
|
|
17
|
+
options;
|
|
18
|
+
async callTool(name, args, approval) {
|
|
19
|
+
const frozenArgs = structuredClone(args);
|
|
20
|
+
try {
|
|
21
|
+
if (!this.options.isActive())
|
|
22
|
+
throw new Error('CAPABILITY_VIOLATION: inactive contract');
|
|
23
|
+
const definition = this.options.tools[name];
|
|
24
|
+
if (!Object.hasOwn(this.options.tools, name) || !definition)
|
|
25
|
+
throw new Error('CAPABILITY_VIOLATION: unknown tool');
|
|
26
|
+
this.guard.authorize(this.chain, { ...this.context, now: Date.now() }, name, frozenArgs, definition.resource(frozenArgs));
|
|
27
|
+
if (!definition.readOnly)
|
|
28
|
+
this.options.gate.require(this.context.taskId, 'external_side_effect', { name, args: frozenArgs }, approval);
|
|
29
|
+
this.options.meter.record(0, 0, 1);
|
|
30
|
+
const result = CallToolResultSchema.parse(await this.options.backend.callTool({ name, arguments: frozenArgs }));
|
|
31
|
+
this.options.onAudit?.('TOOL_ALLOWED', { name, resultDigest: digest(result) });
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
const reason = String(e);
|
|
36
|
+
this.options.onAudit?.(reason.includes('TOKEN_REVOKED')
|
|
37
|
+
? 'TOKEN_REVOKED'
|
|
38
|
+
: reason.includes('BUDGET')
|
|
39
|
+
? 'BUDGET_EXCEEDED'
|
|
40
|
+
: 'CAPABILITY_VIOLATION', { name, reason });
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
createServer() {
|
|
45
|
+
const server = new Server({ name: 'acp-capguard', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
46
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => CallToolResultSchema.parse(await this.callTool(request.params.name, request.params.arguments ?? {})));
|
|
47
|
+
return server;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Connect a genuine SDK client/server pair without sockets or credentials. */
|
|
51
|
+
export async function connectMCPTools(handler) {
|
|
52
|
+
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
53
|
+
const { InMemoryTransport } = await import('@modelcontextprotocol/sdk/inMemory.js');
|
|
54
|
+
const server = new Server({ name: 'acp-owner-tools', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
55
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => CallToolResultSchema.parse(await handler(req.params.name, req.params.arguments ?? {})));
|
|
56
|
+
const client = new Client({ name: 'acp-gateway', version: '0.1.0' });
|
|
57
|
+
const [a, b] = InMemoryTransport.createLinkedPair();
|
|
58
|
+
await Promise.all([server.connect(a), client.connect(b)]);
|
|
59
|
+
return {
|
|
60
|
+
client,
|
|
61
|
+
close: async () => {
|
|
62
|
+
await client.close();
|
|
63
|
+
await server.close();
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ApprovalReceipt, Gate, KeyPair } from '@acp/core';
|
|
2
|
+
export declare const gates: Gate[];
|
|
3
|
+
export interface OwnerPolicy {
|
|
4
|
+
requiredGates: Gate[];
|
|
5
|
+
autoApprove: Gate[];
|
|
6
|
+
}
|
|
7
|
+
export declare class ApprovalGate {
|
|
8
|
+
readonly ownerDid: string;
|
|
9
|
+
private used;
|
|
10
|
+
readonly policy: OwnerPolicy;
|
|
11
|
+
constructor(ownerDid: string, policy: OwnerPolicy);
|
|
12
|
+
require(taskId: string, gate: Gate, target: unknown, receipt?: ApprovalReceipt): ApprovalReceipt;
|
|
13
|
+
autoApprove(taskId: string, gate: Gate, target: unknown, owner: KeyPair): ApprovalReceipt;
|
|
14
|
+
}
|
|
15
|
+
export declare function approvalTarget(taskId: string, gate: Gate, details: unknown): {
|
|
16
|
+
taskId: string;
|
|
17
|
+
gate: Gate;
|
|
18
|
+
detailsDigest: string;
|
|
19
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { verifyApproval, signApproval, digest } from '../../core/dist/index.js';
|
|
3
|
+
export const gates = [
|
|
4
|
+
'contract_acceptance',
|
|
5
|
+
'external_side_effect',
|
|
6
|
+
'budget_increase',
|
|
7
|
+
'redelegation',
|
|
8
|
+
'final_verification',
|
|
9
|
+
];
|
|
10
|
+
export class ApprovalGate {
|
|
11
|
+
ownerDid;
|
|
12
|
+
used = new Set();
|
|
13
|
+
policy;
|
|
14
|
+
constructor(ownerDid, policy) {
|
|
15
|
+
this.ownerDid = ownerDid;
|
|
16
|
+
if (policy.autoApprove.some((g) => ['external_side_effect', 'budget_increase'].includes(g)) ||
|
|
17
|
+
[...policy.requiredGates, ...policy.autoApprove].some((g) => !gates.includes(g)))
|
|
18
|
+
throw new Error('INVALID_OWNER_POLICY');
|
|
19
|
+
this.policy = structuredClone(policy);
|
|
20
|
+
}
|
|
21
|
+
require(taskId, gate, target, receipt) {
|
|
22
|
+
if (!gates.includes(gate) ||
|
|
23
|
+
!receipt ||
|
|
24
|
+
!verifyApproval(receipt, this.ownerDid, taskId, gate, target) ||
|
|
25
|
+
this.used.has(receipt.payload.receiptId))
|
|
26
|
+
throw new Error('APPROVAL_REQUIRED: ' + gate);
|
|
27
|
+
this.used.add(receipt.payload.receiptId);
|
|
28
|
+
return receipt;
|
|
29
|
+
}
|
|
30
|
+
autoApprove(taskId, gate, target, owner) {
|
|
31
|
+
if (owner.did !== this.ownerDid ||
|
|
32
|
+
!this.policy.autoApprove.includes(gate) ||
|
|
33
|
+
this.policy.requiredGates.includes(gate))
|
|
34
|
+
throw new Error('HITL_REQUIRED: ' + gate);
|
|
35
|
+
return signApproval(taskId, gate, target, owner);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function approvalTarget(taskId, gate, details) {
|
|
39
|
+
return { taskId, gate, detailsDigest: digest(details) };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B,qBAAqB;IACrB,sBAAsB;IACtB,iBAAiB;IACjB,cAAc;IACd,oBAAoB;CACrB,CAAC;AAKF,MAAM,OAAO,YAAY;IAIZ;IAHH,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IACxB,MAAM,CAAc;IAC7B,YACW,QAAgB,EACzB,MAAmB;QADV,aAAQ,GAAR,QAAQ,CAAQ;QAGzB,IACE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEhF,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,MAAc,EAAE,IAAU,EAAE,MAAe,EAAE,OAAyB;QAC5E,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrB,CAAC,OAAO;YACR,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAExC,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,WAAW,CAAC,MAAc,EAAE,IAAU,EAAE,MAAe,EAAE,KAAc;QACrE,IACE,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ;YAC3B,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAExC,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAC5C,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;CACF;AACD,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAU,EAAE,OAAgB;IACzE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { BudgetSpec, KeyPair, Usage, UsageReceipt, ApprovalReceipt } from '@acp/core';
|
|
2
|
+
export declare function usageWithinBudget(usage: Usage, budget: BudgetSpec): boolean;
|
|
3
|
+
export declare function verifyUsage(receipt: UsageReceipt, signerDid: string, taskId: string, budget: BudgetSpec): boolean;
|
|
4
|
+
export declare class QuotaMeter {
|
|
5
|
+
#private;
|
|
6
|
+
readonly taskId: string;
|
|
7
|
+
readonly ownerDid: string;
|
|
8
|
+
readonly clock: () => number;
|
|
9
|
+
readonly controller: AbortController;
|
|
10
|
+
get budget(): BudgetSpec;
|
|
11
|
+
constructor(taskId: string, budget: BudgetSpec, ownerDid: string, clock?: () => number);
|
|
12
|
+
private timer;
|
|
13
|
+
private halt;
|
|
14
|
+
record(inputTokens?: number, outputTokens?: number, toolCalls?: number): void;
|
|
15
|
+
recordMetrics(delta: Partial<{
|
|
16
|
+
inputTokens: number;
|
|
17
|
+
outputTokens: number;
|
|
18
|
+
totalTokens: number;
|
|
19
|
+
toolCalls: number;
|
|
20
|
+
wallTimeMs: number;
|
|
21
|
+
}>): void;
|
|
22
|
+
amendmentTarget(budget: BudgetSpec): {
|
|
23
|
+
taskId: string;
|
|
24
|
+
previousBudgetDigest: string;
|
|
25
|
+
budget: BudgetSpec;
|
|
26
|
+
};
|
|
27
|
+
amend(budget: BudgetSpec, approval: ApprovalReceipt): void;
|
|
28
|
+
receipt(key: KeyPair): UsageReceipt;
|
|
29
|
+
close(): void;
|
|
30
|
+
}
|
|
31
|
+
/** Instrument the owner's provider adapter, before forwarding any stream output.
|
|
32
|
+
* The adapter owns its BYOK credential; neither the credential nor provider SDK
|
|
33
|
+
* enters the worker. Usage deltas must come from that trusted adapter.
|
|
34
|
+
*/
|
|
35
|
+
export declare function meteredProvider<T>(meter: QuotaMeter, stream: AsyncIterable<{
|
|
36
|
+
value: T;
|
|
37
|
+
inputTokens: number;
|
|
38
|
+
outputTokens: number;
|
|
39
|
+
}>): AsyncGenerator<T>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { signUsage, verifySigned, validateSchema, verifyApproval, digest } from '../../core/dist/index.js';
|
|
3
|
+
export function usageWithinBudget(usage, budget) {
|
|
4
|
+
return ([
|
|
5
|
+
usage.inputTokens,
|
|
6
|
+
usage.outputTokens,
|
|
7
|
+
usage.totalTokens,
|
|
8
|
+
usage.toolCalls,
|
|
9
|
+
usage.wallTimeMs,
|
|
10
|
+
].every((n) => Number.isSafeInteger(n) && n >= 0) &&
|
|
11
|
+
usage.totalTokens === usage.inputTokens + usage.outputTokens &&
|
|
12
|
+
!usage.halted &&
|
|
13
|
+
usage.inputTokens <= budget.maxInputTokens &&
|
|
14
|
+
usage.outputTokens <= budget.maxOutputTokens &&
|
|
15
|
+
usage.toolCalls <= budget.maxToolInvocations &&
|
|
16
|
+
usage.wallTimeMs <= budget.maxWallClockSeconds * 1000);
|
|
17
|
+
}
|
|
18
|
+
export function verifyUsage(receipt, signerDid, taskId, budget) {
|
|
19
|
+
try {
|
|
20
|
+
validateSchema('usage-receipt', receipt);
|
|
21
|
+
return (verifySigned(receipt, signerDid) &&
|
|
22
|
+
receipt.payload.taskId === taskId &&
|
|
23
|
+
usageWithinBudget(receipt.payload, budget));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class QuotaMeter {
|
|
30
|
+
taskId;
|
|
31
|
+
ownerDid;
|
|
32
|
+
clock;
|
|
33
|
+
controller = new AbortController();
|
|
34
|
+
#reportedWallTime = 0;
|
|
35
|
+
#usage;
|
|
36
|
+
#budget;
|
|
37
|
+
#started;
|
|
38
|
+
#timer;
|
|
39
|
+
#amendments = new Set();
|
|
40
|
+
get budget() {
|
|
41
|
+
return structuredClone(this.#budget);
|
|
42
|
+
}
|
|
43
|
+
constructor(taskId, budget, ownerDid, clock = Date.now) {
|
|
44
|
+
this.taskId = taskId;
|
|
45
|
+
this.ownerDid = ownerDid;
|
|
46
|
+
this.clock = clock;
|
|
47
|
+
this.#budget = structuredClone(budget);
|
|
48
|
+
this.#started = clock();
|
|
49
|
+
this.#usage = {
|
|
50
|
+
type: 'UsageReceipt',
|
|
51
|
+
taskId,
|
|
52
|
+
inputTokens: 0,
|
|
53
|
+
outputTokens: 0,
|
|
54
|
+
totalTokens: 0,
|
|
55
|
+
toolCalls: 0,
|
|
56
|
+
wallTimeMs: 0,
|
|
57
|
+
halted: false,
|
|
58
|
+
};
|
|
59
|
+
this.#timer = this.timer();
|
|
60
|
+
}
|
|
61
|
+
timer() {
|
|
62
|
+
const timer = setTimeout(() => this.halt('wallTimeMs'), Math.max(1, this.#budget.maxWallClockSeconds * 1000 - (this.clock() - this.#started)));
|
|
63
|
+
timer.unref();
|
|
64
|
+
return timer;
|
|
65
|
+
}
|
|
66
|
+
halt(reason) {
|
|
67
|
+
this.#usage.halted = true;
|
|
68
|
+
this.controller.abort('BUDGET_EXCEEDED: ' + reason);
|
|
69
|
+
}
|
|
70
|
+
record(inputTokens = 0, outputTokens = 0, toolCalls = 0) {
|
|
71
|
+
if (![inputTokens, outputTokens, toolCalls].every((n) => Number.isSafeInteger(n) && n >= 0)) {
|
|
72
|
+
this.halt('invalid usage');
|
|
73
|
+
throw new Error('INVALID_USAGE');
|
|
74
|
+
}
|
|
75
|
+
if (this.#usage.halted)
|
|
76
|
+
throw new Error('BUDGET_EXCEEDED: halted');
|
|
77
|
+
this.#usage.inputTokens += inputTokens;
|
|
78
|
+
this.#usage.outputTokens += outputTokens;
|
|
79
|
+
this.#usage.totalTokens = this.#usage.inputTokens + this.#usage.outputTokens;
|
|
80
|
+
this.#usage.toolCalls += toolCalls;
|
|
81
|
+
this.#usage.wallTimeMs = Math.max(this.#usage.wallTimeMs, 0, this.clock() - this.#started);
|
|
82
|
+
if (!usageWithinBudget(this.#usage, this.#budget)) {
|
|
83
|
+
this.halt('quota');
|
|
84
|
+
throw new Error('BUDGET_EXCEEDED');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
recordMetrics(delta) {
|
|
88
|
+
const i = delta.inputTokens ?? 0, o = delta.outputTokens ?? 0;
|
|
89
|
+
if (Object.values(delta).some((n) => !Number.isSafeInteger(n) || n < 0) ||
|
|
90
|
+
(delta.totalTokens !== undefined && delta.totalTokens !== i + o)) {
|
|
91
|
+
this.halt('invalid usage');
|
|
92
|
+
throw new Error('INVALID_USAGE');
|
|
93
|
+
}
|
|
94
|
+
if (delta.wallTimeMs !== undefined)
|
|
95
|
+
this.#reportedWallTime += delta.wallTimeMs;
|
|
96
|
+
this.#usage.wallTimeMs = Math.max(this.#usage.wallTimeMs, this.#reportedWallTime);
|
|
97
|
+
this.record(i, o, delta.toolCalls ?? 0);
|
|
98
|
+
}
|
|
99
|
+
amendmentTarget(budget) {
|
|
100
|
+
return { taskId: this.taskId, previousBudgetDigest: digest(this.#budget), budget };
|
|
101
|
+
}
|
|
102
|
+
amend(budget, approval) {
|
|
103
|
+
if (this.#budget.onOverrun !== 'request_hitl_amendment' ||
|
|
104
|
+
!verifyApproval(approval, this.ownerDid, this.taskId, 'budget_increase', this.amendmentTarget(budget)) ||
|
|
105
|
+
this.#amendments.has(approval.payload.receiptId) ||
|
|
106
|
+
this.#usage.halted)
|
|
107
|
+
throw new Error('BUDGET_APPROVAL_REQUIRED');
|
|
108
|
+
if (![
|
|
109
|
+
budget.maxInputTokens,
|
|
110
|
+
budget.maxOutputTokens,
|
|
111
|
+
budget.maxToolInvocations,
|
|
112
|
+
budget.maxWallClockSeconds,
|
|
113
|
+
].every((n) => Number.isSafeInteger(n) && n >= 0) ||
|
|
114
|
+
budget.maxWallClockSeconds < 1)
|
|
115
|
+
throw new Error('INVALID_BUDGET');
|
|
116
|
+
this.#amendments.add(approval.payload.receiptId);
|
|
117
|
+
this.#budget = structuredClone(budget);
|
|
118
|
+
clearTimeout(this.#timer);
|
|
119
|
+
this.#timer = this.timer();
|
|
120
|
+
this.record();
|
|
121
|
+
}
|
|
122
|
+
receipt(key) {
|
|
123
|
+
if (key.did !== this.ownerDid)
|
|
124
|
+
throw new Error('USAGE_SIGNER');
|
|
125
|
+
try {
|
|
126
|
+
this.record();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* Preserve exceeded totals in the signed receipt. */
|
|
130
|
+
}
|
|
131
|
+
return signUsage(this.#usage, key);
|
|
132
|
+
}
|
|
133
|
+
close() {
|
|
134
|
+
clearTimeout(this.#timer);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Instrument the owner's provider adapter, before forwarding any stream output.
|
|
138
|
+
* The adapter owns its BYOK credential; neither the credential nor provider SDK
|
|
139
|
+
* enters the worker. Usage deltas must come from that trusted adapter.
|
|
140
|
+
*/
|
|
141
|
+
export async function* meteredProvider(meter, stream) {
|
|
142
|
+
for await (const chunk of stream) {
|
|
143
|
+
meter.record(chunk.inputTokens, chunk.outputTokens);
|
|
144
|
+
yield chunk.value;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { Json, KeyPair, Signed, SignedEnvelope, Transition } from '@acp/core';
|
|
2
|
+
import type { AuditBundle, AuditEntry } from '@acp/ledger';
|
|
3
|
+
import type { RelayConnectionStatus } from '@acp/relay';
|
|
4
|
+
import type { RelayReceiveFilter, RelayTransport } from '@acp/relay';
|
|
5
|
+
import type { ProgressPayload } from './adapter.js';
|
|
6
|
+
import type { ErrorDetail, SessionResult } from './session.js';
|
|
7
|
+
/** The peer's signed ERROR, retaining optional diagnostics for programmatic callers. */
|
|
8
|
+
export declare class PeerRejectedError extends Error {
|
|
9
|
+
readonly code?: string;
|
|
10
|
+
readonly detail?: ErrorDetail;
|
|
11
|
+
readonly recovery?: {
|
|
12
|
+
proposalDigest: string;
|
|
13
|
+
result?: SessionResult;
|
|
14
|
+
part?: {
|
|
15
|
+
index: number;
|
|
16
|
+
count: number;
|
|
17
|
+
data: string;
|
|
18
|
+
resultDigest: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
constructor(body: Json);
|
|
22
|
+
}
|
|
23
|
+
export declare const asJson: (v: unknown) => Json;
|
|
24
|
+
export declare function receiveRelay(relay: RelayTransport, did: string, signal?: AbortSignal, filter?: RelayReceiveFilter, onStatus?: (status: RelayConnectionStatus) => void): Promise<SignedEnvelope>;
|
|
25
|
+
/** A lost ack is retried by the HTTP client when the completed envelope is redelivered. */
|
|
26
|
+
export declare function acknowledgeRelay(relay: RelayTransport, envelope: SignedEnvelope): Promise<void>;
|
|
27
|
+
export interface CancelBody {
|
|
28
|
+
reason: string;
|
|
29
|
+
cancelledBy: string;
|
|
30
|
+
transition: Signed<Transition>;
|
|
31
|
+
}
|
|
32
|
+
/** Each side has only its own private key. All countersignatures arrive on wire. */
|
|
33
|
+
export declare class SessionWire {
|
|
34
|
+
readonly relay: RelayTransport;
|
|
35
|
+
readonly owner: KeyPair;
|
|
36
|
+
readonly peerDid: string;
|
|
37
|
+
readonly taskId: string;
|
|
38
|
+
readonly actors: [string, string];
|
|
39
|
+
readonly signal: AbortSignal;
|
|
40
|
+
readonly auditPath?: string | undefined;
|
|
41
|
+
/** Legacy in-memory fixtures may open cleartext. Network sessions leave this false. */
|
|
42
|
+
readonly allowUnencryptedEnvelopes: boolean;
|
|
43
|
+
private outgoing;
|
|
44
|
+
private incoming;
|
|
45
|
+
private readonly recoveryParts;
|
|
46
|
+
/** Opened session views keep the ciphertext envelope so delivery verification can check it. */
|
|
47
|
+
private readonly sealedByView;
|
|
48
|
+
private readonly inbox;
|
|
49
|
+
private readonly inboxWaiters;
|
|
50
|
+
private readonly stashed;
|
|
51
|
+
private readonly waiters;
|
|
52
|
+
private readonly waiterAdded;
|
|
53
|
+
private readonly cancelResolvers;
|
|
54
|
+
private pumpError?;
|
|
55
|
+
private pumping;
|
|
56
|
+
private dispatching;
|
|
57
|
+
private detached;
|
|
58
|
+
private stopped;
|
|
59
|
+
private readonly readController;
|
|
60
|
+
private lastHeartbeat;
|
|
61
|
+
private cancellation?;
|
|
62
|
+
/** One bilateral send at a time so PROGRESS cannot overtake its own ACK. */
|
|
63
|
+
private sendTail;
|
|
64
|
+
readonly entries: AuditEntry[];
|
|
65
|
+
onProgress?: (progress: ProgressPayload, envelope: SignedEnvelope) => void | Promise<void>;
|
|
66
|
+
onActivity?: () => void;
|
|
67
|
+
/** Aborts the running task as soon as a CANCEL frame is queued. */
|
|
68
|
+
earlyCancel?: () => void;
|
|
69
|
+
lastCancel?: SignedEnvelope;
|
|
70
|
+
cancelHandled: boolean;
|
|
71
|
+
constructor(relay: RelayTransport, owner: KeyPair, peerDid: string, taskId: string, actors: [string, string], signal: AbortSignal, auditPath?: string | undefined,
|
|
72
|
+
/** Legacy in-memory fixtures may open cleartext. Network sessions leave this false. */
|
|
73
|
+
allowUnencryptedEnvelopes?: boolean);
|
|
74
|
+
get cancellationStarted(): boolean;
|
|
75
|
+
close(): void;
|
|
76
|
+
/** Liveness is signed/encrypted but does not consume audit sequence numbers or extend quota. */
|
|
77
|
+
heartbeat(): Promise<void>;
|
|
78
|
+
/** Keep reading after the caller aborts the session signal, so CANCEL can still be sealed. */
|
|
79
|
+
detachSignal(): void;
|
|
80
|
+
cancelSession(payload?: CancelBody): Promise<void>;
|
|
81
|
+
waitUntilCancelHandled(): Promise<void>;
|
|
82
|
+
private startPump;
|
|
83
|
+
private runPump;
|
|
84
|
+
private shift;
|
|
85
|
+
private nextEnvelope;
|
|
86
|
+
private rejectWaiters;
|
|
87
|
+
private dispatch;
|
|
88
|
+
private watchDelivery;
|
|
89
|
+
rawSend(eventType: string, payload: unknown): Promise<void>;
|
|
90
|
+
/** Ciphertext that still matches the outer signature, when `view` was opened for the session. */
|
|
91
|
+
sealed(view: SignedEnvelope): SignedEnvelope;
|
|
92
|
+
private check;
|
|
93
|
+
private acceptInitial;
|
|
94
|
+
rawReceive(expected: string | string[], initial?: SignedEnvelope): Promise<SignedEnvelope>;
|
|
95
|
+
private append;
|
|
96
|
+
private body;
|
|
97
|
+
private acknowledgeControl;
|
|
98
|
+
private recordPeer;
|
|
99
|
+
sendEvent(eventType: string, payload: unknown): Promise<void>;
|
|
100
|
+
private transmit;
|
|
101
|
+
receiveEvent(eventType: string | string[], initial?: SignedEnvelope): Promise<SignedEnvelope>;
|
|
102
|
+
private sendCancel;
|
|
103
|
+
private checkpoint;
|
|
104
|
+
private seal;
|
|
105
|
+
finishRequester(): Promise<AuditBundle>;
|
|
106
|
+
finishWorker(onSealed?: (bundle: AuditBundle) => void): Promise<AuditBundle>;
|
|
107
|
+
}
|