genaicode 2.11.0 → 2.13.2
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 +52 -1
- package/README.md +18 -16
- package/dist/agents/cli-agent.d.ts +6 -3
- package/dist/agents/cli-agent.js +57 -35
- package/dist/agents/cli-agent.js.map +1 -1
- package/dist/agents/drivers/antigravity.d.ts +7 -1
- package/dist/agents/drivers/antigravity.js +27 -2
- package/dist/agents/drivers/antigravity.js.map +1 -1
- package/dist/agents/drivers/claude-approvals.d.ts +86 -0
- package/dist/agents/drivers/claude-approvals.js +278 -0
- package/dist/agents/drivers/claude-approvals.js.map +1 -0
- package/dist/agents/drivers/claude.d.ts +12 -2
- package/dist/agents/drivers/claude.js +74 -11
- package/dist/agents/drivers/claude.js.map +1 -1
- package/dist/agents/drivers/codex-approvals.d.ts +11 -0
- package/dist/agents/drivers/codex-approvals.js +118 -0
- package/dist/agents/drivers/codex-approvals.js.map +1 -0
- package/dist/agents/drivers/codex-live.d.ts +12 -1
- package/dist/agents/drivers/codex-live.js +46 -32
- package/dist/agents/drivers/codex-live.js.map +1 -1
- package/dist/agents/drivers/codex.d.ts +10 -1
- package/dist/agents/drivers/codex.js +48 -2
- package/dist/agents/drivers/codex.js.map +1 -1
- package/dist/agents/drivers/copilot.d.ts +9 -1
- package/dist/agents/drivers/copilot.js +31 -1
- package/dist/agents/drivers/copilot.js.map +1 -1
- package/dist/agents/drivers/cursor.d.ts +10 -1
- package/dist/agents/drivers/cursor.js +48 -5
- package/dist/agents/drivers/cursor.js.map +1 -1
- package/dist/agents/drivers/gemini.d.ts +11 -1
- package/dist/agents/drivers/gemini.js +46 -2
- package/dist/agents/drivers/gemini.js.map +1 -1
- package/dist/agents/drivers/muse-approvals.d.ts +19 -0
- package/dist/agents/drivers/muse-approvals.js +157 -0
- package/dist/agents/drivers/muse-approvals.js.map +1 -0
- package/dist/agents/drivers/muse-live.d.ts +5 -1
- package/dist/agents/drivers/muse-live.js +21 -109
- package/dist/agents/drivers/muse-live.js.map +1 -1
- package/dist/agents/drivers/opencode.d.ts +7 -1
- package/dist/agents/drivers/opencode.js +28 -2
- package/dist/agents/drivers/opencode.js.map +1 -1
- package/dist/agents/drivers/permission-args.d.ts +14 -0
- package/dist/agents/drivers/permission-args.js +40 -0
- package/dist/agents/drivers/permission-args.js.map +1 -0
- package/dist/agents/drivers/vibe.d.ts +9 -1
- package/dist/agents/drivers/vibe.js +40 -2
- package/dist/agents/drivers/vibe.js.map +1 -1
- package/dist/agents/hosted.js +9 -0
- package/dist/agents/hosted.js.map +1 -1
- package/dist/agents/live-agent.d.ts +49 -4
- package/dist/agents/live-agent.js +84 -15
- package/dist/agents/live-agent.js.map +1 -1
- package/dist/agents/permissions.d.ts +27 -0
- package/dist/agents/permissions.js +79 -0
- package/dist/agents/permissions.js.map +1 -0
- package/dist/agents/prepare.d.ts +12 -1
- package/dist/agents/prepare.js +18 -3
- package/dist/agents/prepare.js.map +1 -1
- package/dist/agents/rpc.d.ts +13 -2
- package/dist/agents/rpc.js +20 -2
- package/dist/agents/rpc.js.map +1 -1
- package/dist/agents/runtime.d.ts +4 -0
- package/dist/agents/runtime.js +20 -0
- package/dist/agents/runtime.js.map +1 -1
- package/dist/agents/session.d.ts +4 -1
- package/dist/agents/session.js +31 -6
- package/dist/agents/session.js.map +1 -1
- package/dist/agents/types.d.ts +56 -7
- package/dist/agents.d.ts +21 -13
- package/dist/agents.js +14 -9
- package/dist/agents.js.map +1 -1
- package/dist/react/agent-chat.js +10 -2
- package/dist/react/agent-chat.js.map +1 -1
- package/dist/ui/index.js +69 -69
- package/dist/ui/web-client.js +9 -9
- package/docs/agents.md +129 -19
- package/package.json +5 -5
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { mergePermissionFlags, resolvePermissions } from '../permissions.js';
|
|
2
|
+
import { antigravityPermissionFlags } from './antigravity.js';
|
|
3
|
+
import { claudePermissionFlags } from './claude-approvals.js';
|
|
4
|
+
import { codexPermissionFlags } from './codex.js';
|
|
5
|
+
import { copilotPermissionFlags } from './copilot.js';
|
|
6
|
+
import { cursorPermissionFlags } from './cursor.js';
|
|
7
|
+
import { geminiPermissionFlags } from './gemini.js';
|
|
8
|
+
import { opencodePermissionFlags } from './opencode.js';
|
|
9
|
+
import { vibePermissionFlags } from './vibe.js';
|
|
10
|
+
const FLAGS = {
|
|
11
|
+
claude: claudePermissionFlags,
|
|
12
|
+
codex: codexPermissionFlags,
|
|
13
|
+
gemini: geminiPermissionFlags,
|
|
14
|
+
cursor: cursorPermissionFlags,
|
|
15
|
+
copilot: copilotPermissionFlags,
|
|
16
|
+
opencode: opencodePermissionFlags,
|
|
17
|
+
vibe: vibePermissionFlags,
|
|
18
|
+
antigravity: antigravityPermissionFlags,
|
|
19
|
+
agy: antigravityPermissionFlags,
|
|
20
|
+
};
|
|
21
|
+
/** Agents `applyPermissionArgs` can translate for (`agy` is Antigravity). */
|
|
22
|
+
export const PERMISSION_AGENTS = Object.keys(FLAGS);
|
|
23
|
+
/**
|
|
24
|
+
* Rewrite an agent's own headless argument list (one an app keeps outside the genaicode
|
|
25
|
+
* drivers) for `permissions`: flags the translation owns are replaced, the rest kept. Each
|
|
26
|
+
* agent's translation is the one its driver uses (`claudePermissionFlags`, ...). Throws for an
|
|
27
|
+
* unknown agent or a combination it cannot honor. For Claude, `ask` and `auto-approve` also
|
|
28
|
+
* need the permission prompt tool (`claudeApprovalTool` with the same sandbox).
|
|
29
|
+
*/
|
|
30
|
+
export function applyPermissionArgs(agent, args, permissions) {
|
|
31
|
+
const translate = FLAGS[agent];
|
|
32
|
+
if (!translate)
|
|
33
|
+
throw new Error(`No permission translation for agent ${JSON.stringify(agent)}.`);
|
|
34
|
+
const resolved = resolvePermissions(permissions);
|
|
35
|
+
if (resolved.approval === undefined && resolved.sandbox === undefined)
|
|
36
|
+
return { args: [...args], env: {} };
|
|
37
|
+
const flags = translate(resolved);
|
|
38
|
+
return { args: mergePermissionFlags(args, flags), env: { ...flags.env } };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=permission-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-args.js","sourceRoot":"","sources":["../../../src/agents/drivers/permission-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAwB,MAAM,mBAAmB,CAAC;AAEnG,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,KAAK,GAAuE;IAChF,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,oBAAoB;IAC3B,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,qBAAqB;IAC7B,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,uBAAuB;IACjC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,0BAA0B;IACvC,GAAG,EAAE,0BAA0B;CAChC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAsB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,IAAuB,EACvB,WAAqC;IAErC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC3G,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type AgentOutputParser } from '../cli-agent.js';
|
|
2
|
-
import
|
|
2
|
+
import { type PermissionFlags } from '../permissions.js';
|
|
3
|
+
import type { AgentPermissions, AgentTask, CodingAgent } from '../types.js';
|
|
3
4
|
export interface VibeAgentOptions {
|
|
4
5
|
/** Executable name or path. Default `vibe`. */
|
|
5
6
|
command?: string;
|
|
@@ -18,6 +19,13 @@ export interface VibeAgentOptions {
|
|
|
18
19
|
* Vibe has no model flag; `task.model` is passed as `VIBE_ACTIVE_MODEL`.
|
|
19
20
|
*/
|
|
20
21
|
export declare function vibe(options?: VibeAgentOptions): CodingAgent;
|
|
22
|
+
/**
|
|
23
|
+
* Vibe flags for `permissions`: `auto-approve` is `--auto-approve` for the selected agent
|
|
24
|
+
* profile, `deny` leaves it off (a headless run declines what it would ask about), and
|
|
25
|
+
* `read-only` is the `plan` profile, which cannot be combined with `auto-approve`. Vibe has
|
|
26
|
+
* no sandbox, so `workspace-write` is not offered. `ask` is not possible headless.
|
|
27
|
+
*/
|
|
28
|
+
export declare function vibePermissionFlags(permissions: AgentPermissions): PermissionFlags;
|
|
21
29
|
export declare function vibeArgs(task: AgentTask, options?: VibeAgentOptions): string[];
|
|
22
30
|
/** Decodes `--output streaming`: one completed history entry per line. */
|
|
23
31
|
export declare function createVibeParser(): AgentOutputParser;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cliAgent } from '../cli-agent.js';
|
|
2
|
+
import { exclusiveOption, resolvePermissions } from '../permissions.js';
|
|
2
3
|
import { isObject, stringField } from './json.js';
|
|
3
4
|
const EDIT_KINDS = new Set(['file_edit', 'file_write']);
|
|
4
5
|
/**
|
|
@@ -9,7 +10,10 @@ export function vibe(options = {}) {
|
|
|
9
10
|
return cliAgent({
|
|
10
11
|
name: 'vibe',
|
|
11
12
|
command: options.command ?? 'vibe',
|
|
12
|
-
capabilities: {
|
|
13
|
+
capabilities: {
|
|
14
|
+
maxTurns: true,
|
|
15
|
+
permissions: { approval: ['auto-approve', 'deny'], sandbox: ['read-only', 'unrestricted'] },
|
|
16
|
+
},
|
|
13
17
|
args: (task) => vibeArgs(task, options),
|
|
14
18
|
prepare: (task) => prepareVibe(task, options),
|
|
15
19
|
createParser: createVibeParser,
|
|
@@ -18,8 +22,42 @@ export function vibe(options = {}) {
|
|
|
18
22
|
function prepareVibe(task, options) {
|
|
19
23
|
return { args: vibeArgs(task, options), ...(task.model ? { env: { VIBE_ACTIVE_MODEL: task.model } } : {}) };
|
|
20
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Vibe flags for `permissions`: `auto-approve` is `--auto-approve` for the selected agent
|
|
27
|
+
* profile, `deny` leaves it off (a headless run declines what it would ask about), and
|
|
28
|
+
* `read-only` is the `plan` profile, which cannot be combined with `auto-approve`. Vibe has
|
|
29
|
+
* no sandbox, so `workspace-write` is not offered. `ask` is not possible headless.
|
|
30
|
+
*/
|
|
31
|
+
export function vibePermissionFlags(permissions) {
|
|
32
|
+
const { approval, sandbox } = permissions;
|
|
33
|
+
if (approval === 'ask')
|
|
34
|
+
throw new Error("vibe cannot ask for approval headless (permissions.approval 'ask').");
|
|
35
|
+
if (sandbox === 'workspace-write')
|
|
36
|
+
throw new Error("vibe has no sandbox ('workspace-write').");
|
|
37
|
+
if (sandbox === 'read-only' && approval === 'auto-approve')
|
|
38
|
+
throw new Error("vibe's read-only profile (plan) cannot be combined with permissions.approval 'auto-approve'.");
|
|
39
|
+
const args = [];
|
|
40
|
+
const replaces = {};
|
|
41
|
+
if (approval) {
|
|
42
|
+
Object.assign(replaces, { '--auto-approve': 'flag', '--yolo': 'flag', '--smart-approve': 'flag' });
|
|
43
|
+
if (approval === 'auto-approve')
|
|
44
|
+
args.push('--auto-approve');
|
|
45
|
+
}
|
|
46
|
+
if (sandbox === 'read-only') {
|
|
47
|
+
replaces['--agent'] = 'value';
|
|
48
|
+
args.push('--agent', 'plan');
|
|
49
|
+
}
|
|
50
|
+
return { args, replaces };
|
|
51
|
+
}
|
|
21
52
|
export function vibeArgs(task, options = {}) {
|
|
22
|
-
const
|
|
53
|
+
const permissions = resolvePermissions(task.permissions);
|
|
54
|
+
const readOnly = permissions.sandbox === 'read-only';
|
|
55
|
+
exclusiveOption('vibe', 'agent', options.agent !== undefined, 'sandbox', readOnly);
|
|
56
|
+
const flags = vibePermissionFlags(permissions);
|
|
57
|
+
const args = ['--output', 'streaming'];
|
|
58
|
+
if (!readOnly)
|
|
59
|
+
args.push('--agent', options.agent ?? 'accept-edits');
|
|
60
|
+
args.push(...flags.args);
|
|
23
61
|
if (options.trustWorkspace ?? true)
|
|
24
62
|
args.push('--trust');
|
|
25
63
|
if (task.maxTurns !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vibe.js","sourceRoot":"","sources":["../../../src/agents/drivers/vibe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"vibe.js","sourceRoot":"","sources":["../../../src/agents/drivers/vibe.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/hosted.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolvePermissions, unsupportedPermissions } from './permissions.js';
|
|
1
2
|
import { RunRecorder } from './runtime.js';
|
|
2
3
|
const TERMINAL = new Set(['completed', 'failed', 'cancelled']);
|
|
3
4
|
/** Adapt a `HostedAgentProvider` to `CodingAgent`, so hosted and local agents share one API. */
|
|
@@ -38,6 +39,14 @@ function runHosted(provider, task, pollIntervalMs) {
|
|
|
38
39
|
delete request.signal;
|
|
39
40
|
delete request.onApproval;
|
|
40
41
|
delete request.timeoutMs;
|
|
42
|
+
const refused = unsupportedPermissions(provider.name, provider.capabilities ?? {}, task);
|
|
43
|
+
if (refused)
|
|
44
|
+
return { exit: exit('spawn-error', new Error(refused)) };
|
|
45
|
+
if (task.permissions !== undefined)
|
|
46
|
+
request.permissions = resolvePermissions(task.permissions);
|
|
47
|
+
// The provider contract has no channel to bring a question back to onApproval.
|
|
48
|
+
if (resolvePermissions(task.permissions).approval === 'ask')
|
|
49
|
+
return { exit: exit('spawn-error', new Error(`${provider.name} cannot run with permissions.approval 'ask'.`)) };
|
|
41
50
|
try {
|
|
42
51
|
taskId = (await provider.start(request, controller.signal)).id;
|
|
43
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted.js","sourceRoot":"","sources":["../../src/agents/hosted.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hosted.js","sourceRoot":"","sources":["../../src/agents/hosted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAqB,MAAM,cAAc,CAAC;AAoC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhF,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,QAA6B,EAAE,UAA8B,EAAE;IACzF,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,IAAI;QACtB,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;QAClE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAA6B,EAAE,IAAe,EAAE,cAAsB;IACvF,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,UAA6C,CAAC;IAClD,IAAI,MAA0B,CAAC;IAE/B,MAAM,IAAI,GAAG,CAAC,MAA6B,EAAE,EAAE;QAC7C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACpD,UAAU,GAAG,MAAM,CAAC;QACpB,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3G,MAAM,IAAI,GAAG,CAAC,MAA6B,EAAE,KAAa,EAAe,EAAE,CAAC,CAAC;QAC3E,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,IAA4D,EAAE;QAC9E,+EAA+E;QAC/E,MAAM,OAAO,GAAuB,EAAE,GAAG,IAAI,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,GAAG,CAAC;QACnB,OAAO,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,OAAO,CAAC,UAAU,CAAC;QAC1B,OAAO,OAAO,CAAC,SAAS,CAAC;QACzB,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACzF,IAAI,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/F,+EAA+E;QAC/E,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,KAAK,KAAK;YACzD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,8CAA8C,CAAC,CAAC,EAAE,CAAC;QAClH,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,OAA4B,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,UAAU;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,IAAI,MAA0B,CAAC;QAC/B,OAAO,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,IAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU;oBAAE,MAAM;gBACtB,0EAA0E;gBAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,QAAQ,CAAC,IAAI,YAAY,OAAO,EAAE,EAAE,EAAE,CAAC;YAChH,CAAC;YACD,4EAA4E;YAC5E,IAAI,UAAU;gBAAE,MAAM;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;YAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjE,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACpB,OAAO,EACL,IAAI,CAAC,KAAK,KAAK,WAAW;wBACxB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;wBACd,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,QAAQ,CAAC,IAAI,eAAe,EAAE;iBAC1E,CAAC;YACJ,CAAC;YACD,uFAAuF;YACvF,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,EAAE,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QACtD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,IAAI;YACf,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CACtB,MAAM,IAAI,CAAC,UAAU;oBACnB,CAAC,CAAC,QAAQ,CAAC,IAAK,CAAC,MAAM,EAAE,IAAI,CAAC;oBAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,0BAA0B,CAAC,CAAC;aAC5E;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAmB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,SAAS,IAAI;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,SAAS,YAAY,CAAC,IAAmB,EAAE,MAAmB;IAC5D,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PreparedRun } from './prepare.js';
|
|
2
|
-
import { RpcPeer } from './rpc.js';
|
|
2
|
+
import { RpcPeer, type RpcRequestContext } from './rpc.js';
|
|
3
3
|
import { type AgentOutcome } from './runtime.js';
|
|
4
4
|
import type { AgentCapabilities, AgentEvent, AgentTask, ApprovalDecision, ApprovalRequest, CodingAgent } from './types.js';
|
|
5
5
|
/** What a live driver gets for one task. */
|
|
@@ -10,12 +10,35 @@ export interface LiveSession {
|
|
|
10
10
|
/** Called for each notification the agent sends. Set once, before the first request. */
|
|
11
11
|
onNotification(handler: (method: string, params: unknown) => void): void;
|
|
12
12
|
/** Called for each request the agent sends. Throw `RpcError` to decline. Unhandled requests are declined. */
|
|
13
|
-
onRequest(handler: (method: string, params: unknown) => unknown | Promise<unknown>): void;
|
|
14
|
-
/**
|
|
15
|
-
|
|
13
|
+
onRequest(handler: (method: string, params: unknown, context: RpcRequestContext) => unknown | Promise<unknown>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Decide a request with `decideApproval`, emitting request and decision events. The decision
|
|
16
|
+
* is `deny` when there is no handler, it throws, `signal` aborts, or the task ends first; the
|
|
17
|
+
* handler's signal aborts in the last two cases.
|
|
18
|
+
*/
|
|
19
|
+
approve(request: ApprovalRequest, signal?: AbortSignal): Promise<ApprovalDecision>;
|
|
20
|
+
/** Aborts once the task is over: its process exited, or it was stopped. */
|
|
21
|
+
readonly signal: AbortSignal;
|
|
16
22
|
/** Make `AgentRun.steer` send input, or pass undefined once the task stops accepting it. */
|
|
17
23
|
setSteer(steer: ((text: string) => Promise<void>) | undefined): void;
|
|
18
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* A vendor's approval protocol over a live session. A driver hands it each request and
|
|
27
|
+
* notification first; methods it does not own come back as `undefined` / `false`.
|
|
28
|
+
*/
|
|
29
|
+
export interface LiveApprovals {
|
|
30
|
+
/** Answer an approval request, or `undefined` when `method` is not one. Rejects requests from another thread or turn. */
|
|
31
|
+
request(method: string, params: unknown, context?: RpcRequestContext): Promise<unknown> | undefined;
|
|
32
|
+
/** Handle an approval notification. True when `method` belonged to the approval protocol. */
|
|
33
|
+
notification(method: string, params: unknown): boolean;
|
|
34
|
+
/** The turn ended: close open questions, and deny whatever is answered afterwards. */
|
|
35
|
+
close(): void;
|
|
36
|
+
}
|
|
37
|
+
/** Which thread (or session) and turn approvals must belong to. Undefined until the agent names them. */
|
|
38
|
+
export interface LiveApprovalIds {
|
|
39
|
+
session?: string;
|
|
40
|
+
turn?: string;
|
|
41
|
+
}
|
|
19
42
|
export interface LiveAgentDefinition {
|
|
20
43
|
name: string;
|
|
21
44
|
command: string;
|
|
@@ -33,5 +56,27 @@ export interface LiveAgentDefinition {
|
|
|
33
56
|
* stays up for the whole task, so the caller can `steer()` it and answer approvals.
|
|
34
57
|
*/
|
|
35
58
|
export declare function liveAgent(definition: LiveAgentDefinition): CodingAgent;
|
|
59
|
+
/**
|
|
60
|
+
* `task.onApproval`'s answer, or `deny`: without a handler, when it throws, and when `signal`
|
|
61
|
+
* aborts first (the handler is not waited for then).
|
|
62
|
+
*/
|
|
63
|
+
export declare function askApproval(task: Pick<AgentTask, 'onApproval'>, request: ApprovalRequest, signal: AbortSignal): Promise<ApprovalDecision>;
|
|
64
|
+
/**
|
|
65
|
+
* Emit `approval-request`, run `decide`, and emit one `approval-resolved`. When `signal`
|
|
66
|
+
* aborts first, the denial is emitted right away, before the run's event stream can close.
|
|
67
|
+
*/
|
|
68
|
+
export declare function reportApproval(emit: (event: AgentEvent) => void, request: ApprovalRequest, signal: AbortSignal, decide: () => Promise<{
|
|
69
|
+
decision: ApprovalDecision;
|
|
70
|
+
automatic: boolean;
|
|
71
|
+
}>): Promise<ApprovalDecision>;
|
|
72
|
+
/**
|
|
73
|
+
* Decide one request under `task.permissions.approval`: `deny` and `auto-approve` answer
|
|
74
|
+
* without asking (`automatic`), otherwise `askApproval`. An approval that arrives after
|
|
75
|
+
* `signal` aborted is a denial either way.
|
|
76
|
+
*/
|
|
77
|
+
export declare function decideApproval(task: Pick<AgentTask, 'onApproval' | 'permissions'>, request: ApprovalRequest, signal: AbortSignal): Promise<{
|
|
78
|
+
decision: ApprovalDecision;
|
|
79
|
+
automatic: boolean;
|
|
80
|
+
}>;
|
|
36
81
|
/** RFC 9562 UUIDv7: time-ordered ids some agents require for idempotent commands. */
|
|
37
82
|
export declare function uuidv7(now?: number): string;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { resolvePermissions } from './permissions.js';
|
|
2
3
|
import { planSpawn } from './prepare.js';
|
|
3
4
|
import { startProcess } from './process.js';
|
|
4
5
|
import { RpcError, RpcPeer } from './rpc.js';
|
|
5
|
-
import { invalidCwd, RunRecorder } from './runtime.js';
|
|
6
|
+
import { anySignal, invalidCwd, linkAbort, RunRecorder } from './runtime.js';
|
|
6
7
|
/**
|
|
7
8
|
* Build a `CodingAgent` from a CLI that serves JSON-RPC over stdio. The process
|
|
8
9
|
* stays up for the whole task, so the caller can `steer()` it and answer approvals.
|
|
@@ -75,8 +76,11 @@ function runLiveAgent(definition, task) {
|
|
|
75
76
|
};
|
|
76
77
|
const rpc = new RpcPeer((line) => handle.write(line), {
|
|
77
78
|
notification: (method, params) => notificationHandler(method, params),
|
|
78
|
-
request: (method, params) => requestHandler(method, params),
|
|
79
|
+
request: (method, params, context) => requestHandler(method, params, context),
|
|
79
80
|
});
|
|
81
|
+
// Ends every open approval question when the task is over.
|
|
82
|
+
const lifetime = new AbortController();
|
|
83
|
+
linkAbort(task.signal, lifetime);
|
|
80
84
|
const session = {
|
|
81
85
|
task,
|
|
82
86
|
rpc,
|
|
@@ -87,24 +91,17 @@ function runLiveAgent(definition, task) {
|
|
|
87
91
|
onRequest(handler) {
|
|
88
92
|
requestHandler = handler;
|
|
89
93
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (task.onApproval)
|
|
95
|
-
decision = (await task.onApproval(request)) === 'approve' ? 'approve' : 'deny';
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
decision = 'deny';
|
|
99
|
-
}
|
|
100
|
-
recorder.emit({ type: 'approval-resolved', id: request.id, decision });
|
|
101
|
-
return decision;
|
|
94
|
+
signal: lifetime.signal,
|
|
95
|
+
approve(request, signal) {
|
|
96
|
+
const ended = signal ? anySignal([lifetime.signal, signal]) : lifetime.signal;
|
|
97
|
+
return reportApproval((event) => recorder.emit(event), request, ended, () => decideApproval(task, request, ended));
|
|
102
98
|
},
|
|
103
99
|
setSteer(next) {
|
|
104
100
|
steer = next;
|
|
105
101
|
},
|
|
106
102
|
};
|
|
107
103
|
const exited = handle.exit.then((exit) => {
|
|
104
|
+
lifetime.abort();
|
|
108
105
|
plan.cleanup();
|
|
109
106
|
steer = undefined;
|
|
110
107
|
rpc.fail(new Error(`${definition.name} exited before the task finished.`));
|
|
@@ -113,6 +110,7 @@ function runLiveAgent(definition, task) {
|
|
|
113
110
|
const outcome = definition.drive(session).then((verdict) => verdict, (error) => ({ ok: false, error: error instanceof Error ? error.message : String(error) }));
|
|
114
111
|
const result = Promise.race([outcome.then(() => undefined), exited]).then(async (early) => {
|
|
115
112
|
steer = undefined;
|
|
113
|
+
lifetime.abort();
|
|
116
114
|
// Exiting before the turn ends is a failure even with exit code 0.
|
|
117
115
|
if (early)
|
|
118
116
|
return recorder.finish(early, (await settledOrUndefined(outcome)) ?? {
|
|
@@ -122,7 +120,78 @@ function runLiveAgent(definition, task) {
|
|
|
122
120
|
handle.close();
|
|
123
121
|
return recorder.finish(await exited, await outcome);
|
|
124
122
|
});
|
|
125
|
-
|
|
123
|
+
const abort = () => {
|
|
124
|
+
lifetime.abort();
|
|
125
|
+
handle.kill();
|
|
126
|
+
};
|
|
127
|
+
return { result, abort, steer: steerRun, [Symbol.asyncIterator]: iterate };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* `task.onApproval`'s answer, or `deny`: without a handler, when it throws, and when `signal`
|
|
131
|
+
* aborts first (the handler is not waited for then).
|
|
132
|
+
*/
|
|
133
|
+
export async function askApproval(task, request, signal) {
|
|
134
|
+
const handler = task.onApproval;
|
|
135
|
+
if (!handler || signal.aborted)
|
|
136
|
+
return 'deny';
|
|
137
|
+
let stop = () => { };
|
|
138
|
+
const withdrawn = new Promise((resolve) => {
|
|
139
|
+
stop = () => resolve('deny');
|
|
140
|
+
signal.addEventListener('abort', stop, { once: true });
|
|
141
|
+
});
|
|
142
|
+
try {
|
|
143
|
+
const answer = await Promise.race([Promise.resolve().then(() => handler(request, signal)), withdrawn]);
|
|
144
|
+
return answer === 'approve' && !signal.aborted ? 'approve' : 'deny';
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return 'deny';
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
signal.removeEventListener('abort', stop);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Emit `approval-request`, run `decide`, and emit one `approval-resolved`. When `signal`
|
|
155
|
+
* aborts first, the denial is emitted right away, before the run's event stream can close.
|
|
156
|
+
*/
|
|
157
|
+
export async function reportApproval(emit, request, signal, decide) {
|
|
158
|
+
emit({ type: 'approval-request', request });
|
|
159
|
+
let reported;
|
|
160
|
+
const report = (decision, automatic) => {
|
|
161
|
+
if (reported)
|
|
162
|
+
return;
|
|
163
|
+
reported = decision;
|
|
164
|
+
emit({ type: 'approval-resolved', id: request.id, decision, ...(automatic ? { automatic } : {}) });
|
|
165
|
+
};
|
|
166
|
+
const withdrawn = () => report('deny', false);
|
|
167
|
+
signal.addEventListener('abort', withdrawn, { once: true });
|
|
168
|
+
try {
|
|
169
|
+
const { decision, automatic } = await decide();
|
|
170
|
+
report(decision, automatic);
|
|
171
|
+
return reported;
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
signal.removeEventListener('abort', withdrawn);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Decide one request under `task.permissions.approval`: `deny` and `auto-approve` answer
|
|
179
|
+
* without asking (`automatic`), otherwise `askApproval`. An approval that arrives after
|
|
180
|
+
* `signal` aborted is a denial either way.
|
|
181
|
+
*/
|
|
182
|
+
export async function decideApproval(task, request, signal) {
|
|
183
|
+
let policy;
|
|
184
|
+
try {
|
|
185
|
+
policy = resolvePermissions(task.permissions).approval;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return { decision: 'deny', automatic: true };
|
|
189
|
+
}
|
|
190
|
+
if (policy === 'deny')
|
|
191
|
+
return { decision: 'deny', automatic: true };
|
|
192
|
+
if (policy === 'auto-approve')
|
|
193
|
+
return { decision: signal.aborted ? 'deny' : 'approve', automatic: true };
|
|
194
|
+
return { decision: await askApproval(task, request, signal), automatic: false };
|
|
126
195
|
}
|
|
127
196
|
/** A driver's verdict when it already settled; undefined when it was still waiting. */
|
|
128
197
|
async function settledOrUndefined(outcome) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-agent.js","sourceRoot":"","sources":["../../src/agents/live-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"live-agent.js","sourceRoot":"","sources":["../../src/agents/live-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentCapabilities, AgentPermissions, AgentTask } from './types.js';
|
|
2
|
+
/** Full access, no questions. */
|
|
3
|
+
export declare const YOLO: Readonly<Required<AgentPermissions>>;
|
|
4
|
+
/** `task.permissions` as an object: `'yolo'` expanded, nothing set for an omitted value. */
|
|
5
|
+
export declare function resolvePermissions(permissions: AgentTask['permissions']): AgentPermissions;
|
|
6
|
+
/** Why `task.permissions` cannot run on this agent, or undefined when it can. */
|
|
7
|
+
export declare function unsupportedPermissions(name: string, capabilities: AgentCapabilities, task: Pick<AgentTask, 'permissions' | 'onApproval'>): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* One agent's command-line translation of `AgentPermissions` (see `applyPermissionArgs`).
|
|
10
|
+
* Throws when the agent cannot honor the combination.
|
|
11
|
+
*/
|
|
12
|
+
export interface PermissionFlags {
|
|
13
|
+
/** Arguments to add. */
|
|
14
|
+
args: string[];
|
|
15
|
+
/** Flags these arguments replace; any already present are removed first, with their values. */
|
|
16
|
+
replaces: Readonly<Record<string, 'flag' | 'value'>>;
|
|
17
|
+
/** Environment variables to set. */
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Remove the flags `replaces` names from `args` (both `--flag value` and `--flag=value`), then
|
|
22
|
+
* insert `flags.args` after a leading subcommand word (`exec`, `run`...), so a trailing
|
|
23
|
+
* `-p` / `--prompt` keeps its value and `exec resume <id> <prompt>` keeps its positionals.
|
|
24
|
+
*/
|
|
25
|
+
export declare function mergePermissionFlags(args: readonly string[], flags: PermissionFlags): string[];
|
|
26
|
+
/** Throw unless the agent option the permissions would set was left at its default. */
|
|
27
|
+
export declare function exclusiveOption(name: string, option: string, set: boolean, field: string, wanted: boolean): void;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Full access, no questions. */
|
|
2
|
+
export const YOLO = Object.freeze({
|
|
3
|
+
approval: 'auto-approve',
|
|
4
|
+
sandbox: 'unrestricted',
|
|
5
|
+
});
|
|
6
|
+
const APPROVALS = ['ask', 'auto-approve', 'deny'];
|
|
7
|
+
const SANDBOXES = ['workspace-write', 'read-only', 'unrestricted'];
|
|
8
|
+
/** `task.permissions` as an object: `'yolo'` expanded, nothing set for an omitted value. */
|
|
9
|
+
export function resolvePermissions(permissions) {
|
|
10
|
+
if (permissions === undefined)
|
|
11
|
+
return {};
|
|
12
|
+
if (permissions === 'yolo')
|
|
13
|
+
return { ...YOLO };
|
|
14
|
+
if (typeof permissions !== 'object' || permissions === null || Array.isArray(permissions))
|
|
15
|
+
throw new Error(`Invalid task.permissions: ${JSON.stringify(permissions)}.`);
|
|
16
|
+
// A misspelled field must not quietly fall back to the driver's defaults.
|
|
17
|
+
const unknown = Object.keys(permissions).filter((key) => key !== 'approval' && key !== 'sandbox');
|
|
18
|
+
if (unknown.length)
|
|
19
|
+
throw new Error(`Unknown task.permissions field: ${unknown.join(', ')}.`);
|
|
20
|
+
const { approval, sandbox } = permissions;
|
|
21
|
+
if (approval !== undefined && !APPROVALS.includes(approval))
|
|
22
|
+
throw new Error(`Unknown permissions.approval: ${JSON.stringify(approval)}.`);
|
|
23
|
+
if (sandbox !== undefined && !SANDBOXES.includes(sandbox))
|
|
24
|
+
throw new Error(`Unknown permissions.sandbox: ${JSON.stringify(sandbox)}.`);
|
|
25
|
+
return {
|
|
26
|
+
...(approval !== undefined ? { approval } : {}),
|
|
27
|
+
...(sandbox !== undefined ? { sandbox } : {}),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Why `task.permissions` cannot run on this agent, or undefined when it can. */
|
|
31
|
+
export function unsupportedPermissions(name, capabilities, task) {
|
|
32
|
+
let permissions;
|
|
33
|
+
try {
|
|
34
|
+
permissions = resolvePermissions(task.permissions);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return error.message;
|
|
38
|
+
}
|
|
39
|
+
const supported = capabilities.permissions ?? {};
|
|
40
|
+
const check = (field, value, values = []) => value === undefined || values.includes(value)
|
|
41
|
+
? undefined
|
|
42
|
+
: `${name} cannot run with permissions.${field} '${value}' (supported: ${values.join(', ') || 'none'}).`;
|
|
43
|
+
const refused = check('approval', permissions.approval, supported.approval) ??
|
|
44
|
+
check('sandbox', permissions.sandbox, supported.sandbox);
|
|
45
|
+
if (refused)
|
|
46
|
+
return refused;
|
|
47
|
+
if (permissions.approval === 'ask' && !task.onApproval)
|
|
48
|
+
return "permissions.approval 'ask' needs task.onApproval.";
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove the flags `replaces` names from `args` (both `--flag value` and `--flag=value`), then
|
|
53
|
+
* insert `flags.args` after a leading subcommand word (`exec`, `run`...), so a trailing
|
|
54
|
+
* `-p` / `--prompt` keeps its value and `exec resume <id> <prompt>` keeps its positionals.
|
|
55
|
+
*/
|
|
56
|
+
export function mergePermissionFlags(args, flags) {
|
|
57
|
+
const kept = [];
|
|
58
|
+
for (let i = 0; i < args.length; i++) {
|
|
59
|
+
const arg = args[i];
|
|
60
|
+
if (arg === '--') {
|
|
61
|
+
kept.push(...args.slice(i));
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
const name = arg.includes('=') ? arg.slice(0, arg.indexOf('=')) : arg;
|
|
65
|
+
const kind = flags.replaces[name];
|
|
66
|
+
if (!kind)
|
|
67
|
+
kept.push(arg);
|
|
68
|
+
else if (kind === 'value' && name === arg)
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
const at = kept.length && !kept[0].startsWith('-') ? 1 : 0;
|
|
72
|
+
return [...kept.slice(0, at), ...flags.args, ...kept.slice(at)];
|
|
73
|
+
}
|
|
74
|
+
/** Throw unless the agent option the permissions would set was left at its default. */
|
|
75
|
+
export function exclusiveOption(name, option, set, field, wanted) {
|
|
76
|
+
if (set && wanted)
|
|
77
|
+
throw new Error(`${name}: set either the ${option} option or task.permissions.${field}, not both.`);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/agents/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/prepare.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentCapabilities, AgentTask, McpServer } from './types.js';
|
|
1
|
+
import type { AgentCapabilities, AgentEvent, AgentTask, McpServer } from './types.js';
|
|
2
2
|
/** Everything a driver needs to start one task's process. */
|
|
3
3
|
export interface PreparedRun {
|
|
4
4
|
args: string[];
|
|
@@ -7,6 +7,13 @@ export interface PreparedRun {
|
|
|
7
7
|
/** Called once the process has exited (temp files, for example). */
|
|
8
8
|
cleanup?(): void;
|
|
9
9
|
}
|
|
10
|
+
/** What `prepare` can use beyond the task. */
|
|
11
|
+
export interface PrepareContext {
|
|
12
|
+
/** Add an event to the run's stream. */
|
|
13
|
+
emit(event: AgentEvent): void;
|
|
14
|
+
/** Aborts once the task is over: the process exited, or it was stopped before it started. */
|
|
15
|
+
readonly signal: AbortSignal;
|
|
16
|
+
}
|
|
10
17
|
/** Reject a task the agent cannot honor before anything is spawned. */
|
|
11
18
|
export declare function unsupportedTask(name: string, capabilities: AgentCapabilities, task: AgentTask): string | undefined;
|
|
12
19
|
export declare function isHttpServer(server: McpServer): server is Extract<McpServer, {
|
|
@@ -30,4 +37,8 @@ export type SpawnPlan = {
|
|
|
30
37
|
};
|
|
31
38
|
/** Check the task, then resolve arguments and environment for the child process. */
|
|
32
39
|
export declare function planSpawn(definition: SpawnDefinition, task: AgentTask, cwdError: string | undefined): SpawnPlan;
|
|
40
|
+
/** `planSpawn` for a `prepare` that may need to wait (start a server, for example). */
|
|
41
|
+
export declare function planSpawnAsync(definition: Omit<SpawnDefinition, 'prepare'> & {
|
|
42
|
+
prepare?(task: AgentTask, context: PrepareContext): PreparedRun | Promise<PreparedRun>;
|
|
43
|
+
}, task: AgentTask, cwdError: string | undefined, context: PrepareContext): Promise<SpawnPlan>;
|
|
33
44
|
export {};
|