catui-agent 1.0.0-beta.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 (1274) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +267 -0
  3. package/dist/build-meta.json +6 -0
  4. package/dist/builtin-extensions.d.ts +47 -0
  5. package/dist/builtin-extensions.js +1 -0
  6. package/dist/catui-defaults.d.ts +555 -0
  7. package/dist/catui-defaults.js +22 -0
  8. package/dist/cli/args.d.ts +70 -0
  9. package/dist/cli/args.js +158 -0
  10. package/dist/cli/config-selector.d.ts +10 -0
  11. package/dist/cli/config-selector.js +1 -0
  12. package/dist/cli/file-processor.d.ts +11 -0
  13. package/dist/cli/file-processor.js +6 -0
  14. package/dist/cli/list-models.d.ts +12 -0
  15. package/dist/cli/list-models.js +2 -0
  16. package/dist/cli/session-picker.d.ts +5 -0
  17. package/dist/cli/session-picker.js +1 -0
  18. package/dist/cli.d.ts +2 -0
  19. package/dist/cli.js +2 -0
  20. package/dist/config.d.ts +103 -0
  21. package/dist/config.js +1 -0
  22. package/dist/core/agent-dir/agent-dir-context.d.ts +60 -0
  23. package/dist/core/agent-dir/agent-dir-context.js +1 -0
  24. package/dist/core/agent-dir/agent-metadata.d.ts +48 -0
  25. package/dist/core/agent-dir/agent-metadata.js +1 -0
  26. package/dist/core/agent-dir/migration-tool.d.ts +40 -0
  27. package/dist/core/agent-dir/migration-tool.js +7 -0
  28. package/dist/core/export-html/AGENT.md +12 -0
  29. package/dist/core/export-html/ansi-to-html.d.ts +9 -0
  30. package/dist/core/export-html/ansi-to-html.js +2 -0
  31. package/dist/core/export-html/index.d.ts +39 -0
  32. package/dist/core/export-html/index.js +2 -0
  33. package/dist/core/export-html/template.css +971 -0
  34. package/dist/core/export-html/template.html +54 -0
  35. package/dist/core/export-html/template.js +66 -0
  36. package/dist/core/export-html/tool-renderer.d.ts +28 -0
  37. package/dist/core/export-html/tool-renderer.js +1 -0
  38. package/dist/core/export-html/vendor/highlight.min.js +4 -0
  39. package/dist/core/export-html/vendor/marked.min.js +56 -0
  40. package/dist/core/extensions-host/index.d.ts +13 -0
  41. package/dist/core/extensions-host/index.js +1 -0
  42. package/dist/core/extensions-host/loader.d.ts +21 -0
  43. package/dist/core/extensions-host/loader.js +1 -0
  44. package/dist/core/extensions-host/runner.d.ts +233 -0
  45. package/dist/core/extensions-host/runner.js +3 -0
  46. package/dist/core/extensions-host/types.d.ts +1079 -0
  47. package/dist/core/extensions-host/types.js +1 -0
  48. package/dist/core/extensions-host/wrapper.d.ts +29 -0
  49. package/dist/core/extensions-host/wrapper.js +2 -0
  50. package/dist/core/index.d.ts +17 -0
  51. package/dist/core/index.js +1 -0
  52. package/dist/core/lib/agent-core/src/agent-loop-continuations.d.ts +17 -0
  53. package/dist/core/lib/agent-core/src/agent-loop-continuations.js +1 -0
  54. package/dist/core/lib/agent-core/src/agent-loop-stream-events.d.ts +19 -0
  55. package/dist/core/lib/agent-core/src/agent-loop-stream-events.js +1 -0
  56. package/dist/core/lib/agent-core/src/agent-loop-tool-results.d.ts +10 -0
  57. package/dist/core/lib/agent-core/src/agent-loop-tool-results.js +3 -0
  58. package/dist/core/lib/agent-core/src/agent-loop-tool-summaries.d.ts +22 -0
  59. package/dist/core/lib/agent-core/src/agent-loop-tool-summaries.js +1 -0
  60. package/dist/core/lib/agent-core/src/agent-loop.d.ts +26 -0
  61. package/dist/core/lib/agent-core/src/agent-loop.js +4 -0
  62. package/dist/core/lib/agent-core/src/agent-run-result.d.ts +9 -0
  63. package/dist/core/lib/agent-core/src/agent-run-result.js +1 -0
  64. package/dist/core/lib/agent-core/src/agent.d.ts +215 -0
  65. package/dist/core/lib/agent-core/src/agent.js +1 -0
  66. package/dist/core/lib/agent-core/src/errors.d.ts +62 -0
  67. package/dist/core/lib/agent-core/src/errors.js +1 -0
  68. package/dist/core/lib/agent-core/src/index.d.ts +14 -0
  69. package/dist/core/lib/agent-core/src/index.js +1 -0
  70. package/dist/core/lib/agent-core/src/proxy.d.ts +91 -0
  71. package/dist/core/lib/agent-core/src/proxy.js +2 -0
  72. package/dist/core/lib/agent-core/src/structured-adaptive-agent-loop.d.ts +15 -0
  73. package/dist/core/lib/agent-core/src/structured-adaptive-agent-loop.js +2 -0
  74. package/dist/core/lib/agent-core/src/structured-adaptive-streaming-tool-executor.d.ts +33 -0
  75. package/dist/core/lib/agent-core/src/structured-adaptive-streaming-tool-executor.js +1 -0
  76. package/dist/core/lib/agent-core/src/structured-adaptive-tool-orchestration.d.ts +35 -0
  77. package/dist/core/lib/agent-core/src/structured-adaptive-tool-orchestration.js +3 -0
  78. package/dist/core/lib/agent-core/src/types.d.ts +417 -0
  79. package/dist/core/lib/agent-core/src/types.js +1 -0
  80. package/dist/core/lib/ai/src/api-registry.d.ts +27 -0
  81. package/dist/core/lib/ai/src/api-registry.js +1 -0
  82. package/dist/core/lib/ai/src/config-path.d.ts +1 -0
  83. package/dist/core/lib/ai/src/config-path.js +1 -0
  84. package/dist/core/lib/ai/src/debug-logger.d.ts +94 -0
  85. package/dist/core/lib/ai/src/debug-logger.js +4 -0
  86. package/dist/core/lib/ai/src/env-api-keys.d.ts +8 -0
  87. package/dist/core/lib/ai/src/env-api-keys.js +1 -0
  88. package/dist/core/lib/ai/src/env.d.ts +7 -0
  89. package/dist/core/lib/ai/src/env.js +1 -0
  90. package/dist/core/lib/ai/src/events.d.ts +8 -0
  91. package/dist/core/lib/ai/src/events.js +1 -0
  92. package/dist/core/lib/ai/src/index.d.ts +27 -0
  93. package/dist/core/lib/ai/src/index.js +1 -0
  94. package/dist/core/lib/ai/src/json.d.ts +7 -0
  95. package/dist/core/lib/ai/src/json.js +1 -0
  96. package/dist/core/lib/ai/src/models.d.ts +31 -0
  97. package/dist/core/lib/ai/src/models.generated.d.ts +15315 -0
  98. package/dist/core/lib/ai/src/models.generated.js +1 -0
  99. package/dist/core/lib/ai/src/models.js +1 -0
  100. package/dist/core/lib/ai/src/overflow.d.ts +7 -0
  101. package/dist/core/lib/ai/src/overflow.js +1 -0
  102. package/dist/core/lib/ai/src/providers/amazon-bedrock.d.ts +20 -0
  103. package/dist/core/lib/ai/src/providers/amazon-bedrock.js +1 -0
  104. package/dist/core/lib/ai/src/providers/anthropic.d.ts +38 -0
  105. package/dist/core/lib/ai/src/providers/anthropic.js +2 -0
  106. package/dist/core/lib/ai/src/providers/azure-openai-responses.d.ts +21 -0
  107. package/dist/core/lib/ai/src/providers/azure-openai-responses.js +1 -0
  108. package/dist/core/lib/ai/src/providers/github-copilot-headers.d.ts +13 -0
  109. package/dist/core/lib/ai/src/providers/github-copilot-headers.js +1 -0
  110. package/dist/core/lib/ai/src/providers/google-gemini-cli.d.ts +79 -0
  111. package/dist/core/lib/ai/src/providers/google-gemini-cli.js +2 -0
  112. package/dist/core/lib/ai/src/providers/google-shared.d.ts +70 -0
  113. package/dist/core/lib/ai/src/providers/google-shared.js +2 -0
  114. package/dist/core/lib/ai/src/providers/google-vertex.d.ts +20 -0
  115. package/dist/core/lib/ai/src/providers/google-vertex.js +1 -0
  116. package/dist/core/lib/ai/src/providers/google.d.ts +18 -0
  117. package/dist/core/lib/ai/src/providers/google.js +1 -0
  118. package/dist/core/lib/ai/src/providers/openai-codex-responses.d.ts +8 -0
  119. package/dist/core/lib/ai/src/providers/openai-codex-responses.js +7 -0
  120. package/dist/core/lib/ai/src/providers/openai-completions.d.ts +20 -0
  121. package/dist/core/lib/ai/src/providers/openai-completions.js +6 -0
  122. package/dist/core/lib/ai/src/providers/openai-responses-shared.d.ts +22 -0
  123. package/dist/core/lib/ai/src/providers/openai-responses-shared.js +10 -0
  124. package/dist/core/lib/ai/src/providers/openai-responses.d.ts +19 -0
  125. package/dist/core/lib/ai/src/providers/openai-responses.js +1 -0
  126. package/dist/core/lib/ai/src/providers/register-builtins.d.ts +8 -0
  127. package/dist/core/lib/ai/src/providers/register-builtins.js +1 -0
  128. package/dist/core/lib/ai/src/providers/simple-options.d.ts +13 -0
  129. package/dist/core/lib/ai/src/providers/simple-options.js +1 -0
  130. package/dist/core/lib/ai/src/providers/transform-messages.d.ts +13 -0
  131. package/dist/core/lib/ai/src/providers/transform-messages.js +1 -0
  132. package/dist/core/lib/ai/src/registry.d.ts +8 -0
  133. package/dist/core/lib/ai/src/registry.js +1 -0
  134. package/dist/core/lib/ai/src/schema.d.ts +10 -0
  135. package/dist/core/lib/ai/src/schema.js +1 -0
  136. package/dist/core/lib/ai/src/stream.d.ts +33 -0
  137. package/dist/core/lib/ai/src/stream.js +1 -0
  138. package/dist/core/lib/ai/src/types.d.ts +331 -0
  139. package/dist/core/lib/ai/src/types.js +0 -0
  140. package/dist/core/lib/ai/src/utils/event-stream-types.d.ts +12 -0
  141. package/dist/core/lib/ai/src/utils/event-stream-types.js +0 -0
  142. package/dist/core/lib/ai/src/utils/event-stream.d.ts +31 -0
  143. package/dist/core/lib/ai/src/utils/event-stream.js +1 -0
  144. package/dist/core/lib/ai/src/utils/http-proxy.d.ts +13 -0
  145. package/dist/core/lib/ai/src/utils/http-proxy.js +1 -0
  146. package/dist/core/lib/ai/src/utils/json-parse.d.ts +14 -0
  147. package/dist/core/lib/ai/src/utils/json-parse.js +1 -0
  148. package/dist/core/lib/ai/src/utils/oauth/anthropic.d.ts +22 -0
  149. package/dist/core/lib/ai/src/utils/oauth/anthropic.js +1 -0
  150. package/dist/core/lib/ai/src/utils/oauth/decode-credential.d.ts +12 -0
  151. package/dist/core/lib/ai/src/utils/oauth/decode-credential.js +1 -0
  152. package/dist/core/lib/ai/src/utils/oauth/github-copilot.d.ts +35 -0
  153. package/dist/core/lib/ai/src/utils/oauth/github-copilot.js +1 -0
  154. package/dist/core/lib/ai/src/utils/oauth/google-antigravity.d.ts +31 -0
  155. package/dist/core/lib/ai/src/utils/oauth/google-antigravity.js +1 -0
  156. package/dist/core/lib/ai/src/utils/oauth/google-gemini-cli.d.ts +31 -0
  157. package/dist/core/lib/ai/src/utils/oauth/google-gemini-cli.js +1 -0
  158. package/dist/core/lib/ai/src/utils/oauth/index.d.ts +60 -0
  159. package/dist/core/lib/ai/src/utils/oauth/index.js +1 -0
  160. package/dist/core/lib/ai/src/utils/oauth/openai-codex.d.ts +39 -0
  161. package/dist/core/lib/ai/src/utils/oauth/openai-codex.js +11 -0
  162. package/dist/core/lib/ai/src/utils/oauth/pkce.d.ts +18 -0
  163. package/dist/core/lib/ai/src/utils/oauth/pkce.js +1 -0
  164. package/dist/core/lib/ai/src/utils/oauth/types.d.ts +52 -0
  165. package/dist/core/lib/ai/src/utils/oauth/types.js +0 -0
  166. package/dist/core/lib/ai/src/utils/overflow.d.ts +57 -0
  167. package/dist/core/lib/ai/src/utils/overflow.js +1 -0
  168. package/dist/core/lib/ai/src/utils/sanitize-unicode.d.ts +16 -0
  169. package/dist/core/lib/ai/src/utils/sanitize-unicode.js +1 -0
  170. package/dist/core/lib/ai/src/utils/typebox-helpers.d.ts +22 -0
  171. package/dist/core/lib/ai/src/utils/typebox-helpers.js +1 -0
  172. package/dist/core/lib/ai/src/utils/validation.d.ts +23 -0
  173. package/dist/core/lib/ai/src/utils/validation.js +6 -0
  174. package/dist/core/lib/tui/src/autocomplete.d.ts +62 -0
  175. package/dist/core/lib/tui/src/autocomplete.js +2 -0
  176. package/dist/core/lib/tui/src/components/box.d.ts +27 -0
  177. package/dist/core/lib/tui/src/components/box.js +1 -0
  178. package/dist/core/lib/tui/src/components/cached-container.d.ts +42 -0
  179. package/dist/core/lib/tui/src/components/cached-container.js +1 -0
  180. package/dist/core/lib/tui/src/components/cancellable-loader.d.ts +27 -0
  181. package/dist/core/lib/tui/src/components/cancellable-loader.js +1 -0
  182. package/dist/core/lib/tui/src/components/editor.d.ts +222 -0
  183. package/dist/core/lib/tui/src/components/editor.js +21 -0
  184. package/dist/core/lib/tui/src/components/image.d.ts +33 -0
  185. package/dist/core/lib/tui/src/components/image.js +1 -0
  186. package/dist/core/lib/tui/src/components/input.d.ts +42 -0
  187. package/dist/core/lib/tui/src/components/input.js +2 -0
  188. package/dist/core/lib/tui/src/components/loader.d.ts +26 -0
  189. package/dist/core/lib/tui/src/components/loader.js +1 -0
  190. package/dist/core/lib/tui/src/components/markdown.d.ts +100 -0
  191. package/dist/core/lib/tui/src/components/markdown.js +7 -0
  192. package/dist/core/lib/tui/src/components/select-list.d.ts +37 -0
  193. package/dist/core/lib/tui/src/components/select-list.js +1 -0
  194. package/dist/core/lib/tui/src/components/settings-list.d.ts +55 -0
  195. package/dist/core/lib/tui/src/components/settings-list.js +1 -0
  196. package/dist/core/lib/tui/src/components/spacer.d.ts +17 -0
  197. package/dist/core/lib/tui/src/components/spacer.js +1 -0
  198. package/dist/core/lib/tui/src/components/text.d.ts +24 -0
  199. package/dist/core/lib/tui/src/components/text.js +1 -0
  200. package/dist/core/lib/tui/src/components/truncated-text.d.ts +18 -0
  201. package/dist/core/lib/tui/src/components/truncated-text.js +2 -0
  202. package/dist/core/lib/tui/src/editor-component.d.ts +51 -0
  203. package/dist/core/lib/tui/src/editor-component.js +0 -0
  204. package/dist/core/lib/tui/src/fuzzy.d.ts +32 -0
  205. package/dist/core/lib/tui/src/fuzzy.js +1 -0
  206. package/dist/core/lib/tui/src/index.d.ts +29 -0
  207. package/dist/core/lib/tui/src/index.js +1 -0
  208. package/dist/core/lib/tui/src/keybindings.d.ts +44 -0
  209. package/dist/core/lib/tui/src/keybindings.js +1 -0
  210. package/dist/core/lib/tui/src/keys.d.ts +149 -0
  211. package/dist/core/lib/tui/src/keys.js +5 -0
  212. package/dist/core/lib/tui/src/kill-ring.d.ts +33 -0
  213. package/dist/core/lib/tui/src/kill-ring.js +1 -0
  214. package/dist/core/lib/tui/src/stdin-buffer.d.ts +38 -0
  215. package/dist/core/lib/tui/src/stdin-buffer.js +1 -0
  216. package/dist/core/lib/tui/src/terminal-image.d.ts +73 -0
  217. package/dist/core/lib/tui/src/terminal-image.js +1 -0
  218. package/dist/core/lib/tui/src/terminal.d.ts +86 -0
  219. package/dist/core/lib/tui/src/terminal.js +1 -0
  220. package/dist/core/lib/tui/src/tui.d.ts +220 -0
  221. package/dist/core/lib/tui/src/tui.js +12 -0
  222. package/dist/core/lib/tui/src/undo-stack.d.ts +22 -0
  223. package/dist/core/lib/tui/src/undo-stack.js +1 -0
  224. package/dist/core/lib/tui/src/utils.d.ts +83 -0
  225. package/dist/core/lib/tui/src/utils.js +2 -0
  226. package/dist/core/mcp/figma-auth.d.ts +21 -0
  227. package/dist/core/mcp/figma-auth.js +22 -0
  228. package/dist/core/mcp/index.d.ts +11 -0
  229. package/dist/core/mcp/index.js +1 -0
  230. package/dist/core/mcp/mcp-adapter.d.ts +21 -0
  231. package/dist/core/mcp/mcp-adapter.js +3 -0
  232. package/dist/core/mcp/mcp-client.d.ts +91 -0
  233. package/dist/core/mcp/mcp-client.js +6 -0
  234. package/dist/core/mcp/mcp-config.d.ts +55 -0
  235. package/dist/core/mcp/mcp-config.js +1 -0
  236. package/dist/core/mcp/mcp-guidance.d.ts +52 -0
  237. package/dist/core/mcp/mcp-guidance.js +54 -0
  238. package/dist/core/mcp/mcp-manager.d.ts +51 -0
  239. package/dist/core/mcp/mcp-manager.js +1 -0
  240. package/dist/core/mcp/mcp-types.d.ts +62 -0
  241. package/dist/core/mcp/mcp-types.js +0 -0
  242. package/dist/core/messages.d.ts +77 -0
  243. package/dist/core/messages.js +17 -0
  244. package/dist/core/model/custom-providers.d.ts +34 -0
  245. package/dist/core/model/custom-providers.js +1 -0
  246. package/dist/core/model/discovery-cache.d.ts +65 -0
  247. package/dist/core/model/discovery-cache.js +1 -0
  248. package/dist/core/model/discovery-cache.test.d.ts +7 -0
  249. package/dist/core/model/discovery-cache.test.js +1 -0
  250. package/dist/core/model/discovery.d.ts +79 -0
  251. package/dist/core/model/discovery.js +1 -0
  252. package/dist/core/model/discovery.test.d.ts +7 -0
  253. package/dist/core/model/discovery.test.js +1 -0
  254. package/dist/core/model/index.d.ts +10 -0
  255. package/dist/core/model/index.js +1 -0
  256. package/dist/core/model/known-models.d.ts +65 -0
  257. package/dist/core/model/known-models.generated.d.ts +2 -0
  258. package/dist/core/model/known-models.generated.js +1 -0
  259. package/dist/core/model/known-models.js +1 -0
  260. package/dist/core/model/switcher.d.ts +80 -0
  261. package/dist/core/model/switcher.js +1 -0
  262. package/dist/core/model-registry.d.ts +186 -0
  263. package/dist/core/model-registry.js +9 -0
  264. package/dist/core/model-resolver.d.ts +106 -0
  265. package/dist/core/model-resolver.js +1 -0
  266. package/dist/core/package-manager.d.ts +156 -0
  267. package/dist/core/package-manager.js +3 -0
  268. package/dist/core/persona/persona-manager.d.ts +35 -0
  269. package/dist/core/persona/persona-manager.js +5 -0
  270. package/dist/core/platform/abort-slot.d.ts +26 -0
  271. package/dist/core/platform/abort-slot.js +1 -0
  272. package/dist/core/platform/config/auth-storage.d.ts +126 -0
  273. package/dist/core/platform/config/auth-storage.js +1 -0
  274. package/dist/core/platform/config/defaults.d.ts +8 -0
  275. package/dist/core/platform/config/defaults.js +1 -0
  276. package/dist/core/platform/config/diagnostics.d.ts +20 -0
  277. package/dist/core/platform/config/diagnostics.js +0 -0
  278. package/dist/core/platform/config/resolve-config-value.d.ts +12 -0
  279. package/dist/core/platform/config/resolve-config-value.js +1 -0
  280. package/dist/core/platform/config/resource-loader.d.ts +188 -0
  281. package/dist/core/platform/config/resource-loader.js +2 -0
  282. package/dist/core/platform/config/settings-manager.d.ts +314 -0
  283. package/dist/core/platform/config/settings-manager.js +1 -0
  284. package/dist/core/platform/exec/bash-executor.d.ts +41 -0
  285. package/dist/core/platform/exec/bash-executor.js +1 -0
  286. package/dist/core/platform/exec/exec.d.ts +25 -0
  287. package/dist/core/platform/exec/exec.js +1 -0
  288. package/dist/core/platform/i18n/index.d.ts +26 -0
  289. package/dist/core/platform/i18n/index.js +1 -0
  290. package/dist/core/platform/i18n/messages.d.ts +56 -0
  291. package/dist/core/platform/i18n/messages.js +1 -0
  292. package/dist/core/platform/i18n/messages.zh.d.ts +56 -0
  293. package/dist/core/platform/i18n/messages.zh.js +1 -0
  294. package/dist/core/platform/i18n/slash-commands.d.ts +53 -0
  295. package/dist/core/platform/i18n/slash-commands.js +1 -0
  296. package/dist/core/platform/i18n/slash-commands.zh.d.ts +53 -0
  297. package/dist/core/platform/i18n/slash-commands.zh.js +1 -0
  298. package/dist/core/platform/i18n/themes.d.ts +11 -0
  299. package/dist/core/platform/i18n/themes.js +1 -0
  300. package/dist/core/platform/i18n/themes.zh.d.ts +11 -0
  301. package/dist/core/platform/i18n/themes.zh.js +1 -0
  302. package/dist/core/platform/keybindings.d.ts +61 -0
  303. package/dist/core/platform/keybindings.js +1 -0
  304. package/dist/core/platform/listeners.d.ts +21 -0
  305. package/dist/core/platform/listeners.js +1 -0
  306. package/dist/core/platform/telemetry/batching-dispatcher.d.ts +41 -0
  307. package/dist/core/platform/telemetry/batching-dispatcher.js +1 -0
  308. package/dist/core/platform/telemetry/build-meta.d.ts +12 -0
  309. package/dist/core/platform/telemetry/build-meta.js +1 -0
  310. package/dist/core/platform/telemetry/caller-context.d.ts +32 -0
  311. package/dist/core/platform/telemetry/caller-context.js +1 -0
  312. package/dist/core/platform/telemetry/credentials.d.ts +27 -0
  313. package/dist/core/platform/telemetry/credentials.js +1 -0
  314. package/dist/core/platform/telemetry/ext-events.d.ts +89 -0
  315. package/dist/core/platform/telemetry/ext-events.js +1 -0
  316. package/dist/core/platform/telemetry/index.d.ts +13 -0
  317. package/dist/core/platform/telemetry/index.js +1 -0
  318. package/dist/core/platform/telemetry/insforge-base.d.ts +37 -0
  319. package/dist/core/platform/telemetry/insforge-base.js +1 -0
  320. package/dist/core/platform/telemetry/types.d.ts +33 -0
  321. package/dist/core/platform/telemetry/types.js +0 -0
  322. package/dist/core/platform/timings.d.ts +2 -0
  323. package/dist/core/platform/timings.js +3 -0
  324. package/dist/core/platform/utils/logger.d.ts +75 -0
  325. package/dist/core/platform/utils/logger.js +1 -0
  326. package/dist/core/platform/utils/shell.d.ts +25 -0
  327. package/dist/core/platform/utils/shell.js +9 -0
  328. package/dist/core/platform/utils/sleep.d.ts +7 -0
  329. package/dist/core/platform/utils/sleep.js +1 -0
  330. package/dist/core/platform/utils/tools-manager.d.ts +19 -0
  331. package/dist/core/platform/utils/tools-manager.js +1 -0
  332. package/dist/core/prompt/prompt-templates.d.ts +49 -0
  333. package/dist/core/prompt/prompt-templates.js +2 -0
  334. package/dist/core/prompt/system-prompt.d.ts +24 -0
  335. package/dist/core/prompt/system-prompt.js +139 -0
  336. package/dist/core/runtime/agent-session.d.ts +676 -0
  337. package/dist/core/runtime/agent-session.js +15 -0
  338. package/dist/core/runtime/bash-runner.d.ts +56 -0
  339. package/dist/core/runtime/bash-runner.js +2 -0
  340. package/dist/core/runtime/catui-agent.d.ts +182 -0
  341. package/dist/core/runtime/catui-agent.js +1 -0
  342. package/dist/core/runtime/compaction-controller.d.ts +43 -0
  343. package/dist/core/runtime/compaction-controller.js +1 -0
  344. package/dist/core/runtime/default-tools.d.ts +9 -0
  345. package/dist/core/runtime/default-tools.js +1 -0
  346. package/dist/core/runtime/event-bridge.d.ts +21 -0
  347. package/dist/core/runtime/event-bridge.js +1 -0
  348. package/dist/core/runtime/event-bus.d.ts +8 -0
  349. package/dist/core/runtime/event-bus.js +1 -0
  350. package/dist/core/runtime/export-bridge.d.ts +23 -0
  351. package/dist/core/runtime/export-bridge.js +1 -0
  352. package/dist/core/runtime/extension-core-bindings.d.ts +46 -0
  353. package/dist/core/runtime/extension-core-bindings.js +3 -0
  354. package/dist/core/runtime/model-controller.d.ts +84 -0
  355. package/dist/core/runtime/model-controller.js +1 -0
  356. package/dist/core/runtime/model-cycle.d.ts +20 -0
  357. package/dist/core/runtime/model-cycle.js +1 -0
  358. package/dist/core/runtime/prompt-assembly.d.ts +20 -0
  359. package/dist/core/runtime/prompt-assembly.js +3 -0
  360. package/dist/core/runtime/retry-coordinator.d.ts +84 -0
  361. package/dist/core/runtime/retry-coordinator.js +1 -0
  362. package/dist/core/runtime/sdk.d.ts +163 -0
  363. package/dist/core/runtime/sdk.js +1 -0
  364. package/dist/core/runtime/session-context.d.ts +155 -0
  365. package/dist/core/runtime/session-context.js +0 -0
  366. package/dist/core/runtime/session-lifecycle-controller.d.ts +42 -0
  367. package/dist/core/runtime/session-lifecycle-controller.js +1 -0
  368. package/dist/core/runtime/session-tree-controller.d.ts +40 -0
  369. package/dist/core/runtime/session-tree-controller.js +1 -0
  370. package/dist/core/runtime/slash-command-catalog.d.ts +27 -0
  371. package/dist/core/runtime/slash-command-catalog.js +1 -0
  372. package/dist/core/runtime/thinking-levels.d.ts +31 -0
  373. package/dist/core/runtime/thinking-levels.js +1 -0
  374. package/dist/core/runtime/tool-runtime-controller.d.ts +35 -0
  375. package/dist/core/runtime/tool-runtime-controller.js +1 -0
  376. package/dist/core/runtime/turn-context.d.ts +52 -0
  377. package/dist/core/runtime/turn-context.js +1 -0
  378. package/dist/core/session/compaction/branch-summarization.d.ts +85 -0
  379. package/dist/core/session/compaction/branch-summarization.js +38 -0
  380. package/dist/core/session/compaction/compaction.d.ts +120 -0
  381. package/dist/core/session/compaction/compaction.js +104 -0
  382. package/dist/core/session/compaction/index.d.ts +9 -0
  383. package/dist/core/session/compaction/index.js +1 -0
  384. package/dist/core/session/compaction/utils.d.ts +37 -0
  385. package/dist/core/session/compaction/utils.js +17 -0
  386. package/dist/core/session/session-manager.d.ts +359 -0
  387. package/dist/core/session/session-manager.js +14 -0
  388. package/dist/core/skills.d.ts +57 -0
  389. package/dist/core/skills.js +4 -0
  390. package/dist/core/slash-commands.d.ts +36 -0
  391. package/dist/core/slash-commands.js +1 -0
  392. package/dist/core/soul-integration.d.ts +77 -0
  393. package/dist/core/soul-integration.js +1 -0
  394. package/dist/core/soul-options-contract.d.ts +10 -0
  395. package/dist/core/soul-options-contract.js +0 -0
  396. package/dist/core/sub-agent/agent-definition-loader.d.ts +96 -0
  397. package/dist/core/sub-agent/agent-definition-loader.js +2 -0
  398. package/dist/core/sub-agent/agent-definition.d.ts +162 -0
  399. package/dist/core/sub-agent/agent-definition.js +6 -0
  400. package/dist/core/sub-agent/agent-handoff-safety.d.ts +39 -0
  401. package/dist/core/sub-agent/agent-handoff-safety.js +1 -0
  402. package/dist/core/sub-agent/agent-input-output.d.ts +143 -0
  403. package/dist/core/sub-agent/agent-input-output.js +1 -0
  404. package/dist/core/sub-agent/agent-output-persistence.d.ts +43 -0
  405. package/dist/core/sub-agent/agent-output-persistence.js +3 -0
  406. package/dist/core/sub-agent/agent-prompt-builder.d.ts +37 -0
  407. package/dist/core/sub-agent/agent-prompt-builder.js +2 -0
  408. package/dist/core/sub-agent/agent-registry.d.ts +145 -0
  409. package/dist/core/sub-agent/agent-registry.js +1 -0
  410. package/dist/core/sub-agent/agent-result-extractor.d.ts +28 -0
  411. package/dist/core/sub-agent/agent-result-extractor.js +3 -0
  412. package/dist/core/sub-agent/agent-telemetry.d.ts +71 -0
  413. package/dist/core/sub-agent/agent-telemetry.js +1 -0
  414. package/dist/core/sub-agent/agent-tool-filter.d.ts +89 -0
  415. package/dist/core/sub-agent/agent-tool-filter.js +2 -0
  416. package/dist/core/sub-agent/agent-tool.d.ts +69 -0
  417. package/dist/core/sub-agent/agent-tool.js +11 -0
  418. package/dist/core/sub-agent/index.d.ts +26 -0
  419. package/dist/core/sub-agent/index.js +1 -0
  420. package/dist/core/sub-agent/send-message-tool.d.ts +33 -0
  421. package/dist/core/sub-agent/send-message-tool.js +2 -0
  422. package/dist/core/sub-agent/sub-agent-backend.d.ts +26 -0
  423. package/dist/core/sub-agent/sub-agent-backend.js +7 -0
  424. package/dist/core/sub-agent/sub-agent-runtime.d.ts +34 -0
  425. package/dist/core/sub-agent/sub-agent-runtime.js +1 -0
  426. package/dist/core/sub-agent/sub-agent-types.d.ts +138 -0
  427. package/dist/core/sub-agent/sub-agent-types.js +0 -0
  428. package/dist/core/sub-agent/subprocess-backend.d.ts +35 -0
  429. package/dist/core/sub-agent/subprocess-backend.js +1 -0
  430. package/dist/core/sub-agent/subprocess-worker.d.ts +12 -0
  431. package/dist/core/sub-agent/subprocess-worker.js +1 -0
  432. package/dist/core/theme-contract.d.ts +32 -0
  433. package/dist/core/theme-contract.js +0 -0
  434. package/dist/core/tools/bash.d.ts +73 -0
  435. package/dist/core/tools/bash.js +21 -0
  436. package/dist/core/tools/edit-diff.d.ts +58 -0
  437. package/dist/core/tools/edit-diff.js +16 -0
  438. package/dist/core/tools/edit.d.ts +46 -0
  439. package/dist/core/tools/edit.js +1 -0
  440. package/dist/core/tools/file-state-cache.d.ts +30 -0
  441. package/dist/core/tools/file-state-cache.js +1 -0
  442. package/dist/core/tools/find.d.ts +46 -0
  443. package/dist/core/tools/find.js +8 -0
  444. package/dist/core/tools/grep.d.ts +58 -0
  445. package/dist/core/tools/grep.js +13 -0
  446. package/dist/core/tools/index.d.ts +116 -0
  447. package/dist/core/tools/index.js +1 -0
  448. package/dist/core/tools/input-validation.d.ts +13 -0
  449. package/dist/core/tools/input-validation.js +1 -0
  450. package/dist/core/tools/ls.d.ts +45 -0
  451. package/dist/core/tools/ls.js +4 -0
  452. package/dist/core/tools/orchestrator.d.ts +76 -0
  453. package/dist/core/tools/orchestrator.js +1 -0
  454. package/dist/core/tools/path-utils.d.ts +7 -0
  455. package/dist/core/tools/path-utils.js +1 -0
  456. package/dist/core/tools/pdf-extract.d.ts +11 -0
  457. package/dist/core/tools/pdf-extract.js +1 -0
  458. package/dist/core/tools/read.d.ts +46 -0
  459. package/dist/core/tools/read.js +11 -0
  460. package/dist/core/tools/source.d.ts +78 -0
  461. package/dist/core/tools/source.js +1 -0
  462. package/dist/core/tools/time.d.ts +19 -0
  463. package/dist/core/tools/time.js +2 -0
  464. package/dist/core/tools/truncate.d.ts +66 -0
  465. package/dist/core/tools/truncate.js +5 -0
  466. package/dist/core/tools/write-guard.d.ts +2 -0
  467. package/dist/core/tools/write-guard.js +1 -0
  468. package/dist/core/tools/write.d.ts +36 -0
  469. package/dist/core/tools/write.js +1 -0
  470. package/dist/core/workspace/index.d.ts +8 -0
  471. package/dist/core/workspace/index.js +1 -0
  472. package/dist/core/workspace/worktree-manager.d.ts +73 -0
  473. package/dist/core/workspace/worktree-manager.js +3 -0
  474. package/dist/extensions/builtin/AGENT.md +115 -0
  475. package/dist/extensions/builtin/ask-user-question/ask-user-question-tool.d.ts +9 -0
  476. package/dist/extensions/builtin/ask-user-question/ask-user-question-tool.js +4 -0
  477. package/dist/extensions/builtin/ask-user-question/index.d.ts +8 -0
  478. package/dist/extensions/builtin/ask-user-question/index.js +1 -0
  479. package/dist/extensions/builtin/ask-user-question/prompt.d.ts +14 -0
  480. package/dist/extensions/builtin/ask-user-question/prompt.js +30 -0
  481. package/dist/extensions/builtin/ask-user-question/types.d.ts +69 -0
  482. package/dist/extensions/builtin/ask-user-question/types.js +1 -0
  483. package/dist/extensions/builtin/browser/AGENT.md +17 -0
  484. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -0
  485. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -0
  486. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -0
  487. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -0
  488. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -0
  489. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -0
  490. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -0
  491. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -0
  492. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -0
  493. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -0
  494. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -0
  495. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -0
  496. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -0
  497. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -0
  498. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -0
  499. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -0
  500. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -0
  501. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -0
  502. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -0
  503. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -0
  504. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -0
  505. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -0
  506. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -0
  507. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -0
  508. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -0
  509. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -0
  510. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -0
  511. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -0
  512. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -0
  513. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -0
  514. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -0
  515. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -0
  516. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -0
  517. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -0
  518. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -0
  519. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -0
  520. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -0
  521. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -0
  522. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -0
  523. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -0
  524. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -0
  525. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -0
  526. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -0
  527. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -0
  528. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -0
  529. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -0
  530. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -0
  531. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -0
  532. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -0
  533. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -0
  534. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -0
  535. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -0
  536. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -0
  537. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -0
  538. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -0
  539. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -0
  540. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -0
  541. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -0
  542. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -0
  543. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -0
  544. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -0
  545. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -0
  546. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -0
  547. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -0
  548. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -0
  549. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -0
  550. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -0
  551. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -0
  552. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -0
  553. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -0
  554. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -0
  555. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -0
  556. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -0
  557. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -0
  558. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -0
  559. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -0
  560. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -0
  561. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -0
  562. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -0
  563. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -0
  564. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -0
  565. package/dist/extensions/builtin/browser/browser.md +73 -0
  566. package/dist/extensions/builtin/browser/index.d.ts +8 -0
  567. package/dist/extensions/builtin/browser/index.js +15 -0
  568. package/dist/extensions/builtin/browser/install.md +142 -0
  569. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -0
  570. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -0
  571. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -0
  572. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -0
  573. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -0
  574. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -0
  575. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -0
  576. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -0
  577. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -0
  578. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -0
  579. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -0
  580. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -0
  581. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -0
  582. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -0
  583. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -0
  584. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -0
  585. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -0
  586. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -0
  587. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -0
  588. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -0
  589. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -0
  590. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -0
  591. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -0
  592. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -0
  593. package/dist/extensions/builtin/btw/index.d.ts +8 -0
  594. package/dist/extensions/builtin/btw/index.js +15 -0
  595. package/dist/extensions/builtin/debug/collectors.d.ts +96 -0
  596. package/dist/extensions/builtin/debug/collectors.js +7 -0
  597. package/dist/extensions/builtin/debug/index.d.ts +8 -0
  598. package/dist/extensions/builtin/debug/index.js +49 -0
  599. package/dist/extensions/builtin/diagnostics/diagnostic-buffer.d.ts +19 -0
  600. package/dist/extensions/builtin/diagnostics/diagnostic-buffer.js +1 -0
  601. package/dist/extensions/builtin/diagnostics/index.d.ts +8 -0
  602. package/dist/extensions/builtin/diagnostics/index.js +1 -0
  603. package/dist/extensions/builtin/diagnostics/redaction.d.ts +8 -0
  604. package/dist/extensions/builtin/diagnostics/redaction.js +1 -0
  605. package/dist/extensions/builtin/diagnostics/reporter.d.ts +17 -0
  606. package/dist/extensions/builtin/diagnostics/reporter.js +1 -0
  607. package/dist/extensions/builtin/diagnostics/types.d.ts +62 -0
  608. package/dist/extensions/builtin/diagnostics/types.js +1 -0
  609. package/dist/extensions/builtin/discipline/index.d.ts +8 -0
  610. package/dist/extensions/builtin/discipline/index.js +7 -0
  611. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -0
  612. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -0
  613. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -0
  614. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -0
  615. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -0
  616. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -0
  617. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -0
  618. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -0
  619. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -0
  620. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -0
  621. package/dist/extensions/builtin/goal/README.md +67 -0
  622. package/dist/extensions/builtin/goal/goal-command.d.ts +13 -0
  623. package/dist/extensions/builtin/goal/goal-command.js +9 -0
  624. package/dist/extensions/builtin/goal/goal-controller.d.ts +143 -0
  625. package/dist/extensions/builtin/goal/goal-controller.js +1 -0
  626. package/dist/extensions/builtin/goal/goal-format.d.ts +52 -0
  627. package/dist/extensions/builtin/goal/goal-format.js +1 -0
  628. package/dist/extensions/builtin/goal/goal-parser.d.ts +27 -0
  629. package/dist/extensions/builtin/goal/goal-parser.js +2 -0
  630. package/dist/extensions/builtin/goal/goal-prompts.d.ts +15 -0
  631. package/dist/extensions/builtin/goal/goal-prompts.js +5 -0
  632. package/dist/extensions/builtin/goal/goal-store.d.ts +28 -0
  633. package/dist/extensions/builtin/goal/goal-store.js +1 -0
  634. package/dist/extensions/builtin/goal/goal-tools.d.ts +26 -0
  635. package/dist/extensions/builtin/goal/goal-tools.js +3 -0
  636. package/dist/extensions/builtin/goal/goal-types.d.ts +87 -0
  637. package/dist/extensions/builtin/goal/goal-types.js +1 -0
  638. package/dist/extensions/builtin/goal/index.d.ts +8 -0
  639. package/dist/extensions/builtin/goal/index.js +10 -0
  640. package/dist/extensions/builtin/grub/README.md +112 -0
  641. package/dist/extensions/builtin/grub/grub-controller.d.ts +67 -0
  642. package/dist/extensions/builtin/grub/grub-controller.js +1 -0
  643. package/dist/extensions/builtin/grub/grub-decision.d.ts +8 -0
  644. package/dist/extensions/builtin/grub/grub-decision.js +1 -0
  645. package/dist/extensions/builtin/grub/grub-feature-list.d.ts +54 -0
  646. package/dist/extensions/builtin/grub/grub-feature-list.js +2 -0
  647. package/dist/extensions/builtin/grub/grub-format.d.ts +13 -0
  648. package/dist/extensions/builtin/grub/grub-format.js +4 -0
  649. package/dist/extensions/builtin/grub/grub-harness.d.ts +9 -0
  650. package/dist/extensions/builtin/grub/grub-harness.js +3 -0
  651. package/dist/extensions/builtin/grub/grub-i18n.d.ts +166 -0
  652. package/dist/extensions/builtin/grub/grub-i18n.js +1 -0
  653. package/dist/extensions/builtin/grub/grub-parser.d.ts +24 -0
  654. package/dist/extensions/builtin/grub/grub-parser.js +2 -0
  655. package/dist/extensions/builtin/grub/grub-persistence.d.ts +17 -0
  656. package/dist/extensions/builtin/grub/grub-persistence.js +2 -0
  657. package/dist/extensions/builtin/grub/grub-prompts.d.ts +12 -0
  658. package/dist/extensions/builtin/grub/grub-prompts.js +97 -0
  659. package/dist/extensions/builtin/grub/grub-turn.d.ts +16 -0
  660. package/dist/extensions/builtin/grub/grub-turn.js +1 -0
  661. package/dist/extensions/builtin/grub/grub-types.d.ts +110 -0
  662. package/dist/extensions/builtin/grub/grub-types.js +1 -0
  663. package/dist/extensions/builtin/grub/index.d.ts +8 -0
  664. package/dist/extensions/builtin/grub/index.js +6 -0
  665. package/dist/extensions/builtin/idle-think/curiosity.d.ts +46 -0
  666. package/dist/extensions/builtin/idle-think/curiosity.js +2 -0
  667. package/dist/extensions/builtin/idle-think/idle-think-runtime.d.ts +46 -0
  668. package/dist/extensions/builtin/idle-think/idle-think-runtime.js +1 -0
  669. package/dist/extensions/builtin/idle-think/index.d.ts +15 -0
  670. package/dist/extensions/builtin/idle-think/index.js +1 -0
  671. package/dist/extensions/builtin/idle-think/insights.d.ts +27 -0
  672. package/dist/extensions/builtin/idle-think/insights.js +5 -0
  673. package/dist/extensions/builtin/idle-think/thinker.d.ts +26 -0
  674. package/dist/extensions/builtin/idle-think/thinker.js +9 -0
  675. package/dist/extensions/builtin/insights/html-report.d.ts +21 -0
  676. package/dist/extensions/builtin/insights/html-report.js +463 -0
  677. package/dist/extensions/builtin/insights/index.d.ts +24 -0
  678. package/dist/extensions/builtin/insights/index.js +2 -0
  679. package/dist/extensions/builtin/insights/insights-engine.d.ts +18 -0
  680. package/dist/extensions/builtin/insights/insights-engine.js +39 -0
  681. package/dist/extensions/builtin/insights/prompts.d.ts +17 -0
  682. package/dist/extensions/builtin/insights/prompts.js +180 -0
  683. package/dist/extensions/builtin/insights/session-scanner.d.ts +27 -0
  684. package/dist/extensions/builtin/insights/session-scanner.js +19 -0
  685. package/dist/extensions/builtin/insights/stats.d.ts +13 -0
  686. package/dist/extensions/builtin/insights/stats.js +1 -0
  687. package/dist/extensions/builtin/insights/types.d.ts +199 -0
  688. package/dist/extensions/builtin/insights/types.js +0 -0
  689. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -0
  690. package/dist/extensions/builtin/link-world/index.d.ts +8 -0
  691. package/dist/extensions/builtin/link-world/index.js +19 -0
  692. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -0
  693. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -0
  694. package/dist/extensions/builtin/link-world/linkworld.md +313 -0
  695. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -0
  696. package/dist/extensions/builtin/loop/README.md +92 -0
  697. package/dist/extensions/builtin/loop/cron/cron-parser.d.ts +56 -0
  698. package/dist/extensions/builtin/loop/cron/cron-parser.js +1 -0
  699. package/dist/extensions/builtin/loop/cron/cron-scheduler.d.ts +85 -0
  700. package/dist/extensions/builtin/loop/cron/cron-scheduler.js +10 -0
  701. package/dist/extensions/builtin/loop/cron/cron-tasks-lock.d.ts +42 -0
  702. package/dist/extensions/builtin/loop/cron/cron-tasks-lock.js +1 -0
  703. package/dist/extensions/builtin/loop/cron/cron-tasks.d.ts +200 -0
  704. package/dist/extensions/builtin/loop/cron/cron-tasks.js +2 -0
  705. package/dist/extensions/builtin/loop/cron/index.d.ts +18 -0
  706. package/dist/extensions/builtin/loop/cron/index.js +1 -0
  707. package/dist/extensions/builtin/loop/cron-tools/cron-create-tool.d.ts +35 -0
  708. package/dist/extensions/builtin/loop/cron-tools/cron-create-tool.js +1 -0
  709. package/dist/extensions/builtin/loop/cron-tools/cron-delete-tool.d.ts +29 -0
  710. package/dist/extensions/builtin/loop/cron-tools/cron-delete-tool.js +1 -0
  711. package/dist/extensions/builtin/loop/cron-tools/cron-list-tool.d.ts +25 -0
  712. package/dist/extensions/builtin/loop/cron-tools/cron-list-tool.js +2 -0
  713. package/dist/extensions/builtin/loop/cron-tools/index.d.ts +16 -0
  714. package/dist/extensions/builtin/loop/cron-tools/index.js +1 -0
  715. package/dist/extensions/builtin/loop/cron-tools/prompt.d.ts +35 -0
  716. package/dist/extensions/builtin/loop/cron-tools/prompt.js +38 -0
  717. package/dist/extensions/builtin/loop/index.d.ts +19 -0
  718. package/dist/extensions/builtin/loop/index.js +2 -0
  719. package/dist/extensions/builtin/loop/loop-skill.d.ts +18 -0
  720. package/dist/extensions/builtin/loop/loop-skill.js +58 -0
  721. package/dist/extensions/builtin/lsp/index.d.ts +8 -0
  722. package/dist/extensions/builtin/lsp/index.js +1 -0
  723. package/dist/extensions/builtin/lsp/lsp-client.d.ts +22 -0
  724. package/dist/extensions/builtin/lsp/lsp-client.js +1 -0
  725. package/dist/extensions/builtin/lsp/lsp-config.d.ts +8 -0
  726. package/dist/extensions/builtin/lsp/lsp-config.js +1 -0
  727. package/dist/extensions/builtin/lsp/lsp-formatters.d.ts +15 -0
  728. package/dist/extensions/builtin/lsp/lsp-formatters.js +18 -0
  729. package/dist/extensions/builtin/lsp/lsp-server-instance.d.ts +24 -0
  730. package/dist/extensions/builtin/lsp/lsp-server-instance.js +1 -0
  731. package/dist/extensions/builtin/lsp/lsp-server-manager.d.ts +21 -0
  732. package/dist/extensions/builtin/lsp/lsp-server-manager.js +1 -0
  733. package/dist/extensions/builtin/lsp/lsp-tool.d.ts +33 -0
  734. package/dist/extensions/builtin/lsp/lsp-tool.js +2 -0
  735. package/dist/extensions/builtin/lsp/types.d.ts +31 -0
  736. package/dist/extensions/builtin/lsp/types.js +1 -0
  737. package/dist/extensions/builtin/mcp/figma-design.md +68 -0
  738. package/dist/extensions/builtin/mcp/index.d.ts +14 -0
  739. package/dist/extensions/builtin/mcp/index.js +25 -0
  740. package/dist/extensions/builtin/mcp/mcp-management.md +85 -0
  741. package/dist/extensions/builtin/plan/clear-context-state.d.ts +8 -0
  742. package/dist/extensions/builtin/plan/clear-context-state.js +1 -0
  743. package/dist/extensions/builtin/plan/enter-plan-mode-tool.d.ts +11 -0
  744. package/dist/extensions/builtin/plan/enter-plan-mode-tool.js +2 -0
  745. package/dist/extensions/builtin/plan/exit-plan-mode-tool.d.ts +18 -0
  746. package/dist/extensions/builtin/plan/exit-plan-mode-tool.js +13 -0
  747. package/dist/extensions/builtin/plan/index.d.ts +8 -0
  748. package/dist/extensions/builtin/plan/index.js +24 -0
  749. package/dist/extensions/builtin/plan/plan-agents.d.ts +23 -0
  750. package/dist/extensions/builtin/plan/plan-agents.js +43 -0
  751. package/dist/extensions/builtin/plan/plan-file-manager.d.ts +26 -0
  752. package/dist/extensions/builtin/plan/plan-file-manager.js +1 -0
  753. package/dist/extensions/builtin/plan/plan-permissions.d.ts +15 -0
  754. package/dist/extensions/builtin/plan/plan-permissions.js +12 -0
  755. package/dist/extensions/builtin/plan/plan-validation.d.ts +18 -0
  756. package/dist/extensions/builtin/plan/plan-validation.js +5 -0
  757. package/dist/extensions/builtin/plan/plan-workflow-prompt.d.ts +18 -0
  758. package/dist/extensions/builtin/plan/plan-workflow-prompt.js +102 -0
  759. package/dist/extensions/builtin/plan/teammate-approval.d.ts +49 -0
  760. package/dist/extensions/builtin/plan/teammate-approval.js +3 -0
  761. package/dist/extensions/builtin/plan/types.d.ts +133 -0
  762. package/dist/extensions/builtin/plan/types.js +1 -0
  763. package/dist/extensions/builtin/presence/index.d.ts +40 -0
  764. package/dist/extensions/builtin/presence/index.js +15 -0
  765. package/dist/extensions/builtin/presence/presence-memory.d.ts +47 -0
  766. package/dist/extensions/builtin/presence/presence-memory.js +1 -0
  767. package/dist/extensions/builtin/recap/AGENT.md +15 -0
  768. package/dist/extensions/builtin/recap/index.d.ts +8 -0
  769. package/dist/extensions/builtin/recap/index.js +1 -0
  770. package/dist/extensions/builtin/recap/recap-budget.d.ts +24 -0
  771. package/dist/extensions/builtin/recap/recap-budget.js +1 -0
  772. package/dist/extensions/builtin/recap/recap-extractor.d.ts +34 -0
  773. package/dist/extensions/builtin/recap/recap-extractor.js +3 -0
  774. package/dist/extensions/builtin/recap/recap-renderer.d.ts +19 -0
  775. package/dist/extensions/builtin/recap/recap-renderer.js +2 -0
  776. package/dist/extensions/builtin/recap/recap-synthesizer.d.ts +51 -0
  777. package/dist/extensions/builtin/recap/recap-synthesizer.js +19 -0
  778. package/dist/extensions/builtin/recap/recap-types.d.ts +40 -0
  779. package/dist/extensions/builtin/recap/recap-types.js +1 -0
  780. package/dist/extensions/builtin/sal/README.md +72 -0
  781. package/dist/extensions/builtin/sal/anchors.d.ts +46 -0
  782. package/dist/extensions/builtin/sal/anchors.js +1 -0
  783. package/dist/extensions/builtin/sal/eval/index.d.ts +18 -0
  784. package/dist/extensions/builtin/sal/eval/index.js +1 -0
  785. package/dist/extensions/builtin/sal/eval/insforge-sink.d.ts +30 -0
  786. package/dist/extensions/builtin/sal/eval/insforge-sink.js +1 -0
  787. package/dist/extensions/builtin/sal/eval/jsonl-sink.d.ts +27 -0
  788. package/dist/extensions/builtin/sal/eval/jsonl-sink.js +3 -0
  789. package/dist/extensions/builtin/sal/eval/noop-sink.d.ts +8 -0
  790. package/dist/extensions/builtin/sal/eval/noop-sink.js +1 -0
  791. package/dist/extensions/builtin/sal/eval/types.d.ts +60 -0
  792. package/dist/extensions/builtin/sal/eval/types.js +1 -0
  793. package/dist/extensions/builtin/sal/index.d.ts +12 -0
  794. package/dist/extensions/builtin/sal/index.js +7 -0
  795. package/dist/extensions/builtin/sal/sal-config.d.ts +46 -0
  796. package/dist/extensions/builtin/sal/sal-config.js +1 -0
  797. package/dist/extensions/builtin/sal/sal-context.d.ts +11 -0
  798. package/dist/extensions/builtin/sal/sal-context.js +2 -0
  799. package/dist/extensions/builtin/sal/sal-runtime.d.ts +72 -0
  800. package/dist/extensions/builtin/sal/sal-runtime.js +0 -0
  801. package/dist/extensions/builtin/sal/sal-trace.d.ts +11 -0
  802. package/dist/extensions/builtin/sal/sal-trace.js +1 -0
  803. package/dist/extensions/builtin/sal/terrain.d.ts +73 -0
  804. package/dist/extensions/builtin/sal/terrain.js +3 -0
  805. package/dist/extensions/builtin/sal/weights.d.ts +28 -0
  806. package/dist/extensions/builtin/sal/weights.js +1 -0
  807. package/dist/extensions/builtin/security-audit/README.md +289 -0
  808. package/dist/extensions/builtin/security-audit/engine/detector.d.ts +44 -0
  809. package/dist/extensions/builtin/security-audit/engine/detector.js +1 -0
  810. package/dist/extensions/builtin/security-audit/engine/interceptor.d.ts +61 -0
  811. package/dist/extensions/builtin/security-audit/engine/interceptor.js +27 -0
  812. package/dist/extensions/builtin/security-audit/engine/logger.d.ts +65 -0
  813. package/dist/extensions/builtin/security-audit/engine/logger.js +65 -0
  814. package/dist/extensions/builtin/security-audit/index.d.ts +13 -0
  815. package/dist/extensions/builtin/security-audit/index.js +49 -0
  816. package/dist/extensions/builtin/security-audit/interface.d.ts +167 -0
  817. package/dist/extensions/builtin/security-audit/interface.js +1 -0
  818. package/dist/extensions/builtin/soul/index.d.ts +13 -0
  819. package/dist/extensions/builtin/soul/index.js +1 -0
  820. package/dist/extensions/builtin/subagent/index.d.ts +8 -0
  821. package/dist/extensions/builtin/subagent/index.js +8 -0
  822. package/dist/extensions/builtin/subagent/subagent-parser.d.ts +30 -0
  823. package/dist/extensions/builtin/subagent/subagent-parser.js +15 -0
  824. package/dist/extensions/builtin/subagent/subagent-runner.d.ts +49 -0
  825. package/dist/extensions/builtin/subagent/subagent-runner.js +8 -0
  826. package/dist/extensions/builtin/subagent/subagent-types.d.ts +57 -0
  827. package/dist/extensions/builtin/subagent/subagent-types.js +0 -0
  828. package/dist/extensions/builtin/task/index.d.ts +8 -0
  829. package/dist/extensions/builtin/task/index.js +1 -0
  830. package/dist/extensions/builtin/task/task-store.d.ts +42 -0
  831. package/dist/extensions/builtin/task/task-store.js +1 -0
  832. package/dist/extensions/builtin/task/task-tools/task-create-tool.d.ts +37 -0
  833. package/dist/extensions/builtin/task/task-tools/task-create-tool.js +40 -0
  834. package/dist/extensions/builtin/task/task-tools/task-get-tool.d.ts +31 -0
  835. package/dist/extensions/builtin/task/task-tools/task-get-tool.js +23 -0
  836. package/dist/extensions/builtin/task/task-tools/task-list-tool.d.ts +27 -0
  837. package/dist/extensions/builtin/task/task-tools/task-list-tool.js +22 -0
  838. package/dist/extensions/builtin/task/task-tools/task-output-tool.d.ts +32 -0
  839. package/dist/extensions/builtin/task/task-tools/task-output-tool.js +10 -0
  840. package/dist/extensions/builtin/task/task-tools/task-stop-tool.d.ts +31 -0
  841. package/dist/extensions/builtin/task/task-tools/task-stop-tool.js +5 -0
  842. package/dist/extensions/builtin/task/task-tools/task-update-tool.d.ts +47 -0
  843. package/dist/extensions/builtin/task/task-tools/task-update-tool.js +77 -0
  844. package/dist/extensions/builtin/task/task-tools/tool-search-tool.d.ts +34 -0
  845. package/dist/extensions/builtin/task/task-tools/tool-search-tool.js +14 -0
  846. package/dist/extensions/builtin/task/task-types.d.ts +30 -0
  847. package/dist/extensions/builtin/task/task-types.js +1 -0
  848. package/dist/extensions/builtin/teach/README.md +197 -0
  849. package/dist/extensions/builtin/teach/index.d.ts +12 -0
  850. package/dist/extensions/builtin/teach/index.js +6 -0
  851. package/dist/extensions/builtin/teach/references/analogy-library.md +153 -0
  852. package/dist/extensions/builtin/teach/references/learning-paths.md +214 -0
  853. package/dist/extensions/builtin/teach/references/source-verification.md +268 -0
  854. package/dist/extensions/builtin/teach/references/teaching-template.md +237 -0
  855. package/dist/extensions/builtin/teach/teach-format.d.ts +35 -0
  856. package/dist/extensions/builtin/teach/teach-format.js +6 -0
  857. package/dist/extensions/builtin/teach/teach-i18n.d.ts +47 -0
  858. package/dist/extensions/builtin/teach/teach-i18n.js +1 -0
  859. package/dist/extensions/builtin/teach/teach-persistence.d.ts +36 -0
  860. package/dist/extensions/builtin/teach/teach-persistence.js +35 -0
  861. package/dist/extensions/builtin/teach/teach-prompts.d.ts +52 -0
  862. package/dist/extensions/builtin/teach/teach-prompts.js +35 -0
  863. package/dist/extensions/builtin/teach/teach-runtime.d.ts +93 -0
  864. package/dist/extensions/builtin/teach/teach-runtime.js +9 -0
  865. package/dist/extensions/builtin/teach/teach-types.d.ts +81 -0
  866. package/dist/extensions/builtin/teach/teach-types.js +0 -0
  867. package/dist/extensions/builtin/team/AGENT.md +112 -0
  868. package/dist/extensions/builtin/team/TESTING.md +299 -0
  869. package/dist/extensions/builtin/team/index.d.ts +26 -0
  870. package/dist/extensions/builtin/team/index.js +11 -0
  871. package/dist/extensions/builtin/team/team-dashboard.d.ts +13 -0
  872. package/dist/extensions/builtin/team/team-dashboard.js +1 -0
  873. package/dist/extensions/builtin/team/team-harness.d.ts +35 -0
  874. package/dist/extensions/builtin/team/team-harness.js +18 -0
  875. package/dist/extensions/builtin/team/team-mailbox.d.ts +50 -0
  876. package/dist/extensions/builtin/team/team-mailbox.js +4 -0
  877. package/dist/extensions/builtin/team/team-orchestrator.d.ts +39 -0
  878. package/dist/extensions/builtin/team/team-orchestrator.js +5 -0
  879. package/dist/extensions/builtin/team/team-parser.d.ts +84 -0
  880. package/dist/extensions/builtin/team/team-parser.js +38 -0
  881. package/dist/extensions/builtin/team/team-permissions.d.ts +63 -0
  882. package/dist/extensions/builtin/team/team-permissions.js +1 -0
  883. package/dist/extensions/builtin/team/team-presets.d.ts +45 -0
  884. package/dist/extensions/builtin/team/team-presets.js +2 -0
  885. package/dist/extensions/builtin/team/team-psyche.d.ts +14 -0
  886. package/dist/extensions/builtin/team/team-psyche.js +5 -0
  887. package/dist/extensions/builtin/team/team-runtime-helpers.d.ts +48 -0
  888. package/dist/extensions/builtin/team/team-runtime-helpers.js +2 -0
  889. package/dist/extensions/builtin/team/team-runtime.d.ts +91 -0
  890. package/dist/extensions/builtin/team/team-runtime.js +3 -0
  891. package/dist/extensions/builtin/team/team-state-store.d.ts +29 -0
  892. package/dist/extensions/builtin/team/team-state-store.js +2 -0
  893. package/dist/extensions/builtin/team/team-task-store.d.ts +35 -0
  894. package/dist/extensions/builtin/team/team-task-store.js +2 -0
  895. package/dist/extensions/builtin/team/team-transcript.d.ts +31 -0
  896. package/dist/extensions/builtin/team/team-transcript.js +2 -0
  897. package/dist/extensions/builtin/team/team-types.d.ts +250 -0
  898. package/dist/extensions/builtin/team/team-types.js +0 -0
  899. package/dist/extensions/builtin/team/team-ui.d.ts +50 -0
  900. package/dist/extensions/builtin/team/team-ui.js +2 -0
  901. package/dist/extensions/builtin/token-save/README.md +56 -0
  902. package/dist/extensions/builtin/token-save/config.d.ts +8 -0
  903. package/dist/extensions/builtin/token-save/config.js +1 -0
  904. package/dist/extensions/builtin/token-save/filters.d.ts +14 -0
  905. package/dist/extensions/builtin/token-save/filters.js +24 -0
  906. package/dist/extensions/builtin/token-save/index.d.ts +8 -0
  907. package/dist/extensions/builtin/token-save/index.js +4 -0
  908. package/dist/extensions/builtin/token-save/lexer.d.ts +11 -0
  909. package/dist/extensions/builtin/token-save/lexer.js +1 -0
  910. package/dist/extensions/builtin/token-save/recovery.d.ts +1 -0
  911. package/dist/extensions/builtin/token-save/recovery.js +1 -0
  912. package/dist/extensions/builtin/token-save/rewrite.d.ts +19 -0
  913. package/dist/extensions/builtin/token-save/rewrite.js +1 -0
  914. package/dist/extensions/builtin/token-save/runner.d.ts +14 -0
  915. package/dist/extensions/builtin/token-save/runner.js +3 -0
  916. package/dist/extensions/builtin/token-save/stream.d.ts +20 -0
  917. package/dist/extensions/builtin/token-save/stream.js +1 -0
  918. package/dist/extensions/builtin/token-save/toml-dsl.d.ts +25 -0
  919. package/dist/extensions/builtin/token-save/toml-dsl.js +3 -0
  920. package/dist/extensions/builtin/token-save/tracking.d.ts +24 -0
  921. package/dist/extensions/builtin/token-save/tracking.js +8 -0
  922. package/dist/extensions/optional/AGENT.md +11 -0
  923. package/dist/extensions/optional/export-html/index.d.ts +41 -0
  924. package/dist/extensions/optional/export-html/index.js +2 -0
  925. package/dist/extensions/optional/simplify/index.d.ts +35 -0
  926. package/dist/extensions/optional/simplify/index.js +77 -0
  927. package/dist/index.d.ts +9 -0
  928. package/dist/index.js +1 -0
  929. package/dist/main.d.ts +7 -0
  930. package/dist/main.js +41 -0
  931. package/dist/migrations.d.ts +30 -0
  932. package/dist/migrations.js +4 -0
  933. package/dist/models.d.ts +7 -0
  934. package/dist/models.js +1 -0
  935. package/dist/modes/acp/acp-mode.d.ts +30 -0
  936. package/dist/modes/acp/acp-mode.js +25 -0
  937. package/dist/modes/index.d.ts +14 -0
  938. package/dist/modes/index.js +1 -0
  939. package/dist/modes/interactive/agent-loop-status.d.ts +8 -0
  940. package/dist/modes/interactive/agent-loop-status.js +1 -0
  941. package/dist/modes/interactive/components/apikey-input.d.ts +10 -0
  942. package/dist/modes/interactive/components/apikey-input.js +3 -0
  943. package/dist/modes/interactive/components/armin.d.ts +39 -0
  944. package/dist/modes/interactive/components/armin.js +1 -0
  945. package/dist/modes/interactive/components/assistant-message.d.ts +21 -0
  946. package/dist/modes/interactive/components/assistant-message.js +1 -0
  947. package/dist/modes/interactive/components/attachments-bar.d.ts +37 -0
  948. package/dist/modes/interactive/components/attachments-bar.js +1 -0
  949. package/dist/modes/interactive/components/bash-execution.d.ts +40 -0
  950. package/dist/modes/interactive/components/bash-execution.js +13 -0
  951. package/dist/modes/interactive/components/bordered-loader.d.ts +21 -0
  952. package/dist/modes/interactive/components/bordered-loader.js +1 -0
  953. package/dist/modes/interactive/components/branch-summary-message.d.ts +21 -0
  954. package/dist/modes/interactive/components/branch-summary-message.js +3 -0
  955. package/dist/modes/interactive/components/buddy/pet-sprites.d.ts +31 -0
  956. package/dist/modes/interactive/components/buddy/pet-sprites.js +1 -0
  957. package/dist/modes/interactive/components/catui-loader.d.ts +55 -0
  958. package/dist/modes/interactive/components/catui-loader.js +1 -0
  959. package/dist/modes/interactive/components/compaction-summary-message.d.ts +21 -0
  960. package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
  961. package/dist/modes/interactive/components/config-selector.d.ts +76 -0
  962. package/dist/modes/interactive/components/config-selector.js +1 -0
  963. package/dist/modes/interactive/components/countdown-timer.d.ts +19 -0
  964. package/dist/modes/interactive/components/countdown-timer.js +1 -0
  965. package/dist/modes/interactive/components/custom-editor.d.ts +37 -0
  966. package/dist/modes/interactive/components/custom-editor.js +1 -0
  967. package/dist/modes/interactive/components/custom-message.d.ts +26 -0
  968. package/dist/modes/interactive/components/custom-message.js +2 -0
  969. package/dist/modes/interactive/components/daxnuts.d.ts +28 -0
  970. package/dist/modes/interactive/components/daxnuts.js +1 -0
  971. package/dist/modes/interactive/components/diff.d.ts +17 -0
  972. package/dist/modes/interactive/components/diff.js +3 -0
  973. package/dist/modes/interactive/components/dynamic-border.d.ts +20 -0
  974. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  975. package/dist/modes/interactive/components/editor-buddy-layout.d.ts +17 -0
  976. package/dist/modes/interactive/components/editor-buddy-layout.js +1 -0
  977. package/dist/modes/interactive/components/extension-editor.d.ts +25 -0
  978. package/dist/modes/interactive/components/extension-editor.js +1 -0
  979. package/dist/modes/interactive/components/extension-input.d.ts +29 -0
  980. package/dist/modes/interactive/components/extension-input.js +2 -0
  981. package/dist/modes/interactive/components/extension-selector.d.ts +32 -0
  982. package/dist/modes/interactive/components/extension-selector.js +2 -0
  983. package/dist/modes/interactive/components/footer.d.ts +34 -0
  984. package/dist/modes/interactive/components/footer.js +1 -0
  985. package/dist/modes/interactive/components/index.d.ts +44 -0
  986. package/dist/modes/interactive/components/index.js +1 -0
  987. package/dist/modes/interactive/components/keybinding-hints.d.ts +46 -0
  988. package/dist/modes/interactive/components/keybinding-hints.js +1 -0
  989. package/dist/modes/interactive/components/login-dialog.d.ts +47 -0
  990. package/dist/modes/interactive/components/login-dialog.js +1 -0
  991. package/dist/modes/interactive/components/memory-stats.d.ts +14 -0
  992. package/dist/modes/interactive/components/memory-stats.js +2 -0
  993. package/dist/modes/interactive/components/model-selector.d.ts +59 -0
  994. package/dist/modes/interactive/components/model-selector.js +2 -0
  995. package/dist/modes/interactive/components/notification-queue.d.ts +49 -0
  996. package/dist/modes/interactive/components/notification-queue.js +1 -0
  997. package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
  998. package/dist/modes/interactive/components/oauth-selector.js +1 -0
  999. package/dist/modes/interactive/components/persona-selector.d.ts +24 -0
  1000. package/dist/modes/interactive/components/persona-selector.js +1 -0
  1001. package/dist/modes/interactive/components/plan-progress-panel.d.ts +24 -0
  1002. package/dist/modes/interactive/components/plan-progress-panel.js +1 -0
  1003. package/dist/modes/interactive/components/provider-selector.d.ts +25 -0
  1004. package/dist/modes/interactive/components/provider-selector.js +1 -0
  1005. package/dist/modes/interactive/components/raw-text.d.ts +19 -0
  1006. package/dist/modes/interactive/components/raw-text.js +3 -0
  1007. package/dist/modes/interactive/components/scoped-models-selector.d.ts +54 -0
  1008. package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
  1009. package/dist/modes/interactive/components/session-selector-search.d.ts +28 -0
  1010. package/dist/modes/interactive/components/session-selector-search.js +1 -0
  1011. package/dist/modes/interactive/components/session-selector.d.ts +100 -0
  1012. package/dist/modes/interactive/components/session-selector.js +2 -0
  1013. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  1014. package/dist/modes/interactive/components/settings-selector.js +1 -0
  1015. package/dist/modes/interactive/components/show-images-selector.d.ts +15 -0
  1016. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  1017. package/dist/modes/interactive/components/skill-invocation-message.d.ts +22 -0
  1018. package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
  1019. package/dist/modes/interactive/components/soul-stats.d.ts +15 -0
  1020. package/dist/modes/interactive/components/soul-stats.js +2 -0
  1021. package/dist/modes/interactive/components/sub-agent-panel.d.ts +24 -0
  1022. package/dist/modes/interactive/components/sub-agent-panel.js +1 -0
  1023. package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
  1024. package/dist/modes/interactive/components/task-status-panel.js +1 -0
  1025. package/dist/modes/interactive/components/theme-selector.d.ts +16 -0
  1026. package/dist/modes/interactive/components/theme-selector.js +1 -0
  1027. package/dist/modes/interactive/components/thinking-selector.d.ts +16 -0
  1028. package/dist/modes/interactive/components/thinking-selector.js +1 -0
  1029. package/dist/modes/interactive/components/tool-execution.d.ts +80 -0
  1030. package/dist/modes/interactive/components/tool-execution.js +58 -0
  1031. package/dist/modes/interactive/components/tree-selector.d.ts +73 -0
  1032. package/dist/modes/interactive/components/tree-selector.js +1 -0
  1033. package/dist/modes/interactive/components/user-message-selector.d.ts +35 -0
  1034. package/dist/modes/interactive/components/user-message-selector.js +1 -0
  1035. package/dist/modes/interactive/components/user-message.d.ts +13 -0
  1036. package/dist/modes/interactive/components/user-message.js +1 -0
  1037. package/dist/modes/interactive/components/visual-truncate.d.ts +29 -0
  1038. package/dist/modes/interactive/components/visual-truncate.js +1 -0
  1039. package/dist/modes/interactive/controllers/auth-provider-config-controller.d.ts +64 -0
  1040. package/dist/modes/interactive/controllers/auth-provider-config-controller.js +1 -0
  1041. package/dist/modes/interactive/controllers/extension-ui/custom-overlay-host.d.ts +38 -0
  1042. package/dist/modes/interactive/controllers/extension-ui/custom-overlay-host.js +1 -0
  1043. package/dist/modes/interactive/controllers/extension-ui/editor-component-adapter.d.ts +37 -0
  1044. package/dist/modes/interactive/controllers/extension-ui/editor-component-adapter.js +1 -0
  1045. package/dist/modes/interactive/controllers/extension-ui/persistent-surface-registry.d.ts +53 -0
  1046. package/dist/modes/interactive/controllers/extension-ui/persistent-surface-registry.js +1 -0
  1047. package/dist/modes/interactive/controllers/extension-ui/prompt-host.d.ts +52 -0
  1048. package/dist/modes/interactive/controllers/extension-ui/prompt-host.js +2 -0
  1049. package/dist/modes/interactive/controllers/image-pipeline-controller.d.ts +106 -0
  1050. package/dist/modes/interactive/controllers/image-pipeline-controller.js +1 -0
  1051. package/dist/modes/interactive/controllers/input-submit-controller.d.ts +80 -0
  1052. package/dist/modes/interactive/controllers/input-submit-controller.js +2 -0
  1053. package/dist/modes/interactive/controllers/interrupt-controller.d.ts +75 -0
  1054. package/dist/modes/interactive/controllers/interrupt-controller.js +1 -0
  1055. package/dist/modes/interactive/controllers/model-overlay-controller.d.ts +127 -0
  1056. package/dist/modes/interactive/controllers/model-overlay-controller.js +3 -0
  1057. package/dist/modes/interactive/controllers/self-update-controller.d.ts +71 -0
  1058. package/dist/modes/interactive/controllers/self-update-controller.js +24 -0
  1059. package/dist/modes/interactive/controllers/settings-overlay-controller.d.ts +56 -0
  1060. package/dist/modes/interactive/controllers/settings-overlay-controller.js +2 -0
  1061. package/dist/modes/interactive/controllers/slash-dispatcher-controller.d.ts +74 -0
  1062. package/dist/modes/interactive/controllers/slash-dispatcher-controller.js +1 -0
  1063. package/dist/modes/interactive/controllers/stream-render-controller.d.ts +110 -0
  1064. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -0
  1065. package/dist/modes/interactive/controllers/tree-overlay-controller.d.ts +55 -0
  1066. package/dist/modes/interactive/controllers/tree-overlay-controller.js +1 -0
  1067. package/dist/modes/interactive/footer-data-provider.d.ts +32 -0
  1068. package/dist/modes/interactive/footer-data-provider.js +1 -0
  1069. package/dist/modes/interactive/interactive-mode.d.ts +303 -0
  1070. package/dist/modes/interactive/interactive-mode.js +119 -0
  1071. package/dist/modes/interactive/services/tips.d.ts +20 -0
  1072. package/dist/modes/interactive/services/tips.js +1 -0
  1073. package/dist/modes/interactive/slash-command-arguments.d.ts +28 -0
  1074. package/dist/modes/interactive/slash-command-arguments.js +1 -0
  1075. package/dist/modes/interactive/state/interactive-state.d.ts +74 -0
  1076. package/dist/modes/interactive/state/interactive-state.js +1 -0
  1077. package/dist/modes/interactive/theme/dark.json +85 -0
  1078. package/dist/modes/interactive/theme/light.json +84 -0
  1079. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  1080. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  1081. package/dist/modes/interactive/theme/theme.js +16 -0
  1082. package/dist/modes/interactive/theme/warm.json +81 -0
  1083. package/dist/modes/print-mode.d.ts +38 -0
  1084. package/dist/modes/print-mode.js +2 -0
  1085. package/dist/modes/rpc/rpc-client.d.ts +221 -0
  1086. package/dist/modes/rpc/rpc-client.js +2 -0
  1087. package/dist/modes/rpc/rpc-mode.d.ts +14 -0
  1088. package/dist/modes/rpc/rpc-mode.js +1 -0
  1089. package/dist/modes/rpc/rpc-types.d.ts +449 -0
  1090. package/dist/modes/rpc/rpc-types.js +0 -0
  1091. package/dist/modes/utils/agent-loop-result-format.d.ts +10 -0
  1092. package/dist/modes/utils/agent-loop-result-format.js +1 -0
  1093. package/dist/modes/utils/clipboard-image.d.ts +10 -0
  1094. package/dist/modes/utils/clipboard-image.js +1 -0
  1095. package/dist/modes/utils/clipboard-native.d.ts +11 -0
  1096. package/dist/modes/utils/clipboard-native.js +1 -0
  1097. package/dist/modes/utils/clipboard.d.ts +1 -0
  1098. package/dist/modes/utils/clipboard.js +1 -0
  1099. package/dist/modes/utils/image-convert.d.ts +8 -0
  1100. package/dist/modes/utils/image-convert.js +1 -0
  1101. package/dist/modes/utils/image-resize.d.ts +41 -0
  1102. package/dist/modes/utils/image-resize.js +1 -0
  1103. package/dist/node_modules/@catui/agent-core/dist/agent-loop-continuations.js +1 -0
  1104. package/dist/node_modules/@catui/agent-core/dist/agent-loop-stream-events.js +1 -0
  1105. package/dist/node_modules/@catui/agent-core/dist/agent-loop-tool-results.js +3 -0
  1106. package/dist/node_modules/@catui/agent-core/dist/agent-loop-tool-summaries.js +1 -0
  1107. package/dist/node_modules/@catui/agent-core/dist/agent-loop.js +4 -0
  1108. package/dist/node_modules/@catui/agent-core/dist/agent-run-result.js +1 -0
  1109. package/dist/node_modules/@catui/agent-core/dist/agent.js +1 -0
  1110. package/dist/node_modules/@catui/agent-core/dist/errors.js +1 -0
  1111. package/dist/node_modules/@catui/agent-core/dist/index.js +1 -0
  1112. package/dist/node_modules/@catui/agent-core/dist/proxy.js +2 -0
  1113. package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-agent-loop.js +2 -0
  1114. package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-streaming-tool-executor.js +1 -0
  1115. package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-tool-orchestration.js +3 -0
  1116. package/dist/node_modules/@catui/agent-core/dist/types.js +1 -0
  1117. package/dist/node_modules/@catui/agent-core/package.json +28 -0
  1118. package/dist/node_modules/@catui/ai/dist/api-registry.js +1 -0
  1119. package/dist/node_modules/@catui/ai/dist/cli.js +21 -0
  1120. package/dist/node_modules/@catui/ai/dist/config-path.js +1 -0
  1121. package/dist/node_modules/@catui/ai/dist/debug-logger.js +4 -0
  1122. package/dist/node_modules/@catui/ai/dist/env-api-keys.js +1 -0
  1123. package/dist/node_modules/@catui/ai/dist/env.js +1 -0
  1124. package/dist/node_modules/@catui/ai/dist/events.js +1 -0
  1125. package/dist/node_modules/@catui/ai/dist/index.js +1 -0
  1126. package/dist/node_modules/@catui/ai/dist/json.js +1 -0
  1127. package/dist/node_modules/@catui/ai/dist/models.generated.js +1 -0
  1128. package/dist/node_modules/@catui/ai/dist/models.js +1 -0
  1129. package/dist/node_modules/@catui/ai/dist/overflow.js +1 -0
  1130. package/dist/node_modules/@catui/ai/dist/providers/amazon-bedrock.js +1 -0
  1131. package/dist/node_modules/@catui/ai/dist/providers/anthropic.js +2 -0
  1132. package/dist/node_modules/@catui/ai/dist/providers/azure-openai-responses.js +1 -0
  1133. package/dist/node_modules/@catui/ai/dist/providers/github-copilot-headers.js +1 -0
  1134. package/dist/node_modules/@catui/ai/dist/providers/google-gemini-cli.js +2 -0
  1135. package/dist/node_modules/@catui/ai/dist/providers/google-shared.js +2 -0
  1136. package/dist/node_modules/@catui/ai/dist/providers/google-vertex.js +1 -0
  1137. package/dist/node_modules/@catui/ai/dist/providers/google.js +1 -0
  1138. package/dist/node_modules/@catui/ai/dist/providers/openai-codex-responses.js +7 -0
  1139. package/dist/node_modules/@catui/ai/dist/providers/openai-completions.js +6 -0
  1140. package/dist/node_modules/@catui/ai/dist/providers/openai-responses-shared.js +10 -0
  1141. package/dist/node_modules/@catui/ai/dist/providers/openai-responses.js +1 -0
  1142. package/dist/node_modules/@catui/ai/dist/providers/register-builtins.js +1 -0
  1143. package/dist/node_modules/@catui/ai/dist/providers/simple-options.js +1 -0
  1144. package/dist/node_modules/@catui/ai/dist/providers/transform-messages.js +1 -0
  1145. package/dist/node_modules/@catui/ai/dist/registry.js +1 -0
  1146. package/dist/node_modules/@catui/ai/dist/schema.js +1 -0
  1147. package/dist/node_modules/@catui/ai/dist/stream.js +1 -0
  1148. package/dist/node_modules/@catui/ai/dist/types.js +0 -0
  1149. package/dist/node_modules/@catui/ai/dist/utils/event-stream-types.js +0 -0
  1150. package/dist/node_modules/@catui/ai/dist/utils/event-stream.js +1 -0
  1151. package/dist/node_modules/@catui/ai/dist/utils/http-proxy.js +1 -0
  1152. package/dist/node_modules/@catui/ai/dist/utils/json-parse.js +1 -0
  1153. package/dist/node_modules/@catui/ai/dist/utils/oauth/anthropic.js +1 -0
  1154. package/dist/node_modules/@catui/ai/dist/utils/oauth/decode-credential.js +1 -0
  1155. package/dist/node_modules/@catui/ai/dist/utils/oauth/github-copilot.js +1 -0
  1156. package/dist/node_modules/@catui/ai/dist/utils/oauth/google-antigravity.js +1 -0
  1157. package/dist/node_modules/@catui/ai/dist/utils/oauth/google-gemini-cli.js +1 -0
  1158. package/dist/node_modules/@catui/ai/dist/utils/oauth/index.js +1 -0
  1159. package/dist/node_modules/@catui/ai/dist/utils/oauth/openai-codex.js +11 -0
  1160. package/dist/node_modules/@catui/ai/dist/utils/oauth/pkce.js +1 -0
  1161. package/dist/node_modules/@catui/ai/dist/utils/oauth/types.js +0 -0
  1162. package/dist/node_modules/@catui/ai/dist/utils/overflow.js +1 -0
  1163. package/dist/node_modules/@catui/ai/dist/utils/sanitize-unicode.js +1 -0
  1164. package/dist/node_modules/@catui/ai/dist/utils/typebox-helpers.js +1 -0
  1165. package/dist/node_modules/@catui/ai/dist/utils/validation.js +6 -0
  1166. package/dist/node_modules/@catui/ai/package.json +106 -0
  1167. package/dist/node_modules/@catui/tui/dist/autocomplete.js +2 -0
  1168. package/dist/node_modules/@catui/tui/dist/components/box.js +1 -0
  1169. package/dist/node_modules/@catui/tui/dist/components/cached-container.js +1 -0
  1170. package/dist/node_modules/@catui/tui/dist/components/cancellable-loader.js +1 -0
  1171. package/dist/node_modules/@catui/tui/dist/components/editor.js +21 -0
  1172. package/dist/node_modules/@catui/tui/dist/components/image.js +1 -0
  1173. package/dist/node_modules/@catui/tui/dist/components/input.js +2 -0
  1174. package/dist/node_modules/@catui/tui/dist/components/loader.js +1 -0
  1175. package/dist/node_modules/@catui/tui/dist/components/markdown.js +7 -0
  1176. package/dist/node_modules/@catui/tui/dist/components/select-list.js +1 -0
  1177. package/dist/node_modules/@catui/tui/dist/components/settings-list.js +1 -0
  1178. package/dist/node_modules/@catui/tui/dist/components/spacer.js +1 -0
  1179. package/dist/node_modules/@catui/tui/dist/components/text.js +1 -0
  1180. package/dist/node_modules/@catui/tui/dist/components/truncated-text.js +2 -0
  1181. package/dist/node_modules/@catui/tui/dist/editor-component.js +0 -0
  1182. package/dist/node_modules/@catui/tui/dist/fuzzy.js +1 -0
  1183. package/dist/node_modules/@catui/tui/dist/index.js +1 -0
  1184. package/dist/node_modules/@catui/tui/dist/keybindings.js +1 -0
  1185. package/dist/node_modules/@catui/tui/dist/keys.js +5 -0
  1186. package/dist/node_modules/@catui/tui/dist/kill-ring.js +1 -0
  1187. package/dist/node_modules/@catui/tui/dist/stdin-buffer.js +1 -0
  1188. package/dist/node_modules/@catui/tui/dist/terminal-image.js +1 -0
  1189. package/dist/node_modules/@catui/tui/dist/terminal.js +1 -0
  1190. package/dist/node_modules/@catui/tui/dist/tui.js +12 -0
  1191. package/dist/node_modules/@catui/tui/dist/undo-stack.js +1 -0
  1192. package/dist/node_modules/@catui/tui/dist/utils.js +2 -0
  1193. package/dist/node_modules/@catui/tui/package.json +37 -0
  1194. package/dist/packages/mem-core/src/store.d.ts +21 -0
  1195. package/dist/packages/mem-core/src/store.js +1 -0
  1196. package/dist/packages/mem-core/src/types.d.ts +329 -0
  1197. package/dist/packages/mem-core/src/types.js +0 -0
  1198. package/dist/packages/protocol/src/commands.d.ts +33 -0
  1199. package/dist/packages/protocol/src/commands.js +0 -0
  1200. package/dist/packages/protocol/src/flags.d.ts +20 -0
  1201. package/dist/packages/protocol/src/flags.js +0 -0
  1202. package/dist/packages/protocol/src/hooks.d.ts +17 -0
  1203. package/dist/packages/protocol/src/hooks.js +0 -0
  1204. package/dist/packages/protocol/src/index.d.ts +15 -0
  1205. package/dist/packages/protocol/src/index.js +1 -0
  1206. package/dist/packages/protocol/src/lifecycle.d.ts +61 -0
  1207. package/dist/packages/protocol/src/lifecycle.js +0 -0
  1208. package/dist/packages/protocol/src/tools.d.ts +77 -0
  1209. package/dist/packages/protocol/src/tools.js +0 -0
  1210. package/dist/packages/soul-core/src/config.d.ts +20 -0
  1211. package/dist/packages/soul-core/src/config.js +1 -0
  1212. package/dist/packages/soul-core/src/diagnostics.d.ts +23 -0
  1213. package/dist/packages/soul-core/src/diagnostics.js +1 -0
  1214. package/dist/packages/soul-core/src/evolution.d.ts +75 -0
  1215. package/dist/packages/soul-core/src/evolution.js +1 -0
  1216. package/dist/packages/soul-core/src/index.d.ts +13 -0
  1217. package/dist/packages/soul-core/src/index.js +1 -0
  1218. package/dist/packages/soul-core/src/injection.d.ts +35 -0
  1219. package/dist/packages/soul-core/src/injection.js +8 -0
  1220. package/dist/packages/soul-core/src/manager.d.ts +101 -0
  1221. package/dist/packages/soul-core/src/manager.js +1 -0
  1222. package/dist/packages/soul-core/src/store.d.ts +62 -0
  1223. package/dist/packages/soul-core/src/store.js +1 -0
  1224. package/dist/packages/soul-core/src/types.d.ts +317 -0
  1225. package/dist/packages/soul-core/src/types.js +0 -0
  1226. package/dist/public-config.d.ts +12 -0
  1227. package/dist/public-config.js +1 -0
  1228. package/dist/runtime.d.ts +9 -0
  1229. package/dist/runtime.js +1 -0
  1230. package/dist/session-compaction.d.ts +7 -0
  1231. package/dist/session-compaction.js +1 -0
  1232. package/dist/session.d.ts +7 -0
  1233. package/dist/session.js +1 -0
  1234. package/dist/skills.d.ts +7 -0
  1235. package/dist/skills.js +1 -0
  1236. package/dist/tools.d.ts +7 -0
  1237. package/dist/tools.js +1 -0
  1238. package/dist/utils/changelog.d.ts +20 -0
  1239. package/dist/utils/changelog.js +4 -0
  1240. package/dist/utils/diagnostics.d.ts +37 -0
  1241. package/dist/utils/diagnostics.js +1 -0
  1242. package/dist/utils/frontmatter.d.ts +7 -0
  1243. package/dist/utils/frontmatter.js +4 -0
  1244. package/dist/utils/git.d.ts +25 -0
  1245. package/dist/utils/git.js +1 -0
  1246. package/dist/utils/mime.d.ts +1 -0
  1247. package/dist/utils/mime.js +1 -0
  1248. package/dist/utils/photon.d.ts +6 -0
  1249. package/dist/utils/photon.js +1 -0
  1250. package/dist/utils/startup-profiler.d.ts +87 -0
  1251. package/dist/utils/startup-profiler.js +2 -0
  1252. package/docs/codex-goal-command-impl.md +1055 -0
  1253. package/docs/codex-goal-vs-grub.md +500 -0
  1254. package/docs/custom-provider.md +27 -0
  1255. package/docs/extensions.md +27 -0
  1256. package/docs/keybindings.md +27 -0
  1257. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +251 -0
  1258. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +123 -0
  1259. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -0
  1260. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -0
  1261. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -0
  1262. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +321 -0
  1263. package/docs/loop-usage-examples.md +215 -0
  1264. package/docs/models.md +27 -0
  1265. package/docs/packages.md +27 -0
  1266. package/docs/pi-design-philosophy.md +457 -0
  1267. package/docs/planmode.md +1987 -0
  1268. package/docs/prompt-templates.md +27 -0
  1269. package/docs/providers.md +27 -0
  1270. package/docs/sdk.md +27 -0
  1271. package/docs/skills.md +27 -0
  1272. package/docs/themes.md +27 -0
  1273. package/docs/tui.md +27 -0
  1274. package/package.json +191 -0
@@ -0,0 +1,1987 @@
1
+ # 06 | `/plan` 命令实现与一比一复现指南
2
+
3
+ > 基于 Claude Code v2.1.88 反编译源码的逆向分析文档。本文目标是把 Plan Mode 拆成可施工规格:让 GPT-4 级别模型也能按步骤实现出结构和行为接近源码的版本,而不是只理解概念。
4
+
5
+ ## 目录
6
+
7
+ 1. [一句话总结](#1-一句话总结)
8
+ 2. [必须实现的能力边界](#2-必须实现的能力边界)
9
+ 3. [核心文件和职责](#3-核心文件和职责)
10
+ 4. [整体数据流](#4-整体数据流)
11
+ 5. [最小状态模型](#5-最小状态模型)
12
+ 6. [`/plan` local-jsx 命令](#6-plan-local-jsx-命令)
13
+ 7. [Plan 文件系统](#7-plan-文件系统)
14
+ 8. [权限模式切换](#8-权限模式切换)
15
+ 9. [EnterPlanModeTool](#9-enterplanmodetool)
16
+ 10. [ExitPlanModeV2Tool](#10-exitplanmodev2tool)
17
+ 11. [Plan Mode 附件系统](#11-plan-mode-附件系统)
18
+ 12. [Plan workflow prompt](#12-plan-workflow-prompt)
19
+ 13. [Explore Agent 与 Plan Agent](#13-explore-agent-与-plan-agent)
20
+ 14. [Auto mode 与 Plan mode 的交互](#14-auto-mode-与-plan-mode-的交互)
21
+ 15. [Teammate 审批流](#15-teammate-审批流)
22
+ 16. [从零实现顺序](#16-从零实现顺序)
23
+ 17. [最小可用版本](#17-最小可用版本)
24
+ 18. [完整版本增强项](#18-完整版本增强项)
25
+ 19. [测试清单](#19-测试清单)
26
+ 20. [常见错误](#20-常见错误)
27
+ 21. [关键结论](#21-关键结论)
28
+
29
+ ---
30
+
31
+ ## 1. 一句话总结
32
+
33
+ Plan Mode 是一个权限受限的规划状态。进入后,模型只能读取代码和编辑唯一的 plan 文件;完成规划后必须调用 `ExitPlanMode` 请求用户批准,批准后恢复进入前的权限模式并开始实现。
34
+
35
+ 它由六层组成:
36
+
37
+ ```
38
+ 用户 /plan 或模型 EnterPlanMode
39
+
40
+
41
+ 切换 toolPermissionContext.mode = "plan"
42
+
43
+
44
+ 记录 prePlanMode,准备退出时恢复
45
+
46
+
47
+ 附件系统注入 plan_mode 工作流 prompt
48
+
49
+
50
+ 模型只读探索 + 写 plan 文件
51
+
52
+
53
+ 模型调用 ExitPlanMode
54
+
55
+
56
+ 用户或 team lead 审批
57
+
58
+
59
+ 恢复 prePlanMode,注入 plan_mode_exit 附件
60
+ ```
61
+
62
+ 最重要的设计点:**`/plan` 本身只切换状态;真正指导模型如何规划的是附件系统注入的 plan mode prompt;真正退出和审批的是 `ExitPlanModeV2Tool`。**
63
+
64
+ ---
65
+
66
+ ## 2. 必须实现的能力边界
67
+
68
+ Plan Mode 必须支持:
69
+
70
+ 1. 用户输入 `/plan` 进入 plan mode。
71
+ 2. 用户输入 `/plan <description>` 进入 plan mode,并把描述作为下一轮模型查询。
72
+ 3. 模型主动调用 `EnterPlanMode` 进入 plan mode。
73
+ 4. 已在 plan mode 时,`/plan` 显示当前 plan 文件内容。
74
+ 5. 已在 plan mode 时,`/plan open` 用外部编辑器打开 plan 文件。
75
+ 6. 进入 plan mode 后,只允许读操作和编辑 plan 文件。
76
+ 7. 进入 plan mode 后,附件系统注入 plan workflow 指令。
77
+ 8. 模型必须把计划写到 plan 文件。
78
+ 9. 模型必须用 `ExitPlanMode` 请求批准,不能用普通文本问“可以开始吗”。
79
+ 10. 用户批准后恢复进入前的权限模式。
80
+ 11. 退出后注入 `plan_mode_exit` 附件,提醒模型现在可以修改文件。
81
+ 12. 会话恢复、fork、远程会话尽量保留 plan 文件。
82
+ 13. teammate 可走 leader 审批流。
83
+
84
+ Plan Mode 不应该:
85
+
86
+ 1. 直接修改业务文件。
87
+ 2. 在 plan mode 内运行写操作 shell 命令。
88
+ 3. 让 subagent 调用 `EnterPlanMode`。
89
+ 4. 让模型在未写 plan 的情况下对 plan-required teammate 退出。
90
+ 5. 在 channels 环境中进入一个无法退出的 plan mode。
91
+
92
+ ---
93
+
94
+ ## 3. 核心文件和职责
95
+
96
+ | 文件 | 职责 |
97
+ |------|------|
98
+ | `src/commands/plan/index.ts` | 注册 `/plan` local-jsx 命令 |
99
+ | `src/commands/plan/plan.tsx` | `/plan` 命令主逻辑:进入、显示、打开 plan |
100
+ | `src/bootstrap/state.ts` | 保存 plan mode 附件标志、plan slug cache、退出标志 |
101
+ | `src/utils/permissions/permissionSetup.ts` | 进入 plan mode 前准备权限上下文 |
102
+ | `src/utils/permissions/PermissionUpdate.ts` | 应用 `{ type: 'setMode', mode: 'plan' }` |
103
+ | `src/utils/plans.ts` | plan 文件路径、读写、slug、resume/fork 恢复 |
104
+ | `src/tools/EnterPlanModeTool/EnterPlanModeTool.ts` | 模型主动进入 plan mode 的工具 |
105
+ | `src/tools/EnterPlanModeTool/prompt.ts` | 告诉模型何时应该使用 EnterPlanMode |
106
+ | `src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts` | 退出、审批、恢复权限、返回 approved plan |
107
+ | `src/tools/ExitPlanModeTool/prompt.ts` | 告诉模型如何调用 ExitPlanMode |
108
+ | `src/utils/attachments.ts` | 根据状态生成 `plan_mode` / `plan_mode_exit` 附件 |
109
+ | `src/utils/messages.ts` | 把附件转换成模型可见 workflow prompt |
110
+ | `src/utils/planModeV2.ts` | Explore/Plan agent 数量、interview phase、实验变体 |
111
+ | `src/tools/AgentTool/built-in/exploreAgent.ts` | Explore agent 定义,只读搜索 |
112
+ | `src/tools/AgentTool/built-in/planAgent.ts` | Plan agent 定义,只读规划 |
113
+ | `src/tools.ts` | 注册 EnterPlanMode 和 ExitPlanMode 工具 |
114
+
115
+ ---
116
+
117
+ ## 4. 整体数据流
118
+
119
+ ### 4.1 用户输入 `/plan`
120
+
121
+ ```
122
+ 用户输入 /plan [description]
123
+
124
+
125
+ processSlashCommand
126
+
127
+
128
+ 找到 local-jsx command: plan
129
+
130
+
131
+ load() -> import('./plan.js')
132
+
133
+
134
+ call(onDone, context, args)
135
+
136
+ ├─ 当前不在 plan mode
137
+ │ ├─ handlePlanModeTransition(currentMode, 'plan')
138
+ │ ├─ prepareContextForPlanMode(...)
139
+ │ ├─ applyPermissionUpdate(... setMode plan ...)
140
+ │ └─ onDone('Enabled plan mode', { shouldQuery: args 非空且不是 open })
141
+
142
+ └─ 当前已在 plan mode
143
+ ├─ 没有 plan 文件 -> onDone('Already in plan mode. No plan written yet.')
144
+ ├─ args[0] === 'open' -> editFileInEditor(planPath)
145
+ └─ 否则 renderToString(<PlanDisplay />)
146
+ ```
147
+
148
+ ### 4.2 模型主动调用 `EnterPlanMode`
149
+
150
+ ```
151
+ 模型判断任务复杂
152
+
153
+
154
+ 调用 EnterPlanMode({})
155
+
156
+
157
+ validate: 非 agent context,channels 未启用
158
+
159
+
160
+ handlePlanModeTransition(currentMode, 'plan')
161
+
162
+
163
+ setAppState(toolPermissionContext.mode = 'plan')
164
+
165
+
166
+ tool_result 返回 plan mode 指令摘要
167
+
168
+
169
+ 下一轮 attachment 注入完整 workflow prompt
170
+ ```
171
+
172
+ ### 4.3 模型退出 plan mode
173
+
174
+ ```
175
+ 模型写完 plan 文件
176
+
177
+
178
+ 调用 ExitPlanMode({})
179
+
180
+
181
+ validate: 非 teammate 必须当前 mode === 'plan'
182
+
183
+
184
+ checkPermissions
185
+
186
+ ├─ teammate -> allow
187
+ └─ 普通用户 -> ask "Exit plan mode?"
188
+
189
+
190
+ call()
191
+
192
+ ├─ 读取 plan 文件
193
+ ├─ 如果 input.plan 存在,写回 plan 文件
194
+ ├─ teammate required -> 发 leader mailbox,等待审批
195
+ └─ 普通用户 -> 恢复 prePlanMode
196
+
197
+
198
+ tool_result:
199
+ User has approved your plan. You can now start coding.
200
+ ```
201
+
202
+ ---
203
+
204
+ ## 5. 最小状态模型
205
+
206
+ 要实现 Plan Mode,至少需要以下状态字段。
207
+
208
+ ### 5.1 ToolPermissionContext
209
+
210
+ 伪类型:
211
+
212
+ ```typescript
213
+ type ToolPermissionContext = {
214
+ mode: 'default' | 'plan' | 'auto' | 'acceptEdits' | 'bypassPermissions'
215
+ prePlanMode?: 'default' | 'auto' | 'acceptEdits' | 'bypassPermissions'
216
+ strippedDangerousRules?: PermissionRule[]
217
+ }
218
+ ```
219
+
220
+ 字段含义:
221
+
222
+ | 字段 | 作用 |
223
+ |------|------|
224
+ | `mode` | 当前权限模式 |
225
+ | `prePlanMode` | 进入 plan mode 前的模式,退出时恢复 |
226
+ | `strippedDangerousRules` | auto/plan 期间临时移除的危险 allow rules |
227
+
228
+ ### 5.2 Bootstrap state
229
+
230
+ 伪类型:
231
+
232
+ ```typescript
233
+ type BootstrapState = {
234
+ needsPlanModeExitAttachment: boolean
235
+ hasExitedPlanModeInSession: boolean
236
+ planSlugCache: Map<SessionId, string>
237
+ }
238
+ ```
239
+
240
+ 字段含义:
241
+
242
+ | 字段 | 作用 |
243
+ |------|------|
244
+ | `needsPlanModeExitAttachment` | 刚退出 plan mode 时置 true,附件系统消费后清零 |
245
+ | `hasExitedPlanModeInSession` | 用于判断重新进入 plan mode 是否需要 reentry 指令 |
246
+ | `planSlugCache` | session id -> plan slug,保证同一 session 使用同一 plan 文件 |
247
+
248
+ ### 5.3 关键状态函数
249
+
250
+ 必须提供:
251
+
252
+ ```typescript
253
+ function handlePlanModeTransition(fromMode: string, toMode: string): void
254
+ function needsPlanModeExitAttachment(): boolean
255
+ function setNeedsPlanModeExitAttachment(value: boolean): void
256
+ function hasExitedPlanModeInSession(): boolean
257
+ function setHasExitedPlanMode(value: boolean): void
258
+ function getPlanSlugCache(): Map<SessionId, string>
259
+ function getSessionId(): SessionId
260
+ ```
261
+
262
+ `handlePlanModeTransition` 逻辑:
263
+
264
+ ```typescript
265
+ if (toMode === 'plan' && fromMode !== 'plan') {
266
+ STATE.needsPlanModeExitAttachment = false
267
+ }
268
+
269
+ if (fromMode === 'plan' && toMode !== 'plan') {
270
+ STATE.needsPlanModeExitAttachment = true
271
+ }
272
+ ```
273
+
274
+ 注意:源码中 `ExitPlanModeV2Tool.call()` 也会显式设置:
275
+
276
+ ```typescript
277
+ setHasExitedPlanMode(true)
278
+ setNeedsPlanModeExitAttachment(true)
279
+ ```
280
+
281
+ ---
282
+
283
+ ## 6. `/plan` local-jsx 命令
284
+
285
+ ### 6.1 注册文件
286
+
287
+ 文件:`src/commands/plan/index.ts`
288
+
289
+ ```typescript
290
+ const plan = {
291
+ type: 'local-jsx',
292
+ name: 'plan',
293
+ description: 'Enable plan mode or view the current session plan',
294
+ argumentHint: '[open|<description>]',
295
+ load: () => import('./plan.js'),
296
+ } satisfies Command
297
+ ```
298
+
299
+ 实现要求:
300
+
301
+ 1. `type` 必须是 `local-jsx`。
302
+ 2. `name` 必须是 `plan`。
303
+ 3. `load` 动态 import `./plan.js`。
304
+ 4. 该 command 必须加入全局 commands 列表。
305
+
306
+ ### 6.2 `call()` 函数签名
307
+
308
+ 文件:`src/commands/plan/plan.tsx`
309
+
310
+ ```typescript
311
+ export async function call(
312
+ onDone: LocalJSXCommandOnDone,
313
+ context: LocalJSXCommandContext,
314
+ args: string,
315
+ ): Promise<React.ReactNode>
316
+ ```
317
+
318
+ `context` 至少需要:
319
+
320
+ ```typescript
321
+ type LocalJSXCommandContext = {
322
+ getAppState(): AppState
323
+ setAppState(updater: (prev: AppState) => AppState): void
324
+ }
325
+ ```
326
+
327
+ ### 6.3 当前不在 plan mode
328
+
329
+ 完整伪代码:
330
+
331
+ ```typescript
332
+ const appState = getAppState()
333
+ const currentMode = appState.toolPermissionContext.mode
334
+
335
+ if (currentMode !== 'plan') {
336
+ handlePlanModeTransition(currentMode, 'plan')
337
+
338
+ setAppState(prev => ({
339
+ ...prev,
340
+ toolPermissionContext: applyPermissionUpdate(
341
+ prepareContextForPlanMode(prev.toolPermissionContext),
342
+ {
343
+ type: 'setMode',
344
+ mode: 'plan',
345
+ destination: 'session',
346
+ },
347
+ ),
348
+ }))
349
+
350
+ const description = args.trim()
351
+ if (description && description !== 'open') {
352
+ onDone('Enabled plan mode', { shouldQuery: true })
353
+ } else {
354
+ onDone('Enabled plan mode')
355
+ }
356
+
357
+ return null
358
+ }
359
+ ```
360
+
361
+ 分支含义:
362
+
363
+ | 输入 | 行为 |
364
+ |------|------|
365
+ | `/plan` | 进入 plan mode,不立即 query |
366
+ | `/plan open` 且当前不在 plan mode | 只进入 plan mode,不打开文件 |
367
+ | `/plan 重构认证模块` | 进入 plan mode,并 `shouldQuery: true` |
368
+
369
+ 为什么 `/plan <description>` 要 `shouldQuery: true`:用户提供了任务描述,进入 plan mode 后要立刻让模型开始规划。
370
+
371
+ ### 6.4 当前已在 plan mode
372
+
373
+ 完整伪代码:
374
+
375
+ ```typescript
376
+ const planContent = getPlan()
377
+ const planPath = getPlanFilePath()
378
+
379
+ if (!planContent) {
380
+ onDone('Already in plan mode. No plan written yet.')
381
+ return null
382
+ }
383
+
384
+ const argList = args.trim().split(/\s+/)
385
+
386
+ if (argList[0] === 'open') {
387
+ const result = await editFileInEditor(planPath)
388
+ if (result.error) {
389
+ onDone(`Failed to open plan in editor: ${result.error}`)
390
+ } else {
391
+ onDone(`Opened plan in editor: ${planPath}`)
392
+ }
393
+ return null
394
+ }
395
+
396
+ const editor = getExternalEditor()
397
+ const editorName = editor ? toIDEDisplayName(editor) : undefined
398
+ const display = (
399
+ <PlanDisplay
400
+ planContent={planContent}
401
+ planPath={planPath}
402
+ editorName={editorName}
403
+ />
404
+ )
405
+
406
+ const output = await renderToString(display)
407
+ onDone(output)
408
+ return null
409
+ ```
410
+
411
+ ### 6.5 PlanDisplay 组件
412
+
413
+ 显示结构:
414
+
415
+ ```tsx
416
+ <Box flexDirection="column">
417
+ <Text bold>Current Plan</Text>
418
+ <Text dimColor>{planPath}</Text>
419
+ <Box marginTop={1}>
420
+ <Text>{planContent}</Text>
421
+ </Box>
422
+ {editorName && (
423
+ <Box marginTop={1}>
424
+ <Text dimColor>"/plan open"</Text>
425
+ <Text dimColor> to edit this plan in </Text>
426
+ <Text bold dimColor>{editorName}</Text>
427
+ </Box>
428
+ )}
429
+ </Box>
430
+ ```
431
+
432
+ 注意:源码使用 React compiler cache,复现时不需要实现缓存。
433
+
434
+ ---
435
+
436
+ ## 7. Plan 文件系统
437
+
438
+ 核心文件:`src/utils/plans.ts`
439
+
440
+ ### 7.1 文件位置
441
+
442
+ 默认:
443
+
444
+ ```text
445
+ ~/.claude/plans/{slug}.md
446
+ ```
447
+
448
+ 如果是 subagent:
449
+
450
+ ```text
451
+ ~/.claude/plans/{slug}-agent-{agentId}.md
452
+ ```
453
+
454
+ 如果用户设置了 `plansDirectory`:
455
+
456
+ ```json
457
+ {
458
+ "plansDirectory": ".claude/plans"
459
+ }
460
+ ```
461
+
462
+ 则相对于项目根目录解析,且必须位于项目根目录内。
463
+
464
+ ### 7.2 必须实现的 API
465
+
466
+ ```typescript
467
+ function getPlanSlug(sessionId?: SessionId): string
468
+ function setPlanSlug(sessionId: SessionId, slug: string): void
469
+ function clearPlanSlug(sessionId?: SessionId): void
470
+ function clearAllPlanSlugs(): void
471
+ function getPlansDirectory(): string
472
+ function getPlanFilePath(agentId?: AgentId): string
473
+ function getPlan(agentId?: AgentId): string | null
474
+ async function copyPlanForResume(log: LogOption, targetSessionId?: SessionId): Promise<boolean>
475
+ async function copyPlanForFork(log: LogOption, targetSessionId: SessionId): Promise<boolean>
476
+ async function persistFileSnapshotIfRemote(): Promise<void>
477
+ ```
478
+
479
+ ### 7.3 `getPlansDirectory`
480
+
481
+ 伪代码:
482
+
483
+ ```typescript
484
+ function getPlansDirectory(): string {
485
+ const settingsDir = getInitialSettings().plansDirectory
486
+
487
+ if (settingsDir) {
488
+ const cwd = getCwd()
489
+ const resolved = resolve(cwd, settingsDir)
490
+
491
+ if (!resolved.startsWith(cwd + sep) && resolved !== cwd) {
492
+ logError(new Error(`plansDirectory must be within project root: ${settingsDir}`))
493
+ return join(getClaudeConfigHomeDir(), 'plans')
494
+ }
495
+
496
+ mkdirSync(resolved, { recursive: true })
497
+ return resolved
498
+ }
499
+
500
+ const fallback = join(getClaudeConfigHomeDir(), 'plans')
501
+ mkdirSync(fallback, { recursive: true })
502
+ return fallback
503
+ }
504
+ ```
505
+
506
+ 源码中该函数用 `memoize` 包裹,因为渲染和权限检查会频繁调用。
507
+
508
+ ### 7.4 `getPlanSlug`
509
+
510
+ 伪代码:
511
+
512
+ ```typescript
513
+ function getPlanSlug(sessionId = getSessionId()) {
514
+ const cache = getPlanSlugCache()
515
+ let slug = cache.get(sessionId)
516
+
517
+ if (!slug) {
518
+ const plansDir = getPlansDirectory()
519
+ for (let i = 0; i < 10; i++) {
520
+ slug = generateWordSlug()
521
+ const filePath = join(plansDir, `${slug}.md`)
522
+ if (!existsSync(filePath)) break
523
+ }
524
+ cache.set(sessionId, slug)
525
+ }
526
+
527
+ return slug
528
+ }
529
+ ```
530
+
531
+ 关键规则:
532
+
533
+ 1. slug 延迟生成。
534
+ 2. 同一 session id 重复调用返回同一个 slug。
535
+ 3. 最多重试 10 次避免文件名冲突。
536
+ 4. 生成结果放进 `planSlugCache`。
537
+
538
+ ### 7.5 `getPlanFilePath`
539
+
540
+ ```typescript
541
+ function getPlanFilePath(agentId?: AgentId): string {
542
+ const planSlug = getPlanSlug(getSessionId())
543
+
544
+ if (!agentId) {
545
+ return join(getPlansDirectory(), `${planSlug}.md`)
546
+ }
547
+
548
+ return join(getPlansDirectory(), `${planSlug}-agent-${agentId}.md`)
549
+ }
550
+ ```
551
+
552
+ ### 7.6 `getPlan`
553
+
554
+ ```typescript
555
+ function getPlan(agentId?: AgentId): string | null {
556
+ const filePath = getPlanFilePath(agentId)
557
+ try {
558
+ return readFileSync(filePath, 'utf-8')
559
+ } catch (error) {
560
+ if (isENOENT(error)) return null
561
+ logError(error)
562
+ return null
563
+ }
564
+ }
565
+ ```
566
+
567
+ ### 7.7 Resume 恢复
568
+
569
+ `copyPlanForResume(log, targetSessionId)`:
570
+
571
+ 1. 从消息历史中找 `slug`。
572
+ 2. `setPlanSlug(targetSessionId, slug)`。
573
+ 3. 如果 plan 文件还在,返回 true。
574
+ 4. 如果文件丢失且不是远程环境,返回 false。
575
+ 5. 如果是远程环境,尝试恢复:
576
+ - 优先从 `file_snapshot` 中找 `key === 'plan'`
577
+ - 否则从消息历史中找 `ExitPlanMode` tool_use input 的 `plan`
578
+ - 否则找 user message 的 `planContent`
579
+ - 否则找 `plan_file_reference` attachment
580
+ 6. 恢复成功后写回 plan 文件。
581
+
582
+ ### 7.8 Fork 恢复
583
+
584
+ `copyPlanForFork(log, targetSessionId)`:
585
+
586
+ 1. 从原日志取 original slug。
587
+ 2. 为 target session 生成新 slug。
588
+ 3. 把原 plan 文件复制到新 plan 文件。
589
+ 4. 不复用原 slug,避免 fork 会话互相覆盖。
590
+
591
+ ### 7.9 远程会话 snapshot
592
+
593
+ `persistFileSnapshotIfRemote()`:
594
+
595
+ 1. 只在远程环境中运行。
596
+ 2. 读取当前 plan 文件。
597
+ 3. 写入一条 `system` / `file_snapshot` transcript message。
598
+ 4. 用于 remote resume 时恢复 plan 文件。
599
+
600
+ ---
601
+
602
+ ## 8. 权限模式切换
603
+
604
+ 核心文件:`src/utils/permissions/permissionSetup.ts`
605
+
606
+ ### 8.1 `prepareContextForPlanMode`
607
+
608
+ 完整伪代码:
609
+
610
+ ```typescript
611
+ function prepareContextForPlanMode(context: ToolPermissionContext) {
612
+ const currentMode = context.mode
613
+ if (currentMode === 'plan') return context
614
+
615
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
616
+ const planAutoMode = shouldPlanUseAutoMode()
617
+
618
+ if (currentMode === 'auto') {
619
+ if (planAutoMode) {
620
+ return { ...context, prePlanMode: 'auto' }
621
+ }
622
+
623
+ autoModeStateModule?.setAutoModeActive(false)
624
+ setNeedsAutoModeExitAttachment(true)
625
+ return {
626
+ ...restoreDangerousPermissions(context),
627
+ prePlanMode: 'auto',
628
+ }
629
+ }
630
+
631
+ if (planAutoMode && currentMode !== 'bypassPermissions') {
632
+ autoModeStateModule?.setAutoModeActive(true)
633
+ return {
634
+ ...stripDangerousPermissionsForAutoMode(context),
635
+ prePlanMode: currentMode,
636
+ }
637
+ }
638
+ }
639
+
640
+ return { ...context, prePlanMode: currentMode }
641
+ }
642
+ ```
643
+
644
+ ### 8.2 行为表
645
+
646
+ | 进入前模式 | planAutoMode | 结果 |
647
+ |------------|--------------|------|
648
+ | `plan` | 任意 | 原样返回 |
649
+ | `auto` | true | 保持 auto active,记录 `prePlanMode: 'auto'` |
650
+ | `auto` | false | 关闭 auto active,恢复危险权限,记录 `prePlanMode: 'auto'` |
651
+ | `default` | true | 打开 auto active,剥离危险权限,记录 `prePlanMode: 'default'` |
652
+ | `acceptEdits` | true | 打开 auto active,剥离危险权限,记录 `prePlanMode: 'acceptEdits'` |
653
+ | `bypassPermissions` | true | 不打开 auto,记录 `prePlanMode: 'bypassPermissions'` |
654
+ | 其他 | false | 只记录 `prePlanMode: currentMode` |
655
+
656
+ ### 8.3 应用 mode 更新
657
+
658
+ 进入 plan mode 时不能只改 `mode`,必须先 `prepareContextForPlanMode`,再 `applyPermissionUpdate`:
659
+
660
+ ```typescript
661
+ toolPermissionContext: applyPermissionUpdate(
662
+ prepareContextForPlanMode(prev.toolPermissionContext),
663
+ { type: 'setMode', mode: 'plan', destination: 'session' },
664
+ )
665
+ ```
666
+
667
+ 这样才能保留 `prePlanMode` 和 auto mode side effects。
668
+
669
+ ### 8.4 Plan mode 权限规则
670
+
671
+ 复现时至少要保证:
672
+
673
+ | 工具类别 | Plan mode 行为 |
674
+ |----------|----------------|
675
+ | FileRead | 允许 |
676
+ | Glob/Grep | 允许 |
677
+ | FileWrite | 只允许写 plan 文件 |
678
+ | FileEdit | 只允许编辑 plan 文件 |
679
+ | NotebookEdit | 禁止 |
680
+ | Bash/PowerShell | 只允许只读命令 |
681
+ | Agent | 允许 Explore/Plan 等只读 agent |
682
+ | ExitPlanMode | 允许主线程调用;部分 agent 场景特殊处理 |
683
+ | EnterPlanMode | agent context 禁止 |
684
+
685
+ 实现上可以在权限检查层判断:
686
+
687
+ ```typescript
688
+ if (context.mode === 'plan') {
689
+ if (tool is readOnly) allow
690
+ if (tool edits file && target === getPlanFilePath(agentId)) allow
691
+ if (tool === ExitPlanMode) allow
692
+ otherwise deny or ask
693
+ }
694
+ ```
695
+
696
+ ---
697
+
698
+ ## 9. EnterPlanModeTool
699
+
700
+ 核心文件:`src/tools/EnterPlanModeTool/EnterPlanModeTool.ts`
701
+
702
+ ### 9.1 工具定义
703
+
704
+ ```typescript
705
+ export const EnterPlanModeTool = buildTool({
706
+ name: 'EnterPlanMode',
707
+ searchHint: 'switch to plan mode to design an approach before coding',
708
+ shouldDefer: true,
709
+ isConcurrencySafe: true,
710
+ isReadOnly: true,
711
+ })
712
+ ```
713
+
714
+ ### 9.2 Schema
715
+
716
+ 输入是 strict empty object:
717
+
718
+ ```typescript
719
+ const inputSchema = z.strictObject({})
720
+ ```
721
+
722
+ 输出:
723
+
724
+ ```typescript
725
+ {
726
+ message: string
727
+ }
728
+ ```
729
+
730
+ ### 9.3 isEnabled
731
+
732
+ channels 场景禁用:
733
+
734
+ ```typescript
735
+ if ((feature('KAIROS') || feature('KAIROS_CHANNELS')) &&
736
+ getAllowedChannels().length > 0) {
737
+ return false
738
+ }
739
+ return true
740
+ ```
741
+
742
+ 原因:channels 用户可能不在 TUI 前,`ExitPlanMode` 审批弹窗会卡住。
743
+
744
+ ### 9.4 call
745
+
746
+ 完整伪代码:
747
+
748
+ ```typescript
749
+ async call(_input, context) {
750
+ if (context.agentId) {
751
+ throw new Error('EnterPlanMode tool cannot be used in agent contexts')
752
+ }
753
+
754
+ const appState = context.getAppState()
755
+ handlePlanModeTransition(appState.toolPermissionContext.mode, 'plan')
756
+
757
+ context.setAppState(prev => ({
758
+ ...prev,
759
+ toolPermissionContext: applyPermissionUpdate(
760
+ prepareContextForPlanMode(prev.toolPermissionContext),
761
+ { type: 'setMode', mode: 'plan', destination: 'session' },
762
+ ),
763
+ }))
764
+
765
+ return {
766
+ data: {
767
+ message:
768
+ 'Entered plan mode. You should now focus on exploring the codebase and designing an implementation approach.',
769
+ },
770
+ }
771
+ }
772
+ ```
773
+
774
+ ### 9.5 tool_result 映射
775
+
776
+ 标准模式返回:
777
+
778
+ ```text
779
+ Entered plan mode...
780
+
781
+ In plan mode, you should:
782
+ 1. Thoroughly explore the codebase...
783
+ ...
784
+ Remember: DO NOT write or edit any files yet.
785
+ ```
786
+
787
+ interview phase 返回:
788
+
789
+ ```text
790
+ Entered plan mode...
791
+
792
+ DO NOT write or edit any files except the plan file.
793
+ Detailed workflow instructions will follow.
794
+ ```
795
+
796
+ 注意:完整 workflow 不在这里,而在 attachment -> messages.ts 中注入。
797
+
798
+ ---
799
+
800
+ ## 10. ExitPlanModeV2Tool
801
+
802
+ 核心文件:`src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts`
803
+
804
+ 这是 Plan Mode 最复杂的模块。要一比一实现,必须按分支表写。
805
+
806
+ ### 10.1 工具定义
807
+
808
+ ```typescript
809
+ export const ExitPlanModeV2Tool = buildTool({
810
+ name: 'ExitPlanMode',
811
+ searchHint: 'present plan for approval and start coding (plan mode only)',
812
+ shouldDefer: true,
813
+ isConcurrencySafe: true,
814
+ isReadOnly: false,
815
+ })
816
+ ```
817
+
818
+ ### 10.2 Schema
819
+
820
+ 源码的公开 input schema 是 strict empty object:
821
+
822
+ ```typescript
823
+ const inputSchema = z.strictObject({})
824
+ ```
825
+
826
+ 但 `call()` 内部会检查:
827
+
828
+ ```typescript
829
+ const inputPlan =
830
+ 'plan' in input && typeof input.plan === 'string' ? input.plan : undefined
831
+ ```
832
+
833
+ 原因:CCR web UI 或 permission result 可能把用户编辑过的 plan 放进 `input.plan`。这个字段不是普通模型应该手写的 schema 字段。
834
+
835
+ 输出包含:
836
+
837
+ ```typescript
838
+ type Output = {
839
+ plan?: string | null
840
+ isAgent?: boolean
841
+ filePath?: string
842
+ hasTaskTool?: boolean
843
+ planWasEdited?: boolean
844
+ awaitingLeaderApproval?: boolean
845
+ requestId?: string
846
+ }
847
+ ```
848
+
849
+ ### 10.3 requiresUserInteraction
850
+
851
+ ```typescript
852
+ requiresUserInteraction() {
853
+ if (isTeammate()) return false
854
+ return true
855
+ }
856
+ ```
857
+
858
+ 含义:
859
+
860
+ | 场景 | 是否需要本地用户弹窗 |
861
+ |------|----------------------|
862
+ | 普通用户 | 需要 |
863
+ | teammate plan required | 不需要本地弹窗,发给 leader 审批 |
864
+ | teammate voluntary plan | 不需要本地弹窗,直接退出 |
865
+
866
+ ### 10.4 validateInput
867
+
868
+ ```typescript
869
+ async validateInput(_input, { getAppState, options }) {
870
+ if (isTeammate()) {
871
+ return { result: true }
872
+ }
873
+
874
+ const mode = getAppState().toolPermissionContext.mode
875
+ if (mode !== 'plan') {
876
+ logEvent('tengu_exit_plan_mode_called_outside_plan', ...)
877
+ return {
878
+ result: false,
879
+ message:
880
+ 'You are not in plan mode. This tool is only for exiting plan mode after writing a plan. If your plan was already approved, continue with implementation.',
881
+ errorCode: 1,
882
+ }
883
+ }
884
+
885
+ return { result: true }
886
+ }
887
+ ```
888
+
889
+ ### 10.5 checkPermissions
890
+
891
+ ```typescript
892
+ async checkPermissions(input, context) {
893
+ if (isTeammate()) {
894
+ return { behavior: 'allow', updatedInput: input }
895
+ }
896
+
897
+ return {
898
+ behavior: 'ask',
899
+ message: 'Exit plan mode?',
900
+ updatedInput: input,
901
+ }
902
+ }
903
+ ```
904
+
905
+ ### 10.6 call 总流程
906
+
907
+ 伪代码:
908
+
909
+ ```typescript
910
+ async call(input, context) {
911
+ const isAgent = !!context.agentId
912
+ const filePath = getPlanFilePath(context.agentId)
913
+ const inputPlan =
914
+ 'plan' in input && typeof input.plan === 'string'
915
+ ? input.plan
916
+ : undefined
917
+ const plan = inputPlan ?? getPlan(context.agentId)
918
+
919
+ if (inputPlan !== undefined && filePath) {
920
+ await writeFile(filePath, inputPlan, 'utf-8').catch(logError)
921
+ void persistFileSnapshotIfRemote()
922
+ }
923
+
924
+ if (isTeammate() && isPlanModeRequired()) {
925
+ return await submitPlanToLeader(...)
926
+ }
927
+
928
+ restorePermissionMode(context)
929
+
930
+ const hasTaskTool =
931
+ isAgentSwarmsEnabled() &&
932
+ context.options.tools.some(t => toolMatchesName(t, AGENT_TOOL_NAME))
933
+
934
+ return {
935
+ data: {
936
+ plan,
937
+ isAgent,
938
+ filePath,
939
+ hasTaskTool: hasTaskTool || undefined,
940
+ planWasEdited: inputPlan !== undefined || undefined,
941
+ },
942
+ }
943
+ }
944
+ ```
945
+
946
+ ### 10.7 teammate required 分支
947
+
948
+ 如果 `isTeammate() && isPlanModeRequired()`:
949
+
950
+ 1. 如果没有 plan,抛错:
951
+
952
+ ```typescript
953
+ throw new Error(
954
+ `No plan file found at ${filePath}. Please write your plan to this file before calling ExitPlanMode.`,
955
+ )
956
+ ```
957
+
958
+ 2. 生成 `requestId`:
959
+
960
+ ```typescript
961
+ generateRequestId('plan_approval', formatAgentId(agentName, teamName || 'default'))
962
+ ```
963
+
964
+ 3. 写 mailbox:
965
+
966
+ ```typescript
967
+ const approvalRequest = {
968
+ type: 'plan_approval_request',
969
+ from: agentName,
970
+ timestamp: new Date().toISOString(),
971
+ planFilePath: filePath,
972
+ planContent: plan,
973
+ requestId,
974
+ }
975
+
976
+ await writeToMailbox(
977
+ 'team-lead',
978
+ {
979
+ from: agentName,
980
+ text: jsonStringify(approvalRequest),
981
+ timestamp: new Date().toISOString(),
982
+ },
983
+ teamName,
984
+ )
985
+ ```
986
+
987
+ 4. 如果是 in-process teammate,更新 task 状态为 awaiting approval。
988
+ 5. 返回:
989
+
990
+ ```typescript
991
+ {
992
+ plan,
993
+ isAgent: true,
994
+ filePath,
995
+ awaitingLeaderApproval: true,
996
+ requestId,
997
+ }
998
+ ```
999
+
1000
+ ### 10.8 普通退出时恢复权限
1001
+
1002
+ 核心伪代码:
1003
+
1004
+ ```typescript
1005
+ context.setAppState(prev => {
1006
+ if (prev.toolPermissionContext.mode !== 'plan') return prev
1007
+
1008
+ setHasExitedPlanMode(true)
1009
+ setNeedsPlanModeExitAttachment(true)
1010
+
1011
+ let restoreMode = prev.toolPermissionContext.prePlanMode ?? 'default'
1012
+
1013
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
1014
+ if (restoreMode === 'auto' && !isAutoModeGateEnabled()) {
1015
+ restoreMode = 'default'
1016
+ }
1017
+
1018
+ const restoringToAuto = restoreMode === 'auto'
1019
+ const autoWasUsedDuringPlan = autoModeStateModule?.isAutoModeActive() ?? false
1020
+ autoModeStateModule?.setAutoModeActive(restoringToAuto)
1021
+
1022
+ if (autoWasUsedDuringPlan && !restoringToAuto) {
1023
+ setNeedsAutoModeExitAttachment(true)
1024
+ }
1025
+ }
1026
+
1027
+ let baseContext = prev.toolPermissionContext
1028
+
1029
+ if (restoreMode === 'auto') {
1030
+ baseContext = stripDangerousPermissionsForAutoMode(baseContext)
1031
+ } else if (prev.toolPermissionContext.strippedDangerousRules) {
1032
+ baseContext = restoreDangerousPermissions(baseContext)
1033
+ }
1034
+
1035
+ return {
1036
+ ...prev,
1037
+ toolPermissionContext: {
1038
+ ...baseContext,
1039
+ mode: restoreMode,
1040
+ prePlanMode: undefined,
1041
+ },
1042
+ }
1043
+ })
1044
+ ```
1045
+
1046
+ ### 10.9 gate fallback notification
1047
+
1048
+ 如果进入 plan 前是 `auto`,但退出时 auto gate 关闭:
1049
+
1050
+ 1. 恢复到 `default`。
1051
+ 2. 添加 notification:
1052
+
1053
+ ```typescript
1054
+ context.addNotification?.({
1055
+ key: 'auto-mode-gate-plan-exit-fallback',
1056
+ text: `plan exit -> default · ${gateFallbackNotification}`,
1057
+ priority: 'immediate',
1058
+ color: 'warning',
1059
+ timeoutMs: 10000,
1060
+ })
1061
+ ```
1062
+
1063
+ ### 10.10 tool_result 映射
1064
+
1065
+ #### teammate 等待审批
1066
+
1067
+ ```text
1068
+ Your plan has been submitted to the team lead for approval.
1069
+
1070
+ Plan file: <filePath>
1071
+
1072
+ What happens next:
1073
+ 1. Wait for the team lead to review your plan
1074
+ 2. You will receive a message in your inbox with approval/rejection
1075
+ 3. If approved, you can proceed with implementation
1076
+ 4. If rejected, refine your plan based on the feedback
1077
+
1078
+ Important: Do NOT proceed until you receive approval.
1079
+
1080
+ Request ID: <requestId>
1081
+ ```
1082
+
1083
+ #### agent 场景
1084
+
1085
+ ```text
1086
+ User has approved the plan. There is nothing else needed from you now. Please respond with "ok"
1087
+ ```
1088
+
1089
+ #### 空 plan
1090
+
1091
+ ```text
1092
+ User has approved exiting plan mode. You can now proceed.
1093
+ ```
1094
+
1095
+ #### 普通用户批准
1096
+
1097
+ ```text
1098
+ User has approved your plan. You can now start coding. Start with updating your todo list if applicable
1099
+
1100
+ Your plan has been saved to: <filePath>
1101
+ You can refer back to it if needed during implementation.
1102
+
1103
+ ## Approved Plan:
1104
+ <plan>
1105
+ ```
1106
+
1107
+ 如果用户编辑过 plan,标题变成:
1108
+
1109
+ ```text
1110
+ ## Approved Plan (edited by user):
1111
+ ```
1112
+
1113
+ 如果当前工具列表有 Agent/Team 工具,还会附加并行任务提示。
1114
+
1115
+ ---
1116
+
1117
+ ## 11. Plan Mode 附件系统
1118
+
1119
+ 核心文件:`src/utils/attachments.ts` 和 `src/utils/messages.ts`
1120
+
1121
+ ### 11.1 Attachment 类型
1122
+
1123
+ 必须支持:
1124
+
1125
+ ```typescript
1126
+ type Attachment =
1127
+ | {
1128
+ type: 'plan_mode'
1129
+ reminderType: 'full' | 'sparse'
1130
+ isSubAgent?: boolean
1131
+ planFilePath: string
1132
+ planExists: boolean
1133
+ }
1134
+ | {
1135
+ type: 'plan_mode_reentry'
1136
+ planFilePath: string
1137
+ }
1138
+ | {
1139
+ type: 'plan_mode_exit'
1140
+ planFilePath: string
1141
+ planExists: boolean
1142
+ }
1143
+ | {
1144
+ type: 'plan_file_reference'
1145
+ planFilePath: string
1146
+ planContent: string
1147
+ }
1148
+ ```
1149
+
1150
+ ### 11.2 `getPlanModeAttachments`
1151
+
1152
+ 生成条件:
1153
+
1154
+ 1. 当前 `toolPermissionContext.mode !== 'plan'`,返回 `[]`。
1155
+ 2. 如果已有 plan mode attachment 且距离上次不足阈值 human turns,返回 `[]`。
1156
+ 3. 读取 `planFilePath = getPlanFilePath(agentId)`。
1157
+ 4. 读取 `existingPlan = getPlan(agentId)`。
1158
+ 5. 如果 `hasExitedPlanModeInSession()` 且 plan 存在,先加入 `plan_mode_reentry`,然后 `setHasExitedPlanMode(false)`。
1159
+ 6. 计算 full/sparse reminder。
1160
+ 7. 加入 `plan_mode` attachment。
1161
+
1162
+ 伪代码:
1163
+
1164
+ ```typescript
1165
+ async function getPlanModeAttachments(messages, toolUseContext) {
1166
+ const mode = toolUseContext.getAppState().toolPermissionContext.mode
1167
+ if (mode !== 'plan') return []
1168
+
1169
+ if (messages?.length) {
1170
+ const { turnCount, foundPlanModeAttachment } =
1171
+ getPlanModeAttachmentTurnCount(messages)
1172
+
1173
+ if (foundPlanModeAttachment &&
1174
+ turnCount < PLAN_MODE_ATTACHMENT_CONFIG.TURNS_BETWEEN_ATTACHMENTS) {
1175
+ return []
1176
+ }
1177
+ }
1178
+
1179
+ const planFilePath = getPlanFilePath(toolUseContext.agentId)
1180
+ const existingPlan = getPlan(toolUseContext.agentId)
1181
+ const attachments = []
1182
+
1183
+ if (hasExitedPlanModeInSession() && existingPlan !== null) {
1184
+ attachments.push({ type: 'plan_mode_reentry', planFilePath })
1185
+ setHasExitedPlanMode(false)
1186
+ }
1187
+
1188
+ const attachmentCount =
1189
+ countPlanModeAttachmentsSinceLastExit(messages ?? []) + 1
1190
+
1191
+ const reminderType =
1192
+ attachmentCount % FULL_REMINDER_EVERY_N_ATTACHMENTS === 1
1193
+ ? 'full'
1194
+ : 'sparse'
1195
+
1196
+ attachments.push({
1197
+ type: 'plan_mode',
1198
+ reminderType,
1199
+ isSubAgent: !!toolUseContext.agentId,
1200
+ planFilePath,
1201
+ planExists: existingPlan !== null,
1202
+ })
1203
+
1204
+ return attachments
1205
+ }
1206
+ ```
1207
+
1208
+ ### 11.3 human turn 计数
1209
+
1210
+ `getPlanModeAttachmentTurnCount(messages)` 从后往前扫描:
1211
+
1212
+ 1. 只数 human user turns。
1213
+ 2. 不数 `isMeta` user message。
1214
+ 3. 不数 tool_result user message。
1215
+ 4. 遇到最近的 `plan_mode` 或 `plan_mode_reentry` attachment 停止。
1216
+
1217
+ 这是为了避免 tool loop 中每次工具调用都重复注入 plan prompt。
1218
+
1219
+ ### 11.4 full/sparse 规则
1220
+
1221
+ 源码逻辑:
1222
+
1223
+ ```typescript
1224
+ const attachmentCount =
1225
+ countPlanModeAttachmentsSinceLastExit(messages ?? []) + 1
1226
+
1227
+ const reminderType =
1228
+ attachmentCount % FULL_REMINDER_EVERY_N_ATTACHMENTS === 1
1229
+ ? 'full'
1230
+ : 'sparse'
1231
+ ```
1232
+
1233
+ 含义:第 1、N+1、2N+1 次注入 full,其余 sparse。
1234
+
1235
+ ### 11.5 `getPlanModeExitAttachment`
1236
+
1237
+ 退出后一次性注入:
1238
+
1239
+ ```typescript
1240
+ async function getPlanModeExitAttachment(toolUseContext) {
1241
+ if (!needsPlanModeExitAttachment()) return []
1242
+
1243
+ const appState = toolUseContext.getAppState()
1244
+ if (appState.toolPermissionContext.mode === 'plan') {
1245
+ setNeedsPlanModeExitAttachment(false)
1246
+ return []
1247
+ }
1248
+
1249
+ setNeedsPlanModeExitAttachment(false)
1250
+
1251
+ const planFilePath = getPlanFilePath(toolUseContext.agentId)
1252
+ const planExists = getPlan(toolUseContext.agentId) !== null
1253
+
1254
+ return [{ type: 'plan_mode_exit', planFilePath, planExists }]
1255
+ }
1256
+ ```
1257
+
1258
+ ### 11.6 messages.ts 中的渲染
1259
+
1260
+ `plan_mode`:
1261
+
1262
+ ```typescript
1263
+ return getPlanModeInstructions(attachment)
1264
+ ```
1265
+
1266
+ `plan_mode_reentry`:
1267
+
1268
+ ```text
1269
+ You are returning to plan mode after having previously exited it.
1270
+ A plan file exists at <path>.
1271
+
1272
+ Before proceeding:
1273
+ 1. Read existing plan
1274
+ 2. Compare current request
1275
+ 3. Different task -> overwrite
1276
+ 4. Same task -> modify and clean stale parts
1277
+ 5. Always edit plan file before ExitPlanMode
1278
+ ```
1279
+
1280
+ `plan_mode_exit`:
1281
+
1282
+ ```text
1283
+ ## Exited Plan Mode
1284
+
1285
+ You have exited plan mode. You can now make edits, run tools, and take actions.
1286
+ The plan file is located at <path> if you need to reference it.
1287
+ ```
1288
+
1289
+ ---
1290
+
1291
+ ## 12. Plan workflow prompt
1292
+
1293
+ 核心文件:`src/utils/messages.ts`
1294
+
1295
+ ### 12.1 标准 5 阶段 workflow
1296
+
1297
+ `getPlanModeV2Instructions(attachment)` 生成主要 prompt。
1298
+
1299
+ 开头必须包含硬约束:
1300
+
1301
+ ```text
1302
+ Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received.
1303
+ ```
1304
+
1305
+ 然后给出 plan 文件信息:
1306
+
1307
+ ```text
1308
+ No plan file exists yet. You should create your plan at <path> using FileWrite.
1309
+ ```
1310
+
1311
+ 或:
1312
+
1313
+ ```text
1314
+ A plan file already exists at <path>. You can read it and make incremental edits using FileEdit.
1315
+ ```
1316
+
1317
+ ### 12.2 Phase 1: Initial Understanding
1318
+
1319
+ 要求:
1320
+
1321
+ 1. 全面理解用户请求。
1322
+ 2. 搜索可复用函数、工具、模式。
1323
+ 3. 只能使用 `Explore` subagent 类型。
1324
+ 4. 最多启动 `getPlanModeV2ExploreAgentCount()` 个 Explore agents。
1325
+ 5. 单文件/小改动用 1 个 agent。
1326
+ 6. 范围不确定或跨模块时用多个 agent。
1327
+
1328
+ ### 12.3 Phase 2: Design
1329
+
1330
+ 要求:
1331
+
1332
+ 1. 启动 `Plan` agent 设计实现。
1333
+ 2. 默认至少 1 个 Plan agent。
1334
+ 3. trivial task 可以跳过。
1335
+ 4. 最多 `getPlanModeV2AgentCount()` 个 Plan agents。
1336
+ 5. agent prompt 必须包含 Phase 1 的完整背景、文件名、代码路径、约束。
1337
+
1338
+ ### 12.4 Phase 3: Review
1339
+
1340
+ 要求:
1341
+
1342
+ 1. 读取 agents 识别出的关键文件。
1343
+ 2. 确认方案符合用户原始意图。
1344
+ 3. 有疑问时用 `AskUserQuestion`。
1345
+
1346
+ ### 12.5 Phase 4: Final Plan
1347
+
1348
+ 要求模型把 plan 写入 plan 文件。
1349
+
1350
+ 默认 control 版本至少包括:
1351
+
1352
+ 1. context:为什么要做这个改动。
1353
+ 2. 推荐方案,不列无关替代方案。
1354
+ 3. 需要修改的关键文件路径。
1355
+ 4. 可复用的现有函数和工具,带文件路径。
1356
+ 5. 验证方式,最好是端到端命令。
1357
+
1358
+ ### 12.6 Phase 5: ExitPlanMode
1359
+
1360
+ 关键规则:
1361
+
1362
+ 1. 当计划完成后必须调用 `ExitPlanMode`。
1363
+ 2. 当前 turn 只能以 `AskUserQuestion` 或 `ExitPlanMode` 结束。
1364
+ 3. 不允许普通文本问“这个计划可以吗”。
1365
+ 4. 不允许用 `AskUserQuestion` 请求 plan approval。
1366
+ 5. 只有澄清需求或选择方案时才用 `AskUserQuestion`。
1367
+
1368
+ ### 12.7 Interview phase
1369
+
1370
+ 开关函数:
1371
+
1372
+ ```typescript
1373
+ function isPlanModeInterviewPhaseEnabled() {
1374
+ if (process.env.USER_TYPE === 'ant') return true
1375
+ const env = process.env.CLAUDE_CODE_PLAN_MODE_INTERVIEW_PHASE
1376
+ if (isEnvTruthy(env)) return true
1377
+ if (isEnvDefinedFalsy(env)) return false
1378
+ return getFeatureValue_CACHED_MAY_BE_STALE(
1379
+ 'tengu_plan_mode_interview_phase',
1380
+ false,
1381
+ )
1382
+ }
1383
+ ```
1384
+
1385
+ interview phase 不强制 Explore/Plan agents,而是让模型:
1386
+
1387
+ 1. 直接读取代码。
1388
+ 2. 逐步写 plan 文件。
1389
+ 3. 遇到决策就问用户。
1390
+ 4. 反复迭代,直到所有歧义解决。
1391
+ 5. 最后调用 `ExitPlanMode`。
1392
+
1393
+ 首轮要求:
1394
+
1395
+ ```text
1396
+ Start by quickly scanning a few key files to form an initial understanding.
1397
+ Then write a skeleton plan and ask the user your first round of questions.
1398
+ Don't explore exhaustively before engaging the user.
1399
+ ```
1400
+
1401
+ ### 12.8 PewterLedger 实验
1402
+
1403
+ 文件:`src/utils/planModeV2.ts`
1404
+
1405
+ 变体:
1406
+
1407
+ ```typescript
1408
+ type PewterLedgerVariant = 'trim' | 'cut' | 'cap' | null
1409
+ ```
1410
+
1411
+ | 变体 | 作用 |
1412
+ |------|------|
1413
+ | `null` | control,完整 plan |
1414
+ | `trim` | 轻度缩短 |
1415
+ | `cut` | 中度缩短,减少背景 |
1416
+ | `cap` | 强限制,40 行上限 |
1417
+
1418
+ 复现最小版本可以先只实现 control。
1419
+
1420
+ ---
1421
+
1422
+ ## 13. Explore Agent 与 Plan Agent
1423
+
1424
+ ### 13.1 Explore Agent
1425
+
1426
+ 文件:`src/tools/AgentTool/built-in/exploreAgent.ts`
1427
+
1428
+ 关键定义:
1429
+
1430
+ ```typescript
1431
+ const EXPLORE_AGENT = {
1432
+ agentType: 'Explore',
1433
+ model: process.env.USER_TYPE === 'ant' ? 'inherit' : 'haiku',
1434
+ omitClaudeMd: true,
1435
+ disallowedTools: [
1436
+ 'Agent',
1437
+ 'ExitPlanMode',
1438
+ 'FileEdit',
1439
+ 'FileWrite',
1440
+ 'NotebookEdit',
1441
+ ],
1442
+ }
1443
+ ```
1444
+
1445
+ 必须保证:
1446
+
1447
+ 1. 只读。
1448
+ 2. 不能嵌套 Agent。
1449
+ 3. 不能退出 plan mode。
1450
+ 4. 不能写文件。
1451
+ 5. 主要用于快速搜索代码。
1452
+
1453
+ ### 13.2 Plan Agent
1454
+
1455
+ 文件:`src/tools/AgentTool/built-in/planAgent.ts`
1456
+
1457
+ 关键定义:
1458
+
1459
+ ```typescript
1460
+ const PLAN_AGENT = {
1461
+ agentType: 'Plan',
1462
+ model: 'inherit',
1463
+ omitClaudeMd: true,
1464
+ tools: EXPLORE_AGENT.tools,
1465
+ disallowedTools: EXPLORE_AGENT.disallowedTools,
1466
+ }
1467
+ ```
1468
+
1469
+ Plan Agent 的 prompt 要求:
1470
+
1471
+ 1. 作为软件架构师。
1472
+ 2. 基于 Explore 结果设计方案。
1473
+ 3. 输出分步实现策略。
1474
+ 4. 输出 `Critical Files for Implementation`。
1475
+ 5. 仍然只读,不能写文件。
1476
+
1477
+ ### 13.3 agent 数量
1478
+
1479
+ 文件:`src/utils/planModeV2.ts`
1480
+
1481
+ ```typescript
1482
+ function getPlanModeV2ExploreAgentCount() {
1483
+ if (env CLAUDE_CODE_PLAN_V2_EXPLORE_AGENT_COUNT is 1..10) return env
1484
+ return 3
1485
+ }
1486
+
1487
+ function getPlanModeV2AgentCount() {
1488
+ if (env CLAUDE_CODE_PLAN_V2_AGENT_COUNT is 1..10) return env
1489
+ if (subscriptionType === 'max' && rateLimitTier === 'default_claude_max_20x') return 3
1490
+ if (subscriptionType === 'enterprise' || subscriptionType === 'team') return 3
1491
+ return 1
1492
+ }
1493
+ ```
1494
+
1495
+ ---
1496
+
1497
+ ## 14. Auto mode 与 Plan mode 的交互
1498
+
1499
+ 如果实现项目没有 auto mode,可以跳过本节,直接把 `prePlanMode` 恢复为原 mode。
1500
+
1501
+ 如果有 auto mode,必须实现:
1502
+
1503
+ 1. `shouldPlanUseAutoMode()`
1504
+ 2. `prepareContextForPlanMode()`
1505
+ 3. `transitionPlanAutoMode()`
1506
+ 4. ExitPlanMode 里的 auto restore/fallback
1507
+
1508
+ ### 14.1 shouldPlanUseAutoMode
1509
+
1510
+ ```typescript
1511
+ return (
1512
+ hasAutoModeOptIn() &&
1513
+ isAutoModeGateEnabled() &&
1514
+ getUseAutoModeDuringPlan()
1515
+ )
1516
+ ```
1517
+
1518
+ ### 14.2 settings 中途变化
1519
+
1520
+ `transitionPlanAutoMode(context)`:
1521
+
1522
+ 1. 只在 `mode === 'plan'` 时生效。
1523
+ 2. 如果 `prePlanMode === 'bypassPermissions'`,不激活 auto。
1524
+ 3. 如果 want 和 have 都 true,重新 strip dangerous permissions。
1525
+ 4. 如果 want true have false,打开 auto 并 strip。
1526
+ 5. 如果 want false have true,关闭 auto 并 restore dangerous permissions。
1527
+
1528
+ ---
1529
+
1530
+ ## 15. Teammate 审批流
1531
+
1532
+ 当 teammate 使用 plan mode,分两类。
1533
+
1534
+ ### 15.1 plan_mode_required teammate
1535
+
1536
+ 流程:
1537
+
1538
+ ```
1539
+ teammate 调用 ExitPlanMode
1540
+
1541
+ ├─ 如果 plan 文件不存在 -> 抛错
1542
+
1543
+ ├─ 生成 plan_approval_request
1544
+
1545
+ ├─ 写入 team-lead mailbox
1546
+
1547
+ ├─ 标记 teammate task awaiting approval
1548
+
1549
+ └─ 返回 awaitingLeaderApproval: true
1550
+ ```
1551
+
1552
+ teammate 收到 tool result 后必须停止实现,等待 inbox。
1553
+
1554
+ ### 15.2 voluntary plan mode teammate
1555
+
1556
+ 如果不是 required:
1557
+
1558
+ 1. `requiresUserInteraction()` 返回 false。
1559
+ 2. `checkPermissions()` allow。
1560
+ 3. `call()` 直接恢复权限模式。
1561
+
1562
+ ---
1563
+
1564
+ ## 16. 从零实现顺序
1565
+
1566
+ 如果让 GPT-4 级别模型实现,不要一次让它写全部。按这个顺序分任务。
1567
+
1568
+ ### 步骤 1:实现状态字段
1569
+
1570
+ 实现:
1571
+
1572
+ 1. `toolPermissionContext.mode`
1573
+ 2. `toolPermissionContext.prePlanMode`
1574
+ 3. `needsPlanModeExitAttachment`
1575
+ 4. `hasExitedPlanModeInSession`
1576
+ 5. `planSlugCache`
1577
+
1578
+ ### 步骤 2:实现 `plans.ts`
1579
+
1580
+ 实现:
1581
+
1582
+ 1. `getPlansDirectory`
1583
+ 2. `getPlanSlug`
1584
+ 3. `getPlanFilePath`
1585
+ 4. `getPlan`
1586
+ 5. `clearPlanSlug`
1587
+
1588
+ 先不实现 resume/fork。
1589
+
1590
+ ### 步骤 3:实现权限准备函数
1591
+
1592
+ 实现:
1593
+
1594
+ 1. `handlePlanModeTransition`
1595
+ 2. `prepareContextForPlanMode`
1596
+ 3. `applyPermissionUpdate({ type: 'setMode' })`
1597
+
1598
+ ### 步骤 4:实现 `/plan` 命令
1599
+
1600
+ 实现:
1601
+
1602
+ 1. `src/commands/plan/index.ts`
1603
+ 2. `src/commands/plan/plan.tsx`
1604
+ 3. `PlanDisplay`
1605
+ 4. `/plan open`
1606
+
1607
+ ### 步骤 5:实现 Plan Mode 权限拦截
1608
+
1609
+ 至少保证:
1610
+
1611
+ 1. 读工具允许。
1612
+ 2. 非 plan 文件写入禁止。
1613
+ 3. plan 文件写入允许。
1614
+ 4. ExitPlanMode 允许。
1615
+
1616
+ ### 步骤 6:实现 EnterPlanModeTool
1617
+
1618
+ 实现:
1619
+
1620
+ 1. empty input schema
1621
+ 2. channels disabled gate
1622
+ 3. agent context 禁止
1623
+ 4. call 切 mode
1624
+ 5. tool_result prompt
1625
+
1626
+ ### 步骤 7:实现 ExitPlanModeV2Tool
1627
+
1628
+ 先实现普通用户版本:
1629
+
1630
+ 1. validate mode 必须是 plan
1631
+ 2. checkPermissions ask
1632
+ 3. 读取 plan
1633
+ 4. 恢复 prePlanMode
1634
+ 5. 返回 approved plan
1635
+
1636
+ 再补 teammate 和 input.plan。
1637
+
1638
+ ### 步骤 8:实现 attachment
1639
+
1640
+ 实现:
1641
+
1642
+ 1. `plan_mode`
1643
+ 2. `plan_mode_exit`
1644
+ 3. `plan_mode_reentry`
1645
+ 4. human turn throttle
1646
+
1647
+ ### 步骤 9:实现 workflow prompt
1648
+
1649
+ 先实现标准 5 阶段。
1650
+
1651
+ 之后再补:
1652
+
1653
+ 1. interview phase
1654
+ 2. PewterLedger variants
1655
+ 3. sparse reminders
1656
+
1657
+ ### 步骤 10:实现 Explore/Plan agents
1658
+
1659
+ 实现:
1660
+
1661
+ 1. Explore agent 只读定义
1662
+ 2. Plan agent 只读定义
1663
+ 3. agent count env override
1664
+
1665
+ ### 步骤 11:实现恢复和远程增强
1666
+
1667
+ 实现:
1668
+
1669
+ 1. `copyPlanForResume`
1670
+ 2. `copyPlanForFork`
1671
+ 3. `persistFileSnapshotIfRemote`
1672
+ 4. `plan_file_reference`
1673
+
1674
+ ---
1675
+
1676
+ ## 17. 最小可用版本
1677
+
1678
+ 如果只想先跑通 Plan Mode,保留这些:
1679
+
1680
+ 1. `/plan` 命令。
1681
+ 2. `toolPermissionContext.mode = 'plan'`。
1682
+ 3. `prePlanMode`。
1683
+ 4. `getPlanFilePath` 和 `getPlan`。
1684
+ 5. 只允许写 plan 文件。
1685
+ 6. `EnterPlanModeTool`。
1686
+ 7. `ExitPlanModeTool` 普通用户流程。
1687
+ 8. `plan_mode` 附件注入一个简单 workflow。
1688
+
1689
+ 可以暂时省略:
1690
+
1691
+ 1. auto mode。
1692
+ 2. teammate。
1693
+ 3. resume/fork。
1694
+ 4. remote snapshot。
1695
+ 5. PewterLedger。
1696
+ 6. interview phase。
1697
+ 7. full/sparse 节流。
1698
+ 8. Explore/Plan agent 数量实验。
1699
+
1700
+ 最小可用数据流:
1701
+
1702
+ ```
1703
+ /plan task
1704
+
1705
+
1706
+ mode = plan, prePlanMode = oldMode
1707
+
1708
+
1709
+ attachment 注入:只能读代码,写 plan 文件
1710
+
1711
+
1712
+ 模型写 ~/.claude/plans/<slug>.md
1713
+
1714
+
1715
+ 模型调用 ExitPlanMode
1716
+
1717
+
1718
+ 用户批准
1719
+
1720
+
1721
+ mode = prePlanMode
1722
+ ```
1723
+
1724
+ ---
1725
+
1726
+ ## 18. 完整版本增强项
1727
+
1728
+ 按优先级补:
1729
+
1730
+ 1. `/plan open`。
1731
+ 2. `plan_mode_exit` 附件。
1732
+ 3. `plan_mode_reentry` 附件。
1733
+ 4. full/sparse 注入节流。
1734
+ 5. Explore/Plan agents。
1735
+ 6. agent count env override。
1736
+ 7. interview phase。
1737
+ 8. auto mode integration。
1738
+ 9. teammate approval。
1739
+ 10. resume/fork plan recovery。
1740
+ 11. remote file snapshot。
1741
+ 12. PewterLedger variants。
1742
+
1743
+ ---
1744
+
1745
+ ## 19. 测试清单
1746
+
1747
+ ### 19.1 `/plan` 基本行为
1748
+
1749
+ ```text
1750
+ 初始 mode = default
1751
+ 输入 /plan
1752
+ 期望:
1753
+ - mode = plan
1754
+ - prePlanMode = default
1755
+ - onDone('Enabled plan mode')
1756
+ - shouldQuery 不为 true
1757
+ ```
1758
+
1759
+ ```text
1760
+ 初始 mode = default
1761
+ 输入 /plan 重构认证模块
1762
+ 期望:
1763
+ - mode = plan
1764
+ - prePlanMode = default
1765
+ - onDone('Enabled plan mode', { shouldQuery: true })
1766
+ ```
1767
+
1768
+ ```text
1769
+ 初始 mode = plan
1770
+ 没有 plan 文件
1771
+ 输入 /plan
1772
+ 期望:
1773
+ - onDone('Already in plan mode. No plan written yet.')
1774
+ ```
1775
+
1776
+ ```text
1777
+ 初始 mode = plan
1778
+ 有 plan 文件
1779
+ 输入 /plan
1780
+ 期望:
1781
+ - 输出 Current Plan
1782
+ - 输出 plan path
1783
+ - 输出 plan content
1784
+ ```
1785
+
1786
+ ```text
1787
+ 初始 mode = plan
1788
+ 有 plan 文件
1789
+ 输入 /plan open
1790
+ 期望:
1791
+ - 调用 editFileInEditor(planPath)
1792
+ - 成功时输出 Opened plan in editor
1793
+ - 失败时输出 Failed to open plan in editor
1794
+ ```
1795
+
1796
+ ### 19.2 Plan 文件
1797
+
1798
+ 测试:
1799
+
1800
+ 1. 同一 session 多次 `getPlanFilePath()` 返回同一路径。
1801
+ 2. 不同 session slug 不同。
1802
+ 3. `agentId` 存在时文件名包含 `-agent-{agentId}`。
1803
+ 4. `plansDirectory` 越界时 fallback 到 `~/.claude/plans`。
1804
+ 5. `getPlan()` 文件不存在返回 null。
1805
+ 6. `getPlan()` 读错误时 logError 并返回 null。
1806
+
1807
+ ### 19.3 EnterPlanModeTool
1808
+
1809
+ 测试:
1810
+
1811
+ 1. input schema 不接受任何字段。
1812
+ 2. `context.agentId` 存在时抛错。
1813
+ 3. channels active 时 `isEnabled() === false`。
1814
+ 4. call 后 mode 变 plan。
1815
+ 5. call 后 `prePlanMode` 记录旧 mode。
1816
+
1817
+ ### 19.4 ExitPlanModeV2Tool
1818
+
1819
+ 普通用户:
1820
+
1821
+ 1. mode 不是 plan 时 validate 拒绝。
1822
+ 2. mode 是 plan 时 validate 通过。
1823
+ 3. checkPermissions 返回 ask。
1824
+ 4. call 后 mode 恢复 prePlanMode。
1825
+ 5. call 后 `prePlanMode` 清空。
1826
+ 6. call 后 `hasExitedPlanModeInSession = true`。
1827
+ 7. call 后 `needsPlanModeExitAttachment = true`。
1828
+ 8. plan 为空时 tool_result 返回 “approved exiting plan mode”。
1829
+ 9. plan 非空时 tool_result 包含 approved plan。
1830
+
1831
+ input.plan:
1832
+
1833
+ 1. 传入 `input.plan` 时写回 plan 文件。
1834
+ 2. `planWasEdited = true`。
1835
+ 3. tool_result 标题是 `Approved Plan (edited by user)`。
1836
+
1837
+ teammate:
1838
+
1839
+ 1. `requiresUserInteraction()` 返回 false。
1840
+ 2. plan_required 且无 plan 时抛错。
1841
+ 3. plan_required 且有 plan 时写 mailbox。
1842
+ 4. 返回 `awaitingLeaderApproval: true`。
1843
+
1844
+ ### 19.5 附件系统
1845
+
1846
+ 测试:
1847
+
1848
+ 1. mode 非 plan 时不注入 `plan_mode`。
1849
+ 2. mode plan 时注入 `plan_mode`。
1850
+ 3. plan 文件不存在时 `planExists = false`。
1851
+ 4. plan 文件存在时 `planExists = true`。
1852
+ 5. tool loop 中不因为 assistant/tool messages 反复注入。
1853
+ 6. 退出后注入一次 `plan_mode_exit`。
1854
+ 7. `plan_mode_exit` 注入后 flag 清零。
1855
+ 8. 重新进入且 plan 存在时先注入 `plan_mode_reentry`。
1856
+
1857
+ ### 19.6 权限
1858
+
1859
+ Plan mode 中:
1860
+
1861
+ | 操作 | 期望 |
1862
+ |------|------|
1863
+ | FileRead 任意文件 | 允许 |
1864
+ | Grep/Glob | 允许 |
1865
+ | FileWrite plan 文件 | 允许 |
1866
+ | FileWrite 业务文件 | 拒绝 |
1867
+ | FileEdit plan 文件 | 允许 |
1868
+ | FileEdit 业务文件 | 拒绝 |
1869
+ | Bash `ls` | 允许 |
1870
+ | Bash `rm file` | 拒绝 |
1871
+ | ExitPlanMode | 允许/ask |
1872
+ | EnterPlanMode in agent | 拒绝 |
1873
+
1874
+ ### 19.7 workflow prompt
1875
+
1876
+ 检查 `plan_mode` prompt 必须包含:
1877
+
1878
+ 1. 不允许修改文件,除了 plan 文件。
1879
+ 2. plan file path。
1880
+ 3. Phase 1 Explore。
1881
+ 4. Phase 2 Plan。
1882
+ 5. Phase 3 Review。
1883
+ 6. Phase 4 写 plan 文件。
1884
+ 7. Phase 5 调用 ExitPlanMode。
1885
+ 8. 禁止用文本请求 plan approval。
1886
+
1887
+ ---
1888
+
1889
+ ## 20. 常见错误
1890
+
1891
+ ### 错误 1:只改 mode,不记录 prePlanMode
1892
+
1893
+ 退出时无法恢复原权限模式。
1894
+
1895
+ 正确:
1896
+
1897
+ ```typescript
1898
+ prepareContextForPlanMode(prev.toolPermissionContext)
1899
+ ```
1900
+
1901
+ ### 错误 2:`/plan <description>` 没有 `shouldQuery: true`
1902
+
1903
+ 用户输入任务描述后,模型不会开始规划。
1904
+
1905
+ ### 错误 3:允许写任意文件
1906
+
1907
+ Plan mode 的核心是只读探索。唯一允许写的是 plan 文件。
1908
+
1909
+ ### 错误 4:把完整 workflow 放进 EnterPlanMode tool_result
1910
+
1911
+ 源码中 EnterPlanMode 只返回简短说明。完整 workflow 由 attachment 注入。这样 `/plan` 和 `EnterPlanMode` 两种入口能共享同一套指令。
1912
+
1913
+ ### 错误 5:ExitPlanMode 不走用户审批
1914
+
1915
+ 普通用户必须通过 `checkPermissions -> ask`。
1916
+
1917
+ ### 错误 6:ExitPlanMode 不设置 exit attachment flag
1918
+
1919
+ 退出后模型不知道自己已经可以写文件。
1920
+
1921
+ 正确:
1922
+
1923
+ ```typescript
1924
+ setHasExitedPlanMode(true)
1925
+ setNeedsPlanModeExitAttachment(true)
1926
+ ```
1927
+
1928
+ ### 错误 7:plan 文件 slug 每次重新生成
1929
+
1930
+ 同一 session 必须复用同一个 slug,否则 `/plan` 读不到之前写的 plan。
1931
+
1932
+ ### 错误 8:subagent 复用主 plan 文件名
1933
+
1934
+ subagent plan 文件必须带 `-agent-{agentId}`,否则会覆盖主会话 plan。
1935
+
1936
+ ### 错误 9:普通文本询问 plan approval
1937
+
1938
+ prompt 必须明确禁止:
1939
+
1940
+ ```text
1941
+ Do NOT ask about plan approval in text or AskUserQuestion.
1942
+ Use ExitPlanMode.
1943
+ ```
1944
+
1945
+ ### 错误 10:teammate required 没 plan 也允许退出
1946
+
1947
+ plan_mode_required teammate 必须先写 plan 文件,否则抛错。
1948
+
1949
+ ---
1950
+
1951
+ ## 21. 关键结论
1952
+
1953
+ 要一比一实现 Plan Mode,不要把它当成一个 `/plan` 命令。它实际是一个状态机:
1954
+
1955
+ ```text
1956
+ default/auto/acceptEdits/bypassPermissions
1957
+
1958
+
1959
+ plan
1960
+
1961
+ ├─ attachment 注入 workflow
1962
+ ├─ 权限层限制只读 + plan 文件写入
1963
+ ├─ model 写 plan
1964
+ └─ ExitPlanMode 审批
1965
+
1966
+
1967
+ prePlanMode
1968
+ ```
1969
+
1970
+ 最小实现先抓住四件事:
1971
+
1972
+ 1. `prePlanMode` 保存和恢复。
1973
+ 2. plan 文件路径稳定。
1974
+ 3. plan mode 权限只允许读和写 plan 文件。
1975
+ 4. ExitPlanMode 是唯一 plan approval 出口。
1976
+
1977
+ 完整实现再补:
1978
+
1979
+ 1. attachment 节流。
1980
+ 2. reentry/exit 附件。
1981
+ 3. Explore/Plan agents。
1982
+ 4. auto mode 交互。
1983
+ 5. teammate 审批。
1984
+ 6. resume/fork/remote recovery。
1985
+ 7. 实验变体。
1986
+
1987
+ 按本文顺序实现,GPT-4 级别模型可以把每一步当成独立小任务完成,并通过测试清单逐项验证。