@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,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.
|
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import {
|
|
5
|
-
CONFIG_DIR_NAME,
|
|
6
|
-
getAgentDir,
|
|
7
|
-
parseFrontmatter,
|
|
8
|
-
} from "@earendil-works/pi-coding-agent";
|
|
9
|
-
import type { AgentScope } from "./types.ts";
|
|
10
|
-
|
|
11
|
-
export interface AgentConfig {
|
|
12
|
-
name: string;
|
|
13
|
-
description: string;
|
|
14
|
-
tools?: string[];
|
|
15
|
-
model?: string;
|
|
16
|
-
thinking?: string;
|
|
17
|
-
systemPromptMode?: "append" | "replace";
|
|
18
|
-
systemPrompt: string;
|
|
19
|
-
source: "builtin" | "user" | "project";
|
|
20
|
-
filePath: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface AgentDiscoveryResult {
|
|
24
|
-
agents: AgentConfig[];
|
|
25
|
-
projectAgentsDir: string | null;
|
|
26
|
-
builtinAgentsDir: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const THINKING_LEVELS = new Set([
|
|
30
|
-
"off",
|
|
31
|
-
"minimal",
|
|
32
|
-
"low",
|
|
33
|
-
"medium",
|
|
34
|
-
"high",
|
|
35
|
-
"xhigh",
|
|
36
|
-
"max",
|
|
37
|
-
]);
|
|
38
|
-
|
|
39
|
-
export function getBuiltinAgentsDir(): string {
|
|
40
|
-
return path.join(
|
|
41
|
-
path.dirname(fileURLToPath(import.meta.url)),
|
|
42
|
-
"..",
|
|
43
|
-
"agents",
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function loadAgentsFromDir(
|
|
48
|
-
dir: string,
|
|
49
|
-
source: AgentConfig["source"],
|
|
50
|
-
): AgentConfig[] {
|
|
51
|
-
if (!fs.existsSync(dir)) return [];
|
|
52
|
-
|
|
53
|
-
let entries: fs.Dirent[];
|
|
54
|
-
try {
|
|
55
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
56
|
-
} catch {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const agents: AgentConfig[] = [];
|
|
61
|
-
for (const entry of entries) {
|
|
62
|
-
if (!entry.name.endsWith(".md")) continue;
|
|
63
|
-
if (!entry.isFile() && !entry.isSymbolicLink()) continue;
|
|
64
|
-
|
|
65
|
-
const filePath = path.join(dir, entry.name);
|
|
66
|
-
let content: string;
|
|
67
|
-
try {
|
|
68
|
-
content = fs.readFileSync(filePath, "utf-8");
|
|
69
|
-
} catch {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const { frontmatter, body } = parseFrontmatter<Record<string, string>>(
|
|
74
|
-
content,
|
|
75
|
-
);
|
|
76
|
-
if (!frontmatter.name || !frontmatter.description) continue;
|
|
77
|
-
|
|
78
|
-
const tools = frontmatter.tools
|
|
79
|
-
?.split(",")
|
|
80
|
-
.map((tool) => tool.trim())
|
|
81
|
-
.filter(Boolean);
|
|
82
|
-
|
|
83
|
-
const systemPromptMode =
|
|
84
|
-
frontmatter.systemPromptMode === "append" ? "append" : "replace";
|
|
85
|
-
|
|
86
|
-
agents.push({
|
|
87
|
-
name: frontmatter.name,
|
|
88
|
-
description: frontmatter.description,
|
|
89
|
-
tools: tools && tools.length > 0 ? tools : undefined,
|
|
90
|
-
model: frontmatter.model,
|
|
91
|
-
thinking: frontmatter.thinking,
|
|
92
|
-
systemPromptMode,
|
|
93
|
-
systemPrompt: body,
|
|
94
|
-
source,
|
|
95
|
-
filePath,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return agents;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function isDirectory(candidate: string): boolean {
|
|
103
|
-
try {
|
|
104
|
-
return fs.statSync(candidate).isDirectory();
|
|
105
|
-
} catch {
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function findNearestProjectAgentsDir(cwd: string): string | null {
|
|
111
|
-
let currentDir = cwd;
|
|
112
|
-
while (true) {
|
|
113
|
-
const candidate = path.join(currentDir, CONFIG_DIR_NAME, "agents");
|
|
114
|
-
if (isDirectory(candidate)) return candidate;
|
|
115
|
-
|
|
116
|
-
const parentDir = path.dirname(currentDir);
|
|
117
|
-
if (parentDir === currentDir) return null;
|
|
118
|
-
currentDir = parentDir;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function applyThinkingSuffix(
|
|
123
|
-
model: string | undefined,
|
|
124
|
-
thinking: string | undefined,
|
|
125
|
-
): string | undefined {
|
|
126
|
-
if (!model || !thinking) return model;
|
|
127
|
-
const colonIdx = model.lastIndexOf(":");
|
|
128
|
-
if (
|
|
129
|
-
colonIdx !== -1 &&
|
|
130
|
-
THINKING_LEVELS.has(model.substring(colonIdx + 1))
|
|
131
|
-
) {
|
|
132
|
-
return `${model.slice(0, colonIdx)}:${thinking}`;
|
|
133
|
-
}
|
|
134
|
-
return `${model}:${thinking}`;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function discoverAgents(
|
|
138
|
-
cwd: string,
|
|
139
|
-
scope: AgentScope = "both",
|
|
140
|
-
): AgentDiscoveryResult {
|
|
141
|
-
const builtinAgentsDir = getBuiltinAgentsDir();
|
|
142
|
-
const userDir = path.join(getAgentDir(), "agents");
|
|
143
|
-
const projectAgentsDir = findNearestProjectAgentsDir(cwd);
|
|
144
|
-
|
|
145
|
-
const builtinAgents = loadAgentsFromDir(builtinAgentsDir, "builtin");
|
|
146
|
-
const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
|
|
147
|
-
const projectAgents =
|
|
148
|
-
scope === "user" || !projectAgentsDir
|
|
149
|
-
? []
|
|
150
|
-
: loadAgentsFromDir(projectAgentsDir, "project");
|
|
151
|
-
|
|
152
|
-
const agentMap = new Map<string, AgentConfig>();
|
|
153
|
-
for (const agent of builtinAgents) agentMap.set(agent.name, agent);
|
|
154
|
-
if (scope === "both" || scope === "user") {
|
|
155
|
-
for (const agent of userAgents) agentMap.set(agent.name, agent);
|
|
156
|
-
}
|
|
157
|
-
if (scope === "both" || scope === "project") {
|
|
158
|
-
for (const agent of projectAgents) agentMap.set(agent.name, agent);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
agents: Array.from(agentMap.values()),
|
|
163
|
-
projectAgentsDir,
|
|
164
|
-
builtinAgentsDir,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import {
|
|
5
|
+
CONFIG_DIR_NAME,
|
|
6
|
+
getAgentDir,
|
|
7
|
+
parseFrontmatter,
|
|
8
|
+
} from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import type { AgentScope } from "./types.ts";
|
|
10
|
+
|
|
11
|
+
export interface AgentConfig {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
tools?: string[];
|
|
15
|
+
model?: string;
|
|
16
|
+
thinking?: string;
|
|
17
|
+
systemPromptMode?: "append" | "replace";
|
|
18
|
+
systemPrompt: string;
|
|
19
|
+
source: "builtin" | "user" | "project";
|
|
20
|
+
filePath: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface AgentDiscoveryResult {
|
|
24
|
+
agents: AgentConfig[];
|
|
25
|
+
projectAgentsDir: string | null;
|
|
26
|
+
builtinAgentsDir: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const THINKING_LEVELS = new Set([
|
|
30
|
+
"off",
|
|
31
|
+
"minimal",
|
|
32
|
+
"low",
|
|
33
|
+
"medium",
|
|
34
|
+
"high",
|
|
35
|
+
"xhigh",
|
|
36
|
+
"max",
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
export function getBuiltinAgentsDir(): string {
|
|
40
|
+
return path.join(
|
|
41
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
42
|
+
"..",
|
|
43
|
+
"agents",
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function loadAgentsFromDir(
|
|
48
|
+
dir: string,
|
|
49
|
+
source: AgentConfig["source"],
|
|
50
|
+
): AgentConfig[] {
|
|
51
|
+
if (!fs.existsSync(dir)) return [];
|
|
52
|
+
|
|
53
|
+
let entries: fs.Dirent[];
|
|
54
|
+
try {
|
|
55
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
56
|
+
} catch {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const agents: AgentConfig[] = [];
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (!entry.name.endsWith(".md")) continue;
|
|
63
|
+
if (!entry.isFile() && !entry.isSymbolicLink()) continue;
|
|
64
|
+
|
|
65
|
+
const filePath = path.join(dir, entry.name);
|
|
66
|
+
let content: string;
|
|
67
|
+
try {
|
|
68
|
+
content = fs.readFileSync(filePath, "utf-8");
|
|
69
|
+
} catch {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const { frontmatter, body } = parseFrontmatter<Record<string, string>>(
|
|
74
|
+
content,
|
|
75
|
+
);
|
|
76
|
+
if (!frontmatter.name || !frontmatter.description) continue;
|
|
77
|
+
|
|
78
|
+
const tools = frontmatter.tools
|
|
79
|
+
?.split(",")
|
|
80
|
+
.map((tool) => tool.trim())
|
|
81
|
+
.filter(Boolean);
|
|
82
|
+
|
|
83
|
+
const systemPromptMode =
|
|
84
|
+
frontmatter.systemPromptMode === "append" ? "append" : "replace";
|
|
85
|
+
|
|
86
|
+
agents.push({
|
|
87
|
+
name: frontmatter.name,
|
|
88
|
+
description: frontmatter.description,
|
|
89
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
90
|
+
model: frontmatter.model,
|
|
91
|
+
thinking: frontmatter.thinking,
|
|
92
|
+
systemPromptMode,
|
|
93
|
+
systemPrompt: body,
|
|
94
|
+
source,
|
|
95
|
+
filePath,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return agents;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function isDirectory(candidate: string): boolean {
|
|
103
|
+
try {
|
|
104
|
+
return fs.statSync(candidate).isDirectory();
|
|
105
|
+
} catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function findNearestProjectAgentsDir(cwd: string): string | null {
|
|
111
|
+
let currentDir = cwd;
|
|
112
|
+
while (true) {
|
|
113
|
+
const candidate = path.join(currentDir, CONFIG_DIR_NAME, "agents");
|
|
114
|
+
if (isDirectory(candidate)) return candidate;
|
|
115
|
+
|
|
116
|
+
const parentDir = path.dirname(currentDir);
|
|
117
|
+
if (parentDir === currentDir) return null;
|
|
118
|
+
currentDir = parentDir;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function applyThinkingSuffix(
|
|
123
|
+
model: string | undefined,
|
|
124
|
+
thinking: string | undefined,
|
|
125
|
+
): string | undefined {
|
|
126
|
+
if (!model || !thinking) return model;
|
|
127
|
+
const colonIdx = model.lastIndexOf(":");
|
|
128
|
+
if (
|
|
129
|
+
colonIdx !== -1 &&
|
|
130
|
+
THINKING_LEVELS.has(model.substring(colonIdx + 1))
|
|
131
|
+
) {
|
|
132
|
+
return `${model.slice(0, colonIdx)}:${thinking}`;
|
|
133
|
+
}
|
|
134
|
+
return `${model}:${thinking}`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function discoverAgents(
|
|
138
|
+
cwd: string,
|
|
139
|
+
scope: AgentScope = "both",
|
|
140
|
+
): AgentDiscoveryResult {
|
|
141
|
+
const builtinAgentsDir = getBuiltinAgentsDir();
|
|
142
|
+
const userDir = path.join(getAgentDir(), "agents");
|
|
143
|
+
const projectAgentsDir = findNearestProjectAgentsDir(cwd);
|
|
144
|
+
|
|
145
|
+
const builtinAgents = loadAgentsFromDir(builtinAgentsDir, "builtin");
|
|
146
|
+
const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
|
|
147
|
+
const projectAgents =
|
|
148
|
+
scope === "user" || !projectAgentsDir
|
|
149
|
+
? []
|
|
150
|
+
: loadAgentsFromDir(projectAgentsDir, "project");
|
|
151
|
+
|
|
152
|
+
const agentMap = new Map<string, AgentConfig>();
|
|
153
|
+
for (const agent of builtinAgents) agentMap.set(agent.name, agent);
|
|
154
|
+
if (scope === "both" || scope === "user") {
|
|
155
|
+
for (const agent of userAgents) agentMap.set(agent.name, agent);
|
|
156
|
+
}
|
|
157
|
+
if (scope === "both" || scope === "project") {
|
|
158
|
+
for (const agent of projectAgents) agentMap.set(agent.name, agent);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
agents: Array.from(agentMap.values()),
|
|
163
|
+
projectAgentsDir,
|
|
164
|
+
builtinAgentsDir,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SUBAGENT_ASYNC_COMPLETE,
|
|
3
|
-
SUBAGENT_ASYNC_STARTED,
|
|
4
|
-
} from "../rpc/channels.ts";
|
|
5
|
-
import type { AsyncRunStatus, ExecuteSubagentInput } from "../types.ts";
|
|
6
|
-
|
|
7
|
-
export interface AsyncJobTracker {
|
|
8
|
-
track(runId: string, status: AsyncRunStatus): void;
|
|
9
|
-
update(runId: string, patch: Partial<AsyncRunStatus>): void;
|
|
10
|
-
get(runId: string): AsyncRunStatus | undefined;
|
|
11
|
-
list(): AsyncRunStatus[];
|
|
12
|
-
remove(runId: string): void;
|
|
13
|
-
clear(): void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function createAsyncJobTracker(): AsyncJobTracker {
|
|
17
|
-
const jobs = new Map<string, AsyncRunStatus>();
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
track(runId, status) {
|
|
21
|
-
jobs.set(runId, status);
|
|
22
|
-
},
|
|
23
|
-
update(runId, patch) {
|
|
24
|
-
const current = jobs.get(runId);
|
|
25
|
-
if (!current) return;
|
|
26
|
-
jobs.set(runId, { ...current, ...patch, updatedAt: Date.now() });
|
|
27
|
-
},
|
|
28
|
-
get(runId) {
|
|
29
|
-
return jobs.get(runId);
|
|
30
|
-
},
|
|
31
|
-
list() {
|
|
32
|
-
return Array.from(jobs.values());
|
|
33
|
-
},
|
|
34
|
-
remove(runId) {
|
|
35
|
-
jobs.delete(runId);
|
|
36
|
-
},
|
|
37
|
-
clear() {
|
|
38
|
-
jobs.clear();
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface SubagentEventBus {
|
|
44
|
-
emit(channel: string, payload: unknown): void;
|
|
45
|
-
on(channel: string, handler: (payload: unknown) => void): () => void;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function emitAsyncStarted(
|
|
49
|
-
events: SubagentEventBus | undefined,
|
|
50
|
-
payload: {
|
|
51
|
-
id: string;
|
|
52
|
-
mode: AsyncRunStatus["mode"];
|
|
53
|
-
sessionId: string | null;
|
|
54
|
-
agents: string[];
|
|
55
|
-
},
|
|
56
|
-
): void {
|
|
57
|
-
events?.emit(SUBAGENT_ASYNC_STARTED, payload);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function emitAsyncComplete(
|
|
61
|
-
events: SubagentEventBus | undefined,
|
|
62
|
-
payload: {
|
|
63
|
-
id: string;
|
|
64
|
-
exitCode: number;
|
|
65
|
-
finalOutput: string;
|
|
66
|
-
},
|
|
67
|
-
): void {
|
|
68
|
-
events?.emit(SUBAGENT_ASYNC_COMPLETE, payload);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export type AsyncExecuteInput = ExecuteSubagentInput;
|
|
1
|
+
import {
|
|
2
|
+
SUBAGENT_ASYNC_COMPLETE,
|
|
3
|
+
SUBAGENT_ASYNC_STARTED,
|
|
4
|
+
} from "../rpc/channels.ts";
|
|
5
|
+
import type { AsyncRunStatus, ExecuteSubagentInput } from "../types.ts";
|
|
6
|
+
|
|
7
|
+
export interface AsyncJobTracker {
|
|
8
|
+
track(runId: string, status: AsyncRunStatus): void;
|
|
9
|
+
update(runId: string, patch: Partial<AsyncRunStatus>): void;
|
|
10
|
+
get(runId: string): AsyncRunStatus | undefined;
|
|
11
|
+
list(): AsyncRunStatus[];
|
|
12
|
+
remove(runId: string): void;
|
|
13
|
+
clear(): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createAsyncJobTracker(): AsyncJobTracker {
|
|
17
|
+
const jobs = new Map<string, AsyncRunStatus>();
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
track(runId, status) {
|
|
21
|
+
jobs.set(runId, status);
|
|
22
|
+
},
|
|
23
|
+
update(runId, patch) {
|
|
24
|
+
const current = jobs.get(runId);
|
|
25
|
+
if (!current) return;
|
|
26
|
+
jobs.set(runId, { ...current, ...patch, updatedAt: Date.now() });
|
|
27
|
+
},
|
|
28
|
+
get(runId) {
|
|
29
|
+
return jobs.get(runId);
|
|
30
|
+
},
|
|
31
|
+
list() {
|
|
32
|
+
return Array.from(jobs.values());
|
|
33
|
+
},
|
|
34
|
+
remove(runId) {
|
|
35
|
+
jobs.delete(runId);
|
|
36
|
+
},
|
|
37
|
+
clear() {
|
|
38
|
+
jobs.clear();
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface SubagentEventBus {
|
|
44
|
+
emit(channel: string, payload: unknown): void;
|
|
45
|
+
on(channel: string, handler: (payload: unknown) => void): () => void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function emitAsyncStarted(
|
|
49
|
+
events: SubagentEventBus | undefined,
|
|
50
|
+
payload: {
|
|
51
|
+
id: string;
|
|
52
|
+
mode: AsyncRunStatus["mode"];
|
|
53
|
+
sessionId: string | null;
|
|
54
|
+
agents: string[];
|
|
55
|
+
},
|
|
56
|
+
): void {
|
|
57
|
+
events?.emit(SUBAGENT_ASYNC_STARTED, payload);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function emitAsyncComplete(
|
|
61
|
+
events: SubagentEventBus | undefined,
|
|
62
|
+
payload: {
|
|
63
|
+
id: string;
|
|
64
|
+
exitCode: number;
|
|
65
|
+
finalOutput: string;
|
|
66
|
+
},
|
|
67
|
+
): void {
|
|
68
|
+
events?.emit(SUBAGENT_ASYNC_COMPLETE, payload);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type AsyncExecuteInput = ExecuteSubagentInput;
|