@vitos-pizza/vitos-pizza 0.1.0 → 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/AGENTS.md +158 -158
- package/CHANGELOG.md +42 -24
- package/LICENSE +21 -21
- package/README.md +237 -234
- package/assets/logo.svg +28 -28
- package/node_modules/@vitos-pizza/agent-mode/extensions/index.ts +138 -117
- package/node_modules/@vitos-pizza/agent-mode/package.json +3 -3
- package/node_modules/@vitos-pizza/agent-mode/src/apply-mode.ts +60 -60
- package/node_modules/@vitos-pizza/agent-mode/src/mode-events.ts +102 -102
- package/node_modules/@vitos-pizza/agent-mode/src/modes.ts +43 -43
- package/node_modules/@vitos-pizza/agent-mode/src/plan-instructions.ts +85 -44
- package/node_modules/@vitos-pizza/agent-mode/tests/apply-mode.test.ts +36 -36
- package/node_modules/@vitos-pizza/agent-mode/tests/mode-events.test.ts +22 -22
- package/node_modules/@vitos-pizza/agent-mode/tests/modes.test.ts +38 -38
- package/node_modules/@vitos-pizza/agent-mode/tests/plan-instructions.test.ts +68 -45
- package/node_modules/@vitos-pizza/agent-mode/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/agent-mode/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/keybindings/extensions/index.ts +104 -104
- package/node_modules/@vitos-pizza/keybindings/package.json +1 -1
- package/node_modules/@vitos-pizza/keybindings/presets/shortcuts.json +3 -3
- package/node_modules/@vitos-pizza/keybindings/src/bind.ts +57 -57
- package/node_modules/@vitos-pizza/keybindings/src/config.ts +84 -84
- package/node_modules/@vitos-pizza/keybindings/src/registry.ts +43 -43
- package/node_modules/@vitos-pizza/keybindings/src/types.ts +54 -54
- package/node_modules/@vitos-pizza/keybindings/tests/config.test.ts +83 -83
- package/node_modules/@vitos-pizza/keybindings/tests/registry.test.ts +142 -142
- package/node_modules/@vitos-pizza/keybindings/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/keybindings/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/permission-system/extensions/index.ts +162 -162
- package/node_modules/@vitos-pizza/permission-system/package.json +2 -2
- package/node_modules/@vitos-pizza/permission-system/src/bash/matcher.ts +54 -51
- package/node_modules/@vitos-pizza/permission-system/src/bash/parser.ts +40 -40
- package/node_modules/@vitos-pizza/permission-system/src/config-paths.ts +23 -23
- package/node_modules/@vitos-pizza/permission-system/src/detect-preset-mode.ts +61 -61
- package/node_modules/@vitos-pizza/permission-system/src/expand-home.ts +12 -12
- package/node_modules/@vitos-pizza/permission-system/src/forwarding/forwarder.ts +224 -224
- package/node_modules/@vitos-pizza/permission-system/src/forwarding/subagent-registry.ts +61 -61
- package/node_modules/@vitos-pizza/permission-system/src/gates/path-utils.ts +66 -66
- package/node_modules/@vitos-pizza/permission-system/src/gates/pipeline.ts +151 -155
- package/node_modules/@vitos-pizza/permission-system/src/handlers/before-agent-start.ts +86 -65
- package/node_modules/@vitos-pizza/permission-system/src/handlers/skill-input.ts +1 -1
- package/node_modules/@vitos-pizza/permission-system/src/handlers/tool-call-gate.ts +204 -199
- package/node_modules/@vitos-pizza/permission-system/src/mode-api.ts +44 -44
- package/node_modules/@vitos-pizza/permission-system/src/permission-evaluator.ts +233 -216
- package/node_modules/@vitos-pizza/permission-system/src/permission-session.ts +62 -62
- package/node_modules/@vitos-pizza/permission-system/src/policy-loader.ts +211 -211
- package/node_modules/@vitos-pizza/permission-system/src/sanitizers/skill-prompt.ts +99 -99
- package/node_modules/@vitos-pizza/permission-system/src/sanitizers/system-prompt.ts +221 -221
- package/node_modules/@vitos-pizza/permission-system/src/service.ts +66 -66
- package/node_modules/@vitos-pizza/permission-system/src/session-approvals.ts +4 -1
- package/node_modules/@vitos-pizza/permission-system/src/types.ts +80 -80
- package/node_modules/@vitos-pizza/permission-system/src/ui/approval-summary.ts +43 -43
- package/node_modules/@vitos-pizza/permission-system/src/ui/config-modal.ts +36 -36
- package/node_modules/@vitos-pizza/permission-system/src/ui/permission-dialog.ts +52 -52
- package/node_modules/@vitos-pizza/permission-system/src/wildcard-matcher.ts +81 -81
- package/node_modules/@vitos-pizza/permission-system/src/yaml-frontmatter.ts +84 -84
- package/node_modules/@vitos-pizza/permission-system/src/yolo/runtime-api.ts +49 -49
- package/node_modules/@vitos-pizza/permission-system/tests/bash-parser.test.ts +32 -32
- package/node_modules/@vitos-pizza/permission-system/tests/before-agent-start.test.ts +61 -0
- package/node_modules/@vitos-pizza/permission-system/tests/detect-preset-mode.test.ts +68 -68
- package/node_modules/@vitos-pizza/permission-system/tests/forwarder.test.ts +55 -55
- package/node_modules/@vitos-pizza/permission-system/tests/gates.test.ts +170 -61
- package/node_modules/@vitos-pizza/permission-system/tests/path-utils.test.ts +68 -68
- package/node_modules/@vitos-pizza/permission-system/tests/permission-evaluator.test.ts +82 -55
- package/node_modules/@vitos-pizza/permission-system/tests/policy-loader.test.ts +25 -25
- package/node_modules/@vitos-pizza/permission-system/tests/system-prompt-sanitizer.test.ts +22 -22
- package/node_modules/@vitos-pizza/permission-system/tests/wildcard-matcher.test.ts +27 -27
- package/node_modules/@vitos-pizza/permission-system/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/permission-system/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/question/package.json +1 -1
- package/node_modules/@vitos-pizza/question/src/question-ui.ts +5 -1
- package/node_modules/@vitos-pizza/question/src/register-tool.ts +1 -4
- package/node_modules/@vitos-pizza/question/tests/question-ui-width-cache.test.ts +45 -0
- package/node_modules/@vitos-pizza/question/tests/register-tool-render.test.ts +48 -45
- package/node_modules/@vitos-pizza/session-title/extensions/index.ts +137 -137
- package/node_modules/@vitos-pizza/session-title/package.json +3 -3
- package/node_modules/@vitos-pizza/session-title/src/build-title-prompt.ts +16 -16
- package/node_modules/@vitos-pizza/session-title/src/extract-title-context.ts +55 -55
- package/node_modules/@vitos-pizza/session-title/src/fast-rules.ts +48 -48
- package/node_modules/@vitos-pizza/session-title/src/load-settings.ts +70 -70
- package/node_modules/@vitos-pizza/session-title/src/normalize-title.ts +20 -20
- package/node_modules/@vitos-pizza/session-title/src/parse-title-response.ts +6 -6
- package/node_modules/@vitos-pizza/session-title/src/resolve-title-model.ts +33 -33
- package/node_modules/@vitos-pizza/session-title/src/schedule-title-job.ts +53 -53
- package/node_modules/@vitos-pizza/session-title/src/should-schedule.ts +30 -30
- package/node_modules/@vitos-pizza/session-title/src/title-agent.ts +60 -60
- package/node_modules/@vitos-pizza/session-title/src/truncate-input.ts +10 -10
- package/node_modules/@vitos-pizza/session-title/src/types.ts +29 -29
- package/node_modules/@vitos-pizza/session-title/tests/build-title-prompt.test.ts +34 -34
- package/node_modules/@vitos-pizza/session-title/tests/extension.test.ts +198 -198
- package/node_modules/@vitos-pizza/session-title/tests/extract-title-context.test.ts +48 -48
- package/node_modules/@vitos-pizza/session-title/tests/fast-rules.test.ts +43 -43
- package/node_modules/@vitos-pizza/session-title/tests/parse-title-response.test.ts +34 -34
- package/node_modules/@vitos-pizza/session-title/tests/should-schedule.test.ts +30 -30
- package/node_modules/@vitos-pizza/session-title/tests/title-agent.test.ts +154 -154
- package/node_modules/@vitos-pizza/session-title/tests/truncate-input.test.ts +15 -15
- package/node_modules/@vitos-pizza/session-title/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/session-title/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/subagents/agents/planner.md +46 -43
- package/node_modules/@vitos-pizza/subagents/agents/scout.md +40 -40
- package/node_modules/@vitos-pizza/subagents/agents/title.md +13 -13
- package/node_modules/@vitos-pizza/subagents/agents/worker.md +36 -36
- package/node_modules/@vitos-pizza/subagents/extensions/index.ts +164 -164
- package/node_modules/@vitos-pizza/subagents/package.json +1 -1
- package/node_modules/@vitos-pizza/subagents/skills/subagents/SKILL.md +86 -80
- package/node_modules/@vitos-pizza/subagents/src/agents.ts +166 -166
- package/node_modules/@vitos-pizza/subagents/src/async/job-tracker.ts +71 -71
- package/node_modules/@vitos-pizza/subagents/src/async/spawn-async.ts +220 -220
- package/node_modules/@vitos-pizza/subagents/src/async/storage.ts +57 -57
- package/node_modules/@vitos-pizza/subagents/src/env.ts +4 -4
- package/node_modules/@vitos-pizza/subagents/src/execute-subagent.ts +285 -285
- package/node_modules/@vitos-pizza/subagents/src/progress.ts +187 -187
- package/node_modules/@vitos-pizza/subagents/src/render-animation.ts +40 -40
- package/node_modules/@vitos-pizza/subagents/src/render.ts +428 -428
- package/node_modules/@vitos-pizza/subagents/src/rpc/channels.ts +21 -21
- package/node_modules/@vitos-pizza/subagents/src/rpc/client.ts +144 -144
- package/node_modules/@vitos-pizza/subagents/src/rpc/server.ts +11 -11
- package/node_modules/@vitos-pizza/subagents/src/run-agent.ts +313 -313
- package/node_modules/@vitos-pizza/subagents/src/runtime.ts +102 -102
- package/node_modules/@vitos-pizza/subagents/src/schema.ts +62 -62
- package/node_modules/@vitos-pizza/subagents/src/spawn.ts +104 -104
- package/node_modules/@vitos-pizza/subagents/src/types.ts +92 -92
- package/node_modules/@vitos-pizza/subagents/src/utils.ts +100 -100
- package/node_modules/@vitos-pizza/subagents/src/wait.ts +159 -159
- package/node_modules/@vitos-pizza/subagents/tests/agents.test.ts +19 -19
- package/node_modules/@vitos-pizza/subagents/tests/execute-subagent.test.ts +96 -96
- package/node_modules/@vitos-pizza/subagents/tests/extension.test.ts +42 -42
- package/node_modules/@vitos-pizza/subagents/tests/progress.test.ts +206 -206
- package/node_modules/@vitos-pizza/subagents/tests/rpc.test.ts +74 -74
- package/node_modules/@vitos-pizza/subagents/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/subagents/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/ui-enhancements/package.json +1 -1
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/border-status.ts +14 -1
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
- package/node_modules/@vitos-pizza/ui-enhancements/tests/agent-mode-badge.test.ts +35 -35
- package/node_modules/@vitos-pizza/ui-enhancements/tests/resize-recovery.test.ts +135 -0
- package/node_modules/@vitos-pizza/websearch/package.json +1 -1
- package/node_modules/node-addon-api/tools/conversion.js +0 -0
- package/node_modules/node-gyp-build/bin.js +0 -0
- package/node_modules/node-gyp-build/build-test.js +0 -0
- package/node_modules/node-gyp-build/optional.js +0 -0
- package/package.json +11 -9
- package/packages/agent-mode/extensions/index.ts +138 -117
- package/packages/agent-mode/package.json +3 -3
- package/packages/agent-mode/src/apply-mode.ts +60 -60
- package/packages/agent-mode/src/mode-events.ts +102 -102
- package/packages/agent-mode/src/modes.ts +43 -43
- package/packages/agent-mode/src/plan-instructions.ts +85 -44
- package/packages/agent-mode/tsconfig.json +13 -13
- package/packages/agent-mode/vitest.config.ts +8 -8
- package/packages/keybindings/extensions/index.ts +104 -104
- package/packages/keybindings/package.json +1 -1
- package/packages/keybindings/presets/shortcuts.json +3 -3
- package/packages/keybindings/src/bind.ts +57 -57
- package/packages/keybindings/src/config.ts +84 -84
- package/packages/keybindings/src/registry.ts +43 -43
- package/packages/keybindings/src/types.ts +54 -54
- package/packages/keybindings/tsconfig.json +13 -13
- package/packages/keybindings/vitest.config.ts +8 -8
- package/packages/permission-system/extensions/index.ts +162 -162
- package/packages/permission-system/node_modules/web-tree-sitter/debug/tree-sitter.wasm +0 -0
- package/packages/permission-system/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
- package/packages/permission-system/package.json +2 -2
- package/packages/permission-system/src/bash/matcher.ts +54 -51
- package/packages/permission-system/src/bash/parser.ts +40 -40
- package/packages/permission-system/src/config-paths.ts +23 -23
- package/packages/permission-system/src/detect-preset-mode.ts +61 -61
- package/packages/permission-system/src/expand-home.ts +12 -12
- package/packages/permission-system/src/forwarding/forwarder.ts +224 -224
- package/packages/permission-system/src/forwarding/subagent-registry.ts +61 -61
- package/packages/permission-system/src/gates/path-utils.ts +66 -66
- package/packages/permission-system/src/gates/pipeline.ts +151 -155
- package/packages/permission-system/src/handlers/before-agent-start.ts +86 -65
- package/packages/permission-system/src/handlers/skill-input.ts +1 -1
- package/packages/permission-system/src/handlers/tool-call-gate.ts +204 -199
- package/packages/permission-system/src/mode-api.ts +44 -44
- package/packages/permission-system/src/permission-evaluator.ts +233 -216
- package/packages/permission-system/src/permission-session.ts +62 -62
- package/packages/permission-system/src/policy-loader.ts +211 -211
- package/packages/permission-system/src/sanitizers/skill-prompt.ts +99 -99
- package/packages/permission-system/src/sanitizers/system-prompt.ts +221 -221
- package/packages/permission-system/src/service.ts +66 -66
- package/packages/permission-system/src/session-approvals.ts +4 -1
- package/packages/permission-system/src/types.ts +80 -80
- package/packages/permission-system/src/ui/approval-summary.ts +43 -43
- package/packages/permission-system/src/ui/config-modal.ts +36 -36
- package/packages/permission-system/src/ui/permission-dialog.ts +52 -52
- package/packages/permission-system/src/wildcard-matcher.ts +81 -81
- package/packages/permission-system/src/yaml-frontmatter.ts +84 -84
- package/packages/permission-system/src/yolo/runtime-api.ts +49 -49
- package/packages/permission-system/tsconfig.json +13 -13
- package/packages/permission-system/vitest.config.ts +8 -8
- package/packages/question/package.json +1 -1
- package/packages/question/src/question-ui.ts +5 -1
- package/packages/question/src/register-tool.ts +1 -4
- package/packages/session-title/extensions/index.ts +137 -137
- package/packages/session-title/package.json +3 -3
- package/packages/session-title/src/build-title-prompt.ts +16 -16
- package/packages/session-title/src/extract-title-context.ts +55 -55
- package/packages/session-title/src/fast-rules.ts +48 -48
- package/packages/session-title/src/load-settings.ts +70 -70
- package/packages/session-title/src/normalize-title.ts +20 -20
- package/packages/session-title/src/parse-title-response.ts +6 -6
- package/packages/session-title/src/resolve-title-model.ts +33 -33
- package/packages/session-title/src/schedule-title-job.ts +53 -53
- package/packages/session-title/src/should-schedule.ts +30 -30
- package/packages/session-title/src/title-agent.ts +60 -60
- package/packages/session-title/src/truncate-input.ts +10 -10
- package/packages/session-title/src/types.ts +29 -29
- package/packages/session-title/tsconfig.json +13 -13
- package/packages/session-title/vitest.config.ts +8 -8
- package/packages/subagents/agents/planner.md +46 -43
- package/packages/subagents/agents/scout.md +40 -40
- package/packages/subagents/agents/title.md +13 -13
- package/packages/subagents/agents/worker.md +36 -36
- package/packages/subagents/extensions/index.ts +164 -164
- package/packages/subagents/package.json +1 -1
- package/packages/subagents/skills/subagents/SKILL.md +86 -80
- package/packages/subagents/src/agents.ts +166 -166
- package/packages/subagents/src/async/job-tracker.ts +71 -71
- package/packages/subagents/src/async/spawn-async.ts +220 -220
- package/packages/subagents/src/async/storage.ts +57 -57
- package/packages/subagents/src/env.ts +4 -4
- package/packages/subagents/src/execute-subagent.ts +285 -285
- package/packages/subagents/src/progress.ts +187 -187
- package/packages/subagents/src/render-animation.ts +40 -40
- package/packages/subagents/src/render.ts +428 -428
- package/packages/subagents/src/rpc/channels.ts +21 -21
- package/packages/subagents/src/rpc/client.ts +144 -144
- package/packages/subagents/src/rpc/server.ts +11 -11
- package/packages/subagents/src/run-agent.ts +313 -313
- package/packages/subagents/src/runtime.ts +102 -102
- package/packages/subagents/src/schema.ts +62 -62
- package/packages/subagents/src/spawn.ts +104 -104
- package/packages/subagents/src/types.ts +92 -92
- package/packages/subagents/src/utils.ts +100 -100
- package/packages/subagents/src/wait.ts +159 -159
- package/packages/subagents/tsconfig.json +13 -13
- package/packages/subagents/vitest.config.ts +8 -8
- package/packages/todoist/extensions/index.ts +163 -0
- package/packages/todoist/package.json +34 -0
- package/packages/todoist/src/events.ts +7 -0
- package/packages/todoist/src/silent-render.ts +8 -0
- package/packages/todoist/src/state.ts +147 -0
- package/packages/todoist/src/tools.ts +175 -0
- package/packages/todoist/src/types.ts +34 -0
- package/packages/todoist/src/widget.ts +109 -0
- package/packages/todoist/tsconfig.json +13 -0
- package/packages/todoist/vitest.config.ts +8 -0
- package/packages/ui-enhancements/package.json +1 -1
- package/packages/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
- package/packages/ui-enhancements/src/chrome/border-status.ts +14 -1
- package/packages/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
- package/packages/websearch/package.json +1 -1
- package/scripts/sync-pi-manifest.mjs +1 -1
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.cjs +0 -2988
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm +0 -0
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm.map +0 -1
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitos-pizza/subagents — subprocess subagent delegation for Vito's Pizzeria.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type {
|
|
6
|
-
ExtensionAPI,
|
|
7
|
-
ExtensionContext,
|
|
8
|
-
} from "@earendil-works/pi-coding-agent";
|
|
9
|
-
import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../src/env.ts";
|
|
10
|
-
import { createSubagentRuntime } from "../src/runtime.ts";
|
|
11
|
-
import type { SubagentRuntime } from "../src/runtime.ts";
|
|
12
|
-
import { SUBAGENTS_READY } from "../src/rpc/channels.ts";
|
|
13
|
-
import { startSubagentRpcServer } from "../src/rpc/client.ts";
|
|
14
|
-
import {
|
|
15
|
-
clearSubagentResultAnimation,
|
|
16
|
-
ensureSubagentResultAnimation,
|
|
17
|
-
} from "../src/render-animation.ts";
|
|
18
|
-
import {
|
|
19
|
-
renderSubagentCall,
|
|
20
|
-
renderSubagentResult,
|
|
21
|
-
subagentResultIsRunning,
|
|
22
|
-
renderWaitCall,
|
|
23
|
-
renderWaitResult,
|
|
24
|
-
} from "../src/render.ts";
|
|
25
|
-
import { SubagentParams, WaitParams } from "../src/schema.ts";
|
|
26
|
-
import type { ExecuteSubagentInput, WaitInput } from "../src/types.ts";
|
|
27
|
-
|
|
28
|
-
export interface SubagentsTestHarness {
|
|
29
|
-
handlers: {
|
|
30
|
-
session_start?: (event: unknown, ctx: ExtensionContext) => void;
|
|
31
|
-
session_shutdown?: (event: unknown, ctx: ExtensionContext) => void;
|
|
32
|
-
};
|
|
33
|
-
runtime?: SubagentRuntime;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function registerSubagents(
|
|
37
|
-
pi: ExtensionAPI,
|
|
38
|
-
): SubagentsTestHarness {
|
|
39
|
-
const handlers: SubagentsTestHarness["handlers"] = {};
|
|
40
|
-
let currentCtx: ExtensionContext | null = null;
|
|
41
|
-
let rpcDispose: (() => void) | null = null;
|
|
42
|
-
|
|
43
|
-
const runtime = createSubagentRuntime({
|
|
44
|
-
getContext: () => currentCtx,
|
|
45
|
-
events: pi.events,
|
|
46
|
-
}) as SubagentRuntime & { _restore(sessionFile: string | null): void };
|
|
47
|
-
|
|
48
|
-
pi.registerTool({
|
|
49
|
-
name: "subagent",
|
|
50
|
-
label: "Subagent",
|
|
51
|
-
description:
|
|
52
|
-
"Delegate tasks to specialized subagents. Modes: single (agent+task), parallel (tasks[]), chain (chain[] with {previous}). Use async:true for background runs.",
|
|
53
|
-
parameters: SubagentParams,
|
|
54
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
55
|
-
currentCtx = ctx;
|
|
56
|
-
return runtime.execute(params as ExecuteSubagentInput, {
|
|
57
|
-
signal,
|
|
58
|
-
onUpdate: onUpdate
|
|
59
|
-
? (partial) => onUpdate(partial)
|
|
60
|
-
: undefined,
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
renderCall(args, theme) {
|
|
64
|
-
return renderSubagentCall(args as Record<string, unknown>, theme);
|
|
65
|
-
},
|
|
66
|
-
renderResult(result, options, theme, context) {
|
|
67
|
-
if (subagentResultIsRunning(
|
|
68
|
-
result as {
|
|
69
|
-
content: Array<{ type: string; text?: string }>;
|
|
70
|
-
details?: import("../src/types.ts").SubagentDetails;
|
|
71
|
-
},
|
|
72
|
-
options,
|
|
73
|
-
)) {
|
|
74
|
-
ensureSubagentResultAnimation(context);
|
|
75
|
-
} else {
|
|
76
|
-
clearSubagentResultAnimation(context);
|
|
77
|
-
}
|
|
78
|
-
return renderSubagentResult(
|
|
79
|
-
result as {
|
|
80
|
-
content: Array<{ type: string; text?: string }>;
|
|
81
|
-
details?: import("../src/types.ts").SubagentDetails;
|
|
82
|
-
},
|
|
83
|
-
options,
|
|
84
|
-
theme,
|
|
85
|
-
context,
|
|
86
|
-
);
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
pi.registerTool({
|
|
91
|
-
name: "wait",
|
|
92
|
-
label: "Wait",
|
|
93
|
-
description:
|
|
94
|
-
"Block until background subagent runs finish. Default returns when the first run completes; use all:true to wait for every active run.",
|
|
95
|
-
parameters: WaitParams,
|
|
96
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
97
|
-
currentCtx = ctx;
|
|
98
|
-
const outcome = await runtime.wait(params as WaitInput);
|
|
99
|
-
const summaries = outcome.completed.map((run) => {
|
|
100
|
-
const status = run.state;
|
|
101
|
-
const output = run.finalOutput ?? "(no output)";
|
|
102
|
-
return `- ${run.id} [${run.agents.join(", ")}] ${status}: ${output}`;
|
|
103
|
-
});
|
|
104
|
-
const header = outcome.timedOut
|
|
105
|
-
? `Wait timed out (${outcome.activeRemaining} still active).`
|
|
106
|
-
: `Wait complete (${outcome.completed.length} run(s)).`;
|
|
107
|
-
return {
|
|
108
|
-
content: [
|
|
109
|
-
{
|
|
110
|
-
type: "text",
|
|
111
|
-
text: `${header}\n${summaries.join("\n") || "(none)"}`,
|
|
112
|
-
},
|
|
113
|
-
],
|
|
114
|
-
details: outcome,
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
renderCall(args, theme) {
|
|
118
|
-
return renderWaitCall(args as Record<string, unknown>, theme);
|
|
119
|
-
},
|
|
120
|
-
renderResult(result, _options, theme) {
|
|
121
|
-
return renderWaitResult(
|
|
122
|
-
result as { content: Array<{ type: string; text?: string }> },
|
|
123
|
-
theme,
|
|
124
|
-
);
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
handlers.session_start = (_event, ctx) => {
|
|
129
|
-
currentCtx = ctx;
|
|
130
|
-
if (!process.env[SUBAGENT_CHILD_ENV]) {
|
|
131
|
-
const sessionId = ctx.sessionManager.getSessionId?.();
|
|
132
|
-
if (sessionId) {
|
|
133
|
-
process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
const sessionFile = ctx.sessionManager.getSessionFile?.() ?? null;
|
|
137
|
-
(runtime as SubagentRuntime & { _restore(sessionFile: string | null): void })._restore(
|
|
138
|
-
sessionFile,
|
|
139
|
-
);
|
|
140
|
-
rpcDispose?.();
|
|
141
|
-
rpcDispose = startSubagentRpcServer(pi.events, runtime);
|
|
142
|
-
pi.events.emit(SUBAGENTS_READY, { version: 1 });
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
pi.on("session_start", handlers.session_start);
|
|
146
|
-
|
|
147
|
-
handlers.session_shutdown = () => {
|
|
148
|
-
delete process.env[SUBAGENT_PARENT_SESSION_ENV];
|
|
149
|
-
rpcDispose?.();
|
|
150
|
-
rpcDispose = null;
|
|
151
|
-
currentCtx = null;
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
pi.on("session_shutdown", handlers.session_shutdown);
|
|
155
|
-
|
|
156
|
-
return { handlers, runtime };
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export default function subagentsExtension(pi: ExtensionAPI) {
|
|
160
|
-
if (process.env[SUBAGENT_CHILD_ENV] === "1") {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
registerSubagents(pi);
|
|
164
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @vitos-pizza/subagents — subprocess subagent delegation for Vito's Pizzeria.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
ExtensionAPI,
|
|
7
|
+
ExtensionContext,
|
|
8
|
+
} from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../src/env.ts";
|
|
10
|
+
import { createSubagentRuntime } from "../src/runtime.ts";
|
|
11
|
+
import type { SubagentRuntime } from "../src/runtime.ts";
|
|
12
|
+
import { SUBAGENTS_READY } from "../src/rpc/channels.ts";
|
|
13
|
+
import { startSubagentRpcServer } from "../src/rpc/client.ts";
|
|
14
|
+
import {
|
|
15
|
+
clearSubagentResultAnimation,
|
|
16
|
+
ensureSubagentResultAnimation,
|
|
17
|
+
} from "../src/render-animation.ts";
|
|
18
|
+
import {
|
|
19
|
+
renderSubagentCall,
|
|
20
|
+
renderSubagentResult,
|
|
21
|
+
subagentResultIsRunning,
|
|
22
|
+
renderWaitCall,
|
|
23
|
+
renderWaitResult,
|
|
24
|
+
} from "../src/render.ts";
|
|
25
|
+
import { SubagentParams, WaitParams } from "../src/schema.ts";
|
|
26
|
+
import type { ExecuteSubagentInput, WaitInput } from "../src/types.ts";
|
|
27
|
+
|
|
28
|
+
export interface SubagentsTestHarness {
|
|
29
|
+
handlers: {
|
|
30
|
+
session_start?: (event: unknown, ctx: ExtensionContext) => void;
|
|
31
|
+
session_shutdown?: (event: unknown, ctx: ExtensionContext) => void;
|
|
32
|
+
};
|
|
33
|
+
runtime?: SubagentRuntime;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function registerSubagents(
|
|
37
|
+
pi: ExtensionAPI,
|
|
38
|
+
): SubagentsTestHarness {
|
|
39
|
+
const handlers: SubagentsTestHarness["handlers"] = {};
|
|
40
|
+
let currentCtx: ExtensionContext | null = null;
|
|
41
|
+
let rpcDispose: (() => void) | null = null;
|
|
42
|
+
|
|
43
|
+
const runtime = createSubagentRuntime({
|
|
44
|
+
getContext: () => currentCtx,
|
|
45
|
+
events: pi.events,
|
|
46
|
+
}) as SubagentRuntime & { _restore(sessionFile: string | null): void };
|
|
47
|
+
|
|
48
|
+
pi.registerTool({
|
|
49
|
+
name: "subagent",
|
|
50
|
+
label: "Subagent",
|
|
51
|
+
description:
|
|
52
|
+
"Delegate tasks to specialized subagents. Modes: single (agent+task), parallel (tasks[]), chain (chain[] with {previous}). Use async:true for background runs.",
|
|
53
|
+
parameters: SubagentParams,
|
|
54
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
55
|
+
currentCtx = ctx;
|
|
56
|
+
return runtime.execute(params as ExecuteSubagentInput, {
|
|
57
|
+
signal,
|
|
58
|
+
onUpdate: onUpdate
|
|
59
|
+
? (partial) => onUpdate(partial)
|
|
60
|
+
: undefined,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
renderCall(args, theme) {
|
|
64
|
+
return renderSubagentCall(args as Record<string, unknown>, theme);
|
|
65
|
+
},
|
|
66
|
+
renderResult(result, options, theme, context) {
|
|
67
|
+
if (subagentResultIsRunning(
|
|
68
|
+
result as {
|
|
69
|
+
content: Array<{ type: string; text?: string }>;
|
|
70
|
+
details?: import("../src/types.ts").SubagentDetails;
|
|
71
|
+
},
|
|
72
|
+
options,
|
|
73
|
+
)) {
|
|
74
|
+
ensureSubagentResultAnimation(context);
|
|
75
|
+
} else {
|
|
76
|
+
clearSubagentResultAnimation(context);
|
|
77
|
+
}
|
|
78
|
+
return renderSubagentResult(
|
|
79
|
+
result as {
|
|
80
|
+
content: Array<{ type: string; text?: string }>;
|
|
81
|
+
details?: import("../src/types.ts").SubagentDetails;
|
|
82
|
+
},
|
|
83
|
+
options,
|
|
84
|
+
theme,
|
|
85
|
+
context,
|
|
86
|
+
);
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
pi.registerTool({
|
|
91
|
+
name: "wait",
|
|
92
|
+
label: "Wait",
|
|
93
|
+
description:
|
|
94
|
+
"Block until background subagent runs finish. Default returns when the first run completes; use all:true to wait for every active run.",
|
|
95
|
+
parameters: WaitParams,
|
|
96
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
97
|
+
currentCtx = ctx;
|
|
98
|
+
const outcome = await runtime.wait(params as WaitInput);
|
|
99
|
+
const summaries = outcome.completed.map((run) => {
|
|
100
|
+
const status = run.state;
|
|
101
|
+
const output = run.finalOutput ?? "(no output)";
|
|
102
|
+
return `- ${run.id} [${run.agents.join(", ")}] ${status}: ${output}`;
|
|
103
|
+
});
|
|
104
|
+
const header = outcome.timedOut
|
|
105
|
+
? `Wait timed out (${outcome.activeRemaining} still active).`
|
|
106
|
+
: `Wait complete (${outcome.completed.length} run(s)).`;
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: `${header}\n${summaries.join("\n") || "(none)"}`,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
details: outcome,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
renderCall(args, theme) {
|
|
118
|
+
return renderWaitCall(args as Record<string, unknown>, theme);
|
|
119
|
+
},
|
|
120
|
+
renderResult(result, _options, theme) {
|
|
121
|
+
return renderWaitResult(
|
|
122
|
+
result as { content: Array<{ type: string; text?: string }> },
|
|
123
|
+
theme,
|
|
124
|
+
);
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
handlers.session_start = (_event, ctx) => {
|
|
129
|
+
currentCtx = ctx;
|
|
130
|
+
if (!process.env[SUBAGENT_CHILD_ENV]) {
|
|
131
|
+
const sessionId = ctx.sessionManager.getSessionId?.();
|
|
132
|
+
if (sessionId) {
|
|
133
|
+
process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const sessionFile = ctx.sessionManager.getSessionFile?.() ?? null;
|
|
137
|
+
(runtime as SubagentRuntime & { _restore(sessionFile: string | null): void })._restore(
|
|
138
|
+
sessionFile,
|
|
139
|
+
);
|
|
140
|
+
rpcDispose?.();
|
|
141
|
+
rpcDispose = startSubagentRpcServer(pi.events, runtime);
|
|
142
|
+
pi.events.emit(SUBAGENTS_READY, { version: 1 });
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
pi.on("session_start", handlers.session_start);
|
|
146
|
+
|
|
147
|
+
handlers.session_shutdown = () => {
|
|
148
|
+
delete process.env[SUBAGENT_PARENT_SESSION_ENV];
|
|
149
|
+
rpcDispose?.();
|
|
150
|
+
rpcDispose = null;
|
|
151
|
+
currentCtx = null;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
pi.on("session_shutdown", handlers.session_shutdown);
|
|
155
|
+
|
|
156
|
+
return { handlers, runtime };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export default function subagentsExtension(pi: ExtensionAPI) {
|
|
160
|
+
if (process.env[SUBAGENT_CHILD_ENV] === "1") {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
registerSubagents(pi);
|
|
164
|
+
}
|
|
@@ -1,80 +1,86 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: subagents
|
|
3
|
-
description: Delegate exploration, planning, and implementation to Vito's Pizzeria subagents (scout, planner, worker).
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Subagents (Vito's Pizzeria)
|
|
7
|
-
|
|
8
|
-
Use the `subagent` tool to delegate work to focused child agents with isolated context.
|
|
9
|
-
|
|
10
|
-
## Agent modes
|
|
11
|
-
|
|
12
|
-
Vito's Pizzeria uses three modes via `/mode` or `F6`:
|
|
13
|
-
|
|
14
|
-
| Mode | When to use |
|
|
15
|
-
|------|-------------|
|
|
16
|
-
| **agent** | Default balanced work |
|
|
17
|
-
| **plan** | Read-only
|
|
18
|
-
| **execute** | Full implementation after plan is approved |
|
|
19
|
-
|
|
20
|
-
In **plan** mode the main agent cannot write/edit/bash. Delegate with subagents:
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
scout → planner → (user confirms) → switch to execute → worker
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Built-in agents
|
|
27
|
-
|
|
28
|
-
| Agent | Use when |
|
|
29
|
-
|-------|----------|
|
|
30
|
-
| `scout` | Fast codebase recon; returns compressed context |
|
|
31
|
-
| `planner` | Turn context + requirements into an implementation plan |
|
|
32
|
-
| `worker` | Execute an approved plan with narrow, correct edits |
|
|
33
|
-
| `title` | Generate short session titles (used by `@vitos-pizza/session-title`) |
|
|
34
|
-
|
|
35
|
-
## Typical workflow
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
scout → planner → worker
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
###
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
1
|
+
---
|
|
2
|
+
name: subagents
|
|
3
|
+
description: Delegate exploration, planning, and implementation to Vito's Pizzeria subagents (scout, planner, worker).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Subagents (Vito's Pizzeria)
|
|
7
|
+
|
|
8
|
+
Use the `subagent` tool to delegate work to focused child agents with isolated context.
|
|
9
|
+
|
|
10
|
+
## Agent modes
|
|
11
|
+
|
|
12
|
+
Vito's Pizzeria uses three modes via `/mode` or `F6`:
|
|
13
|
+
|
|
14
|
+
| Mode | When to use |
|
|
15
|
+
|------|-------------|
|
|
16
|
+
| **agent** | Default balanced work |
|
|
17
|
+
| **plan** | Read-only planning — planner (+ optional scout), `question` for clarification; optional short **Next** footer |
|
|
18
|
+
| **execute** | Full implementation after plan is approved |
|
|
19
|
+
|
|
20
|
+
In **plan** mode the main agent cannot write/edit/bash. Delegate with subagents. Scout is optional — use it only when codebase recon is needed; otherwise call planner directly. When recon spans independent areas, run multiple scouts in parallel (`tasks: [...]`) then planner:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
[optional scout(s) →] planner → (user confirms) → switch to execute → worker
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Built-in agents
|
|
27
|
+
|
|
28
|
+
| Agent | Use when |
|
|
29
|
+
|-------|----------|
|
|
30
|
+
| `scout` | Fast codebase recon; returns compressed context |
|
|
31
|
+
| `planner` | Turn context + requirements into an implementation plan |
|
|
32
|
+
| `worker` | Execute an approved plan with narrow, correct edits |
|
|
33
|
+
| `title` | Generate short session titles (used by `@vitos-pizza/session-title`) |
|
|
34
|
+
|
|
35
|
+
## Typical workflow
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
[optional scout →] planner → worker
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Planner only (enough context)
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{ "agent": "planner", "task": "Create an implementation plan for ..." }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Chain with scout (when recon is needed)
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"chain": [
|
|
52
|
+
{ "agent": "scout", "task": "Map the auth module and key entry points" },
|
|
53
|
+
{ "agent": "planner", "task": "Create a plan based on {previous}" },
|
|
54
|
+
{ "agent": "worker", "task": "Implement the plan from {previous}" }
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Parallel
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"tasks": [
|
|
64
|
+
{ "agent": "scout", "task": "Scan packages/subagents" },
|
|
65
|
+
{ "agent": "scout", "task": "Scan packages/permission-system" }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Async + wait
|
|
71
|
+
|
|
72
|
+
Start work in the background, then block until it finishes:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{ "agent": "worker", "task": "...", "async": true }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{ "id": "<runId>" }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
via the `wait` tool.
|
|
83
|
+
|
|
84
|
+
## External modules
|
|
85
|
+
|
|
86
|
+
Other Vito's Pizzeria extensions can request subagent runs via `pi.events` RPC (`subagents:rpc:run`). Import helpers from `@vitos-pizza/subagents/rpc/client` if needed.
|