@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.
Files changed (259) hide show
  1. package/AGENTS.md +158 -158
  2. package/CHANGELOG.md +42 -24
  3. package/LICENSE +21 -21
  4. package/README.md +237 -234
  5. package/assets/logo.svg +28 -28
  6. package/node_modules/@vitos-pizza/agent-mode/extensions/index.ts +138 -117
  7. package/node_modules/@vitos-pizza/agent-mode/package.json +3 -3
  8. package/node_modules/@vitos-pizza/agent-mode/src/apply-mode.ts +60 -60
  9. package/node_modules/@vitos-pizza/agent-mode/src/mode-events.ts +102 -102
  10. package/node_modules/@vitos-pizza/agent-mode/src/modes.ts +43 -43
  11. package/node_modules/@vitos-pizza/agent-mode/src/plan-instructions.ts +85 -44
  12. package/node_modules/@vitos-pizza/agent-mode/tests/apply-mode.test.ts +36 -36
  13. package/node_modules/@vitos-pizza/agent-mode/tests/mode-events.test.ts +22 -22
  14. package/node_modules/@vitos-pizza/agent-mode/tests/modes.test.ts +38 -38
  15. package/node_modules/@vitos-pizza/agent-mode/tests/plan-instructions.test.ts +68 -45
  16. package/node_modules/@vitos-pizza/agent-mode/tsconfig.json +13 -13
  17. package/node_modules/@vitos-pizza/agent-mode/vitest.config.ts +8 -8
  18. package/node_modules/@vitos-pizza/keybindings/extensions/index.ts +104 -104
  19. package/node_modules/@vitos-pizza/keybindings/package.json +1 -1
  20. package/node_modules/@vitos-pizza/keybindings/presets/shortcuts.json +3 -3
  21. package/node_modules/@vitos-pizza/keybindings/src/bind.ts +57 -57
  22. package/node_modules/@vitos-pizza/keybindings/src/config.ts +84 -84
  23. package/node_modules/@vitos-pizza/keybindings/src/registry.ts +43 -43
  24. package/node_modules/@vitos-pizza/keybindings/src/types.ts +54 -54
  25. package/node_modules/@vitos-pizza/keybindings/tests/config.test.ts +83 -83
  26. package/node_modules/@vitos-pizza/keybindings/tests/registry.test.ts +142 -142
  27. package/node_modules/@vitos-pizza/keybindings/tsconfig.json +13 -13
  28. package/node_modules/@vitos-pizza/keybindings/vitest.config.ts +8 -8
  29. package/node_modules/@vitos-pizza/permission-system/extensions/index.ts +162 -162
  30. package/node_modules/@vitos-pizza/permission-system/package.json +2 -2
  31. package/node_modules/@vitos-pizza/permission-system/src/bash/matcher.ts +54 -51
  32. package/node_modules/@vitos-pizza/permission-system/src/bash/parser.ts +40 -40
  33. package/node_modules/@vitos-pizza/permission-system/src/config-paths.ts +23 -23
  34. package/node_modules/@vitos-pizza/permission-system/src/detect-preset-mode.ts +61 -61
  35. package/node_modules/@vitos-pizza/permission-system/src/expand-home.ts +12 -12
  36. package/node_modules/@vitos-pizza/permission-system/src/forwarding/forwarder.ts +224 -224
  37. package/node_modules/@vitos-pizza/permission-system/src/forwarding/subagent-registry.ts +61 -61
  38. package/node_modules/@vitos-pizza/permission-system/src/gates/path-utils.ts +66 -66
  39. package/node_modules/@vitos-pizza/permission-system/src/gates/pipeline.ts +151 -155
  40. package/node_modules/@vitos-pizza/permission-system/src/handlers/before-agent-start.ts +86 -65
  41. package/node_modules/@vitos-pizza/permission-system/src/handlers/skill-input.ts +1 -1
  42. package/node_modules/@vitos-pizza/permission-system/src/handlers/tool-call-gate.ts +204 -199
  43. package/node_modules/@vitos-pizza/permission-system/src/mode-api.ts +44 -44
  44. package/node_modules/@vitos-pizza/permission-system/src/permission-evaluator.ts +233 -216
  45. package/node_modules/@vitos-pizza/permission-system/src/permission-session.ts +62 -62
  46. package/node_modules/@vitos-pizza/permission-system/src/policy-loader.ts +211 -211
  47. package/node_modules/@vitos-pizza/permission-system/src/sanitizers/skill-prompt.ts +99 -99
  48. package/node_modules/@vitos-pizza/permission-system/src/sanitizers/system-prompt.ts +221 -221
  49. package/node_modules/@vitos-pizza/permission-system/src/service.ts +66 -66
  50. package/node_modules/@vitos-pizza/permission-system/src/session-approvals.ts +4 -1
  51. package/node_modules/@vitos-pizza/permission-system/src/types.ts +80 -80
  52. package/node_modules/@vitos-pizza/permission-system/src/ui/approval-summary.ts +43 -43
  53. package/node_modules/@vitos-pizza/permission-system/src/ui/config-modal.ts +36 -36
  54. package/node_modules/@vitos-pizza/permission-system/src/ui/permission-dialog.ts +52 -52
  55. package/node_modules/@vitos-pizza/permission-system/src/wildcard-matcher.ts +81 -81
  56. package/node_modules/@vitos-pizza/permission-system/src/yaml-frontmatter.ts +84 -84
  57. package/node_modules/@vitos-pizza/permission-system/src/yolo/runtime-api.ts +49 -49
  58. package/node_modules/@vitos-pizza/permission-system/tests/bash-parser.test.ts +32 -32
  59. package/node_modules/@vitos-pizza/permission-system/tests/before-agent-start.test.ts +61 -0
  60. package/node_modules/@vitos-pizza/permission-system/tests/detect-preset-mode.test.ts +68 -68
  61. package/node_modules/@vitos-pizza/permission-system/tests/forwarder.test.ts +55 -55
  62. package/node_modules/@vitos-pizza/permission-system/tests/gates.test.ts +170 -61
  63. package/node_modules/@vitos-pizza/permission-system/tests/path-utils.test.ts +68 -68
  64. package/node_modules/@vitos-pizza/permission-system/tests/permission-evaluator.test.ts +82 -55
  65. package/node_modules/@vitos-pizza/permission-system/tests/policy-loader.test.ts +25 -25
  66. package/node_modules/@vitos-pizza/permission-system/tests/system-prompt-sanitizer.test.ts +22 -22
  67. package/node_modules/@vitos-pizza/permission-system/tests/wildcard-matcher.test.ts +27 -27
  68. package/node_modules/@vitos-pizza/permission-system/tsconfig.json +13 -13
  69. package/node_modules/@vitos-pizza/permission-system/vitest.config.ts +8 -8
  70. package/node_modules/@vitos-pizza/question/package.json +1 -1
  71. package/node_modules/@vitos-pizza/question/src/question-ui.ts +5 -1
  72. package/node_modules/@vitos-pizza/question/src/register-tool.ts +1 -4
  73. package/node_modules/@vitos-pizza/question/tests/question-ui-width-cache.test.ts +45 -0
  74. package/node_modules/@vitos-pizza/question/tests/register-tool-render.test.ts +48 -45
  75. package/node_modules/@vitos-pizza/session-title/extensions/index.ts +137 -137
  76. package/node_modules/@vitos-pizza/session-title/package.json +3 -3
  77. package/node_modules/@vitos-pizza/session-title/src/build-title-prompt.ts +16 -16
  78. package/node_modules/@vitos-pizza/session-title/src/extract-title-context.ts +55 -55
  79. package/node_modules/@vitos-pizza/session-title/src/fast-rules.ts +48 -48
  80. package/node_modules/@vitos-pizza/session-title/src/load-settings.ts +70 -70
  81. package/node_modules/@vitos-pizza/session-title/src/normalize-title.ts +20 -20
  82. package/node_modules/@vitos-pizza/session-title/src/parse-title-response.ts +6 -6
  83. package/node_modules/@vitos-pizza/session-title/src/resolve-title-model.ts +33 -33
  84. package/node_modules/@vitos-pizza/session-title/src/schedule-title-job.ts +53 -53
  85. package/node_modules/@vitos-pizza/session-title/src/should-schedule.ts +30 -30
  86. package/node_modules/@vitos-pizza/session-title/src/title-agent.ts +60 -60
  87. package/node_modules/@vitos-pizza/session-title/src/truncate-input.ts +10 -10
  88. package/node_modules/@vitos-pizza/session-title/src/types.ts +29 -29
  89. package/node_modules/@vitos-pizza/session-title/tests/build-title-prompt.test.ts +34 -34
  90. package/node_modules/@vitos-pizza/session-title/tests/extension.test.ts +198 -198
  91. package/node_modules/@vitos-pizza/session-title/tests/extract-title-context.test.ts +48 -48
  92. package/node_modules/@vitos-pizza/session-title/tests/fast-rules.test.ts +43 -43
  93. package/node_modules/@vitos-pizza/session-title/tests/parse-title-response.test.ts +34 -34
  94. package/node_modules/@vitos-pizza/session-title/tests/should-schedule.test.ts +30 -30
  95. package/node_modules/@vitos-pizza/session-title/tests/title-agent.test.ts +154 -154
  96. package/node_modules/@vitos-pizza/session-title/tests/truncate-input.test.ts +15 -15
  97. package/node_modules/@vitos-pizza/session-title/tsconfig.json +13 -13
  98. package/node_modules/@vitos-pizza/session-title/vitest.config.ts +8 -8
  99. package/node_modules/@vitos-pizza/subagents/agents/planner.md +46 -43
  100. package/node_modules/@vitos-pizza/subagents/agents/scout.md +40 -40
  101. package/node_modules/@vitos-pizza/subagents/agents/title.md +13 -13
  102. package/node_modules/@vitos-pizza/subagents/agents/worker.md +36 -36
  103. package/node_modules/@vitos-pizza/subagents/extensions/index.ts +164 -164
  104. package/node_modules/@vitos-pizza/subagents/package.json +1 -1
  105. package/node_modules/@vitos-pizza/subagents/skills/subagents/SKILL.md +86 -80
  106. package/node_modules/@vitos-pizza/subagents/src/agents.ts +166 -166
  107. package/node_modules/@vitos-pizza/subagents/src/async/job-tracker.ts +71 -71
  108. package/node_modules/@vitos-pizza/subagents/src/async/spawn-async.ts +220 -220
  109. package/node_modules/@vitos-pizza/subagents/src/async/storage.ts +57 -57
  110. package/node_modules/@vitos-pizza/subagents/src/env.ts +4 -4
  111. package/node_modules/@vitos-pizza/subagents/src/execute-subagent.ts +285 -285
  112. package/node_modules/@vitos-pizza/subagents/src/progress.ts +187 -187
  113. package/node_modules/@vitos-pizza/subagents/src/render-animation.ts +40 -40
  114. package/node_modules/@vitos-pizza/subagents/src/render.ts +428 -428
  115. package/node_modules/@vitos-pizza/subagents/src/rpc/channels.ts +21 -21
  116. package/node_modules/@vitos-pizza/subagents/src/rpc/client.ts +144 -144
  117. package/node_modules/@vitos-pizza/subagents/src/rpc/server.ts +11 -11
  118. package/node_modules/@vitos-pizza/subagents/src/run-agent.ts +313 -313
  119. package/node_modules/@vitos-pizza/subagents/src/runtime.ts +102 -102
  120. package/node_modules/@vitos-pizza/subagents/src/schema.ts +62 -62
  121. package/node_modules/@vitos-pizza/subagents/src/spawn.ts +104 -104
  122. package/node_modules/@vitos-pizza/subagents/src/types.ts +92 -92
  123. package/node_modules/@vitos-pizza/subagents/src/utils.ts +100 -100
  124. package/node_modules/@vitos-pizza/subagents/src/wait.ts +159 -159
  125. package/node_modules/@vitos-pizza/subagents/tests/agents.test.ts +19 -19
  126. package/node_modules/@vitos-pizza/subagents/tests/execute-subagent.test.ts +96 -96
  127. package/node_modules/@vitos-pizza/subagents/tests/extension.test.ts +42 -42
  128. package/node_modules/@vitos-pizza/subagents/tests/progress.test.ts +206 -206
  129. package/node_modules/@vitos-pizza/subagents/tests/rpc.test.ts +74 -74
  130. package/node_modules/@vitos-pizza/subagents/tsconfig.json +13 -13
  131. package/node_modules/@vitos-pizza/subagents/vitest.config.ts +8 -8
  132. package/node_modules/@vitos-pizza/ui-enhancements/package.json +1 -1
  133. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
  134. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/border-status.ts +14 -1
  135. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
  136. package/node_modules/@vitos-pizza/ui-enhancements/tests/agent-mode-badge.test.ts +35 -35
  137. package/node_modules/@vitos-pizza/ui-enhancements/tests/resize-recovery.test.ts +135 -0
  138. package/node_modules/@vitos-pizza/websearch/package.json +1 -1
  139. package/node_modules/node-addon-api/tools/conversion.js +0 -0
  140. package/node_modules/node-gyp-build/bin.js +0 -0
  141. package/node_modules/node-gyp-build/build-test.js +0 -0
  142. package/node_modules/node-gyp-build/optional.js +0 -0
  143. package/package.json +11 -9
  144. package/packages/agent-mode/extensions/index.ts +138 -117
  145. package/packages/agent-mode/package.json +3 -3
  146. package/packages/agent-mode/src/apply-mode.ts +60 -60
  147. package/packages/agent-mode/src/mode-events.ts +102 -102
  148. package/packages/agent-mode/src/modes.ts +43 -43
  149. package/packages/agent-mode/src/plan-instructions.ts +85 -44
  150. package/packages/agent-mode/tsconfig.json +13 -13
  151. package/packages/agent-mode/vitest.config.ts +8 -8
  152. package/packages/keybindings/extensions/index.ts +104 -104
  153. package/packages/keybindings/package.json +1 -1
  154. package/packages/keybindings/presets/shortcuts.json +3 -3
  155. package/packages/keybindings/src/bind.ts +57 -57
  156. package/packages/keybindings/src/config.ts +84 -84
  157. package/packages/keybindings/src/registry.ts +43 -43
  158. package/packages/keybindings/src/types.ts +54 -54
  159. package/packages/keybindings/tsconfig.json +13 -13
  160. package/packages/keybindings/vitest.config.ts +8 -8
  161. package/packages/permission-system/extensions/index.ts +162 -162
  162. package/packages/permission-system/node_modules/web-tree-sitter/debug/tree-sitter.wasm +0 -0
  163. package/packages/permission-system/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
  164. package/packages/permission-system/package.json +2 -2
  165. package/packages/permission-system/src/bash/matcher.ts +54 -51
  166. package/packages/permission-system/src/bash/parser.ts +40 -40
  167. package/packages/permission-system/src/config-paths.ts +23 -23
  168. package/packages/permission-system/src/detect-preset-mode.ts +61 -61
  169. package/packages/permission-system/src/expand-home.ts +12 -12
  170. package/packages/permission-system/src/forwarding/forwarder.ts +224 -224
  171. package/packages/permission-system/src/forwarding/subagent-registry.ts +61 -61
  172. package/packages/permission-system/src/gates/path-utils.ts +66 -66
  173. package/packages/permission-system/src/gates/pipeline.ts +151 -155
  174. package/packages/permission-system/src/handlers/before-agent-start.ts +86 -65
  175. package/packages/permission-system/src/handlers/skill-input.ts +1 -1
  176. package/packages/permission-system/src/handlers/tool-call-gate.ts +204 -199
  177. package/packages/permission-system/src/mode-api.ts +44 -44
  178. package/packages/permission-system/src/permission-evaluator.ts +233 -216
  179. package/packages/permission-system/src/permission-session.ts +62 -62
  180. package/packages/permission-system/src/policy-loader.ts +211 -211
  181. package/packages/permission-system/src/sanitizers/skill-prompt.ts +99 -99
  182. package/packages/permission-system/src/sanitizers/system-prompt.ts +221 -221
  183. package/packages/permission-system/src/service.ts +66 -66
  184. package/packages/permission-system/src/session-approvals.ts +4 -1
  185. package/packages/permission-system/src/types.ts +80 -80
  186. package/packages/permission-system/src/ui/approval-summary.ts +43 -43
  187. package/packages/permission-system/src/ui/config-modal.ts +36 -36
  188. package/packages/permission-system/src/ui/permission-dialog.ts +52 -52
  189. package/packages/permission-system/src/wildcard-matcher.ts +81 -81
  190. package/packages/permission-system/src/yaml-frontmatter.ts +84 -84
  191. package/packages/permission-system/src/yolo/runtime-api.ts +49 -49
  192. package/packages/permission-system/tsconfig.json +13 -13
  193. package/packages/permission-system/vitest.config.ts +8 -8
  194. package/packages/question/package.json +1 -1
  195. package/packages/question/src/question-ui.ts +5 -1
  196. package/packages/question/src/register-tool.ts +1 -4
  197. package/packages/session-title/extensions/index.ts +137 -137
  198. package/packages/session-title/package.json +3 -3
  199. package/packages/session-title/src/build-title-prompt.ts +16 -16
  200. package/packages/session-title/src/extract-title-context.ts +55 -55
  201. package/packages/session-title/src/fast-rules.ts +48 -48
  202. package/packages/session-title/src/load-settings.ts +70 -70
  203. package/packages/session-title/src/normalize-title.ts +20 -20
  204. package/packages/session-title/src/parse-title-response.ts +6 -6
  205. package/packages/session-title/src/resolve-title-model.ts +33 -33
  206. package/packages/session-title/src/schedule-title-job.ts +53 -53
  207. package/packages/session-title/src/should-schedule.ts +30 -30
  208. package/packages/session-title/src/title-agent.ts +60 -60
  209. package/packages/session-title/src/truncate-input.ts +10 -10
  210. package/packages/session-title/src/types.ts +29 -29
  211. package/packages/session-title/tsconfig.json +13 -13
  212. package/packages/session-title/vitest.config.ts +8 -8
  213. package/packages/subagents/agents/planner.md +46 -43
  214. package/packages/subagents/agents/scout.md +40 -40
  215. package/packages/subagents/agents/title.md +13 -13
  216. package/packages/subagents/agents/worker.md +36 -36
  217. package/packages/subagents/extensions/index.ts +164 -164
  218. package/packages/subagents/package.json +1 -1
  219. package/packages/subagents/skills/subagents/SKILL.md +86 -80
  220. package/packages/subagents/src/agents.ts +166 -166
  221. package/packages/subagents/src/async/job-tracker.ts +71 -71
  222. package/packages/subagents/src/async/spawn-async.ts +220 -220
  223. package/packages/subagents/src/async/storage.ts +57 -57
  224. package/packages/subagents/src/env.ts +4 -4
  225. package/packages/subagents/src/execute-subagent.ts +285 -285
  226. package/packages/subagents/src/progress.ts +187 -187
  227. package/packages/subagents/src/render-animation.ts +40 -40
  228. package/packages/subagents/src/render.ts +428 -428
  229. package/packages/subagents/src/rpc/channels.ts +21 -21
  230. package/packages/subagents/src/rpc/client.ts +144 -144
  231. package/packages/subagents/src/rpc/server.ts +11 -11
  232. package/packages/subagents/src/run-agent.ts +313 -313
  233. package/packages/subagents/src/runtime.ts +102 -102
  234. package/packages/subagents/src/schema.ts +62 -62
  235. package/packages/subagents/src/spawn.ts +104 -104
  236. package/packages/subagents/src/types.ts +92 -92
  237. package/packages/subagents/src/utils.ts +100 -100
  238. package/packages/subagents/src/wait.ts +159 -159
  239. package/packages/subagents/tsconfig.json +13 -13
  240. package/packages/subagents/vitest.config.ts +8 -8
  241. package/packages/todoist/extensions/index.ts +163 -0
  242. package/packages/todoist/package.json +34 -0
  243. package/packages/todoist/src/events.ts +7 -0
  244. package/packages/todoist/src/silent-render.ts +8 -0
  245. package/packages/todoist/src/state.ts +147 -0
  246. package/packages/todoist/src/tools.ts +175 -0
  247. package/packages/todoist/src/types.ts +34 -0
  248. package/packages/todoist/src/widget.ts +109 -0
  249. package/packages/todoist/tsconfig.json +13 -0
  250. package/packages/todoist/vitest.config.ts +8 -0
  251. package/packages/ui-enhancements/package.json +1 -1
  252. package/packages/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
  253. package/packages/ui-enhancements/src/chrome/border-status.ts +14 -1
  254. package/packages/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
  255. package/packages/websearch/package.json +1 -1
  256. package/scripts/sync-pi-manifest.mjs +1 -1
  257. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.cjs +0 -2988
  258. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm +0 -0
  259. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm.map +0 -1
@@ -1,43 +1,43 @@
1
- import type { PermissionPresetName } from "@vitos-pizza/permission-system/mode-api";
2
- import {
3
- PRESETS_DIR,
4
- } from "@vitos-pizza/permission-system/mode-api";
5
- import { detectPresetMode } from "@vitos-pizza/permission-system/detect-preset-mode";
6
- import type { ExtensionConfig } from "@vitos-pizza/permission-system/types";
7
-
8
- export type AgentMode = "agent" | "plan" | "execute";
9
-
10
- export const AGENT_MODES: readonly AgentMode[] = [
11
- "agent",
12
- "plan",
13
- "execute",
14
- ] as const;
15
-
16
- export const PRESET_BY_MODE: Record<AgentMode, PermissionPresetName> = {
17
- agent: "default",
18
- plan: "plan",
19
- execute: "yolo",
20
- };
21
-
22
- export const MODE_LABELS: Record<AgentMode, string> = {
23
- agent: "Agent mode — balanced permissions",
24
- plan: "Plan mode — read-only exploration",
25
- execute: "Execute mode — minimal gates",
26
- };
27
-
28
- export function isAgentMode(value: string): value is AgentMode {
29
- return (AGENT_MODES as readonly string[]).includes(value);
30
- }
31
-
32
- export function cycleAgentMode(current: AgentMode): AgentMode {
33
- const index = AGENT_MODES.indexOf(current);
34
- return AGENT_MODES[(index + 1) % AGENT_MODES.length];
35
- }
36
-
37
- export function inferAgentMode(config: ExtensionConfig): AgentMode {
38
- if (config.agentMode) return config.agentMode;
39
- const detected = detectPresetMode(config.permission, PRESETS_DIR);
40
- if (detected === "plan") return "plan";
41
- if (detected === "yolo") return "execute";
42
- return "agent";
43
- }
1
+ import type { PermissionPresetName } from "@vitos-pizza/permission-system/mode-api";
2
+ import {
3
+ PRESETS_DIR,
4
+ } from "@vitos-pizza/permission-system/mode-api";
5
+ import { detectPresetMode } from "@vitos-pizza/permission-system/detect-preset-mode";
6
+ import type { ExtensionConfig } from "@vitos-pizza/permission-system/types";
7
+
8
+ export type AgentMode = "agent" | "plan" | "execute";
9
+
10
+ export const AGENT_MODES: readonly AgentMode[] = [
11
+ "agent",
12
+ "plan",
13
+ "execute",
14
+ ] as const;
15
+
16
+ export const PRESET_BY_MODE: Record<AgentMode, PermissionPresetName> = {
17
+ agent: "default",
18
+ plan: "plan",
19
+ execute: "yolo",
20
+ };
21
+
22
+ export const MODE_LABELS: Record<AgentMode, string> = {
23
+ agent: "Agent mode — balanced permissions",
24
+ plan: "Plan mode — read-only exploration",
25
+ execute: "Execute mode — minimal gates",
26
+ };
27
+
28
+ export function isAgentMode(value: string): value is AgentMode {
29
+ return (AGENT_MODES as readonly string[]).includes(value);
30
+ }
31
+
32
+ export function cycleAgentMode(current: AgentMode): AgentMode {
33
+ const index = AGENT_MODES.indexOf(current);
34
+ return AGENT_MODES[(index + 1) % AGENT_MODES.length];
35
+ }
36
+
37
+ export function inferAgentMode(config: ExtensionConfig): AgentMode {
38
+ if (config.agentMode) return config.agentMode;
39
+ const detected = detectPresetMode(config.permission, PRESETS_DIR);
40
+ if (detected === "plan") return "plan";
41
+ if (detected === "yolo") return "execute";
42
+ return "agent";
43
+ }
@@ -1,44 +1,85 @@
1
- export const PLAN_MODE_TOOLS = [
2
- "read",
3
- "grep",
4
- "find",
5
- "ls",
6
- "question",
7
- "subagent",
8
- "wait",
9
- "web_search",
10
- "web_read",
11
- ] as const;
12
-
13
- export const PLAN_INSTRUCTIONS = `## PLAN MODE
14
-
15
- You are in **plan** mode. Do not call write, edit, or bash on the main agent.
16
-
17
- **Planning workflow**
18
- - Default path: \`subagent({ chain: [{ agent: "scout", task: "..." }, { agent: "planner", task: "..." }] })\`
19
- - Use the \`question\` tool when requirements are unclear
20
- - Produce an Implementation Plan and wait for user confirmation
21
- - Do **not** call worker or edit code directly in this mode
22
-
23
- **To implement**, the user must switch to execute or agent mode (\`/mode execute\` or \`/mode agent\`).`;
24
-
25
- export const PLAN_MODE_MESSAGE = `[PLAN MODE ACTIVE]
26
-
27
- You are in plan mode. The main agent must NOT write, edit, or run bash.
28
-
29
- For any task that needs codebase exploration or an implementation plan, you MUST delegate to subagents:
30
-
31
- 1. Call \`subagent\` with a scout planner chain (do not only use read/grep yourself)
32
- 2. Use \`question\` when requirements are unclear
33
- 3. Return the planner's output and wait for user confirmation
34
- 4. Do NOT call worker or make code changes
35
-
36
- Example:
37
- \`\`\`json
38
- {
39
- "chain": [
40
- { "agent": "scout", "task": "Map relevant code for this task" },
41
- { "agent": "planner", "task": "Create an implementation plan from {previous}" }
42
- ]
43
- }
44
- \`\`\``;
1
+ export const PLAN_MODE_TOOLS = [
2
+ "read",
3
+ "grep",
4
+ "find",
5
+ "ls",
6
+ "question",
7
+ "subagent",
8
+ "wait",
9
+ "web_search",
10
+ "web_read",
11
+ ] as const;
12
+
13
+ export const PLAN_INSTRUCTIONS = `## PLAN MODE
14
+
15
+ You are in **plan** mode. Do not call write, edit, or bash on the main agent.
16
+
17
+ **Planning workflow**
18
+ - Mutually exclusive design choices (2–5 options) always use the \`question\` tool; do not ask in free text
19
+ - Produce an Implementation Plan and wait for user confirmation
20
+ - Do **not** call worker or edit code directly in this mode
21
+
22
+ **When to explore**
23
+ - Scout is **optional**. Skip it when the task is clear, scoped to known files, or the user already provided enough context
24
+ - Call scout only when you need codebase recon (unfamiliar area, many files, unclear entry points)
25
+ - Independent areas parallel scouts via \`subagent({ tasks: [...] })\` to finish recon faster; then planner
26
+ - For light lookups, the main agent may use read/grep/find/ls directly — no scout required
27
+
28
+ **Delegation**
29
+ - Enough context already \`subagent({ agent: "planner", task: "..." })\`
30
+ - Need recon first → \`subagent({ chain: [{ agent: "scout", task: "..." }, { agent: "planner", task: "..." }] })\`
31
+ - Multi-area recon parallel scouts, then planner with the combined findings
32
+
33
+ **After the plan (optional)**
34
+ When helpful, add a short **Next** footer — Cursor-style suggested actions. Skip it if the next step is already obvious.
35
+ - 2–3 bullets max; each one line
36
+ - Concrete verbs the user can reply with (e.g. confirm → \`/mode execute\`, tweak scope)
37
+ - No essays, no restating the whole plan
38
+
39
+ Example:
40
+ \`\`\`
41
+ **Next**
42
+ - Confirm → \`/mode execute\` (or F6) to implement
43
+ - Say what to change if the scope is off
44
+ \`\`\`
45
+
46
+ **To implement**, the user must switch to execute or agent mode (\`/mode execute\` or \`/mode agent\`).`;
47
+
48
+ export const PLAN_MODE_MESSAGE = `[PLAN MODE ACTIVE]
49
+
50
+ You are in plan mode. The main agent must NOT write, edit, or run bash.
51
+
52
+ 1. Mutually exclusive choices → \`question\` tool (not free-text "which do you prefer?")
53
+ 2. Scout only if needed; parallel scouts (\`tasks: [...]\`) when exploring independent areas; otherwise go straight to planner
54
+ 3. Return the plan and wait; optionally a short **Next** footer (2–3 one-line actions) when helpful
55
+ 4. Do NOT call worker or make code changes
56
+
57
+ Planner only (no scout):
58
+ \`\`\`json
59
+ { "agent": "planner", "task": "Create an implementation plan for ..." }
60
+ \`\`\`
61
+
62
+ Scout → planner (when recon is needed):
63
+ \`\`\`json
64
+ {
65
+ "chain": [
66
+ { "agent": "scout", "task": "Map relevant code for this task" },
67
+ { "agent": "planner", "task": "Create an implementation plan from {previous}" }
68
+ ]
69
+ }
70
+ \`\`\`
71
+
72
+ Parallel scouts (independent areas), then planner:
73
+ \`\`\`json
74
+ {
75
+ "tasks": [
76
+ { "agent": "scout", "task": "Map area A" },
77
+ { "agent": "scout", "task": "Map area B" }
78
+ ]
79
+ }
80
+ \`\`\`
81
+ Then \`subagent({ agent: "planner", task: "Plan from the scout findings above" })\`.`;
82
+
83
+ export const PLAN_MODE_ENDED_MESSAGE = `[PLAN MODE ENDED]
84
+
85
+ You left plan mode. write, edit, and bash are available again according to the current mode (agent or execute). Do not treat earlier [PLAN MODE ACTIVE] messages as still in effect.`;
@@ -1,36 +1,36 @@
1
- import { mkdtempSync, readFileSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { describe, expect, it } from "vitest";
5
- import { loadProjectConfig } from "@vitos-pizza/permission-system/mode-api";
6
- import { applyAgentMode } from "../src/apply-mode.ts";
7
-
8
- describe("apply-mode", () => {
9
- it("persists agentMode and matching preset", () => {
10
- const cwd = mkdtempSync(join(tmpdir(), "agent-mode-"));
11
- applyAgentMode(cwd, "plan");
12
- const config = loadProjectConfig(cwd);
13
- expect(config.agentMode).toBe("plan");
14
- expect(config.permission?.write).toBe("deny");
15
- expect(config.yoloMode).toBe(false);
16
- });
17
-
18
- it("writes execute mode with yolo preset permissions", () => {
19
- const cwd = mkdtempSync(join(tmpdir(), "agent-mode-"));
20
- applyAgentMode(cwd, "execute");
21
- const config = loadProjectConfig(cwd);
22
- expect(config.agentMode).toBe("execute");
23
- expect(config.permission?.bash).toEqual({
24
- "*": "allow",
25
- "rm -rf *": "deny",
26
- });
27
-
28
- const raw = JSON.parse(
29
- readFileSync(
30
- join(cwd, ".pi", "extensions", "pi-permission-system", "config.json"),
31
- "utf8",
32
- ),
33
- ) as { agentMode?: string };
34
- expect(raw.agentMode).toBe("execute");
35
- });
36
- });
1
+ import { mkdtempSync, readFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+ import { loadProjectConfig } from "@vitos-pizza/permission-system/mode-api";
6
+ import { applyAgentMode } from "../src/apply-mode.ts";
7
+
8
+ describe("apply-mode", () => {
9
+ it("persists agentMode and matching preset", () => {
10
+ const cwd = mkdtempSync(join(tmpdir(), "agent-mode-"));
11
+ applyAgentMode(cwd, "plan");
12
+ const config = loadProjectConfig(cwd);
13
+ expect(config.agentMode).toBe("plan");
14
+ expect(config.permission?.write).toBe("deny");
15
+ expect(config.yoloMode).toBe(false);
16
+ });
17
+
18
+ it("writes execute mode with yolo preset permissions", () => {
19
+ const cwd = mkdtempSync(join(tmpdir(), "agent-mode-"));
20
+ applyAgentMode(cwd, "execute");
21
+ const config = loadProjectConfig(cwd);
22
+ expect(config.agentMode).toBe("execute");
23
+ expect(config.permission?.bash).toEqual({
24
+ "*": "allow",
25
+ "rm -rf *": "deny",
26
+ });
27
+
28
+ const raw = JSON.parse(
29
+ readFileSync(
30
+ join(cwd, ".pi", "extensions", "pi-permission-system", "config.json"),
31
+ "utf8",
32
+ ),
33
+ ) as { agentMode?: string };
34
+ expect(raw.agentMode).toBe("execute");
35
+ });
36
+ });
@@ -1,22 +1,22 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- formatAgentModeStatusText,
4
- isAgentModeChangedPayload,
5
- } from "../src/mode-events.ts";
6
-
7
- describe("mode-events", () => {
8
- it("formats status text", () => {
9
- expect(formatAgentModeStatusText("plan")).toBe("mode: plan");
10
- });
11
-
12
- it("validates changed payloads", () => {
13
- expect(
14
- isAgentModeChangedPayload({
15
- mode: "execute",
16
- label: "execute",
17
- color: "warning",
18
- }),
19
- ).toBe(true);
20
- expect(isAgentModeChangedPayload({ mode: "bad" })).toBe(false);
21
- });
22
- });
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ formatAgentModeStatusText,
4
+ isAgentModeChangedPayload,
5
+ } from "../src/mode-events.ts";
6
+
7
+ describe("mode-events", () => {
8
+ it("formats status text", () => {
9
+ expect(formatAgentModeStatusText("plan")).toBe("mode: plan");
10
+ });
11
+
12
+ it("validates changed payloads", () => {
13
+ expect(
14
+ isAgentModeChangedPayload({
15
+ mode: "execute",
16
+ label: "execute",
17
+ color: "warning",
18
+ }),
19
+ ).toBe(true);
20
+ expect(isAgentModeChangedPayload({ mode: "bad" })).toBe(false);
21
+ });
22
+ });
@@ -1,38 +1,38 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- AGENT_MODES,
4
- cycleAgentMode,
5
- inferAgentMode,
6
- isAgentMode,
7
- PRESET_BY_MODE,
8
- } from "../src/modes.ts";
9
-
10
- describe("modes", () => {
11
- it("cycles agent → plan → execute → agent", () => {
12
- expect(cycleAgentMode("agent")).toBe("plan");
13
- expect(cycleAgentMode("plan")).toBe("execute");
14
- expect(cycleAgentMode("execute")).toBe("agent");
15
- });
16
-
17
- it("maps modes to permission presets", () => {
18
- expect(PRESET_BY_MODE.agent).toBe("default");
19
- expect(PRESET_BY_MODE.plan).toBe("plan");
20
- expect(PRESET_BY_MODE.execute).toBe("yolo");
21
- });
22
-
23
- it("validates agent mode strings", () => {
24
- for (const mode of AGENT_MODES) {
25
- expect(isAgentMode(mode)).toBe(true);
26
- }
27
- expect(isAgentMode("careful")).toBe(false);
28
- });
29
-
30
- it("prefers persisted agentMode over preset detection", () => {
31
- expect(
32
- inferAgentMode({
33
- agentMode: "agent",
34
- permission: { "*": "deny" },
35
- }),
36
- ).toBe("agent");
37
- });
38
- });
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ AGENT_MODES,
4
+ cycleAgentMode,
5
+ inferAgentMode,
6
+ isAgentMode,
7
+ PRESET_BY_MODE,
8
+ } from "../src/modes.ts";
9
+
10
+ describe("modes", () => {
11
+ it("cycles agent → plan → execute → agent", () => {
12
+ expect(cycleAgentMode("agent")).toBe("plan");
13
+ expect(cycleAgentMode("plan")).toBe("execute");
14
+ expect(cycleAgentMode("execute")).toBe("agent");
15
+ });
16
+
17
+ it("maps modes to permission presets", () => {
18
+ expect(PRESET_BY_MODE.agent).toBe("default");
19
+ expect(PRESET_BY_MODE.plan).toBe("plan");
20
+ expect(PRESET_BY_MODE.execute).toBe("yolo");
21
+ });
22
+
23
+ it("validates agent mode strings", () => {
24
+ for (const mode of AGENT_MODES) {
25
+ expect(isAgentMode(mode)).toBe(true);
26
+ }
27
+ expect(isAgentMode("careful")).toBe(false);
28
+ });
29
+
30
+ it("prefers persisted agentMode over preset detection", () => {
31
+ expect(
32
+ inferAgentMode({
33
+ agentMode: "agent",
34
+ permission: { "*": "deny" },
35
+ }),
36
+ ).toBe("agent");
37
+ });
38
+ });
@@ -1,45 +1,68 @@
1
- import { readFileSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { describe, expect, it } from "vitest";
5
- import { PermissionEvaluator } from "../../permission-system/src/permission-evaluator.ts";
6
- import { sanitizeSkillPromptBlocks } from "../../permission-system/src/sanitizers/skill-prompt.ts";
7
- import { PLAN_MODE_TOOLS } from "../src/plan-instructions.ts";
8
-
9
- const presetsDir = join(
10
- dirname(fileURLToPath(import.meta.url)),
11
- "../../permission-system/presets",
12
- );
13
-
14
- describe("plan-instructions", () => {
15
- it("lists subagent tooling for plan mode", () => {
16
- expect(PLAN_MODE_TOOLS).toContain("subagent");
17
- expect(PLAN_MODE_TOOLS).toContain("question");
18
- expect(PLAN_MODE_TOOLS).toContain("web_search");
19
- expect(PLAN_MODE_TOOLS).toContain("web_read");
20
- });
21
-
22
- it("plan preset keeps subagents skill in the system prompt", () => {
23
- const planPreset = JSON.parse(
24
- readFileSync(join(presetsDir, "plan.json"), "utf8"),
25
- ) as { permission: Record<string, unknown> };
26
-
27
- const prompt = [
28
- "# System",
29
- "",
30
- "## Skill: subagents",
31
- "Use scout and planner.",
32
- ].join("\n");
33
-
34
- const evaluator = new PermissionEvaluator();
35
- const result = sanitizeSkillPromptBlocks(
36
- prompt,
37
- planPreset.permission as never,
38
- evaluator,
39
- {},
40
- );
41
-
42
- expect(result.prompt).toContain("## Skill: subagents");
43
- expect(result.entries).toHaveLength(1);
44
- });
45
- });
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, it } from "vitest";
5
+ import { PermissionEvaluator } from "../../permission-system/src/permission-evaluator.ts";
6
+ import { sanitizeSkillPromptBlocks } from "../../permission-system/src/sanitizers/skill-prompt.ts";
7
+ import {
8
+ PLAN_INSTRUCTIONS,
9
+ PLAN_MODE_ENDED_MESSAGE,
10
+ PLAN_MODE_MESSAGE,
11
+ PLAN_MODE_TOOLS,
12
+ } from "../src/plan-instructions.ts";
13
+
14
+ const presetsDir = join(
15
+ dirname(fileURLToPath(import.meta.url)),
16
+ "../../permission-system/presets",
17
+ );
18
+
19
+ describe("plan-instructions", () => {
20
+ it("lists subagent tooling for plan mode", () => {
21
+ expect(PLAN_MODE_TOOLS).toContain("subagent");
22
+ expect(PLAN_MODE_TOOLS).toContain("question");
23
+ expect(PLAN_MODE_TOOLS).toContain("web_search");
24
+ expect(PLAN_MODE_TOOLS).toContain("web_read");
25
+ });
26
+
27
+ it("allows an optional short Next footer and structured questions", () => {
28
+ expect(PLAN_INSTRUCTIONS).toContain("**Next**");
29
+ expect(PLAN_INSTRUCTIONS).toContain("optional");
30
+ expect(PLAN_INSTRUCTIONS).toContain("2–3 bullets max");
31
+ expect(PLAN_INSTRUCTIONS).toContain("question");
32
+ expect(PLAN_INSTRUCTIONS).toContain("parallel scouts");
33
+ expect(PLAN_MODE_MESSAGE).toContain("optionally a short **Next** footer");
34
+ expect(PLAN_MODE_MESSAGE).toContain("Parallel scouts");
35
+ expect(PLAN_MODE_MESSAGE).toContain("question");
36
+ });
37
+
38
+ it("defines a clear plan-ended signal for leaving plan mode", () => {
39
+ expect(PLAN_MODE_ENDED_MESSAGE).toContain("[PLAN MODE ENDED]");
40
+ expect(PLAN_MODE_ENDED_MESSAGE).toMatch(/write/i);
41
+ expect(PLAN_MODE_ENDED_MESSAGE).toMatch(/bash/i);
42
+ expect(PLAN_MODE_ENDED_MESSAGE).toContain("[PLAN MODE ACTIVE]");
43
+ });
44
+
45
+ it("plan preset keeps subagents skill in the system prompt", () => {
46
+ const planPreset = JSON.parse(
47
+ readFileSync(join(presetsDir, "plan.json"), "utf8"),
48
+ ) as { permission: Record<string, unknown> };
49
+
50
+ const prompt = [
51
+ "# System",
52
+ "",
53
+ "## Skill: subagents",
54
+ "Use scout and planner.",
55
+ ].join("\n");
56
+
57
+ const evaluator = new PermissionEvaluator();
58
+ const result = sanitizeSkillPromptBlocks(
59
+ prompt,
60
+ planPreset.permission as never,
61
+ evaluator,
62
+ {},
63
+ );
64
+
65
+ expect(result.prompt).toContain("## Skill: subagents");
66
+ expect(result.entries).toHaveLength(1);
67
+ });
68
+ });
@@ -1,13 +1,13 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "allowImportingTsExtensions": true
5
- },
6
- "include": [
7
- "extensions/**/*.ts",
8
- "src/**/*.ts",
9
- "tests/**/*.ts",
10
- "vitest.config.ts"
11
- ],
12
- "exclude": ["node_modules"]
13
- }
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "allowImportingTsExtensions": true
5
+ },
6
+ "include": [
7
+ "extensions/**/*.ts",
8
+ "src/**/*.ts",
9
+ "tests/**/*.ts",
10
+ "vitest.config.ts"
11
+ ],
12
+ "exclude": ["node_modules"]
13
+ }
@@ -1,8 +1,8 @@
1
- import { defineConfig } from "vitest/config";
2
-
3
- export default defineConfig({
4
- test: {
5
- environment: "node",
6
- include: ["tests/**/*.test.ts"],
7
- },
8
- });
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: "node",
6
+ include: ["tests/**/*.test.ts"],
7
+ },
8
+ });