iosm-cli 0.2.14 → 0.2.16
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/CHANGELOG.md +50 -0
- package/README.md +18 -1
- package/dist/cli/args.d.ts +2 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +16 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +3 -0
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +26 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +12 -9
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/checkpoint/fs-checkpoint.d.ts +14 -0
- package/dist/core/checkpoint/fs-checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint/fs-checkpoint.js +211 -0
- package/dist/core/checkpoint/fs-checkpoint.js.map +1 -0
- package/dist/core/command-dispatcher.d.ts +2 -0
- package/dist/core/command-dispatcher.d.ts.map +1 -1
- package/dist/core/command-dispatcher.js +78 -13
- package/dist/core/command-dispatcher.js.map +1 -1
- package/dist/core/mcp/cli.d.ts.map +1 -1
- package/dist/core/mcp/cli.js +26 -0
- package/dist/core/mcp/cli.js.map +1 -1
- package/dist/core/mcp/config.d.ts.map +1 -1
- package/dist/core/mcp/config.js +55 -0
- package/dist/core/mcp/config.js.map +1 -1
- package/dist/core/mcp/index.d.ts +1 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/runtime.d.ts +3 -1
- package/dist/core/mcp/runtime.d.ts.map +1 -1
- package/dist/core/mcp/runtime.js +21 -2
- package/dist/core/mcp/runtime.js.map +1 -1
- package/dist/core/mcp/types.d.ts +30 -2
- package/dist/core/mcp/types.d.ts.map +1 -1
- package/dist/core/mcp/types.js.map +1 -1
- package/dist/core/package-manager.d.ts +10 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +100 -2
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/policy/engine.d.ts +77 -0
- package/dist/core/policy/engine.d.ts.map +1 -0
- package/dist/core/policy/engine.js +614 -0
- package/dist/core/policy/engine.js.map +1 -0
- package/dist/core/policy/index.d.ts +2 -0
- package/dist/core/policy/index.d.ts.map +1 -0
- package/dist/core/policy/index.js +2 -0
- package/dist/core/policy/index.js.map +1 -0
- package/dist/core/sandbox/executor.d.ts +13 -0
- package/dist/core/sandbox/executor.d.ts.map +1 -0
- package/dist/core/sandbox/executor.js +64 -0
- package/dist/core/sandbox/executor.js.map +1 -0
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/security/index.d.ts +3 -0
- package/dist/core/security/index.d.ts.map +1 -0
- package/dist/core/security/index.js +3 -0
- package/dist/core/security/index.js.map +1 -0
- package/dist/core/security/source-security.d.ts +43 -0
- package/dist/core/security/source-security.d.ts.map +1 -0
- package/dist/core/security/source-security.js +94 -0
- package/dist/core/security/source-security.js.map +1 -0
- package/dist/core/security/trust-ledger.d.ts +24 -0
- package/dist/core/security/trust-ledger.d.ts.map +1 -0
- package/dist/core/security/trust-ledger.js +66 -0
- package/dist/core/security/trust-ledger.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +128 -15
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +22 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +9 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/task-plan.d.ts +1 -0
- package/dist/core/task-plan.d.ts.map +1 -1
- package/dist/core/task-plan.js +103 -0
- package/dist/core/task-plan.js.map +1 -1
- package/dist/core/tools/apply-patch.d.ts +29 -0
- package/dist/core/tools/apply-patch.d.ts.map +1 -0
- package/dist/core/tools/apply-patch.js +167 -0
- package/dist/core/tools/apply-patch.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +15 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/git-common.d.ts.map +1 -1
- package/dist/core/tools/git-common.js +15 -1
- package/dist/core/tools/git-common.js.map +1 -1
- package/dist/core/tools/index.d.ts +20 -2
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +85 -25
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/permissions.d.ts +16 -0
- package/dist/core/tools/permissions.d.ts.map +1 -1
- package/dist/core/tools/permissions.js +34 -1
- package/dist/core/tools/permissions.js.map +1 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +68 -24
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/tool-search.d.ts +24 -0
- package/dist/core/tools/tool-search.d.ts.map +1 -0
- package/dist/core/tools/tool-search.js +85 -0
- package/dist/core/tools/tool-search.js.map +1 -0
- package/dist/core/tools/tool-suggest.d.ts +18 -0
- package/dist/core/tools/tool-suggest.d.ts.map +1 -0
- package/dist/core/tools/tool-suggest.js +94 -0
- package/dist/core/tools/tool-suggest.js.map +1 -0
- package/dist/core/tools/verification-runner.d.ts.map +1 -1
- package/dist/core/tools/verification-runner.js +15 -1
- package/dist/core/tools/verification-runner.js.map +1 -1
- package/dist/core/unified-exec.d.ts +39 -0
- package/dist/core/unified-exec.d.ts.map +1 -0
- package/dist/core/unified-exec.js +286 -0
- package/dist/core/unified-exec.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +93 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +352 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/index.d.ts +2 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +217 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +159 -72
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +25 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +33 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +13 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +189 -28
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +54 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/telegram/telegram-bridge-mode.js +51 -22
- package/dist/modes/telegram/telegram-bridge-mode.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +96 -9
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/README.md +2 -0
- package/docs/acp-rpc-mapping.md +38 -0
- package/docs/configuration.generated.md +81 -0
- package/docs/configuration.md +7 -0
- package/package.json +4 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentSession } from "../../core/agent-session.js";
|
|
2
|
+
import type { McpRuntime } from "../../core/mcp/index.js";
|
|
3
|
+
import { type PolicyEngineV2 } from "../../core/policy/index.js";
|
|
4
|
+
export interface AcpIoAdapter {
|
|
5
|
+
input: NodeJS.ReadableStream;
|
|
6
|
+
output: (message: unknown) => void;
|
|
7
|
+
onProcessExit: (handler: () => void) => void;
|
|
8
|
+
requestExit: (code?: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface AcpModeOptions {
|
|
11
|
+
policyEngine?: PolicyEngineV2;
|
|
12
|
+
mcpRuntime?: McpRuntime;
|
|
13
|
+
profileName?: string;
|
|
14
|
+
io?: Partial<AcpIoAdapter>;
|
|
15
|
+
}
|
|
16
|
+
export declare function runAcpMode(session: AgentSession, options?: AcpModeOptions): Promise<never>;
|
|
17
|
+
//# sourceMappingURL=acp-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/acp/acp-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAyB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AA0B/F,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC9B,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC3B;AA+BD,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CA+UpG"}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
2
|
+
import * as readline from "node:readline";
|
|
3
|
+
import { dispatchBuiltinSlashCommand } from "../../core/command-dispatcher.js";
|
|
4
|
+
import { evaluatePermissionWithPolicy } from "../../core/policy/index.js";
|
|
5
|
+
import { PermissionGrantStore, } from "../../core/tools/index.js";
|
|
6
|
+
import { UnifiedExecManager } from "../../core/unified-exec.js";
|
|
7
|
+
const DANGEROUS_TOOL_NAMES = new Set(["bash", "edit", "write", "apply_patch", "git_write", "fs_ops", "db_run"]);
|
|
8
|
+
function normalizePermissionGrantScope(value) {
|
|
9
|
+
if (value === "turn" || value === "session" || value === "once") {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
return "once";
|
|
13
|
+
}
|
|
14
|
+
function writeJsonLine(message) {
|
|
15
|
+
process.stdout.write(`${JSON.stringify(message)}\n`);
|
|
16
|
+
}
|
|
17
|
+
function response(id, result) {
|
|
18
|
+
return { jsonrpc: "2.0", id, result };
|
|
19
|
+
}
|
|
20
|
+
function errorResponse(id, code, message, data) {
|
|
21
|
+
return {
|
|
22
|
+
jsonrpc: "2.0",
|
|
23
|
+
id,
|
|
24
|
+
error: {
|
|
25
|
+
code,
|
|
26
|
+
message,
|
|
27
|
+
data,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function runAcpMode(session, options = {}) {
|
|
32
|
+
const io = {
|
|
33
|
+
input: options.io?.input ?? process.stdin,
|
|
34
|
+
output: options.io?.output ?? writeJsonLine,
|
|
35
|
+
onProcessExit: options.io?.onProcessExit ?? ((handler) => process.once("exit", handler)),
|
|
36
|
+
requestExit: options.io?.requestExit ?? ((code = 0) => process.exit(code)),
|
|
37
|
+
};
|
|
38
|
+
const execManager = new UnifiedExecManager();
|
|
39
|
+
const pendingPermissions = new Map();
|
|
40
|
+
const permissionGrants = new PermissionGrantStore();
|
|
41
|
+
let shutdownRequested = false;
|
|
42
|
+
let shutdownScheduled = false;
|
|
43
|
+
const evaluateRequest = async (request) => {
|
|
44
|
+
if (permissionGrants.isAllowed(request)) {
|
|
45
|
+
return { allowed: true, reason: "Allowed by cached turn/session grant.", effect: "allow" };
|
|
46
|
+
}
|
|
47
|
+
options.policyEngine?.refresh();
|
|
48
|
+
if (options.policyEngine) {
|
|
49
|
+
const evaluated = evaluatePermissionWithPolicy(options.policyEngine, request, {
|
|
50
|
+
profile: options.profileName,
|
|
51
|
+
runtimeMode: "rpc",
|
|
52
|
+
permissionMode: session.settingsManager.getPermissionMode(),
|
|
53
|
+
strictExtensionToolEnforcement: session.settingsManager.getPermissionExtensionToolEnforcement(),
|
|
54
|
+
});
|
|
55
|
+
if (evaluated.outcome === "allow") {
|
|
56
|
+
return {
|
|
57
|
+
allowed: true,
|
|
58
|
+
reason: evaluated.reason,
|
|
59
|
+
effect: evaluated.decision.effect,
|
|
60
|
+
ruleId: evaluated.decision.rule?.id,
|
|
61
|
+
policyLayer: evaluated.decision.layer,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (evaluated.outcome === "deny") {
|
|
65
|
+
return {
|
|
66
|
+
allowed: false,
|
|
67
|
+
reason: evaluated.reason,
|
|
68
|
+
effect: evaluated.decision.effect,
|
|
69
|
+
ruleId: evaluated.decision.rule?.id,
|
|
70
|
+
policyLayer: evaluated.decision.layer,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const denyRules = session.settingsManager.getPermissionDenyRules();
|
|
76
|
+
for (const rule of denyRules) {
|
|
77
|
+
const [toolRaw, ...needleParts] = rule.split(":");
|
|
78
|
+
const toolName = toolRaw.trim();
|
|
79
|
+
const needle = needleParts.join(":").trim().toLowerCase();
|
|
80
|
+
const toolMatches = !toolName || toolName === "*" || toolName === request.toolName;
|
|
81
|
+
if (toolMatches && (!needle || request.summary.toLowerCase().includes(needle))) {
|
|
82
|
+
return { allowed: false, reason: `Denied by legacy rule: ${rule}`, effect: "deny" };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const allowRules = session.settingsManager.getPermissionAllowRules();
|
|
86
|
+
for (const rule of allowRules) {
|
|
87
|
+
const [toolRaw, ...needleParts] = rule.split(":");
|
|
88
|
+
const toolName = toolRaw.trim();
|
|
89
|
+
const needle = needleParts.join(":").trim().toLowerCase();
|
|
90
|
+
const toolMatches = !toolName || toolName === "*" || toolName === request.toolName;
|
|
91
|
+
if (toolMatches && (!needle || request.summary.toLowerCase().includes(needle))) {
|
|
92
|
+
return { allowed: true, reason: `Allowed by legacy rule: ${rule}`, effect: "allow" };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const mode = session.settingsManager.getPermissionMode();
|
|
96
|
+
if (mode === "yolo") {
|
|
97
|
+
return { allowed: true, reason: "Permission mode is yolo.", effect: "allow" };
|
|
98
|
+
}
|
|
99
|
+
if (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {
|
|
100
|
+
return { allowed: true, reason: "ACP mode auto-approves non-dangerous tools.", effect: "allow" };
|
|
101
|
+
}
|
|
102
|
+
if (mode === "auto" && (request.toolName === "edit" || request.toolName === "write" || request.toolName === "apply_patch")) {
|
|
103
|
+
return { allowed: true, reason: "Permission mode auto allows edit/write/apply_patch.", effect: "allow" };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const permissionId = crypto.randomUUID();
|
|
107
|
+
io.output({
|
|
108
|
+
jsonrpc: "2.0",
|
|
109
|
+
method: "acp.permission.request",
|
|
110
|
+
params: {
|
|
111
|
+
id: permissionId,
|
|
112
|
+
request,
|
|
113
|
+
message: `${request.toolName}: ${request.summary}`,
|
|
114
|
+
timeoutMs: 5 * 60 * 1000,
|
|
115
|
+
scopes: ["once", "turn", "session"],
|
|
116
|
+
defaultScope: "once",
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const decision = await new Promise((resolve) => {
|
|
120
|
+
const timeout = setTimeout(() => {
|
|
121
|
+
pendingPermissions.delete(permissionId);
|
|
122
|
+
resolve({ allowed: false, scope: "once" });
|
|
123
|
+
}, 5 * 60 * 1000);
|
|
124
|
+
pendingPermissions.set(permissionId, (value) => {
|
|
125
|
+
clearTimeout(timeout);
|
|
126
|
+
resolve(value);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
if (decision.allowed) {
|
|
130
|
+
permissionGrants.allow(request, decision.scope);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
allowed: decision.allowed,
|
|
134
|
+
reason: decision.allowed ? "Confirmed by ACP client." : "Denied by ACP client.",
|
|
135
|
+
effect: "ask",
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
session.setToolPermissionHandler(async (request) => {
|
|
139
|
+
const decision = await evaluateRequest(request);
|
|
140
|
+
return decision.allowed;
|
|
141
|
+
});
|
|
142
|
+
options.mcpRuntime?.setPermissionGuard((request) => evaluateRequest(request));
|
|
143
|
+
session.subscribe((event) => {
|
|
144
|
+
if (event.type === "agent_start") {
|
|
145
|
+
permissionGrants.resetTurn();
|
|
146
|
+
}
|
|
147
|
+
io.output({
|
|
148
|
+
jsonrpc: "2.0",
|
|
149
|
+
method: "acp.event",
|
|
150
|
+
params: event,
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
const rl = readline.createInterface({
|
|
154
|
+
input: io.input,
|
|
155
|
+
terminal: false,
|
|
156
|
+
});
|
|
157
|
+
const closeAndExit = () => {
|
|
158
|
+
execManager.dispose();
|
|
159
|
+
rl.close();
|
|
160
|
+
io.requestExit(0);
|
|
161
|
+
};
|
|
162
|
+
const scheduleShutdown = () => {
|
|
163
|
+
if (shutdownScheduled)
|
|
164
|
+
return;
|
|
165
|
+
shutdownScheduled = true;
|
|
166
|
+
setImmediate(closeAndExit);
|
|
167
|
+
};
|
|
168
|
+
io.onProcessExit(() => {
|
|
169
|
+
execManager.dispose();
|
|
170
|
+
});
|
|
171
|
+
const handle = async (request) => {
|
|
172
|
+
const id = request.id ?? null;
|
|
173
|
+
switch (request.method) {
|
|
174
|
+
case "acp.handshake":
|
|
175
|
+
return response(id, {
|
|
176
|
+
protocolVersion: "1.0",
|
|
177
|
+
capabilities: {
|
|
178
|
+
streaming: true,
|
|
179
|
+
permissionBridge: true,
|
|
180
|
+
toolEvents: true,
|
|
181
|
+
sessionLifecycle: true,
|
|
182
|
+
backCompatRpc: true,
|
|
183
|
+
execSessions: true,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
case "acp.capabilities":
|
|
187
|
+
return response(id, {
|
|
188
|
+
capabilities: {
|
|
189
|
+
"acp.session.start": true,
|
|
190
|
+
"acp.session.prompt": true,
|
|
191
|
+
"acp.session.steer": true,
|
|
192
|
+
"acp.session.follow_up": true,
|
|
193
|
+
"acp.session.abort": true,
|
|
194
|
+
"acp.session.state": true,
|
|
195
|
+
"acp.command.run_builtin": true,
|
|
196
|
+
"acp.permission.response": true,
|
|
197
|
+
"acp.exec.command": true,
|
|
198
|
+
"acp.exec.write_stdin": true,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
case "acp.session.start":
|
|
202
|
+
return response(id, {
|
|
203
|
+
sessionId: session.sessionId,
|
|
204
|
+
sessionFile: session.sessionFile ?? null,
|
|
205
|
+
});
|
|
206
|
+
case "acp.session.prompt": {
|
|
207
|
+
const message = typeof request.params?.message === "string" ? request.params.message : undefined;
|
|
208
|
+
if (!message)
|
|
209
|
+
return errorResponse(id, -32602, "Invalid params: message is required.");
|
|
210
|
+
void session
|
|
211
|
+
.prompt(message, {
|
|
212
|
+
source: "rpc",
|
|
213
|
+
streamingBehavior: request.params?.streamingBehavior === "steer" || request.params?.streamingBehavior === "followUp"
|
|
214
|
+
? request.params.streamingBehavior
|
|
215
|
+
: undefined,
|
|
216
|
+
})
|
|
217
|
+
.catch((error) => {
|
|
218
|
+
io.output({
|
|
219
|
+
jsonrpc: "2.0",
|
|
220
|
+
method: "acp.event",
|
|
221
|
+
params: {
|
|
222
|
+
type: "error",
|
|
223
|
+
source: "acp.session.prompt",
|
|
224
|
+
message: error instanceof Error ? error.message : String(error),
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
return response(id, { accepted: true });
|
|
229
|
+
}
|
|
230
|
+
case "acp.session.steer": {
|
|
231
|
+
const message = typeof request.params?.message === "string" ? request.params.message : undefined;
|
|
232
|
+
if (!message)
|
|
233
|
+
return errorResponse(id, -32602, "Invalid params: message is required.");
|
|
234
|
+
await session.steer(message);
|
|
235
|
+
return response(id, { accepted: true });
|
|
236
|
+
}
|
|
237
|
+
case "acp.session.follow_up": {
|
|
238
|
+
const message = typeof request.params?.message === "string" ? request.params.message : undefined;
|
|
239
|
+
if (!message)
|
|
240
|
+
return errorResponse(id, -32602, "Invalid params: message is required.");
|
|
241
|
+
await session.followUp(message);
|
|
242
|
+
return response(id, { accepted: true });
|
|
243
|
+
}
|
|
244
|
+
case "acp.session.abort":
|
|
245
|
+
await session.abort();
|
|
246
|
+
return response(id, { aborted: true });
|
|
247
|
+
case "acp.session.state":
|
|
248
|
+
return response(id, {
|
|
249
|
+
sessionId: session.sessionId,
|
|
250
|
+
sessionFile: session.sessionFile ?? null,
|
|
251
|
+
model: session.model ?? null,
|
|
252
|
+
thinkingLevel: session.thinkingLevel,
|
|
253
|
+
isStreaming: session.isStreaming,
|
|
254
|
+
permissionMode: session.settingsManager.getPermissionMode(),
|
|
255
|
+
});
|
|
256
|
+
case "acp.command.run_builtin": {
|
|
257
|
+
const commandText = typeof request.params?.commandText === "string" ? request.params.commandText : undefined;
|
|
258
|
+
if (!commandText)
|
|
259
|
+
return errorResponse(id, -32602, "Invalid params: commandText is required.");
|
|
260
|
+
const result = await dispatchBuiltinSlashCommand(commandText, {
|
|
261
|
+
session,
|
|
262
|
+
settingsManager: session.settingsManager,
|
|
263
|
+
policyEngine: options.policyEngine,
|
|
264
|
+
});
|
|
265
|
+
return response(id, result);
|
|
266
|
+
}
|
|
267
|
+
case "acp.exec.command": {
|
|
268
|
+
const command = typeof request.params?.command === "string" ? request.params.command : undefined;
|
|
269
|
+
if (!command)
|
|
270
|
+
return errorResponse(id, -32602, "Invalid params: command is required.");
|
|
271
|
+
const cwd = typeof request.params?.cwd === "string" ? request.params.cwd : undefined;
|
|
272
|
+
const tty = typeof request.params?.tty === "boolean" ? request.params.tty : undefined;
|
|
273
|
+
const shell = typeof request.params?.shell === "string" ? request.params.shell : undefined;
|
|
274
|
+
const login = typeof request.params?.login === "boolean" ? request.params.login : undefined;
|
|
275
|
+
const yieldTimeMs = typeof request.params?.yieldTimeMs === "number" ? request.params.yieldTimeMs : undefined;
|
|
276
|
+
const maxOutputChars = typeof request.params?.maxOutputChars === "number" ? request.params.maxOutputChars : undefined;
|
|
277
|
+
const result = await execManager.execCommand({
|
|
278
|
+
command,
|
|
279
|
+
cwd,
|
|
280
|
+
tty,
|
|
281
|
+
shell,
|
|
282
|
+
login,
|
|
283
|
+
yieldTimeMs,
|
|
284
|
+
maxOutputChars,
|
|
285
|
+
});
|
|
286
|
+
return response(id, result);
|
|
287
|
+
}
|
|
288
|
+
case "acp.exec.write_stdin": {
|
|
289
|
+
const sessionId = typeof request.params?.sessionId === "number" ? request.params.sessionId : undefined;
|
|
290
|
+
if (sessionId === undefined)
|
|
291
|
+
return errorResponse(id, -32602, "Invalid params: sessionId is required.");
|
|
292
|
+
const chars = typeof request.params?.chars === "string" ? request.params.chars : undefined;
|
|
293
|
+
const yieldTimeMs = typeof request.params?.yieldTimeMs === "number" ? request.params.yieldTimeMs : undefined;
|
|
294
|
+
const maxOutputChars = typeof request.params?.maxOutputChars === "number" ? request.params.maxOutputChars : undefined;
|
|
295
|
+
const result = await execManager.writeStdin({
|
|
296
|
+
sessionId,
|
|
297
|
+
chars,
|
|
298
|
+
yieldTimeMs,
|
|
299
|
+
maxOutputChars,
|
|
300
|
+
});
|
|
301
|
+
return response(id, result);
|
|
302
|
+
}
|
|
303
|
+
case "acp.permission.response": {
|
|
304
|
+
const responseId = typeof request.params?.id === "string" ? request.params.id : undefined;
|
|
305
|
+
const allowed = request.params?.allowed === true;
|
|
306
|
+
if (!responseId)
|
|
307
|
+
return errorResponse(id, -32602, "Invalid params: id is required.");
|
|
308
|
+
const resolver = pendingPermissions.get(responseId);
|
|
309
|
+
if (!resolver)
|
|
310
|
+
return errorResponse(id, -32602, "Unknown permission request id.");
|
|
311
|
+
pendingPermissions.delete(responseId);
|
|
312
|
+
const scope = normalizePermissionGrantScope(request.params?.scope);
|
|
313
|
+
resolver({ allowed, scope });
|
|
314
|
+
return response(id, { accepted: true });
|
|
315
|
+
}
|
|
316
|
+
case "acp.shutdown":
|
|
317
|
+
shutdownRequested = true;
|
|
318
|
+
return response(id, { ok: true });
|
|
319
|
+
default:
|
|
320
|
+
return errorResponse(id, -32601, "Method not found.", { reason: "capability_not_supported" });
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
rl.on("line", async (line) => {
|
|
324
|
+
let parsed;
|
|
325
|
+
try {
|
|
326
|
+
parsed = JSON.parse(line);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
io.output(errorResponse(null, -32700, "Parse error."));
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (!parsed || parsed.jsonrpc !== "2.0" || typeof parsed.method !== "string") {
|
|
333
|
+
io.output(errorResponse(parsed?.id ?? null, -32600, "Invalid Request."));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
try {
|
|
337
|
+
const result = await handle(parsed);
|
|
338
|
+
if (result)
|
|
339
|
+
io.output(result);
|
|
340
|
+
if (shutdownRequested) {
|
|
341
|
+
scheduleShutdown();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
io.output(errorResponse(parsed.id ?? null, -32000, error instanceof Error ? error.message : String(error)));
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
return await new Promise(() => {
|
|
349
|
+
// ACP mode is long-running.
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=acp-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-mode.js","sourceRoot":"","sources":["../../../src/modes/acp/acp-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from \"node:crypto\";\nimport * as readline from \"node:readline\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport { dispatchBuiltinSlashCommand } from \"../../core/command-dispatcher.js\";\nimport type { McpPermissionDecision, McpRuntime } from \"../../core/mcp/index.js\";\nimport { evaluatePermissionWithPolicy, type PolicyEngineV2 } from \"../../core/policy/index.js\";\nimport {\n\ttype PermissionGrantScope,\n\tPermissionGrantStore,\n\ttype ToolPermissionRequest,\n} from \"../../core/tools/index.js\";\nimport { UnifiedExecManager } from \"../../core/unified-exec.js\";\n\ninterface JsonRpcRequest {\n\tjsonrpc: \"2.0\";\n\tid?: string | number | null;\n\tmethod: string;\n\tparams?: Record<string, unknown>;\n}\n\ninterface JsonRpcResponse {\n\tjsonrpc: \"2.0\";\n\tid: string | number | null;\n\tresult?: unknown;\n\terror?: {\n\t\tcode: number;\n\t\tmessage: string;\n\t\tdata?: unknown;\n\t};\n}\n\nexport interface AcpIoAdapter {\n\tinput: NodeJS.ReadableStream;\n\toutput: (message: unknown) => void;\n\tonProcessExit: (handler: () => void) => void;\n\trequestExit: (code?: number) => void;\n}\n\nexport interface AcpModeOptions {\n\tpolicyEngine?: PolicyEngineV2;\n\tmcpRuntime?: McpRuntime;\n\tprofileName?: string;\n\tio?: Partial<AcpIoAdapter>;\n}\n\nconst DANGEROUS_TOOL_NAMES = new Set([\"bash\", \"edit\", \"write\", \"apply_patch\", \"git_write\", \"fs_ops\", \"db_run\"]);\n\nfunction normalizePermissionGrantScope(value: unknown): PermissionGrantScope {\n\tif (value === \"turn\" || value === \"session\" || value === \"once\") {\n\t\treturn value;\n\t}\n\treturn \"once\";\n}\n\nfunction writeJsonLine(message: unknown): void {\n\tprocess.stdout.write(`${JSON.stringify(message)}\\n`);\n}\n\nfunction response(id: string | number | null, result: unknown): JsonRpcResponse {\n\treturn { jsonrpc: \"2.0\", id, result };\n}\n\nfunction errorResponse(id: string | number | null, code: number, message: string, data?: unknown): JsonRpcResponse {\n\treturn {\n\t\tjsonrpc: \"2.0\",\n\t\tid,\n\t\terror: {\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\tdata,\n\t\t},\n\t};\n}\n\nexport async function runAcpMode(session: AgentSession, options: AcpModeOptions = {}): Promise<never> {\n\tconst io: AcpIoAdapter = {\n\t\tinput: options.io?.input ?? process.stdin,\n\t\toutput: options.io?.output ?? writeJsonLine,\n\t\tonProcessExit: options.io?.onProcessExit ?? ((handler) => process.once(\"exit\", handler)),\n\t\trequestExit: options.io?.requestExit ?? ((code = 0) => process.exit(code)),\n\t};\n\tconst execManager = new UnifiedExecManager();\n\tconst pendingPermissions = new Map<string, (decision: { allowed: boolean; scope: PermissionGrantScope }) => void>();\n\tconst permissionGrants = new PermissionGrantStore();\n\tlet shutdownRequested = false;\n\tlet shutdownScheduled = false;\n\n\tconst evaluateRequest = async (request: ToolPermissionRequest): Promise<McpPermissionDecision> => {\n\t\tif (permissionGrants.isAllowed(request)) {\n\t\t\treturn { allowed: true, reason: \"Allowed by cached turn/session grant.\", effect: \"allow\" };\n\t\t}\n\t\toptions.policyEngine?.refresh();\n\t\tif (options.policyEngine) {\n\t\t\tconst evaluated = evaluatePermissionWithPolicy(options.policyEngine, request, {\n\t\t\t\tprofile: options.profileName,\n\t\t\t\truntimeMode: \"rpc\",\n\t\t\t\tpermissionMode: session.settingsManager.getPermissionMode(),\n\t\t\t\tstrictExtensionToolEnforcement: session.settingsManager.getPermissionExtensionToolEnforcement(),\n\t\t\t});\n\t\t\tif (evaluated.outcome === \"allow\") {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: true,\n\t\t\t\t\treason: evaluated.reason,\n\t\t\t\t\teffect: evaluated.decision.effect,\n\t\t\t\t\truleId: evaluated.decision.rule?.id,\n\t\t\t\t\tpolicyLayer: evaluated.decision.layer,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (evaluated.outcome === \"deny\") {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: evaluated.reason,\n\t\t\t\t\teffect: evaluated.decision.effect,\n\t\t\t\t\truleId: evaluated.decision.rule?.id,\n\t\t\t\t\tpolicyLayer: evaluated.decision.layer,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tconst denyRules = session.settingsManager.getPermissionDenyRules();\n\t\t\tfor (const rule of denyRules) {\n\t\t\t\tconst [toolRaw, ...needleParts] = rule.split(\":\");\n\t\t\t\tconst toolName = toolRaw.trim();\n\t\t\t\tconst needle = needleParts.join(\":\").trim().toLowerCase();\n\t\t\t\tconst toolMatches = !toolName || toolName === \"*\" || toolName === request.toolName;\n\t\t\t\tif (toolMatches && (!needle || request.summary.toLowerCase().includes(needle))) {\n\t\t\t\t\treturn { allowed: false, reason: `Denied by legacy rule: ${rule}`, effect: \"deny\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst allowRules = session.settingsManager.getPermissionAllowRules();\n\t\t\tfor (const rule of allowRules) {\n\t\t\t\tconst [toolRaw, ...needleParts] = rule.split(\":\");\n\t\t\t\tconst toolName = toolRaw.trim();\n\t\t\t\tconst needle = needleParts.join(\":\").trim().toLowerCase();\n\t\t\t\tconst toolMatches = !toolName || toolName === \"*\" || toolName === request.toolName;\n\t\t\t\tif (toolMatches && (!needle || request.summary.toLowerCase().includes(needle))) {\n\t\t\t\t\treturn { allowed: true, reason: `Allowed by legacy rule: ${rule}`, effect: \"allow\" };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst mode = session.settingsManager.getPermissionMode();\n\t\t\tif (mode === \"yolo\") {\n\t\t\t\treturn { allowed: true, reason: \"Permission mode is yolo.\", effect: \"allow\" };\n\t\t\t}\n\t\t\tif (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {\n\t\t\t\treturn { allowed: true, reason: \"ACP mode auto-approves non-dangerous tools.\", effect: \"allow\" };\n\t\t\t}\n\t\t\tif (mode === \"auto\" && (request.toolName === \"edit\" || request.toolName === \"write\" || request.toolName === \"apply_patch\")) {\n\t\t\t\treturn { allowed: true, reason: \"Permission mode auto allows edit/write/apply_patch.\", effect: \"allow\" };\n\t\t\t}\n\t\t}\n\n\t\tconst permissionId = crypto.randomUUID();\n\t\t\tio.output({\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tmethod: \"acp.permission.request\",\n\t\t\t\tparams: {\n\t\t\t\t\tid: permissionId,\n\t\t\t\t\trequest,\n\t\t\t\t\tmessage: `${request.toolName}: ${request.summary}`,\n\t\t\t\t\ttimeoutMs: 5 * 60 * 1000,\n\t\t\t\t\tscopes: [\"once\", \"turn\", \"session\"],\n\t\t\t\t\tdefaultScope: \"once\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst decision = await new Promise<{ allowed: boolean; scope: PermissionGrantScope }>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tpendingPermissions.delete(permissionId);\n\t\t\t\t\tresolve({ allowed: false, scope: \"once\" });\n\t\t\t\t}, 5 * 60 * 1000);\n\t\t\t\tpendingPermissions.set(permissionId, (value) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(value);\n\t\t\t\t});\n\t\t\t});\n\t\t\tif (decision.allowed) {\n\t\t\t\tpermissionGrants.allow(request, decision.scope);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tallowed: decision.allowed,\n\t\t\t\treason: decision.allowed ? \"Confirmed by ACP client.\" : \"Denied by ACP client.\",\n\t\t\t\teffect: \"ask\",\n\t\t\t};\n\t\t};\n\n\tsession.setToolPermissionHandler(async (request) => {\n\t\tconst decision = await evaluateRequest(request);\n\t\treturn decision.allowed;\n\t});\n\toptions.mcpRuntime?.setPermissionGuard((request) => evaluateRequest(request));\n\n\tsession.subscribe((event) => {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tpermissionGrants.resetTurn();\n\t\t}\n\t\tio.output({\n\t\t\tjsonrpc: \"2.0\",\n\t\t\tmethod: \"acp.event\",\n\t\t\tparams: event,\n\t\t});\n\t});\n\n\tconst rl = readline.createInterface({\n\t\tinput: io.input,\n\t\tterminal: false,\n\t});\n\n\tconst closeAndExit = () => {\n\t\texecManager.dispose();\n\t\trl.close();\n\t\tio.requestExit(0);\n\t};\n\n\tconst scheduleShutdown = () => {\n\t\tif (shutdownScheduled) return;\n\t\tshutdownScheduled = true;\n\t\tsetImmediate(closeAndExit);\n\t};\n\n\tio.onProcessExit(() => {\n\t\texecManager.dispose();\n\t});\n\n\tconst handle = async (request: JsonRpcRequest): Promise<JsonRpcResponse | undefined> => {\n\t\tconst id = request.id ?? null;\n\t\tswitch (request.method) {\n\t\t\tcase \"acp.handshake\":\n\t\t\t\treturn response(id, {\n\t\t\t\t\tprotocolVersion: \"1.0\",\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\tstreaming: true,\n\t\t\t\t\t\tpermissionBridge: true,\n\t\t\t\t\t\ttoolEvents: true,\n\t\t\t\t\t\tsessionLifecycle: true,\n\t\t\t\t\t\tbackCompatRpc: true,\n\t\t\t\t\t\texecSessions: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tcase \"acp.capabilities\":\n\t\t\t\treturn response(id, {\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\t\"acp.session.start\": true,\n\t\t\t\t\t\t\"acp.session.prompt\": true,\n\t\t\t\t\t\t\"acp.session.steer\": true,\n\t\t\t\t\t\t\"acp.session.follow_up\": true,\n\t\t\t\t\t\t\"acp.session.abort\": true,\n\t\t\t\t\t\t\"acp.session.state\": true,\n\t\t\t\t\t\t\"acp.command.run_builtin\": true,\n\t\t\t\t\t\t\"acp.permission.response\": true,\n\t\t\t\t\t\t\"acp.exec.command\": true,\n\t\t\t\t\t\t\"acp.exec.write_stdin\": true,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tcase \"acp.session.start\":\n\t\t\t\treturn response(id, {\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionFile: session.sessionFile ?? null,\n\t\t\t\t});\n\n\t\t\tcase \"acp.session.prompt\": {\n\t\t\t\tconst message = typeof request.params?.message === \"string\" ? request.params.message : undefined;\n\t\t\t\tif (!message) return errorResponse(id, -32602, \"Invalid params: message is required.\");\n\t\t\t\tvoid session\n\t\t\t\t\t.prompt(message, {\n\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t\tstreamingBehavior:\n\t\t\t\t\t\t\trequest.params?.streamingBehavior === \"steer\" || request.params?.streamingBehavior === \"followUp\"\n\t\t\t\t\t\t\t\t? request.params.streamingBehavior\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tio.output({\n\t\t\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\t\t\tmethod: \"acp.event\",\n\t\t\t\t\t\t\tparams: {\n\t\t\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\t\t\tsource: \"acp.session.prompt\",\n\t\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn response(id, { accepted: true });\n\t\t\t}\n\n\t\t\tcase \"acp.session.steer\": {\n\t\t\t\tconst message = typeof request.params?.message === \"string\" ? request.params.message : undefined;\n\t\t\t\tif (!message) return errorResponse(id, -32602, \"Invalid params: message is required.\");\n\t\t\t\tawait session.steer(message);\n\t\t\t\treturn response(id, { accepted: true });\n\t\t\t}\n\n\t\t\tcase \"acp.session.follow_up\": {\n\t\t\t\tconst message = typeof request.params?.message === \"string\" ? request.params.message : undefined;\n\t\t\t\tif (!message) return errorResponse(id, -32602, \"Invalid params: message is required.\");\n\t\t\t\tawait session.followUp(message);\n\t\t\t\treturn response(id, { accepted: true });\n\t\t\t}\n\n\t\t\tcase \"acp.session.abort\":\n\t\t\t\tawait session.abort();\n\t\t\t\treturn response(id, { aborted: true });\n\n\t\t\tcase \"acp.session.state\":\n\t\t\t\treturn response(id, {\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionFile: session.sessionFile ?? null,\n\t\t\t\t\tmodel: session.model ?? null,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tpermissionMode: session.settingsManager.getPermissionMode(),\n\t\t\t\t});\n\n\t\t\tcase \"acp.command.run_builtin\": {\n\t\t\t\tconst commandText = typeof request.params?.commandText === \"string\" ? request.params.commandText : undefined;\n\t\t\t\tif (!commandText) return errorResponse(id, -32602, \"Invalid params: commandText is required.\");\n\t\t\t\tconst result = await dispatchBuiltinSlashCommand(commandText, {\n\t\t\t\t\tsession,\n\t\t\t\t\tsettingsManager: session.settingsManager,\n\t\t\t\t\tpolicyEngine: options.policyEngine,\n\t\t\t\t});\n\t\t\t\treturn response(id, result);\n\t\t\t}\n\n\t\t\t\tcase \"acp.exec.command\": {\n\t\t\t\t\tconst command = typeof request.params?.command === \"string\" ? request.params.command : undefined;\n\t\t\t\t\tif (!command) return errorResponse(id, -32602, \"Invalid params: command is required.\");\n\t\t\t\t\tconst cwd = typeof request.params?.cwd === \"string\" ? request.params.cwd : undefined;\n\t\t\t\t\tconst tty = typeof request.params?.tty === \"boolean\" ? request.params.tty : undefined;\n\t\t\t\t\tconst shell = typeof request.params?.shell === \"string\" ? request.params.shell : undefined;\n\t\t\t\t\tconst login = typeof request.params?.login === \"boolean\" ? request.params.login : undefined;\n\t\t\t\t\tconst yieldTimeMs = typeof request.params?.yieldTimeMs === \"number\" ? request.params.yieldTimeMs : undefined;\n\t\t\t\t\tconst maxOutputChars =\n\t\t\t\t\t\ttypeof request.params?.maxOutputChars === \"number\" ? request.params.maxOutputChars : undefined;\n\t\t\t\t\tconst result = await execManager.execCommand({\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\ttty,\n\t\t\t\t\t\tshell,\n\t\t\t\t\t\tlogin,\n\t\t\t\t\t\tyieldTimeMs,\n\t\t\t\t\t\tmaxOutputChars,\n\t\t\t\t\t});\n\t\t\t\treturn response(id, result);\n\t\t\t}\n\n\t\t\tcase \"acp.exec.write_stdin\": {\n\t\t\t\tconst sessionId = typeof request.params?.sessionId === \"number\" ? request.params.sessionId : undefined;\n\t\t\t\tif (sessionId === undefined) return errorResponse(id, -32602, \"Invalid params: sessionId is required.\");\n\t\t\t\tconst chars = typeof request.params?.chars === \"string\" ? request.params.chars : undefined;\n\t\t\t\tconst yieldTimeMs = typeof request.params?.yieldTimeMs === \"number\" ? request.params.yieldTimeMs : undefined;\n\t\t\t\tconst maxOutputChars =\n\t\t\t\t\ttypeof request.params?.maxOutputChars === \"number\" ? request.params.maxOutputChars : undefined;\n\t\t\t\tconst result = await execManager.writeStdin({\n\t\t\t\t\tsessionId,\n\t\t\t\t\tchars,\n\t\t\t\t\tyieldTimeMs,\n\t\t\t\t\tmaxOutputChars,\n\t\t\t\t});\n\t\t\t\treturn response(id, result);\n\t\t\t}\n\n\t\t\t\tcase \"acp.permission.response\": {\n\t\t\t\t\tconst responseId = typeof request.params?.id === \"string\" ? request.params.id : undefined;\n\t\t\t\t\tconst allowed = request.params?.allowed === true;\n\t\t\t\t\tif (!responseId) return errorResponse(id, -32602, \"Invalid params: id is required.\");\n\t\t\t\t\tconst resolver = pendingPermissions.get(responseId);\n\t\t\t\t\tif (!resolver) return errorResponse(id, -32602, \"Unknown permission request id.\");\n\t\t\t\t\tpendingPermissions.delete(responseId);\n\t\t\t\t\tconst scope = normalizePermissionGrantScope(request.params?.scope);\n\t\t\t\t\tresolver({ allowed, scope });\n\t\t\t\t\treturn response(id, { accepted: true });\n\t\t\t\t}\n\n\t\t\tcase \"acp.shutdown\":\n\t\t\t\tshutdownRequested = true;\n\t\t\t\treturn response(id, { ok: true });\n\n\t\t\tdefault:\n\t\t\t\treturn errorResponse(id, -32601, \"Method not found.\", { reason: \"capability_not_supported\" });\n\t\t}\n\t};\n\n\trl.on(\"line\", async (line) => {\n\t\tlet parsed: JsonRpcRequest;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line) as JsonRpcRequest;\n\t\t} catch {\n\t\t\tio.output(errorResponse(null, -32700, \"Parse error.\"));\n\t\t\treturn;\n\t\t}\n\t\tif (!parsed || parsed.jsonrpc !== \"2.0\" || typeof parsed.method !== \"string\") {\n\t\t\tio.output(errorResponse(parsed?.id ?? null, -32600, \"Invalid Request.\"));\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst result = await handle(parsed);\n\t\t\tif (result) io.output(result);\n\t\t\tif (shutdownRequested) {\n\t\t\t\tscheduleShutdown();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tio.output(errorResponse(parsed.id ?? null, -32000, error instanceof Error ? error.message : String(error)));\n\t\t}\n\t});\n\n\treturn await new Promise<never>(() => {\n\t\t// ACP mode is long-running.\n\t});\n}\n"]}
|
package/dist/modes/index.d.ts
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { InteractiveMode, type InteractiveModeOptions } from "./interactive/interactive-mode.js";
|
|
5
5
|
export { type PrintModeOptions, runPrintMode } from "./print-mode.js";
|
|
6
|
+
export { runAcpMode, type AcpModeOptions } from "./acp/acp-mode.js";
|
|
6
7
|
export { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener } from "./rpc/rpc-client.js";
|
|
7
8
|
export { runRpcMode } from "./rpc/rpc-mode.js";
|
|
8
|
-
export type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc/rpc-types.js";
|
|
9
|
+
export type { RpcCommand, RpcExecSessionPollResult, RpcResponse, RpcSessionState } from "./rpc/rpc-types.js";
|
|
9
10
|
export { runTelegramBridgeMode, type TelegramBridgeModeOptions } from "./telegram/telegram-bridge-mode.js";
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,EAAE,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/modes/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { InteractiveMode } from "./interactive/interactive-mode.js";
|
|
5
5
|
export { runPrintMode } from "./print-mode.js";
|
|
6
|
+
export { runAcpMode } from "./acp/acp-mode.js";
|
|
6
7
|
export { RpcClient } from "./rpc/rpc-client.js";
|
|
7
8
|
export { runRpcMode } from "./rpc/rpc-mode.js";
|
|
8
9
|
export { runTelegramBridgeMode } from "./telegram/telegram-bridge-mode.js";
|
package/dist/modes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAA+B,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAyB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAkB,SAAS,EAAgD,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAkC,MAAM,oCAAoC,CAAC","sourcesContent":["/**\n * Run modes for the coding agent.\n */\n\nexport { InteractiveMode, type InteractiveModeOptions } from \"./interactive/interactive-mode.js\";\nexport { type PrintModeOptions, runPrintMode } from \"./print-mode.js\";\nexport { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener } from \"./rpc/rpc-client.js\";\nexport { runRpcMode } from \"./rpc/rpc-mode.js\";\nexport type { RpcCommand, RpcResponse, RpcSessionState } from \"./rpc/rpc-types.js\";\nexport { runTelegramBridgeMode, type TelegramBridgeModeOptions } from \"./telegram/telegram-bridge-mode.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAA+B,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAyB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAuB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAkB,SAAS,EAAgD,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAkC,MAAM,oCAAoC,CAAC","sourcesContent":["/**\n * Run modes for the coding agent.\n */\n\nexport { InteractiveMode, type InteractiveModeOptions } from \"./interactive/interactive-mode.js\";\nexport { type PrintModeOptions, runPrintMode } from \"./print-mode.js\";\nexport { runAcpMode, type AcpModeOptions } from \"./acp/acp-mode.js\";\nexport { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener } from \"./rpc/rpc-client.js\";\nexport { runRpcMode } from \"./rpc/rpc-mode.js\";\nexport type { RpcCommand, RpcExecSessionPollResult, RpcResponse, RpcSessionState } from \"./rpc/rpc-types.js\";\nexport { runTelegramBridgeMode, type TelegramBridgeModeOptions } from \"./telegram/telegram-bridge-mode.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,SAAS,EAOT,KAAK,GAAG,EAER,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,SAAS,EAOT,KAAK,GAAG,EAER,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAyQxE,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAC,CAIb;IAEF,OAAO,CAAC,eAAe,CAAC,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,eAAe,CAA8D;IAErF,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAElD,OAAO,CAAC,aAAa,CAAS;gBAG7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,EAAE,EAAE,GAAG,EACP,GAAG,GAAE,MAAsB;IA6B5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAMhC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAQ3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,8BAA8B;IAkBtC,OAAO,CAAC,oCAAoC;IAyD5C;;;OAGG;IACH,eAAe,IAAI,IAAI;IAWvB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B,YAAY,CACX,MAAM,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClF,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;KACjB,EACD,SAAS,UAAQ,GACf,IAAI;IAeP;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA2BlC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKpC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKzB,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAOxC,OAAO,CAAC,aAAa;IA8IrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,mBAAmB;CA0Z3B"}
|