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,122 @@
|
|
|
1
|
+
import { type CredentialProxyHandle } from './credential-proxy.js';
|
|
2
|
+
import type { Json, AgentSkill } from '@acp/core';
|
|
3
|
+
import type { AgentAdapter, AgentTaskContext } from '@acp/runtime';
|
|
4
|
+
export interface CommandRequest {
|
|
5
|
+
command: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
cwd: string;
|
|
8
|
+
env: NodeJS.ProcessEnv;
|
|
9
|
+
input: string;
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface CommandResult {
|
|
14
|
+
stdout: string;
|
|
15
|
+
stderr?: string;
|
|
16
|
+
exitCode?: number;
|
|
17
|
+
}
|
|
18
|
+
export type CommandRunner = (request: CommandRequest) => Promise<CommandResult>;
|
|
19
|
+
export declare function resolveCommand(command: string): Promise<string>;
|
|
20
|
+
export declare const runCommand: CommandRunner;
|
|
21
|
+
export declare function parseJsonDeliverable(value: unknown): Json;
|
|
22
|
+
export interface CommandAdapterOptions {
|
|
23
|
+
command: string | string[];
|
|
24
|
+
args?: string[];
|
|
25
|
+
runner?: CommandRunner;
|
|
26
|
+
id?: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
skills?: AgentSkill[];
|
|
29
|
+
}
|
|
30
|
+
export declare class CommandAgentAdapter implements AgentAdapter {
|
|
31
|
+
readonly options: CommandAdapterOptions;
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly skills: AgentSkill[];
|
|
35
|
+
constructor(options: CommandAdapterOptions);
|
|
36
|
+
protected invocation(): {
|
|
37
|
+
command: string;
|
|
38
|
+
args: string[];
|
|
39
|
+
};
|
|
40
|
+
/** Executable and arguments that `executeCommand` will spawn. */
|
|
41
|
+
resolvedInvocation(): {
|
|
42
|
+
command: string;
|
|
43
|
+
args: string[];
|
|
44
|
+
};
|
|
45
|
+
protected decode(stdout: string, _context: AgentTaskContext): Json;
|
|
46
|
+
protected encodeInput(context: AgentTaskContext): string;
|
|
47
|
+
executeTask(context: AgentTaskContext): Promise<Json>;
|
|
48
|
+
protected executeCommand(context: AgentTaskContext, environment?: NodeJS.ProcessEnv): Promise<Json>;
|
|
49
|
+
}
|
|
50
|
+
export interface CliOptions {
|
|
51
|
+
binaryPath?: string;
|
|
52
|
+
extraArgs?: string[];
|
|
53
|
+
command?: string | string[];
|
|
54
|
+
runner?: CommandRunner;
|
|
55
|
+
apiKey?: string;
|
|
56
|
+
apiKeyEnv?: string;
|
|
57
|
+
baseUrl?: string;
|
|
58
|
+
fetch?: typeof fetch;
|
|
59
|
+
/**
|
|
60
|
+
* Maximum provider requests the credential proxy will forward for one task.
|
|
61
|
+
* When omitted, the proxy uses the task budget's tool-invocation cap, or 16.
|
|
62
|
+
*/
|
|
63
|
+
maxRequests?: number;
|
|
64
|
+
}
|
|
65
|
+
/** Default CLI invocations use a fresh HOME, so host CLI logins are unavailable. */
|
|
66
|
+
export declare function assertCliAuthentication(adapter: 'claude' | 'codex', options?: CliOptions): void;
|
|
67
|
+
declare const CLAUDE_PERMISSION_MODES: readonly ["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "plan"];
|
|
68
|
+
export type ClaudePermissionMode = (typeof CLAUDE_PERMISSION_MODES)[number];
|
|
69
|
+
declare const CODEX_SANDBOX_MODES: readonly ["read-only", "workspace-write", "danger-full-access"];
|
|
70
|
+
export type CodexSandboxMode = (typeof CODEX_SANDBOX_MODES)[number];
|
|
71
|
+
export type CliToolList = string | readonly string[];
|
|
72
|
+
export interface ClaudeCodeAdapterOptions extends CliOptions {
|
|
73
|
+
/** Value of `--tools`. Defaults to the read-only set `Read,Glob,Grep`. */
|
|
74
|
+
tools?: CliToolList;
|
|
75
|
+
/** Used when `tools` is omitted. Passed with the same `--tools` flag. */
|
|
76
|
+
allowedTools?: CliToolList;
|
|
77
|
+
/** Value of `--disallowedTools`. Defaults to shell, file-write, and web tools. */
|
|
78
|
+
disallowedTools?: CliToolList;
|
|
79
|
+
/** Value of `--permission-mode`. Defaults to `dontAsk`. */
|
|
80
|
+
permissionMode?: ClaudePermissionMode;
|
|
81
|
+
/**
|
|
82
|
+
* Omit the read-only defaults. Explicit `tools`, `disallowedTools`, and
|
|
83
|
+
* `permissionMode` are still passed, and `extraArgs` can still set the flags.
|
|
84
|
+
*/
|
|
85
|
+
allowUnsafeTools?: boolean;
|
|
86
|
+
}
|
|
87
|
+
export interface CodexAdapterOptions extends CliOptions {
|
|
88
|
+
/** Value of `--sandbox`. Defaults to `read-only`. */
|
|
89
|
+
sandbox?: CodexSandboxMode;
|
|
90
|
+
}
|
|
91
|
+
export interface ResolvedCliCommand {
|
|
92
|
+
command: string;
|
|
93
|
+
args: string[];
|
|
94
|
+
}
|
|
95
|
+
/** Argv for Claude Code. Read-only tool flags apply unless the owner relaxes that flag. */
|
|
96
|
+
export declare function resolveClaudeCodeCliCommand(options?: ClaudeCodeAdapterOptions): ResolvedCliCommand;
|
|
97
|
+
/** Argv for `codex exec`. `--sandbox read-only` applies unless the owner sets another sandbox. */
|
|
98
|
+
export declare function resolveCodexCliCommand(options?: CodexAdapterOptions): ResolvedCliCommand;
|
|
99
|
+
declare abstract class ProviderCliAdapter extends CommandAgentAdapter {
|
|
100
|
+
protected cliOptions: CliOptions;
|
|
101
|
+
/** Set while the task's provider traffic is going through the credential proxy. */
|
|
102
|
+
protected activeProxy?: CredentialProxyHandle;
|
|
103
|
+
protected abstract providerStyle: 'openai' | 'anthropic';
|
|
104
|
+
/** Stdout usage repeats totals the proxy has already recorded. */
|
|
105
|
+
protected proxyAlreadyMetered(): boolean;
|
|
106
|
+
protected encodeInput(context: AgentTaskContext): string;
|
|
107
|
+
executeTask(context: AgentTaskContext): Promise<Json>;
|
|
108
|
+
}
|
|
109
|
+
export declare class ClaudeCodeAdapter extends ProviderCliAdapter {
|
|
110
|
+
protected providerStyle: "anthropic";
|
|
111
|
+
constructor(options?: ClaudeCodeAdapterOptions);
|
|
112
|
+
protected decode(stdout: string, context: AgentTaskContext): Json;
|
|
113
|
+
}
|
|
114
|
+
/** Claude Code CLI adapter. Same class as `ClaudeCodeAdapter`. */
|
|
115
|
+
export declare const ClaudeCodeCliAdapter: typeof ClaudeCodeAdapter;
|
|
116
|
+
export type ClaudeCodeCliAdapter = ClaudeCodeAdapter;
|
|
117
|
+
export declare class CodexCliAdapter extends ProviderCliAdapter {
|
|
118
|
+
protected providerStyle: "openai";
|
|
119
|
+
constructor(options?: CodexAdapterOptions);
|
|
120
|
+
protected decode(stdout: string, context: AgentTaskContext): Json;
|
|
121
|
+
}
|
|
122
|
+
export {};
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { access, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { constants } from 'node:fs';
|
|
5
|
+
import { delimiter, isAbsolute, join } from 'node:path';
|
|
6
|
+
import { startCredentialProxy } from './credential-proxy.js';
|
|
7
|
+
import { sanitizedEnvironment } from '../../sandbox/dist/index.js';
|
|
8
|
+
export async function resolveCommand(command) {
|
|
9
|
+
if (isAbsolute(command))
|
|
10
|
+
return command;
|
|
11
|
+
if (command.includes('/'))
|
|
12
|
+
throw new Error('COMMAND_MUST_BE_ABSOLUTE_OR_ON_PATH');
|
|
13
|
+
for (const dir of (process.env.PATH ?? '/usr/local/bin:/usr/bin:/bin').split(delimiter)) {
|
|
14
|
+
if (!isAbsolute(dir))
|
|
15
|
+
continue;
|
|
16
|
+
const path = join(dir, command);
|
|
17
|
+
try {
|
|
18
|
+
await access(path, constants.X_OK);
|
|
19
|
+
return path;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
/* next executable directory */
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
throw new Error('COMMAND_NOT_FOUND: ' + command);
|
|
26
|
+
}
|
|
27
|
+
export const runCommand = async (request) => {
|
|
28
|
+
const command = await resolveCommand(request.command);
|
|
29
|
+
// Windows refuses to spawn a .js/.cjs/.mjs path directly (EFTYPE). Run it with this Node.
|
|
30
|
+
const script = /\.(?:cjs|mjs|js)$/i.test(command);
|
|
31
|
+
const binary = script ? process.execPath : command;
|
|
32
|
+
const args = script ? [command, ...request.args] : request.args;
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const child = spawn(binary, args, {
|
|
35
|
+
cwd: request.cwd,
|
|
36
|
+
env: request.env,
|
|
37
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
38
|
+
shell: false,
|
|
39
|
+
detached: process.platform !== 'win32',
|
|
40
|
+
});
|
|
41
|
+
let stdout = '', stderr = '', size = 0, settled = false;
|
|
42
|
+
const kill = () => {
|
|
43
|
+
try {
|
|
44
|
+
if (process.platform !== 'win32' && child.pid)
|
|
45
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
46
|
+
else
|
|
47
|
+
child.kill('SIGKILL');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* already exited */
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const finish = (error, code = 0) => {
|
|
54
|
+
if (settled)
|
|
55
|
+
return;
|
|
56
|
+
settled = true;
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
request.signal.removeEventListener('abort', abort);
|
|
59
|
+
kill();
|
|
60
|
+
error ? reject(error) : resolve({ stdout, stderr, exitCode: code });
|
|
61
|
+
};
|
|
62
|
+
const abort = () => finish(new Error('ADAPTER_ABORTED'));
|
|
63
|
+
const timer = setTimeout(() => finish(new Error('ADAPTER_TIMEOUT')), request.timeoutMs);
|
|
64
|
+
request.signal.addEventListener('abort', abort, { once: true });
|
|
65
|
+
if (request.signal.aborted)
|
|
66
|
+
abort();
|
|
67
|
+
child.stdout.on('data', (b) => {
|
|
68
|
+
size += b.length;
|
|
69
|
+
if (size > 4194304)
|
|
70
|
+
finish(new Error('ADAPTER_OUTPUT_LIMIT'));
|
|
71
|
+
else
|
|
72
|
+
stdout += b.toString();
|
|
73
|
+
});
|
|
74
|
+
child.stderr.on('data', (b) => {
|
|
75
|
+
stderr = (stderr + b.toString()).slice(-4096);
|
|
76
|
+
});
|
|
77
|
+
child.on('error', () => finish(new Error('ADAPTER_SPAWN_FAILED')));
|
|
78
|
+
child.on('close', (code) => finish(code === 0 ? undefined : new Error('ADAPTER_EXIT: ' + code), code ?? 1));
|
|
79
|
+
child.stdin.on('error', () => { });
|
|
80
|
+
child.stdin.end(request.input);
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
export function parseJsonDeliverable(value) {
|
|
84
|
+
if (typeof value !== 'string')
|
|
85
|
+
return JSON.parse(JSON.stringify(value));
|
|
86
|
+
const text = value
|
|
87
|
+
.trim()
|
|
88
|
+
.replace(/^```(?:json)?\s*\n?/, '')
|
|
89
|
+
.replace(/\n?```$/, '');
|
|
90
|
+
try {
|
|
91
|
+
return JSON.parse(text);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new Error('ADAPTER_INVALID_JSON');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export class CommandAgentAdapter {
|
|
98
|
+
options;
|
|
99
|
+
id;
|
|
100
|
+
name;
|
|
101
|
+
skills;
|
|
102
|
+
constructor(options) {
|
|
103
|
+
this.options = options;
|
|
104
|
+
this.id = options.id ?? 'command';
|
|
105
|
+
this.name = options.name ?? 'Command Worker';
|
|
106
|
+
this.skills = options.skills ?? [{ id: 'json-task', name: 'JSON task' }];
|
|
107
|
+
}
|
|
108
|
+
invocation() {
|
|
109
|
+
if (Array.isArray(this.options.command)) {
|
|
110
|
+
const [command, ...args] = this.options.command;
|
|
111
|
+
if (!command)
|
|
112
|
+
throw new Error('MISSING_COMMAND');
|
|
113
|
+
return { command, args: [...args, ...(this.options.args ?? [])] };
|
|
114
|
+
}
|
|
115
|
+
// String commands are explicitly owner-configured shell scripts.
|
|
116
|
+
return {
|
|
117
|
+
command: '/bin/sh',
|
|
118
|
+
args: ['-c', this.options.command, 'acp-task', ...(this.options.args ?? [])],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** Executable and arguments that `executeCommand` will spawn. */
|
|
122
|
+
resolvedInvocation() {
|
|
123
|
+
return this.invocation();
|
|
124
|
+
}
|
|
125
|
+
decode(stdout, _context) {
|
|
126
|
+
return parseJsonDeliverable(stdout);
|
|
127
|
+
}
|
|
128
|
+
encodeInput(context) {
|
|
129
|
+
return JSON.stringify(context.input);
|
|
130
|
+
}
|
|
131
|
+
async executeTask(context) {
|
|
132
|
+
return this.executeCommand(context);
|
|
133
|
+
}
|
|
134
|
+
async executeCommand(context, environment = {}) {
|
|
135
|
+
context.signal.throwIfAborted();
|
|
136
|
+
const started = Date.now();
|
|
137
|
+
const input = JSON.stringify(context.input), inputFile = join(context.workspaceDir, 'input.json');
|
|
138
|
+
await writeFile(inputFile, input, { mode: 0o600 });
|
|
139
|
+
const invocation = this.invocation();
|
|
140
|
+
try {
|
|
141
|
+
const result = await (this.options.runner ?? runCommand)({
|
|
142
|
+
...invocation,
|
|
143
|
+
cwd: context.workspaceDir,
|
|
144
|
+
env: {
|
|
145
|
+
...sanitizedEnvironment(context.workspaceDir),
|
|
146
|
+
PATH: '/usr/local/bin:/usr/bin:/bin',
|
|
147
|
+
TASK_INPUT_FILE: inputFile,
|
|
148
|
+
...environment,
|
|
149
|
+
},
|
|
150
|
+
input: this.encodeInput(context),
|
|
151
|
+
signal: context.signal,
|
|
152
|
+
timeoutMs: context.manifest.budget.maxWallClockSeconds * 1000,
|
|
153
|
+
});
|
|
154
|
+
context.signal.throwIfAborted();
|
|
155
|
+
if (result.exitCode && result.exitCode !== 0)
|
|
156
|
+
throw new Error('ADAPTER_EXIT: ' + result.exitCode);
|
|
157
|
+
return this.decode(result.stdout, context);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
context.reportUsage({ wallTimeMs: Date.now() - started });
|
|
161
|
+
context.reportIsolation?.('workspace_process');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** Default CLI invocations use a fresh HOME, so host CLI logins are unavailable. */
|
|
166
|
+
export function assertCliAuthentication(adapter, options = {}) {
|
|
167
|
+
// Owner-supplied commands/runners manage their own authentication.
|
|
168
|
+
if (options.command || options.runner)
|
|
169
|
+
return;
|
|
170
|
+
const variable = options.apiKeyEnv ?? (adapter === 'claude' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY');
|
|
171
|
+
if (options.apiKey ?? process.env[variable])
|
|
172
|
+
return;
|
|
173
|
+
throw new Error('AGENT_AUTH_REQUIRED: ' + adapter +
|
|
174
|
+
' runs with a fresh task HOME; local CLI logins (~/.claude or ~/.codex) are unavailable. ' +
|
|
175
|
+
'Configure ' + variable + ' in the worker host environment before starting. ' +
|
|
176
|
+
'Never put credentials in task input or invitations.');
|
|
177
|
+
}
|
|
178
|
+
const CLAUDE_PERMISSION_MODES = [
|
|
179
|
+
'acceptEdits',
|
|
180
|
+
'auto',
|
|
181
|
+
'bypassPermissions',
|
|
182
|
+
'default',
|
|
183
|
+
'dontAsk',
|
|
184
|
+
'plan',
|
|
185
|
+
];
|
|
186
|
+
const CODEX_SANDBOX_MODES = ['read-only', 'workspace-write', 'danger-full-access'];
|
|
187
|
+
const CLAUDE_READ_ONLY_TOOLS = 'Read,Glob,Grep';
|
|
188
|
+
const CLAUDE_DISALLOWED_TOOLS = 'Bash,Edit,Write,MultiEdit,NotebookEdit,WebFetch,WebSearch';
|
|
189
|
+
function joinTools(value) {
|
|
190
|
+
return typeof value === 'string' ? value : value.join(',');
|
|
191
|
+
}
|
|
192
|
+
function cliFlagPresent(args, names) {
|
|
193
|
+
return args.some((arg) => names.some((name) => arg === name || arg.startsWith(name + '=')));
|
|
194
|
+
}
|
|
195
|
+
function assertOneOf(value, allowed, code) {
|
|
196
|
+
if (!allowed.includes(value))
|
|
197
|
+
throw new Error(code);
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
function claudeRestrictionArgs(options, extra) {
|
|
201
|
+
const unsafe = options.allowUnsafeTools === true;
|
|
202
|
+
const flags = [];
|
|
203
|
+
const tools = options.tools !== undefined ? options.tools : options.allowedTools;
|
|
204
|
+
if (!cliFlagPresent(extra, ['--tools'])) {
|
|
205
|
+
if (tools !== undefined)
|
|
206
|
+
flags.push('--tools', joinTools(tools));
|
|
207
|
+
else if (!unsafe)
|
|
208
|
+
flags.push('--tools', CLAUDE_READ_ONLY_TOOLS);
|
|
209
|
+
}
|
|
210
|
+
if (!cliFlagPresent(extra, ['--disallowedTools', '--disallowed-tools'])) {
|
|
211
|
+
if (options.disallowedTools !== undefined)
|
|
212
|
+
flags.push('--disallowedTools', joinTools(options.disallowedTools));
|
|
213
|
+
else if (!unsafe)
|
|
214
|
+
flags.push('--disallowedTools', CLAUDE_DISALLOWED_TOOLS);
|
|
215
|
+
}
|
|
216
|
+
if (!cliFlagPresent(extra, ['--permission-mode', '--permissionMode'])) {
|
|
217
|
+
if (options.permissionMode !== undefined)
|
|
218
|
+
flags.push('--permission-mode', assertOneOf(options.permissionMode, CLAUDE_PERMISSION_MODES, 'INVALID_PERMISSION_MODE'));
|
|
219
|
+
else if (!unsafe)
|
|
220
|
+
flags.push('--permission-mode', 'dontAsk');
|
|
221
|
+
}
|
|
222
|
+
return flags;
|
|
223
|
+
}
|
|
224
|
+
/** Argv for Claude Code. Read-only tool flags apply unless the owner relaxes that flag. */
|
|
225
|
+
export function resolveClaudeCodeCliCommand(options = {}) {
|
|
226
|
+
const extra = options.extraArgs ?? [];
|
|
227
|
+
return {
|
|
228
|
+
command: options.binaryPath ?? 'claude',
|
|
229
|
+
args: ['-p', '--output-format', 'json', ...claudeRestrictionArgs(options, extra), ...extra],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** Argv for `codex exec`. `--sandbox read-only` applies unless the owner sets another sandbox. */
|
|
233
|
+
export function resolveCodexCliCommand(options = {}) {
|
|
234
|
+
const extra = options.extraArgs ?? [];
|
|
235
|
+
const args = ['exec', '--json', '--skip-git-repo-check'];
|
|
236
|
+
if (!cliFlagPresent(extra, ['--sandbox', '-s']))
|
|
237
|
+
args.push('--sandbox', assertOneOf(options.sandbox ?? 'read-only', CODEX_SANDBOX_MODES, 'INVALID_SANDBOX_MODE'));
|
|
238
|
+
args.push(...extra, '-');
|
|
239
|
+
return { command: options.binaryPath ?? 'codex', args };
|
|
240
|
+
}
|
|
241
|
+
function commandList(resolved) {
|
|
242
|
+
return [resolved.command, ...resolved.args];
|
|
243
|
+
}
|
|
244
|
+
function usage(context, value, meteredByProxy = false) {
|
|
245
|
+
// The proxy already charged this task from the provider response.
|
|
246
|
+
// Stdout repeats those totals and must not be recorded again.
|
|
247
|
+
if (meteredByProxy)
|
|
248
|
+
return;
|
|
249
|
+
const inputTokens = Number(value.input_tokens ?? value.prompt_tokens ?? 0), outputTokens = Number(value.output_tokens ?? value.completion_tokens ?? 0);
|
|
250
|
+
context.reportUsage({
|
|
251
|
+
inputTokens,
|
|
252
|
+
outputTokens,
|
|
253
|
+
totalTokens: Number(value.total_tokens ?? inputTokens + outputTokens),
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
class ProviderCliAdapter extends CommandAgentAdapter {
|
|
257
|
+
cliOptions = {};
|
|
258
|
+
/** Set while the task's provider traffic is going through the credential proxy. */
|
|
259
|
+
activeProxy;
|
|
260
|
+
/** Stdout usage repeats totals the proxy has already recorded. */
|
|
261
|
+
proxyAlreadyMetered() {
|
|
262
|
+
return (this.activeProxy?.responsesMetered ?? 0) > 0;
|
|
263
|
+
}
|
|
264
|
+
encodeInput(context) {
|
|
265
|
+
return JSON.stringify({
|
|
266
|
+
title: context.manifest.task.title,
|
|
267
|
+
description: context.manifest.task.description,
|
|
268
|
+
input: context.input,
|
|
269
|
+
outputSchema: context.manifest.io.outputSchema,
|
|
270
|
+
instruction: 'Return only a JSON deliverable.',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
async executeTask(context) {
|
|
274
|
+
this.activeProxy = undefined;
|
|
275
|
+
const anthropic = this.providerStyle === 'anthropic';
|
|
276
|
+
const key = this.cliOptions.apiKey ??
|
|
277
|
+
process.env[this.cliOptions.apiKeyEnv ?? (anthropic ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY')];
|
|
278
|
+
if (!key || this.cliOptions.runner || this.cliOptions.command)
|
|
279
|
+
return super.executeTask(context);
|
|
280
|
+
const proxy = await startCredentialProxy({
|
|
281
|
+
apiKey: key,
|
|
282
|
+
baseUrl: this.cliOptions.baseUrl ??
|
|
283
|
+
(anthropic ? 'https://api.anthropic.com/v1' : 'https://api.openai.com/v1'),
|
|
284
|
+
style: this.providerStyle,
|
|
285
|
+
signal: context.signal,
|
|
286
|
+
fetch: this.cliOptions.fetch,
|
|
287
|
+
budget: context.manifest.budget,
|
|
288
|
+
reportUsage: (metrics) => context.reportUsage(metrics),
|
|
289
|
+
maxRequests: this.cliOptions.maxRequests,
|
|
290
|
+
});
|
|
291
|
+
this.activeProxy = proxy;
|
|
292
|
+
try {
|
|
293
|
+
return await this.executeCommand(context, anthropic
|
|
294
|
+
? {
|
|
295
|
+
ANTHROPIC_BASE_URL: proxy.url,
|
|
296
|
+
ANTHROPIC_API_KEY: proxy.token,
|
|
297
|
+
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
|
|
298
|
+
}
|
|
299
|
+
: { OPENAI_BASE_URL: proxy.url + '/v1', OPENAI_API_KEY: proxy.token });
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
this.activeProxy = undefined;
|
|
303
|
+
await proxy.close();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
export class ClaudeCodeAdapter extends ProviderCliAdapter {
|
|
308
|
+
providerStyle = 'anthropic';
|
|
309
|
+
constructor(options = {}) {
|
|
310
|
+
// `command` replaces the argv. Otherwise the CLI starts with read-only tool flags.
|
|
311
|
+
super({
|
|
312
|
+
...options,
|
|
313
|
+
command: options.command ?? commandList(resolveClaudeCodeCliCommand(options)),
|
|
314
|
+
id: 'claude',
|
|
315
|
+
name: 'Claude Code',
|
|
316
|
+
});
|
|
317
|
+
this.cliOptions = options;
|
|
318
|
+
}
|
|
319
|
+
decode(stdout, context) {
|
|
320
|
+
const value = parseJsonDeliverable(stdout);
|
|
321
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
322
|
+
if (value.usage && typeof value.usage === 'object')
|
|
323
|
+
usage(context, value.usage, this.proxyAlreadyMetered());
|
|
324
|
+
if (value.is_error === true)
|
|
325
|
+
throw new Error('CLAUDE_TASK_FAILED');
|
|
326
|
+
if ('structured_output' in value)
|
|
327
|
+
return parseJsonDeliverable(value.structured_output);
|
|
328
|
+
if ('result' in value)
|
|
329
|
+
return parseJsonDeliverable(value.result);
|
|
330
|
+
}
|
|
331
|
+
return value;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Claude Code CLI adapter. Same class as `ClaudeCodeAdapter`. */
|
|
335
|
+
export const ClaudeCodeCliAdapter = ClaudeCodeAdapter;
|
|
336
|
+
export class CodexCliAdapter extends ProviderCliAdapter {
|
|
337
|
+
providerStyle = 'openai';
|
|
338
|
+
constructor(options = {}) {
|
|
339
|
+
// `command` replaces the argv. Otherwise model shell commands stay in the read-only sandbox.
|
|
340
|
+
super({
|
|
341
|
+
...options,
|
|
342
|
+
command: options.command ?? commandList(resolveCodexCliCommand(options)),
|
|
343
|
+
id: 'codex',
|
|
344
|
+
name: 'Codex CLI',
|
|
345
|
+
});
|
|
346
|
+
this.cliOptions = options;
|
|
347
|
+
}
|
|
348
|
+
decode(stdout, context) {
|
|
349
|
+
let direct;
|
|
350
|
+
try {
|
|
351
|
+
direct = JSON.parse(stdout);
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
direct = null;
|
|
355
|
+
}
|
|
356
|
+
if (direct && typeof direct === 'object' && !Array.isArray(direct) && !('type' in direct)) {
|
|
357
|
+
if (direct.usage && typeof direct.usage === 'object')
|
|
358
|
+
usage(context, direct.usage, this.proxyAlreadyMetered());
|
|
359
|
+
return 'result' in direct ? parseJsonDeliverable(direct.result) : direct;
|
|
360
|
+
}
|
|
361
|
+
let result;
|
|
362
|
+
for (const line of stdout.trim().split('\n')) {
|
|
363
|
+
const event = JSON.parse(line);
|
|
364
|
+
if (event.type === 'turn.failed' || event.type === 'error')
|
|
365
|
+
throw new Error('CODEX_TASK_FAILED');
|
|
366
|
+
if (event.usage)
|
|
367
|
+
usage(context, event.usage, this.proxyAlreadyMetered());
|
|
368
|
+
if (event.item?.type === 'agent_message' && event.item.text)
|
|
369
|
+
result = parseJsonDeliverable(event.item.text);
|
|
370
|
+
if (event.result !== undefined)
|
|
371
|
+
result = parseJsonDeliverable(event.result);
|
|
372
|
+
}
|
|
373
|
+
if (result === undefined)
|
|
374
|
+
throw new Error('CODEX_MISSING_RESULT');
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BudgetSpec } from '@acp/core';
|
|
2
|
+
import type { QuotaMeter } from '@acp/runtime';
|
|
3
|
+
export interface ProxyUsageMetrics {
|
|
4
|
+
inputTokens?: number;
|
|
5
|
+
outputTokens?: number;
|
|
6
|
+
totalTokens?: number;
|
|
7
|
+
toolCalls?: number;
|
|
8
|
+
}
|
|
9
|
+
/** Fields the proxy reads from a runtime `QuotaMeter`. */
|
|
10
|
+
export type ProxyQuotaMeter = Pick<QuotaMeter, 'record' | 'controller'>;
|
|
11
|
+
export interface CredentialProxyOptions {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
style: 'openai' | 'anthropic';
|
|
15
|
+
signal: AbortSignal;
|
|
16
|
+
fetch?: typeof fetch;
|
|
17
|
+
/** When set, each proxied response is charged with `meter.record`. */
|
|
18
|
+
meter?: ProxyQuotaMeter;
|
|
19
|
+
/** Called once per proxied response that carries provider usage. */
|
|
20
|
+
reportUsage?: (metrics: ProxyUsageMetrics) => void;
|
|
21
|
+
/** Token caps checked before another upstream request is forwarded. */
|
|
22
|
+
budget?: BudgetSpec;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum upstream requests. Defaults to `budget.maxToolInvocations` when that
|
|
25
|
+
* value is positive, otherwise 16.
|
|
26
|
+
*/
|
|
27
|
+
maxRequests?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CredentialProxyHandle {
|
|
30
|
+
url: string;
|
|
31
|
+
token: string;
|
|
32
|
+
/** Provider responses whose usage was recorded for this proxy. */
|
|
33
|
+
readonly responsesMetered: number;
|
|
34
|
+
close: () => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/** Task-scoped loopback broker. Only the host fetch sees the real provider key. */
|
|
37
|
+
export declare function startCredentialProxy(options: CredentialProxyOptions): Promise<CredentialProxyHandle>;
|