@pencil-agent/nano-pencil 2.0.1 โ†’ 2.0.3

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 (188) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/model/custom-providers.js +1 -1
  7. package/dist/core/model-registry.js +5 -5
  8. package/dist/extensions/builtin/AGENT.md +115 -115
  9. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  10. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  11. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  12. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  13. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  14. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  15. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  16. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  17. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  18. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  19. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  20. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  91. package/dist/extensions/builtin/browser/browser.md +73 -73
  92. package/dist/extensions/builtin/browser/install.md +142 -142
  93. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  94. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  95. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  96. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  97. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  98. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  99. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  100. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  101. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  102. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  103. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  104. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  105. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  107. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  108. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  109. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  110. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  111. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  112. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  113. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  114. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  115. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  116. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  117. package/dist/extensions/builtin/debug/index.js +9 -9
  118. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  119. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  120. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  121. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  122. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  123. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  124. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  125. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  126. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  127. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  128. package/dist/extensions/builtin/goal/README.md +67 -67
  129. package/dist/extensions/builtin/goal/index.js +6 -6
  130. package/dist/extensions/builtin/grub/README.md +112 -112
  131. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  132. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  133. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  134. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  135. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  136. package/dist/extensions/builtin/loop/README.md +92 -92
  137. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  138. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  139. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  140. package/dist/extensions/builtin/sal/README.md +72 -72
  141. package/dist/extensions/builtin/security-audit/README.md +289 -289
  142. package/dist/extensions/builtin/team/AGENT.md +112 -112
  143. package/dist/extensions/builtin/team/TESTING.md +299 -299
  144. package/dist/extensions/builtin/token-save/README.md +56 -56
  145. package/dist/extensions/optional/AGENT.md +10 -10
  146. package/dist/modes/interactive/controllers/input-submit-controller.js +2 -2
  147. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  148. package/dist/modes/interactive/interactive-mode.js +19 -19
  149. package/dist/modes/interactive/theme/dark.json +85 -85
  150. package/dist/modes/interactive/theme/light.json +84 -84
  151. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  152. package/dist/modes/interactive/theme/warm.json +81 -81
  153. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  154. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  155. package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +851 -0
  156. package/docs/SDK-TESTING.md +364 -0
  157. package/docs/codex-goal-command-impl.md +1055 -1055
  158. package/docs/codex-goal-vs-grub.md +500 -500
  159. package/docs/custom-provider.md +27 -27
  160. package/docs/extensions.md +27 -27
  161. package/docs/keybindings.md +27 -27
  162. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  163. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  164. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  165. 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 -158
  166. 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 -128
  167. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  168. package/docs/loop-usage-examples.md +214 -214
  169. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  170. package/docs/models.md +27 -27
  171. package/docs/packages.md +27 -27
  172. package/docs/pi-design-philosophy.md +457 -457
  173. package/docs/planmode.md +1987 -1987
  174. package/docs/prompt-templates.md +27 -27
  175. package/docs/providers.md +27 -27
  176. package/docs/sdk.md +27 -27
  177. package/docs/skills.md +27 -27
  178. package/docs/startup-performance-optimization.md +301 -0
  179. package/docs/themes.md +27 -27
  180. package/docs/tui.md +27 -27
  181. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  182. package/package.json +190 -190
  183. package/docs/cc-agent-design.md +0 -1297
  184. package/docs/cc-tui-design.md +0 -1333
  185. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
  186. package/docs/scan-report.md +0 -3820
  187. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  188. package/docs//351/230/277/351/207/214/345/267/264/345/267/264/350/264/242/346/212/245/345/210/206/346/236/220/344/271/246.md +0 -261
@@ -1,1297 +0,0 @@
1
- # Claude Code ไธปๅญ Agent ๆžถๆž„ๆ‹†่งฃ
2
-
3
- > ๆบ็ ็‰ˆๆœฌ๏ผš@anthropic-ai/claude-code@2.1.92
4
- > ็›ฎๆ ‡๏ผš่ฎฉไธ€ไธชๆจกๅž‹ๅฏไปฅๅœจ nanoPencil ไธญไธ€ๆฏ”ไธ€ๅคๅˆป CC ็š„ Agent๏ผˆๅญไปฃ็†๏ผ‰็ณป็ปŸ
5
-
6
- ---
7
-
8
- ## ไธ€ใ€ไธ€ๅฅ่ฏๆฆ‚ๆ‹ฌ
9
-
10
- CC ็š„ Agent ๅทฅๅ…ทๆ˜ฏไธ€ไธช**่ฟ›็จ‹ๅ†…ๅญไปฃ็†็”Ÿๆˆๅ™จ**๏ผš็ˆถ agent ้€š่ฟ‡ `Agent` tool call ๅˆ›ๅปบไธ€ไธชๅ…จๆ–ฐ็š„ `AgentSession`๏ผˆ็‹ฌ็ซ‹ LLM ๅพช็Žฏ๏ผ‰๏ผŒๅญ agent ๆ‹ฅๆœ‰็‹ฌ็ซ‹็š„็ณป็ปŸๆ็คบใ€ๅทฅๅ…ท้›†ๅ’Œๆถˆๆฏๅކๅฒ๏ผŒๅฎŒๆˆๅŽๅฐ†ๆœ€ๅŽไธ€ๆก assistant ๆถˆๆฏไฝœไธบ็ป“ๆžœ่ฟ”ๅ›ž็ป™็ˆถ agentใ€‚
11
-
12
- **ไธๆ˜ฏ**ๅญ่ฟ›็จ‹ใ€ไธๆ˜ฏ HTTP ่ฐƒ็”จใ€ไธๆ˜ฏ IPCโ€”โ€”ๆ˜ฏๅŒไธ€ไธช่ฟ›็จ‹ๅ†…็š„ๅผ‚ๆญฅๅ‡ฝๆ•ฐ่ฐƒ็”จ๏ผŒๅ…ฑไบซๅŒไธ€ๅฅ— runtime ๅŸบ็ก€่ฎพๆ–ฝใ€‚
13
-
14
- ---
15
-
16
- ## ไบŒใ€ๆ ธๅฟƒๆฆ‚ๅฟตๆ˜ ๅฐ„
17
-
18
- | CC ๆฆ‚ๅฟต | nanoPencil ๅฏนๅบ” | ่ฏดๆ˜Ž |
19
- |---------|----------------|------|
20
- | `Agent` tool | `SubAgentSpec` + `SubAgentRuntime` | CC ๆ˜ฏ LLM ๅฏ่ฐƒ็”จ็š„ tool๏ผ›nanoPencil ๆ˜ฏๅ†…้ƒจ API |
21
- | `Task` (alias) | ๆ—  | CC ไธญ Agent ็š„ๅˆซๅ |
22
- | `subagent_type` | `runRole` / agent definition | ๅ†ณๅฎšๅทฅๅ…ท้›†ๅ’Œ็ณป็ปŸๆ็คบ |
23
- | `run_in_background` | `run_in_background` | ๅผ‚ๆญฅๆ‰ง่กŒ๏ผŒ่พ“ๅ‡บๅ†™ๆ–‡ไปถ |
24
- | `isolation: "worktree"` | `WorktreeManager` | git worktree ้š”็ฆป |
25
- | `agentNameRegistry` | `activeAgents` Map | ๆŒ‰ๅ็งฐๅฏปๅ€ๅญ agent |
26
- | Handoff classifier | ๆ—  | CC ็‹ฌๆœ‰็š„ๅฎ‰ๅ…จๅฎกๆŸฅ |
27
-
28
- ---
29
-
30
- ## ไธ‰ใ€Agent ๅทฅๅ…ท็š„ JSON Schema
31
-
32
- ### 3.1 Input Schema๏ผˆLLM ็œ‹ๅˆฐ็š„๏ผ‰
33
-
34
- ```typescript
35
- // CC ๆบ็ ไธญ็š„ๅฎšไน‰๏ผˆcli.js ็ฌฌ 3947 ่กŒ้™„่ฟ‘๏ผ‰
36
- const AgentInputSchema = z.object({
37
- description: z.string()
38
- .describe("A short (3-5 word) description of the task"),
39
-
40
- prompt: z.string()
41
- .describe("The task for the agent to perform"),
42
-
43
- subagent_type: z.string().optional()
44
- .describe("The type of specialized agent to use for this task"),
45
-
46
- model: z.enum(["sonnet", "opus", "haiku"]).optional()
47
- .describe("Optional model override for this agent. Takes precedence over the agent definition's model frontmatter. If omitted, uses the agent definition's model, or inherits from the parent."),
48
-
49
- run_in_background: z.boolean().optional()
50
- .describe("Set to true to run this agent in the background. You will be notified when it completes."),
51
-
52
- name: z.string().optional()
53
- .describe("Name for the spawned agent. Makes it addressable via SendMessage({to: name}) while running."),
54
-
55
- team_name: z.string().optional()
56
- .describe("Team name for spawning. Uses current team context if omitted."),
57
-
58
- mode: z.enum(["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "plan"]).optional()
59
- .describe('Permission mode for spawned teammate (e.g., "plan" to require plan approval).'),
60
-
61
- isolation: z.enum(["worktree"]).optional()
62
- .describe('Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo.'),
63
-
64
- cwd: z.string().optional()
65
- .describe('Absolute path to run the agent in. Overrides the working directory for all filesystem and shell operations within this agent. Mutually exclusive with isolation: "worktree".'),
66
- });
67
- ```
68
-
69
- **ๆณจๆ„**๏ผš
70
- - `cwd` ๅœจๆœ€็ปˆๅ‘้€็ป™ LLM ็š„ schema ไธญ่ขซ omit ๆމไบ†๏ผˆ`nzY().omit({cwd:!0})`๏ผ‰๏ผŒไฝ†ๅ†…้ƒจๅค„็†ๆ—ถไป็„ถๆŽฅๅ—ใ€‚
71
- - `run_in_background` ๅœจ `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` ็Žฏๅขƒๅ˜้‡ๅฏ็”จๆ—ถไนŸไผš่ขซ omit๏ผˆ`xs1` ๅ‡ฝๆ•ฐ๏ผš`DS6||hx()?q.omit({run_in_background:!0}):q`๏ผ‰ใ€‚
72
-
73
- ### 3.2 Output Schema
74
-
75
- ```typescript
76
- // ๅŒๆญฅๅฎŒๆˆๆ—ถ
77
- type AgentOutputCompleted = {
78
- agentId: string;
79
- agentType?: string;
80
- content: { type: "text"; text: string }[];
81
- totalToolUseCount: number;
82
- totalDurationMs: number;
83
- totalTokens: number;
84
- usage: {
85
- input_tokens: number;
86
- output_tokens: number;
87
- cache_creation_input_tokens: number | null;
88
- cache_read_input_tokens: number | null;
89
- server_tool_use: {
90
- web_search_requests: number;
91
- web_fetch_requests: number;
92
- } | null;
93
- service_tier: ("standard" | "priority" | "batch") | null;
94
- cache_creation: {
95
- ephemeral_1h_input_tokens: number;
96
- ephemeral_5m_input_tokens: number;
97
- } | null;
98
- };
99
- status: "completed";
100
- prompt: string; // ๅŽŸๅง‹ prompt ๆ–‡ๆœฌ
101
- };
102
-
103
- // ๅผ‚ๆญฅๅฏๅŠจๆ—ถ
104
- type AgentOutputAsync = {
105
- status: "async_launched";
106
- agentId: string; // ๅผ‚ๆญฅ agent ็š„ ID
107
- description: string; // ไปปๅŠกๆ่ฟฐ
108
- prompt: string; // ๅŽŸๅง‹ prompt
109
- outputFile: string; // ่พ“ๅ‡บๆ–‡ไปถ่ทฏๅพ„๏ผŒๅฏ็”จไบŽๆฃ€ๆŸฅ่ฟ›ๅบฆ
110
- canReadOutputFile?: boolean; // ็ˆถ agent ๆ˜ฏๅฆๆœ‰ Read/Bash ๅทฅๅ…ท
111
- };
112
-
113
- type AgentOutput = AgentOutputCompleted | AgentOutputAsync;
114
- ```
115
-
116
- ---
117
-
118
- ## ๅ››ใ€AgentDefinition ๅฎŒๆ•ดๆŽฅๅฃ
119
-
120
- ไปŽๆบ็ ไธญๆๅ–็š„ `AgentDefinition` ๆ‰€ๆœ‰ๅญ—ๆฎต๏ผš
121
-
122
- ```typescript
123
- interface AgentDefinition {
124
- // === ๅฟ…ๅกซ ===
125
- agentType: string; // ๅ”ฏไธ€ๆ ‡่ฏ†๏ผŒๅฆ‚ "general-purpose"
126
- description: string; // ไธ€่กŒๆ่ฟฐ
127
- whenToUse: string | (() => string); // โš ๏ธ ๅฏไปฅๆ˜ฏๅ‡ฝๆ•ฐ๏ผExplore ๅฐฑๆ˜ฏๅ‡ฝๆ•ฐๅผ•็”จ
128
- getSystemPrompt: (ctx: { toolUseContext: any }) => string;
129
-
130
- // === ๅทฅๅ…ทๆŽงๅˆถ๏ผˆไบŒ้€‰ไธ€๏ผ‰ ===
131
- tools?: string[]; // ็™ฝๅๅ•๏ผŒ["*"] = ๅ…จ้ƒจ
132
- disallowedTools?: string[]; // ้ป‘ๅๅ•
133
-
134
- // === ๆจกๅž‹ ===
135
- model?: string; // "sonnet" | "opus" | "haiku" | "inherit"
136
- effort?: "low" | "medium" | "high" | number; // ๆŽจ็†ๅŠชๅŠ›็จ‹ๅบฆ
137
-
138
- // === ๆƒ้™ ===
139
- permissionMode?: "acceptEdits" | "auto" | "bypassPermissions" | "default" | "dontAsk" | "plan";
140
-
141
- // === ้š”็ฆป ===
142
- isolation?: "worktree"; // worktree ้š”็ฆปๆจกๅผ
143
-
144
- // === ๅŽๅฐ ===
145
- background?: boolean; // โš ๏ธ agent ๅฎšไน‰็บง็š„ๅŽๅฐๆ ‡ๅฟ—๏ผŒไธๅŒไบŽ run_in_background ๅ‚ๆ•ฐ
146
-
147
- // === Fork ่กŒไธบ ===
148
- forksParentContext?: boolean | "turn"; // โš ๏ธ ๆ–‡ๆกฃๆœชๆๅŠ๏ผๆŽงๅˆถ fork ๆ—ถ็ปงๆ‰ฟๅ“ชไบ›็ˆถๆถˆๆฏ
149
- // true = ็ปงๆ‰ฟๅ…จ้ƒจ็ˆถๆถˆๆฏ
150
- // "turn" = ๅช็ปงๆ‰ฟๅฝ“ๅ‰ turn ็š„ๆถˆๆฏ
151
- // undefined = ไธ็ปงๆ‰ฟ
152
-
153
- // === MCP ===
154
- requiredMcpServers?: string[]; // โš ๏ธ ๆ–‡ๆกฃๆœชๆๅŠ๏ผ้œ€่ฆ็š„ MCP ๆœๅŠกๅ™จ
155
- mcpServers?: string[]; // ๅ…ณ่”็š„ MCP ๆœๅŠกๅ™จ
156
-
157
- // === ๅ…ถไป– ===
158
- source: "built-in" | "plugin" | "flagSettings" | "userSettings" | "projectSettings";
159
- baseDir: string; // ๅŸบ็ก€็›ฎๅฝ•
160
- color?: string; // โš ๏ธ ๆ–‡ๆกฃๆœชๆๅŠ๏ผUI ้ขœ่‰ฒๆ ‡่ฏ†
161
- maxTurns?: number; // ๆœ€ๅคง่ฝฎๆฌก
162
- skills?: string[]; // ๅ…ณ่”็š„ skills
163
- initialPrompt?: string; // ๅˆๅง‹ๆ็คบ
164
- memory?: "user" | "project" | "local"; // ่ฎฐๅฟ†่Œƒๅ›ด
165
- omitClaudeMd?: boolean; // ๆ˜ฏๅฆ่ทณ่ฟ‡ CLAUDE.md
166
- appendSystemPrompt?: boolean; // ๆ˜ฏๅฆ่ฟฝๅŠ ็ณป็ปŸๆ็คบ
167
- hooks?: any; // ้’ฉๅญ้…็ฝฎ
168
- filename?: string; // ๆ–‡ไปถๅ๏ผˆ่‡ชๅฎšไน‰ agent๏ผ‰
169
- }
170
- ```
171
-
172
- ---
173
-
174
- ## ไบ”ใ€ๅ†…็ฝฎ Agent ็ฑปๅž‹ๅฎšไน‰
175
-
176
- ### 5.1 general-purpose
177
-
178
- ```typescript
179
- {
180
- agentType: "general-purpose",
181
- whenToUse: "General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you.",
182
- tools: ["*"], // ๆ‰€ๆœ‰ๅทฅๅ…ท
183
- source: "built-in",
184
- baseDir: "built-in",
185
- getSystemPrompt: hr_, // ็ปงๆ‰ฟไธป agent ็š„็ณป็ปŸๆ็คบ
186
- }
187
- ```
188
-
189
- **ๅ…ณ้”ฎ**๏ผš`tools: ["*"]` ่กจ็คบ้€š้…็ฌฆโ€”โ€”็ปงๆ‰ฟ็ˆถ agent ็š„ๅ…จ้ƒจๅทฅๅ…ท้›†ใ€‚
190
-
191
- ### 5.2 Explore
192
-
193
- ```typescript
194
- {
195
- agentType: "Explore",
196
- whenToUse: Lr_, // โš ๏ธ ๆ˜ฏๅ‡ฝๆ•ฐๅผ•็”จ๏ผŒไธๆ˜ฏๅญ—็ฌฆไธฒๅญ—้ข้‡๏ผ่ฟ่กŒๆ—ถๅŠจๆ€็”Ÿๆˆ
197
- disallowedTools: ["Agent", "ExitPlanMode", "Edit", "Write", "NotebookEdit"],
198
- source: "built-in",
199
- baseDir: "built-in",
200
- model: "haiku", // ๅผบๅˆถไฝฟ็”จ haiku ๆจกๅž‹
201
- omitClaudeMd: true, // ไธๅŠ ่ฝฝ CLAUDE.md
202
- getSystemPrompt: () => Er_(), // ไธ“็”จ็ณป็ปŸๆ็คบ
203
- }
204
- ```
205
-
206
- **ๅ…ณ้”ฎ**๏ผš
207
- - `disallowedTools` ่€Œ้ž `tools`โ€”โ€”็”จ้ป‘ๅๅ•่€Œ้ž็™ฝๅๅ•
208
- - ็ฆๆญข `Agent`๏ผˆไธ่ƒฝ้€’ๅฝ’ spawn๏ผ‰
209
- - ็ฆๆญข `Edit`/`Write`/`NotebookEdit`๏ผˆๅช่ฏป๏ผ‰
210
- - ๅผบๅˆถ `haiku` ๆจกๅž‹๏ผˆๅฟซ้€Ÿใ€ไพฟๅฎœ๏ผ‰
211
-
212
- ### 5.3 Plan
213
-
214
- ```typescript
215
- {
216
- agentType: "Plan",
217
- whenToUse: "Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.",
218
- disallowedTools: ["Agent", "ExitPlanMode", "Edit", "Write", "NotebookEdit"],
219
- source: "built-in",
220
- baseDir: "built-in",
221
- model: "inherit", // โš ๏ธ ็ปงๆ‰ฟ็ˆถ agent ็š„ๆจกๅž‹๏ผŒไธๅผบๅˆถๆŒ‡ๅฎš
222
- omitClaudeMd: true, // โš ๏ธ ไธๅŠ ่ฝฝ CLAUDE.md
223
- getSystemPrompt: () => Rr_(), // ไธ“็”จ็ณป็ปŸๆ็คบ
224
- }
225
- ```
226
-
227
- ### 5.4 statusline-setup
228
-
229
- ```typescript
230
- {
231
- agentType: "statusline-setup",
232
- whenToUse: "Use this agent to configure the user's Claude Code status line setting.",
233
- tools: ["Read", "Edit"], // โš ๏ธ ๅชๆœ‰่ฏปๅ’Œ็ผ–่พ‘๏ผŒๆฒกๆœ‰ Bash/Write
234
- source: "built-in",
235
- baseDir: "built-in",
236
- model: "sonnet", // โš ๏ธ ๆŒ‡ๅฎš sonnet ๆจกๅž‹
237
- color: "orange", // โš ๏ธ UI ้ขœ่‰ฒๆ ‡่ฏ†
238
- getSystemPrompt: () => `You are a status line setup agent for Claude Code...`,
239
- }
240
- ```
241
-
242
- ### 5.5 claude-code-guide
243
-
244
- ```typescript
245
- {
246
- agentType: "claude-code-guide",
247
- whenToUse: `Use this agent when the user asks questions ("Can Claude...", "Does Claude...", "How do I...") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - API usage, tool use, Anthropic SDK usage. IMPORTANT: Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.`,
248
- tools: bj() ? [e7, pq, Bj, Kh] : [Z_, H9, pq, Bj, Kh], // โš ๏ธ ๆกไปถๅทฅๅ…ท้›†๏ผŒๅ–ๅ†ณไบŽๆŸไธช่ฟ่กŒๆ—ถๆ ‡ๅฟ—
249
- source: "built-in",
250
- baseDir: "built-in",
251
- model: "haiku", // โš ๏ธ ไฝฟ็”จ haiku ๆจกๅž‹
252
- permissionMode: "dontAsk", // โš ๏ธ ไธ่ฏข้—ฎๆƒ้™
253
- getSystemPrompt: ({ toolUseContext }) => /* ไธ“็”จ็ณป็ปŸๆ็คบ */,
254
- }
255
- ```
256
-
257
- ---
258
-
259
- ## ๅ…ญใ€Agent Spawn ๅฎŒๆ•ดๆต็จ‹
260
-
261
- ### 6.1 ๅŒๆญฅๆ‰ง่กŒ่ทฏๅพ„
262
-
263
- ```
264
- [1] LLM ่พ“ๅ‡บ tool_use: Agent({ prompt, subagent_type, description, ... })
265
- โ†“
266
- [2] Agent tool handler ่ขซ่ฐƒ็”จ
267
- async call({prompt, subagent_type, description, model, run_in_background, name, team_name, mode, isolation, cwd}, ...)
268
- โ†“
269
- [3] ๅ‚ๆ•ฐ้ข„ๅค„็†
270
- - model: ๅฆ‚ๆžœ Ay6() ไธบ true๏ผˆๆŸไบ›้™ๅˆถๆจกๅผ๏ผ‰๏ผŒๅฟฝ็•ฅ model ๅ‚ๆ•ฐ
271
- - team_name: ๆฃ€ๆŸฅๆ˜ฏๅฆๅœจ team context ไธญ
272
- โ†“
273
- [4] Team ่ทฏๅพ„ๅˆคๆ–ญ
274
- if (team_name && name) โ†’ ่ตฐ team teammate spawn ่ทฏๅพ„๏ผˆKZK ๅ‡ฝๆ•ฐ๏ผ‰
275
- โ†“
276
- [5] Agent ็ฑปๅž‹่งฃๆž
277
- if (subagent_type ๆœชๆŒ‡ๅฎš) {
278
- if (ๅœจ fork worker ไธญ) โ†’ ๆŠ›้”™ "Fork is not available inside a forked worker"
279
- agentDef = PS6๏ผˆ้ป˜่ฎค fork agent ๅฎšไน‰๏ผ‰
280
- isFork = true
281
- } else {
282
- ไปŽ agentDefinitions.activeAgents ไธญๆŸฅๆ‰พๅŒน้…็š„ agentType
283
- if (ๆ‰พไธๅˆฐ) โ†’ ๆŠ›้”™ "Agent type 'X' not found"
284
- if (่ขซ permission rule ๆ‹’็ป) โ†’ ๆŠ›้”™ "Agent type 'X' has been denied"
285
- agentDef = ๆ‰พๅˆฐ็š„ๅฎšไน‰
286
- isFork = false
287
- }
288
- โ†“
289
- [6] MCP ๆœๅŠกๅ™จๆฃ€ๆŸฅ
290
- if (agentDef.requiredMcpServers ๆœ‰ๅ€ผ) {
291
- ็ญ‰ๅพ…ๆœ€ๅคš 30 ็ง’่ฎฉ pending MCP ่ฟžๆŽฅๅฎŒๆˆ
292
- ๆฃ€ๆŸฅๆ‰€้œ€ MCP ๆœๅŠกๅ™จๆ˜ฏๅฆๅฏ็”จ
293
- if (ไธๅฏ็”จ) โ†’ ๆŠ›้”™
294
- }
295
- โ†“
296
- [7] ๆจกๅž‹้€‰ๆ‹ฉ
297
- resolvedModel = JE6(agentDef.model, mainLoopModel, userOverride, permissionMode)
298
- // ไผ˜ๅ…ˆ็บง๏ผšagent ๅฎšไน‰็š„ model > ็”จๆˆทๆŒ‡ๅฎš็š„ model > ไธปๅพช็Žฏ็š„ model
299
- โ†“
300
- [8] ็ณป็ปŸๆ็คบๆž„ๅปบ
301
- if (isFork) {
302
- // Fork ๆจกๅผ๏ผš็ปงๆ‰ฟ็ˆถ agent ็š„็ณป็ปŸๆ็คบ
303
- systemPrompt = parentSession.renderedSystemPrompt
304
- // โš ๏ธ ๅฆ‚ๆžœ renderedSystemPrompt ไธๅญ˜ๅœจ๏ผŒ่ตฐ Lx() ๆž„ๅปบ
305
- messages = buildForkMessages(prompt, queryMetadata)
306
- } else {
307
- // ๆ™ฎ้€šๆจกๅผ๏ผšไฝฟ็”จ agent ๅฎšไน‰็š„็ณป็ปŸๆ็คบ
308
- // โš ๏ธ ๆณจๆ„๏ผšZ18() ไผšๆŠŠ worktree path ๅ’Œ cwd ไฝœไธบ Notes ๆณจๅ…ฅ็ณป็ปŸๆ็คบ
309
- systemPrompt = Z18([additionalWorkingDirs], model, additionalWorkingDirs)
310
- // Z18 ๅผ€ๅคดๆ˜ฏ "Notes:" ็„ถๅŽๅˆ—ๅ‡บๆ‰€ๆœ‰ๅทฅไฝœ็›ฎๅฝ•
311
- if (agentDef.memory) { /* ๅŠ ่ฝฝ่ฎฐๅฟ† */ }
312
- messages = [userMessage(prompt)]
313
- }
314
- โ†“
315
- [9] ๆƒ้™ๆจกๅผ็กฎๅฎš
316
- permissionContext = { ...parentPermissionContext, mode: agentDef.permissionMode ?? "acceptEdits" }
317
- โ†“
318
- [10] ๅทฅๅ…ท้›†็กฎๅฎš
319
- if (isFork) {
320
- availableTools = parentTools // ๅฎŒๅ…จ็ปงๆ‰ฟ
321
- useExactTools = true // โš ๏ธ ็ฒพ็กฎไฝฟ็”จ็ˆถๅทฅๅ…ท๏ผŒไธ้‡ๆ–ฐ่ฟ‡ๆปค
322
- } else {
323
- availableTools = td(permissionContext, mcpTools) // ๆ นๆฎๆƒ้™่ฟ‡ๆปค
324
- }
325
- โ†“
326
- [11] Worktree ๅˆ›ๅปบ๏ผˆๅฆ‚ๆžœ isolation === "worktree"๏ผ‰
327
- worktreeResult = await Xq8(`agent-${agentId.slice(0,8)}`)
328
- // ่ฏฆ่ง็ฌฌไธƒ่Š‚
329
- โ†“
330
- [12] ๅผ‚ๆญฅๅˆคๆ–ญ
331
- // โš ๏ธ ไธ‰ไธช็‹ฌ็ซ‹็š„ๅผ‚ๆญฅ่งฆๅ‘ๆบ๏ผš
332
- // 1. run_in_background ๅ‚ๆ•ฐ๏ผˆ็”จๆˆทๆ˜พๅผๆŒ‡ๅฎš๏ผ‰
333
- // 2. agentDef.background๏ผˆagent ๅฎšไน‰ไธญ็š„ๆ ‡ๅฟ—๏ผ‰
334
- // 3. ่‡ชๅŠจๅŽๅฐๅŒ–๏ผˆ่ฟ่กŒๆ—ถ่ถ…ๆ—ถ๏ผ‰
335
- //
336
- // โš ๏ธ ้™ๅˆถ๏ผšIn-process teammate ไธ่ƒฝ็”จ run_in_background=true ๆˆ– background=true
337
- if (TD() && teamContext && agentDef.background === true) {
338
- throw Error("In-process teammates cannot spawn background agents.")
339
- }
340
- //
341
- isAsync = (run_in_background === true || agentDef.background === true)
342
- autoBackgroundMs = czY() // ้ป˜่ฎค 120000ms = 2 ๅˆ†้’Ÿ๏ผˆๅฆ‚ๆžœๅฏ็”จ๏ผ‰
343
- //
344
- // โš ๏ธ DS6 = CLAUDE_CODE_DISABLE_BACKGROUND_TASKS ็Žฏๅขƒๅ˜้‡
345
- // ๅฆ‚ๆžœ DS6 ไธบ true๏ผŒๆ‰€ๆœ‰ๅผ‚ๆญฅ่ƒฝๅŠ›่ขซ็ฆ็”จ
346
- โ†“
347
- [13] ๅŒๆญฅๆ‰ง่กŒ
348
- ๅˆ›ๅปบ AgentSession๏ผˆ่ฏฆ่ง็ฌฌๅ…ซ่Š‚๏ผ‰
349
- ่ฟญไปฃ LLM ๆต๏ผš
350
- while (true) {
351
- result = await stream.next()
352
- if (result.done) break
353
- // ๆ”ถ้›†ๆถˆๆฏ
354
- messages.push(result.value)
355
- // ๆฃ€ๆŸฅๆ˜ฏๅฆๅบ”่ฏฅ่ฝฌไธบๅŽๅฐ
356
- if (shouldBackground) {
357
- // ่ฝฌไธบๅผ‚ๆญฅ่ทฏๅพ„
358
- break
359
- }
360
- }
361
- โ†“
362
- [14] ็ป“ๆžœๆๅ–
363
- VS8(messages, agentId, metadata) โ†’ AgentOutputCompleted
364
- - ไปŽๆœ€ๅŽไธ€ๆก assistant ๆถˆๆฏๆๅ–ๆ–‡ๆœฌ
365
- - ่ฎก็ฎ— totalTokens, totalToolUseCount, totalDurationMs
366
- - ๆๅ– usage ็ปŸ่ฎก
367
- - โš ๏ธ maxResultSizeChars = 100,000๏ผˆ1e5๏ผ‰ๅญ—็ฌฆ๏ผŒ่ถ…ๅ‡บไผš่ขซๆˆชๆ–ญ
368
- โ†“
369
- [15] ๅฎ‰ๅ…จๅฎกๆŸฅ๏ผˆauto mode ไธ‹๏ผ‰
370
- // โš ๏ธ ๅŒๆญฅ่ทฏๅพ„็›ดๆŽฅ่ฐƒ็”จ ES8
371
- // โš ๏ธ ๅผ‚ๆญฅ่ทฏๅพ„๏ผšES8 ๅœจ็ˆถ agent ่ฏปๅ– outputFile ๆ—ถ่งฆๅ‘๏ผˆๅปถ่ฟŸๅฎกๆŸฅ๏ผ‰
372
- ES8({ agentMessages, tools, toolPermissionContext, abortSignal, subagentType })
373
- - ่ฐƒ็”จ handoff classifier๏ผˆTS8 ๅ‡ฝๆ•ฐ๏ผ‰ๆฃ€ๆŸฅๅญ agent ่พ“ๅ‡บ
374
- - classifier ไฝฟ็”จไธ€ไธชๅฐๆจกๅž‹ๅฎกๆŸฅๅญ agent ็š„ๆ“ไฝœ
375
- - ๅฆ‚ๆžœ flagged โ†’ ่ฟ”ๅ›ž SECURITY WARNING ๅ‰็ผ€
376
- - โš ๏ธ ๅฆ‚ๆžœ classifier ไธๅฏ็”จ๏ผˆunavailable๏ผ‰๏ผŒ่ฟ”ๅ›ž่ญฆๅ‘Šไฝ†ไธ้˜ปๆ–ญ
377
- โ†“
378
- [16] Worktree ๆธ…็†
379
- if (worktree ๅญ˜ๅœจ) {
380
- if (ๆ— ๅ˜ๆ›ด && ๆ— ๆ–ฐๆไบค) โ†’ git worktree remove
381
- else โ†’ ไฟ็•™๏ผˆๅฏๆ‰‹ๅŠจๆฃ€ๆŸฅ๏ผ‰
382
- }
383
- โ†“
384
- [17] ่ฟ”ๅ›ž AgentOutputCompleted ็ป™ LLM
385
- ```
386
-
387
- ### 6.2 ๅผ‚ๆญฅๆ‰ง่กŒ่ทฏๅพ„
388
-
389
- ```
390
- [1-11] ๅŒไธŠ
391
- โ†“
392
- [12] isAsync = true
393
- โ†“
394
- [13] ๅˆ›ๅปบๅŽๅฐไปปๅŠก
395
- taskId = dg8({ agentId, description, prompt, selectedAgent, setAppState, toolUseId })
396
- // ๅœจ AppState ไธญๆณจๅ†ŒไปปๅŠก
397
- โ†“
398
- if (name ๅ‚ๆ•ฐๅญ˜ๅœจ) {
399
- agentNameRegistry.set(name, agentId) // ๆณจๅ†Œๅ็งฐๆ˜ ๅฐ„
400
- }
401
- โ†“
402
- [14] ๅฏๅŠจๅผ‚ๆญฅๆ‰ง่กŒ
403
- OU(sessionMetadata, () =>
404
- q6(() => LS8({
405
- taskId, abortController, makeStream, metadata, description,
406
- toolUseContext, rootSetAppState, agentIdForCleanup,
407
- enableSummarization, getWorktreeResult
408
- }))
409
- )
410
- // LS8 = ๅผ‚ๆญฅ agent runner๏ผˆ่ฏฆ่ง็ฌฌๅ…ซ่Š‚ 8.2๏ผ‰
411
- โ†“
412
- [15] ๆฃ€ๆŸฅ็ˆถ agent ๆ˜ฏๅฆๆœ‰ Read/Bash ๅทฅๅ…ท
413
- canReadOutputFile = tools.some(t => isReadTool(t) || isBashTool(t))
414
- โ†“
415
- [16] ็ซ‹ๅณ่ฟ”ๅ›ž AgentOutputAsync
416
- {
417
- status: "async_launched",
418
- agentId,
419
- description,
420
- prompt,
421
- outputFile: lY(agentId), // <project>/.claude/tasks/<agentId>.output
422
- canReadOutputFile
423
- }
424
- ```
425
-
426
- ---
427
-
428
- ## ไธƒใ€Worktree ้š”็ฆปๆœบๅˆถ
429
-
430
- ### 7.1 ๅˆ›ๅปบ๏ผˆXq8 ๅ‡ฝๆ•ฐ๏ผ‰
431
-
432
- ```typescript
433
- async function Xq8(agentId: string, options?: WorktreeOptions) {
434
- // 1. ๆณจๅ†Œ worktree ๅ…ƒๆ•ฐๆฎ
435
- zS6(agentId);
436
-
437
- // 2. ๆฃ€ๆŸฅๆ˜ฏๅฆๆœ‰ hook-based worktree
438
- if (hM6()) {
439
- const hookResult = await P58(agentId);
440
- // hook ๅฏไปฅ่‡ชๅฎšไน‰ worktree ๅˆ›ๅปบ้€ป่พ‘
441
- return { worktreePath: hookResult.worktreePath, hookBased: true };
442
- }
443
-
444
- // 3. ่Žทๅ– worktree ้…็ฝฎ
445
- const config = getWorktreeConfig();
446
- // symlinkDirectories: ้œ€่ฆ symlink ็š„็›ฎๅฝ•๏ผˆๅฆ‚ node_modules๏ผ‰
447
- // sparsePaths: git sparse-checkout ่ทฏๅพ„
448
-
449
- // 4. ๅˆ›ๅปบ git worktree
450
- const worktreePath = path.join(getTempDir(), `agent-${agentId}`);
451
- const branchName = `agent-${agentId}`;
452
-
453
- await exec(`git worktree add --detach ${worktreePath}`);
454
-
455
- // 5. ๅค„็† sparse checkout๏ผˆๅฆ‚ๆžœ้…็ฝฎไบ†๏ผ‰
456
- if (config.sparsePaths?.length) {
457
- await exec(`git sparse-checkout set --cone ${config.sparsePaths.join(' ')}`, { cwd: worktreePath });
458
- }
459
-
460
- // 6. ๅˆ›ๅปบ symlink๏ผˆๅฆ‚ๆžœ้…็ฝฎไบ†๏ผ‰
461
- if (config.symlinkDirectories?.length) {
462
- for (const dir of config.symlinkDirectories) {
463
- const src = path.join(projectRoot, dir);
464
- const dst = path.join(worktreePath, dir);
465
- if (fs.existsSync(src) && !fs.existsSync(dst)) {
466
- await fs.symlink(src, dst);
467
- }
468
- }
469
- }
470
-
471
- // 7. ่ฎฐๅฝ• head commit๏ผˆ็”จไบŽๅŽ็ปญๅ˜ๆ›ดๆฃ€ๆต‹๏ผ‰
472
- const headCommit = await exec('git rev-parse HEAD', { cwd: worktreePath });
473
-
474
- return {
475
- worktreePath,
476
- worktreeBranch: branchName,
477
- headCommit: headCommit.stdout.trim(),
478
- gitRoot: projectRoot,
479
- };
480
- }
481
- ```
482
-
483
- ### 7.2 ๅ˜ๆ›ดๆฃ€ๆต‹๏ผˆE77 ๅ‡ฝๆ•ฐ๏ผ‰
484
-
485
- ```typescript
486
- async function E77(worktreePath: string, baselineCommit: string): Promise<boolean> {
487
- const { dirty, commitsAhead } = await il8(worktreePath, baselineCommit);
488
- // il8 ๅ†…้ƒจ๏ผš
489
- // dirty = git status --porcelain ่พ“ๅ‡บ้ž็ฉบ
490
- // commitsAhead = git rev-list ${baselineCommit}..HEAD --count
491
- return dirty || commitsAhead > 0;
492
- }
493
- ```
494
-
495
- ### 7.3 ๆธ…็†๏ผˆjJ6 ๅ‡ฝๆ•ฐ๏ผ‰
496
-
497
- ```typescript
498
- async function jJ6(worktreePath: string, branchName: string, gitRoot: string, hookBased?: boolean) {
499
- if (hookBased) {
500
- // hook-based worktree ็”ฑ hook ่ดŸ่ดฃๆธ…็†
501
- const cleanup = await dl8(worktreePath);
502
- return;
503
- }
504
-
505
- // 1. ๅˆ ้™ค worktree
506
- await exec(`git worktree remove ${worktreePath} --force`, { cwd: gitRoot });
507
-
508
- // 2. ๅˆ ้™คๅˆ†ๆ”ฏ๏ผˆๅฆ‚ๆžœๅญ˜ๅœจ๏ผ‰
509
- try {
510
- await exec(`git branch -D ${branchName}`, { cwd: gitRoot });
511
- } catch {
512
- // ๅˆ†ๆ”ฏๅฏ่ƒฝไธๅญ˜ๅœจ๏ผŒๅฟฝ็•ฅ
513
- }
514
- }
515
- ```
516
-
517
- ### 7.4 ็”Ÿๅ‘ฝๅ‘จๆœŸๅ†ณ็ญ–
518
-
519
- ```
520
- Agent ๆ‰ง่กŒๅฎŒๆˆ
521
- โ†“
522
- worktree ๅญ˜ๅœจ๏ผŸ
523
- โ”œโ”€ NO โ†’ ๆ— ๆ“ไฝœ
524
- โ””โ”€ YES โ†’ E77(worktreePath, headCommit)
525
- โ”œโ”€ ๆ— ๅ˜ๆ›ด โ†’ jJ6() ๆธ…็† worktree
526
- โ””โ”€ ๆœ‰ๅ˜ๆ›ด โ†’ ไฟ็•™ worktree๏ผŒ่ฟ”ๅ›ž worktreePath ็ป™็ˆถ agent
527
- // ็ˆถ agent ๅฏไปฅๆฃ€ๆŸฅๅ˜ๆ›ด๏ผŒๆ‰‹ๅŠจๅ†ณๅฎšๆ˜ฏๅฆๅบ”็”จ
528
- ```
529
-
530
- ---
531
-
532
- ## ๅ…ซใ€AgentSession ๅˆ›ๅปบไธŽๆ‰ง่กŒ
533
-
534
- ### 8.1 ๅŒๆญฅๆ‰ง่กŒ๏ผˆcall ๅ‡ฝๆ•ฐๅ†…้ƒจ๏ผ‰
535
-
536
- ```typescript
537
- // CC ๆบ็ ไธญ็š„ๅŒๆญฅๆ‰ง่กŒ่ทฏๅพ„๏ผˆ็ฎ€ๅŒ–๏ผ‰
538
- const agentId = generateUUID();
539
-
540
- const sessionConfig = {
541
- agentDefinition: agentDef,
542
- promptMessages: messages, // ็”จๆˆทๆถˆๆฏ
543
- toolUseContext: parentContext, // ็ปงๆ‰ฟ็ˆถ agent ็š„ context
544
- canUseTool: permissionChecker, // ๆƒ้™ๆฃ€ๆŸฅๅ‡ฝๆ•ฐ
545
- isAsync: false,
546
- querySource: `agent:${agentDef.agentType}`,
547
- model: resolvedModel,
548
- // โš ๏ธ override ้€ป่พ‘ๆฏ”ๆ–‡ๆกฃๆ่ฟฐ็š„ๆ›ดๅคๆ‚๏ผš
549
- override: isFork
550
- ? { systemPrompt: parentSystemPrompt } // Fork: ็ปงๆ‰ฟ็ˆถ็ณป็ปŸๆ็คบ
551
- : agentSystemPrompt && !worktree && !cwd
552
- ? { systemPrompt: I5(agentSystemPrompt) } // ๆ™ฎ้€š๏ผˆๆ—  worktree/cwd๏ผ‰: ๆ ผๅผๅŒ– agent ็ณป็ปŸๆ็คบ
553
- : undefined, // ๆœ‰ worktree/cwd: ไธ override๏ผŒ่ฎฉ Z18 ๅค„็†
554
- availableTools: isFork ? parentTools : filteredTools,
555
- // โš ๏ธ forkContextMessages ๅ–ๅ†ณไบŽ agentDef.forksParentContext๏ผš
556
- forkContextMessages: isFork
557
- ? agentDef.forksParentContext === "turn"
558
- ? parentMessages.slice(turnStartIndex) // "turn": ๅช็ปงๆ‰ฟๅฝ“ๅ‰ turn
559
- : agentDef.forksParentContext === true
560
- ? parentMessages // true: ็ปงๆ‰ฟๅ…จ้ƒจ
561
- : undefined // undefined: ไธ็ปงๆ‰ฟ
562
- : undefined,
563
- worktreePath: worktree?.worktreePath,
564
- description: description,
565
- };
566
-
567
- // ๅˆ›ๅปบ LLM ๆต
568
- const stream = Yx(sessionConfig);
569
-
570
- // ่ฟญไปฃๆ‰ง่กŒ
571
- const messages = [];
572
- let totalTokens = 0;
573
- let totalToolUseCount = 0;
574
-
575
- for await (const event of stream) {
576
- messages.push(event);
577
-
578
- // ๆ›ดๆ–ฐ่ฟ›ๅบฆ UI
579
- if (elapsed > 2000 && !showedSpinner) {
580
- setToolJSX(<AgentProgressUI />);
581
- showedSpinner = true;
582
- }
583
-
584
- // ๆฃ€ๆŸฅๆ˜ฏๅฆๅบ”่ฏฅ่ฝฌไธบๅŽๅฐ
585
- if (shouldBackground && taskId) {
586
- // ่ฝฌไธบๅผ‚ๆญฅ่ทฏๅพ„
587
- break;
588
- }
589
- }
590
-
591
- // ๆๅ–็ป“ๆžœ
592
- const result = VS8(messages, agentId, {
593
- prompt, resolvedAgentModel, isBuiltInAgent, startTime, agentType, isAsync: false
594
- });
595
- ```
596
-
597
- ### 8.2 ๅผ‚ๆญฅๆ‰ง่กŒ๏ผˆLS8 ๅ‡ฝๆ•ฐ๏ผ‰
598
-
599
- ```typescript
600
- async function LS8({
601
- taskId, abortController, makeStream, metadata, description,
602
- toolUseContext, rootSetAppState, agentIdForCleanup,
603
- enableSummarization, getWorktreeResult
604
- }) {
605
- const messages = [];
606
-
607
- try {
608
- // 1. ๅˆ›ๅปบ token ่ฎกๆ•ฐๅ™จ
609
- const tokenCounter = c26();
610
- const toolCounter = l26(toolUseContext.options.tools);
611
-
612
- // 2. ๅฆ‚ๆžœ้œ€่ฆๆ‘˜่ฆ๏ผŒๆณจๅ†Œๅœๆญขๅ›ž่ฐƒ
613
- let stopFn;
614
- if (enableSummarization) {
615
- const { stop } = qe6(taskId, agentId, tokenCounter, rootSetAppState);
616
- stopFn = stop;
617
- }
618
-
619
- // 3. ๅˆ›ๅปบๆตๅนถ่ฟญไปฃ
620
- const stream = makeStream(/* cacheSafeParams */);
621
-
622
- for await (const event of stream) {
623
- // ๆฃ€ๆŸฅ abort
624
- if (abortController.signal.aborted) break;
625
-
626
- messages.push(event);
627
- // ๆ›ดๆ–ฐ token ๅ’Œ tool ่ฎกๆ•ฐ
628
- KK6(tokenCounter, event, toolCounter, toolUseContext.options.tools);
629
-
630
- // ๆ›ดๆ–ฐไปปๅŠก็Šถๆ€
631
- _e6(taskId, Pa(tokenCounter), rootSetAppState);
632
-
633
- // ่ฎฐๅฝ•ๅทฅๅ…ทไฝฟ็”จ
634
- const toolUse = NS8(event);
635
- if (toolUse) {
636
- yS8(tokenCounter, taskId, toolUseId, description, metadata, toolUse);
637
- }
638
- }
639
-
640
- // 4. ๆๅ–็ป“ๆžœ
641
- const result = VS8(messages, taskId, metadata);
642
-
643
- // 5. ๆ›ดๆ–ฐไปปๅŠก็Šถๆ€ไธบๅฎŒๆˆ
644
- hS8(result, rootSetAppState);
645
-
646
- // 6. ๆธ…็† worktree
647
- const worktreeResult = await getWorktreeResult();
648
-
649
- // 7. ๆธ…็† agent ๆณจๅ†Œ
650
- v18(agentId, { agentType: metadata.agentType, description })
651
- .catch(err => log(`Failed to clear worktree metadata: ${err}`));
652
-
653
- return result;
654
-
655
- } catch (error) {
656
- // ้”™่ฏฏๅค„็†
657
- throw error;
658
- } finally {
659
- // ๆธ…็†
660
- if (agentIdForCleanup) {
661
- // ไปŽ activeAgents ไธญ็งป้™ค
662
- }
663
- }
664
- }
665
- ```
666
-
667
- ---
668
-
669
- ## ไนใ€ๅทฅๅ…ท่ฟ‡ๆปคๆœบๅˆถ
670
-
671
- ### 9.1 ่ฟ‡ๆปค้€ป่พ‘
672
-
673
- ```typescript
674
- // ๅทฅๅ…ท่ฟ‡ๆปค็š„ๆ ธๅฟƒๅ‡ฝๆ•ฐ
675
- function filterToolsForAgent(agentDef, parentTools, permissionContext, mcpTools) {
676
- // 1. ่Žทๅ–ๅŸบ็ก€ๅทฅๅ…ท้›†
677
- let tools = td(permissionContext, mcpTools);
678
- // td = ๆ นๆฎๆƒ้™ๆจกๅผ่ฟ‡ๆปคๅทฅๅ…ท
679
-
680
- // 2. ๅบ”็”จ agent ๅฎšไน‰็š„ๅทฅๅ…ท้™ๅˆถ
681
- if (agentDef.tools) {
682
- // ็™ฝๅๅ•ๆจกๅผ๏ผšๅชไฟ็•™ๆŒ‡ๅฎš็š„ๅทฅๅ…ท
683
- if (agentDef.tools.includes("*")) {
684
- // ้€š้…็ฌฆ๏ผšไฟ็•™ๆ‰€ๆœ‰ๅทฅๅ…ท
685
- } else {
686
- tools = tools.filter(t => agentDef.tools.includes(t.name));
687
- }
688
- }
689
-
690
- if (agentDef.disallowedTools) {
691
- // ้ป‘ๅๅ•ๆจกๅผ๏ผš็งป้™คๆŒ‡ๅฎš็š„ๅทฅๅ…ท
692
- tools = tools.filter(t => !agentDef.disallowedTools.includes(t.name));
693
- }
694
-
695
- return tools;
696
- }
697
- ```
698
-
699
- ### 9.2 ๅ„็ฑปๅž‹็š„ๅทฅๅ…ท้›†
700
-
701
- | Agent ็ฑปๅž‹ | ๅทฅๅ…ท็ญ–็•ฅ | ๅ…ทไฝ“ๅทฅๅ…ท | ๆจกๅž‹ | ๅ…ถไป– |
702
- |-----------|---------|---------|------|------|
703
- | general-purpose | `tools: ["*"]` | ็ปงๆ‰ฟ็ˆถ agent ๅ…จ้ƒจๅทฅๅ…ท | ็ปงๆ‰ฟ | - |
704
- | Explore | `disallowedTools` | ๅ…จ้ƒจ - Agent - ExitPlanMode - Edit - Write - NotebookEdit | haiku | omitClaudeMd |
705
- | Plan | `disallowedTools` | ๅŒ Explore | inherit | omitClaudeMd |
706
- | statusline-setup | `tools` ็™ฝๅๅ• | Read, Edit | sonnet | color: orange |
707
- | claude-code-guide | `tools` ๆกไปถ | ๅ–ๅ†ณไบŽ bj() ๆ ‡ๅฟ— | haiku | permissionMode: dontAsk |
708
-
709
- ### 9.3 ๆƒ้™ๆจกๅผๅฏนๅทฅๅ…ท็š„ๅฝฑๅ“
710
-
711
- ```typescript
712
- function td(permissionContext, mcpTools) {
713
- // permissionContext.mode ๅฏ่ƒฝ็š„ๅ€ผ๏ผš
714
- // - "acceptEdits": ้ป˜่ฎคๆจกๅผ๏ผŒ็ผ–่พ‘้œ€่ฆ็กฎ่ฎค
715
- // - "auto": ่‡ชๅŠจๆจกๅผ๏ผŒๅคง้ƒจๅˆ†ๆ“ไฝœ่‡ชๅŠจๆ‰นๅ‡†
716
- // - "bypassPermissions": ่ทณ่ฟ‡ๆ‰€ๆœ‰ๆƒ้™ๆฃ€ๆŸฅ
717
- // - "plan": ๅช่ฏป + plan ๆจกๅผ
718
- // - "dontAsk": ไธ่ฏข้—ฎ๏ผŒ็›ดๆŽฅๆ‹’็ปๆœชๆŽˆๆƒๆ“ไฝœ
719
-
720
- let tools = [...builtinTools];
721
-
722
- // ๆ นๆฎๆจกๅผ่ฟ‡ๆปค
723
- if (permissionContext.mode === "plan") {
724
- tools = tools.filter(t => isReadOnly(t));
725
- }
726
-
727
- // ๆทปๅŠ  MCP ๅทฅๅ…ท
728
- tools.push(...mcpTools);
729
-
730
- return tools;
731
- }
732
- ```
733
-
734
- ---
735
-
736
- ## ๅใ€็ณป็ปŸๆ็คบๆž„ๅปบ
737
-
738
- ### 10.1 ๆ™ฎ้€šๅญ Agent
739
-
740
- ```typescript
741
- // ๅญ agent ็š„็ณป็ปŸๆ็คบๆž„ๅปบ
742
- function buildSubAgentSystemPrompt(agentDef, toolUseContext) {
743
- // 1. ่Žทๅ– agent ๅฎšไน‰็š„็ณป็ปŸๆ็คบ
744
- const agentPrompt = agentDef.getSystemPrompt({ toolUseContext });
745
-
746
- // 2. ๅฆ‚ๆžœ agent ๆœ‰ memory ้…็ฝฎ๏ผŒๅŠ ่ฝฝ่ฎฐๅฟ†
747
- if (agentDef.memory) {
748
- const memory = loadMemory(agentDef.memory);
749
- agentPrompt += `\n${memory}`;
750
- }
751
-
752
- // 3. ๆ ผๅผๅŒ–
753
- return I5(agentPrompt);
754
- // I5 = ๅฐ†็ณป็ปŸๆ็คบๆ ผๅผๅŒ–ไธบ Anthropic API ๆถˆๆฏๆ ผๅผ
755
- }
756
- ```
757
-
758
- ### 10.2 Fork ๆจกๅผ
759
-
760
- ```typescript
761
- // Fork ๆจกๅผ๏ผš็ปงๆ‰ฟ็ˆถ agent ็š„็ณป็ปŸๆ็คบ
762
- function buildForkSystemPrompt(parentSession) {
763
- // ็›ดๆŽฅไฝฟ็”จ็ˆถ agent ็š„ renderedSystemPrompt
764
- return parentSession.renderedSystemPrompt;
765
- }
766
- ```
767
-
768
- ### 10.3 ็ณป็ปŸๆ็คบ็š„ๅทฎๅผ‚
769
-
770
- | ๅœบๆ™ฏ | ็ณป็ปŸๆ็คบๆฅๆบ | CLAUDE.md | ่ฎฐๅฟ† | ๅทฅไฝœ็›ฎๅฝ•ๆณจๅ…ฅ |
771
- |------|------------|-----------|------|------------|
772
- | ๆ™ฎ้€šๅญ agent๏ผˆๆ—  worktree/cwd๏ผ‰ | agentDef.getSystemPrompt() โ†’ I5() ๆ ผๅผๅŒ– | ๅ–ๅ†ณไบŽ agent ๅฎšไน‰ | ๅ–ๅ†ณไบŽ memory ้…็ฝฎ | ๆ—  |
773
- | ๆ™ฎ้€šๅญ agent๏ผˆๆœ‰ worktree/cwd๏ผ‰ | Z18() ๆž„ๅปบ๏ผˆๅซ "Notes:" + ๅทฅไฝœ็›ฎๅฝ•ๅˆ—่กจ๏ผ‰ | ๅ–ๅ†ณไบŽ agent ๅฎšไน‰ | ๅ–ๅ†ณไบŽ memory ้…็ฝฎ | โœ… ่‡ชๅŠจๆณจๅ…ฅ |
774
- | Fork ๆจกๅผ | ็ˆถ agent ็š„ renderedSystemPrompt | ็ปงๆ‰ฟ็ˆถ agent | ็ปงๆ‰ฟ็ˆถ agent | ๆ—  |
775
- | Explore agent | Er_() ไธ“็”จ็ณป็ปŸๆ็คบ | omitClaudeMd: true | ๆ—  | ๆ—  |
776
-
777
- ---
778
-
779
- ## ๅไธ€ใ€ๆถˆๆฏไผ ้€’ๅ่ฎฎ
780
-
781
- ### 11.1 ็ˆถ โ†’ ๅญ
782
-
783
- ```typescript
784
- // ๆถˆๆฏๆž„ๅปบ
785
- const messages = [];
786
-
787
- if (isFork) {
788
- // Fork ๆจกๅผ๏ผšๅŒ…ๅซ็ˆถ agent ็š„ไธŠไธ‹ๆ–‡ๆถˆๆฏ
789
- messages.push(...buildForkContextMessages(parentMessages, prompt, queryMetadata));
790
- // buildForkContextMessages ไผš๏ผš
791
- // 1. ๅ–็ˆถ agent ็š„ๆถˆๆฏๅކๅฒ
792
- // 2. ๆทปๅŠ ็”จๆˆท็š„ๆ–ฐ prompt
793
- // 3. ๆทปๅŠ  query metadata๏ผˆrequestId ็ญ‰๏ผ‰
794
- } else {
795
- // ๆ™ฎ้€šๆจกๅผ๏ผšๅชๆœ‰็”จๆˆทๆถˆๆฏ
796
- messages.push({ type: "user", content: [{ type: "text", text: prompt }] });
797
- }
798
- ```
799
-
800
- ### 11.2 ๅญ โ†’ ็ˆถ๏ผˆๅŒๆญฅ๏ผ‰
801
-
802
- ```typescript
803
- // ็ป“ๆžœๆๅ–๏ผˆVS8 ๅ‡ฝๆ•ฐ๏ผ‰
804
- function VS8(messages, agentId, metadata) {
805
- // 1. ่Žทๅ–ๆœ€ๅŽไธ€ๆก assistant ๆถˆๆฏ
806
- const lastAssistant = findLastAssistantMessage(messages);
807
- if (!lastAssistant) throw new Error("No assistant messages found");
808
-
809
- // 2. ๆๅ–ๆ–‡ๆœฌๅ†…ๅฎน
810
- let textContent = lastAssistant.message.content.filter(c => c.type === "text");
811
-
812
- // 3. ๅฆ‚ๆžœๆœ€ๅŽไธ€ๆกๆฒกๆœ‰ๆ–‡ๆœฌ๏ผŒๅ‘ๅ‰ๆœ็ดข
813
- if (textContent.length === 0) {
814
- for (let i = messages.length - 1; i >= 0; i--) {
815
- const msg = messages[i];
816
- if (msg.type !== "assistant") continue;
817
- const texts = msg.message.content.filter(c => c.type === "text");
818
- if (texts.length > 0) {
819
- textContent = texts;
820
- break;
821
- }
822
- }
823
- }
824
-
825
- // 4. ็ปŸ่ฎก
826
- const totalTokens = $W(messages)?.usage?.total_tokens ?? 0;
827
- const totalToolUseCount = wZz(messages);
828
-
829
- // 5. ๆž„ๅปบ็ป“ๆžœ
830
- return {
831
- agentId,
832
- agentType: metadata.agentType,
833
- content: textContent,
834
- totalDurationMs: Date.now() - metadata.startTime,
835
- totalTokens,
836
- totalToolUseCount,
837
- usage: $W(messages)?.message?.usage,
838
- status: "completed",
839
- prompt: metadata.prompt,
840
- };
841
- }
842
- ```
843
-
844
- ### 11.3 ๅญ โ†’ ็ˆถ๏ผˆๅผ‚ๆญฅ๏ผ‰
845
-
846
- ๅผ‚ๆญฅ agent ็š„็ป“ๆžœ้€š่ฟ‡**ๆ–‡ไปถ็ณป็ปŸ**ไผ ้€’๏ผš
847
-
848
- ```typescript
849
- // ่พ“ๅ‡บๆ–‡ไปถ่ทฏๅพ„
850
- function lY(agentId) {
851
- return path.join(qR6(), `${agentId}.output`);
852
- // qR6() = <project>/.claude/tasks/
853
- }
854
-
855
- // ่พ“ๅ‡บๆ–‡ไปถๅ†…ๅฎน = ๆœ€ๅŽไธ€ๆก assistant ๆถˆๆฏ็š„ๆ–‡ๆœฌ
856
- ```
857
-
858
- ็ˆถ agent ๅฏไปฅ้€š่ฟ‡ Read ๅทฅๅ…ท่ฏปๅ– `outputFile` ๆฅๆฃ€ๆŸฅๅญ agent ็š„่ฟ›ๅบฆใ€‚
859
-
860
- ---
861
-
862
- ## ๅไบŒใ€ๅฎ‰ๅ…จๆœบๅˆถ
863
-
864
- ### 12.1 Handoff Classifier๏ผˆauto mode๏ผ‰
865
-
866
- ```typescript
867
- async function ES8({
868
- agentMessages, tools, toolPermissionContext, abortSignal, subagentType, totalToolUseCount
869
- }) {
870
- // ๅชๅœจ auto mode ไธ‹่ฟ่กŒ
871
- if (toolPermissionContext.mode !== "auto") return null;
872
-
873
- // ๆž„ๅปบๅฎกๆŸฅ prompt
874
- const reviewPrompt = {
875
- role: "user",
876
- content: [{
877
- type: "text",
878
- text: "Sub-agent has finished and is handing back control to the main agent. Review the sub-agent's work based on the block rules and let the main agent know if any file is dangerous (the main agent will see the reason)."
879
- }]
880
- };
881
-
882
- // ่ฐƒ็”จ classifier
883
- const result = await TS8(
884
- [...agentMessages, reviewPrompt],
885
- tools, toolPermissionContext, abortSignal
886
- );
887
-
888
- // ่ฎฐๅฝ•ๅ†ณ็ญ–
889
- d("tengu_auto_mode_decision", {
890
- decision: result.shouldBlock ? "blocked" : "allowed",
891
- toolName: "Agent",
892
- subagentType,
893
- toolUseCount: totalToolUseCount,
894
- isHandoff: true,
895
- });
896
-
897
- if (result.shouldBlock) {
898
- if (result.unavailable) {
899
- return "Note: The safety classifier was unavailable when reviewing this sub-agent's work. Please carefully verify the sub-agent's actions and output before acting on them.";
900
- }
901
- return `SECURITY WARNING: Sub-agent performed actions that may violate security policy. Reason: ${result.reason}. Review the sub-agent's actions carefully before acting on its output.`;
902
- }
903
-
904
- return null; // ๅฎ‰ๅ…จ๏ผŒๆ— ่ญฆๅ‘Š
905
- }
906
- ```
907
-
908
- ### 12.2 ๆƒ้™็ปงๆ‰ฟ
909
-
910
- ```typescript
911
- // ๅญ agent ็š„ๆƒ้™ๆจกๅผ
912
- const childPermissionContext = {
913
- ...parentPermissionContext,
914
- mode: agentDef.permissionMode ?? "acceptEdits",
915
- // agent ๅฎšไน‰ๅฏไปฅ่ฆ†็›–ๆƒ้™ๆจกๅผ
916
- // ไฝ†ไธ่ƒฝๆฏ”็ˆถ agent ๆ›ดๅฎฝๆพ
917
- };
918
- ```
919
-
920
- ### 12.3 ้€’ๅฝ’้™ๅˆถ
921
-
922
- ```typescript
923
- // ๅœจ Fork worker ไธญไธ่ƒฝๅ†ๆฌก fork
924
- if (querySource === `agent:builtin:${forkAgentType}` || isForkWorker(messages)) {
925
- throw new Error("Fork is not available inside a forked worker. Complete your task directly using your tools.");
926
- }
927
-
928
- // Team ไธญ teammate ไธ่ƒฝ spawn teammate
929
- if (isTeamContext && name) {
930
- throw new Error("Teammates cannot spawn other teammates โ€” the team roster is flat.");
931
- }
932
-
933
- // In-process teammate ไธ่ƒฝ spawn background agent
934
- if (isInProcessTeam && run_in_background === true) {
935
- throw new Error("In-process teammates cannot spawn background agents.");
936
- }
937
- ```
938
-
939
- ---
940
-
941
- ## ๅไธ‰ใ€่‡ชๅŠจๅŽๅฐๅŒ–ๆœบๅˆถ
942
-
943
- ### 13.1 ่งฆๅ‘ๆกไปถ
944
-
945
- ```typescript
946
- function czY() {
947
- // ๅฆ‚ๆžœๅฏ็”จไบ†่‡ชๅŠจๅŽๅฐไปปๅŠก๏ผŒ่ฟ”ๅ›ž้˜ˆๅ€ผ๏ผˆ2 ๅˆ†้’Ÿ๏ผ‰
948
- if (U6(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) ||
949
- S8("tengu_auto_background_agents", false)) {
950
- return 120000; // 2 ๅˆ†้’Ÿ
951
- }
952
- return 0; // ็ฆ็”จ
953
- }
954
- ```
955
-
956
- ### 13.2 ่ฝฌๅŽๅฐๆต็จ‹
957
-
958
- ```
959
- ๅŒๆญฅๆ‰ง่กŒไธญ๏ผŒelapsed > autoBackgroundMs
960
- โ†“
961
- ๆฃ€ๆŸฅๆกไปถ๏ผš
962
- - ๅญ agent ่ฟ˜ๅœจ่ฟ่กŒ
963
- - ็ˆถ agent ็š„ UI ๅฏไปฅ่ฎพ็ฝฎ JSX
964
- โ†“
965
- ๅˆ›ๅปบๅŽๅฐไปปๅŠกๅฏน่ฑก
966
- taskId = dg8({ agentId, description, prompt, ... })
967
- โ†“
968
- ่ฎพ็ฝฎ agentNameRegistry๏ผˆๅฆ‚ๆžœ name ๅญ˜ๅœจ๏ผ‰
969
- โ†“
970
- ไธญๆ–ญๅฝ“ๅ‰ๅŒๆญฅ่ฟญไปฃ
971
- stream.return(undefined)
972
- โ†“
973
- ๅฏๅŠจๅผ‚ๆญฅ็ปง็ปญ
974
- OU(metadata, () => LS8({ ... }))
975
- โ†“
976
- ่ฟ”ๅ›ž AgentOutputAsync ็ป™็ˆถ agent
977
- ```
978
-
979
- ---
980
-
981
- ## ๅๅ››ใ€Agent ๆณจๅ†Œ่กจไธŽๅ‘ฝๅ
982
-
983
- ### 14.1 agentNameRegistry
984
-
985
- ```typescript
986
- // ๅœจ AppState ไธญ็ปดๆŠค
987
- agentNameRegistry: Map<string, string> // name โ†’ agentId
988
-
989
- // ๆณจๅ†Œ
990
- if (name) {
991
- setAppState(state => {
992
- const registry = new Map(state.agentNameRegistry);
993
- registry.set(name, agentId);
994
- return { ...state, agentNameRegistry: registry };
995
- });
996
- }
997
-
998
- // ๆŸฅๆ‰พ๏ผˆSendMessage ไฝฟ็”จ๏ผ‰
999
- function findAgentByName(name) {
1000
- return agentNameRegistry.get(name);
1001
- }
1002
- ```
1003
-
1004
- ### 14.2 Agent ๅฎšไน‰็ผ“ๅญ˜
1005
-
1006
- ```typescript
1007
- // agentDefinitions ๅœจ AppState ไธญ็ปดๆŠค
1008
- agentDefinitions: {
1009
- activeAgents: AgentDefinition[], // ๅฝ“ๅ‰ๅฏ็”จ็š„ agent ๅˆ—่กจ
1010
- allAgents: AgentDefinition[], // ๆ‰€ๆœ‰ agent๏ผˆๅŒ…ๆ‹ฌไธๅฏ็”จ็š„๏ผ‰
1011
- failedFiles?: { path: string, error: string }[],
1012
- }
1013
-
1014
- // ๅŠ ่ฝฝๆ—ถๆœบ๏ผš
1015
- // 1. ๅฏๅŠจๆ—ถ
1016
- // 2. ้…็ฝฎๅ˜ๆ›ดๆ—ถ
1017
- // 3. ๆ’ไปถๅŠ ่ฝฝๆ—ถ
1018
-
1019
- // ๆฅๆบ๏ผš
1020
- // 1. ๅ†…็ฝฎ agent๏ผˆfy8()๏ผ‰
1021
- // 2. ๆ’ไปถๅฎšไน‰็š„ agent๏ผˆao6()๏ผ‰
1022
- // 3. ็”จๆˆท่‡ชๅฎšไน‰ agent๏ผˆ.claude/agents/*.md๏ผ‰
1023
- ```
1024
-
1025
- ---
1026
-
1027
- ## ๅไบ”ใ€่‡ชๅฎšไน‰ Agent ๅฎšไน‰ๆ ผๅผ
1028
-
1029
- ### 15.1 Markdown ๆ ผๅผ๏ผˆ.claude/agents/*.md๏ผ‰
1030
-
1031
- ```markdown
1032
- ---
1033
- name: my-agent
1034
- description: "A specialized agent for X"
1035
- tools: ["Read", "Glob", "Grep"] # ๅฏ้€‰๏ผŒ็™ฝๅๅ•
1036
- disallowedTools: ["Write"] # ๅฏ้€‰๏ผŒ้ป‘ๅๅ•
1037
- model: sonnet # ๅฏ้€‰
1038
- effort: high # ๅฏ้€‰
1039
- permissionMode: plan # ๅฏ้€‰
1040
- maxTurns: 10 # ๅฏ้€‰
1041
- background: false # ๅฏ้€‰
1042
- memory: project # ๅฏ้€‰
1043
- isolation: worktree # ๅฏ้€‰
1044
- skills: ["skill-name"] # ๅฏ้€‰
1045
- initialPrompt: "..." # ๅฏ้€‰
1046
- appendSystemPrompt: true # ๅฏ้€‰
1047
- mcpServers: ["server-name"] # ๅฏ้€‰
1048
- ---
1049
-
1050
- You are a specialized agent for X.
1051
-
1052
- Your responsibilities:
1053
- 1. ...
1054
- 2. ...
1055
- ```
1056
-
1057
- ### 15.2 JSON ๆ ผๅผ๏ผˆๆ’ไปถๅฎšไน‰๏ผ‰
1058
-
1059
- ```json
1060
- {
1061
- "agents": {
1062
- "my-agent": {
1063
- "description": "A specialized agent for X",
1064
- "tools": ["Read", "Glob", "Grep"],
1065
- "prompt": "You are a specialized agent for X...",
1066
- "model": "sonnet",
1067
- "permissionMode": "plan",
1068
- "maxTurns": 10,
1069
- "background": false,
1070
- "memory": "project",
1071
- "isolation": "worktree"
1072
- }
1073
- }
1074
- }
1075
- ```
1076
-
1077
- ---
1078
-
1079
- ## ๅๅ…ญใ€Telemetry ไบ‹ไปถ
1080
-
1081
- ```typescript
1082
- // Agent ้€‰ๆ‹ฉ
1083
- d("tengu_agent_tool_selected", {
1084
- agent_type: agentDef.agentType,
1085
- model: resolvedModel,
1086
- source: agentDef.source, // "built-in" | "plugin" | "flagSettings"
1087
- color: agentDef.color,
1088
- is_built_in_agent: isBuiltIn(agentDef),
1089
- is_resume: false,
1090
- is_async: isAsync,
1091
- is_fork: isFork,
1092
- });
1093
-
1094
- // Agent ๅฎŒๆˆ
1095
- d("tengu_agent_tool_completed", {
1096
- agent_type: metadata.agentType,
1097
- model: metadata.resolvedAgentModel,
1098
- prompt_char_count: metadata.prompt.length,
1099
- response_char_count: responseText.length,
1100
- assistant_message_count: messages.length,
1101
- total_tool_use_count: totalToolUseCount,
1102
- duration_ms: Date.now() - metadata.startTime,
1103
- total_tokens: totalTokens,
1104
- is_built_in_agent: metadata.isBuiltInAgent,
1105
- is_async: metadata.isAsync,
1106
- });
1107
-
1108
- // Auto mode ๅ†ณ็ญ–
1109
- d("tengu_auto_mode_decision", {
1110
- decision: "blocked" | "allowed",
1111
- toolName: "Agent",
1112
- subagentType,
1113
- toolUseCount,
1114
- isHandoff: true,
1115
- });
1116
-
1117
- // Agent ่ฎฐๅฟ†ๅŠ ่ฝฝ
1118
- d("tengu_agent_memory_loaded", {
1119
- scope: agentDef.memory,
1120
- source: "subagent",
1121
- });
1122
- ```
1123
-
1124
- ---
1125
-
1126
- ## ๅไธƒใ€ๅฎŒๆ•ด็Šถๆ€ๆœบ
1127
-
1128
- ```
1129
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1130
- โ”‚ Agent Tool Called โ”‚
1131
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1132
- โ”‚
1133
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1134
- โ”‚ Resolve Agent Definition โ”‚
1135
- โ”‚ (subagent_type โ†’ AgentDefinition) โ”‚
1136
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1137
- โ”‚
1138
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1139
- โ”‚ Check Permissions & MCP โ”‚
1140
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1141
- โ”‚
1142
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1143
- โ”‚ Build System Prompt โ”‚
1144
- โ”‚ (fork: inherit, normal: agentDef) โ”‚
1145
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1146
- โ”‚
1147
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1148
- โ”‚ Create Worktree? โ”‚
1149
- โ”‚ (isolation === "worktree") โ”‚
1150
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1151
- โ”‚
1152
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1153
- โ”‚ โ”‚ โ”‚
1154
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1155
- โ”‚ Sync Execution โ”‚ โ”‚ Background โ”‚ โ”‚ Team Teammate โ”‚
1156
- โ”‚ (default) โ”‚ โ”‚ (async) โ”‚ โ”‚ (team_name+name) โ”‚
1157
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1158
- โ”‚ โ”‚ โ”‚
1159
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1160
- โ”‚ Create Session โ”‚ โ”‚ Create Task โ”‚ โ”‚ KZK() โ”‚
1161
- โ”‚ Yx(config) โ”‚ โ”‚ dg8() โ”‚ โ”‚ Team Spawn โ”‚
1162
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1163
- โ”‚ โ”‚
1164
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1165
- โ”‚ Iterate Stream โ”‚ โ”‚ LS8() โ”‚
1166
- โ”‚ for await โ”‚ โ”‚ Async Runner โ”‚
1167
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1168
- โ”‚ โ”‚
1169
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1170
- โ”‚ Auto-background? โ”‚ โ”‚ Write Output โ”‚
1171
- โ”‚ elapsed > 2min โ”‚ โ”‚ File โ”‚
1172
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1173
- โ”‚ โ”‚
1174
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1175
- โ”‚ VS8() Extract โ”‚ โ”‚ Return โ”‚
1176
- โ”‚ Result โ”‚ โ”‚ async_launchedโ”‚
1177
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1178
- โ”‚
1179
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1180
- โ”‚ Handoff Check โ”‚
1181
- โ”‚ (auto mode) โ”‚
1182
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1183
- โ”‚
1184
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1185
- โ”‚ Cleanup Worktree โ”‚
1186
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1187
- โ”‚
1188
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1189
- โ”‚ Return Completed โ”‚
1190
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1191
- ```
1192
-
1193
- ---
1194
-
1195
- ## ๅๅ…ซใ€ๅคๅˆปๆธ…ๅ•
1196
-
1197
- ### 18.1 ๆ•ฐๆฎ็ป“ๆž„
1198
-
1199
- - [ ] `AgentDefinition` ๆŽฅๅฃ๏ผˆ่ฏฆ่ง็ฌฌๅ››่Š‚๏ผŒ25+ ๅญ—ๆฎต๏ผ‰
1200
- - [ ] `AgentInput` / `AgentOutput` ็ฑปๅž‹
1201
- - [ ] `AgentSessionConfig` ๆŽฅๅฃ
1202
- - [ ] `agentNameRegistry` Map
1203
- - [ ] `maxResultSizeChars` ๅธธ้‡๏ผˆ100,000๏ผ‰
1204
- - [ ] `forksParentContext` ไธ‰ๆ€้€ป่พ‘๏ผˆtrue/"turn"/undefined๏ผ‰
1205
-
1206
- ### 18.2 ๆ ธๅฟƒๅ‡ฝๆ•ฐ
1207
-
1208
- - [ ] `resolveAgentType(subagent_type)` โ†’ ๆŸฅๆ‰พ agent ๅฎšไน‰
1209
- - [ ] `filterToolsForAgent(agentDef, parentTools, permissionContext)` โ†’ ๅทฅๅ…ท่ฟ‡ๆปค
1210
- - [ ] `Z18(additionalWorkingDirs, model)` โ†’ ็ณป็ปŸๆ็คบๆž„ๅปบ๏ผˆๅซๅทฅไฝœ็›ฎๅฝ• Notes๏ผ‰
1211
- - [ ] `createWorktree(agentId)` โ†’ worktree ๅˆ›ๅปบ
1212
- - [ ] `checkWorktreeDirty(worktreePath, baseline)` โ†’ ๅ˜ๆ›ดๆฃ€ๆต‹
1213
- - [ ] `cleanupWorktree(worktreePath, branch, gitRoot)` โ†’ worktree ๆธ…็†
1214
- - [ ] `createAgentSession(config)` โ†’ ๅˆ›ๅปบ LLM session
1215
- - [ ] `extractAgentResult(messages, agentId, metadata)` โ†’ ็ป“ๆžœๆๅ–
1216
- - [ ] `checkHandoffSafety(messages, tools, permissionContext)` โ†’ ๅฎ‰ๅ…จๅฎกๆŸฅ
1217
- - [ ] `Lx()` โ†’ ไธป session ็ณป็ปŸๆ็คบๆž„ๅปบ๏ผˆfork ๆจกๅผๅ›ž้€€๏ผ‰
1218
-
1219
- ### 18.3 ๅทฅๅ…ทๆณจๅ†Œ
1220
-
1221
- - [ ] Agent tool ็š„ JSON Schema ๅฎšไน‰
1222
- - [ ] Agent tool handler๏ผˆcall ๅ‡ฝๆ•ฐ๏ผ‰
1223
- - [ ] ๅŒๆญฅ/ๅผ‚ๆญฅๆ‰ง่กŒ่ทฏๅพ„
1224
- - [ ] ่‡ชๅŠจๅŽๅฐๅŒ–้€ป่พ‘
1225
- - [ ] `maxResultSizeChars: 1e5` ๆˆชๆ–ญ
1226
-
1227
- ### 18.4 ๅ†…็ฝฎ Agent
1228
-
1229
- - [ ] general-purpose๏ผˆtools: ["*"]๏ผŒ`whenToUse` ๆ˜ฏๅญ—็ฌฆไธฒ๏ผ‰
1230
- - [ ] Explore๏ผˆdisallowedTools, model: haiku, omitClaudeMd๏ผŒ`whenToUse` ๆ˜ฏๅ‡ฝๆ•ฐๅผ•็”จ๏ผ‰
1231
- - [ ] Plan๏ผˆdisallowedTools๏ผ‰
1232
- - [ ] statusline-setup
1233
- - [ ] claude-code-guide
1234
-
1235
- ### 18.5 ๅฎ‰ๅ…จ
1236
-
1237
- - [ ] ้€’ๅฝ’้™ๅˆถ๏ผˆfork ไธญไธ่ƒฝๅ† fork๏ผ‰
1238
- - [ ] Team ้™ๅˆถ๏ผˆteammate ไธ่ƒฝ spawn teammate๏ผ‰
1239
- - [ ] In-process teammate ไธ่ƒฝ spawn background agent
1240
- - [ ] ๆƒ้™็ปงๆ‰ฟ๏ผˆไธ่ƒฝๆฏ”็ˆถๆ›ดๅฎฝๆพ๏ผ‰
1241
- - [ ] Handoff classifier๏ผˆauto mode ๅฎ‰ๅ…จๅฎกๆŸฅ๏ผ‰
1242
- - [ ] Classifier ไธๅฏ็”จๆ—ถ็š„้™็บงๅค„็†
1243
-
1244
- ### 18.6 ๆŒไน…ๅŒ–
1245
-
1246
- - [ ] ่พ“ๅ‡บๆ–‡ไปถ๏ผˆ`.claude/tasks/<agentId>.output`๏ผ‰
1247
- - [ ] Agent ๅฎšไน‰็ผ“ๅญ˜๏ผˆๅฏๅŠจๆ—ถ/้…็ฝฎๅ˜ๆ›ดๆ—ถ/ๆ’ไปถๅŠ ่ฝฝๆ—ถ๏ผ‰
1248
- - [ ] agentNameRegistry ๆŒไน…ๅŒ–
1249
- - [ ] Worktree ๅ…ƒๆ•ฐๆฎ๏ผˆhead commit ็”จไบŽๅ˜ๆ›ดๆฃ€ๆต‹๏ผ‰
1250
-
1251
- ---
1252
-
1253
- ## ๅไนใ€ไธŽ nanoPencil ็Žฐๆœ‰ๅฎž็Žฐ็š„ๅทฎๅผ‚
1254
-
1255
- | ็ปดๅบฆ | CC | nanoPencil |
1256
- |------|-----|-----------|
1257
- | **ๅทฅๅ…ทๅฎšไน‰** | LLM ๅฏ่ฐƒ็”จ็š„ tool | ๅ†…้ƒจ API๏ผˆSubAgentSpec๏ผ‰ |
1258
- | **Agent ็ฑปๅž‹** | 5 ไธชๅ†…็ฝฎ + ่‡ชๅฎšไน‰ | 2 ็งๆจกๅผ๏ผˆresearch/implement๏ผ‰+ team modes |
1259
- | **Worktree** | git worktree add --detach | ๅŒ |
1260
- | **ๅผ‚ๆญฅๆ‰ง่กŒ** | ๅ†…็ฝฎ run_in_background | ๅ†…็ฝฎ |
1261
- | **่‡ชๅŠจๅŽๅฐ** | 2 ๅˆ†้’Ÿ้˜ˆๅ€ผ | ๆ—  |
1262
- | **ๅฎ‰ๅ…จๅฎกๆŸฅ** | Handoff classifier | ๆ—  |
1263
- | **Fork ๆจกๅผ** | ็ปงๆ‰ฟ็ˆถ agent ็ณป็ปŸๆ็คบๅ’Œๆถˆๆฏ | ๆ—  |
1264
- | **forksParentContext** | true/"turn"/undefined ไธ‰็งๆจกๅผ | ๆ—  |
1265
- | **ๅ‘ฝๅๆณจๅ†Œ** | agentNameRegistry | activeAgents Map |
1266
- | **่พ“ๅ‡บๆ–‡ไปถ** | .claude/tasks/*.output | .nanopencil/subagent-runs/*.md |
1267
- | **็ณป็ปŸๆ็คบ** | ๆŒ‰ agent type ๆž„ๅปบ + Z18 ๆณจๅ…ฅๅทฅไฝœ็›ฎๅฝ• | ๆŒ‰ runRole ๆž„ๅปบ |
1268
- | **ๅทฅๅ…ท่ฟ‡ๆปค** | tools/disallowedTools | createReadOnlyTools/createCodingTools |
1269
- | **่‡ชๅฎšไน‰ Agent** | .claude/agents/*.md | ๆ—  |
1270
- | **็ป“ๆžœๅคงๅฐ้™ๅˆถ** | maxResultSizeChars = 100,000 | ๆ—  |
1271
- | **background ๅญ—ๆฎต** | agent ๅฎšไน‰็บง + ๅ‚ๆ•ฐ็บง๏ผŒไธคไธช็‹ฌ็ซ‹ๆŽงๅˆถ | ไป…ๅ‚ๆ•ฐ็บง |
1272
-
1273
- ---
1274
-
1275
- ## ไบŒๅใ€ๅ…ณ้”ฎๆบ็ ไฝ็ฝฎ
1276
-
1277
- | ็ป„ไปถ | CC ๆบ็ ไฝ็ฝฎ๏ผˆcli.js ่กŒๅท/ๅ‡ฝๆ•ฐๅ๏ผ‰ |
1278
- |------|-------------------------------|
1279
- | ๅทฅๅ…ทๅๅธธ้‡ | `H4="Agent"`, `eI="Task"` |
1280
- | Input Schema | `lzY`, `nzY`, `xs1`๏ผˆ็ฌฌ 3947 ่กŒ้™„่ฟ‘๏ผ‰ |
1281
- | Output Schema | `izY` |
1282
- | Agent handler | `ng8.call()`๏ผˆ็ฌฌ 3947 ่กŒ้™„่ฟ‘๏ผ‰ |
1283
- | ๅ†…็ฝฎ agent ๅฎšไน‰ | `fy8()` |
1284
- | Agent ็ฑปๅž‹่ฟ‡ๆปค | `Mq8()` |
1285
- | ๅทฅๅ…ท่ฟ‡ๆปค | `td()` |
1286
- | Worktree ๅˆ›ๅปบ | `Xq8()` |
1287
- | ๅ˜ๆ›ดๆฃ€ๆต‹ | `E77()` โ†’ `il8()` |
1288
- | Worktree ๆธ…็† | `jJ6()` |
1289
- | ็ณป็ปŸๆ็คบๆž„ๅปบ | `Z18()`, `Lx()` |
1290
- | ็ป“ๆžœๆๅ– | `VS8()` |
1291
- | ๅผ‚ๆญฅ runner | `LS8()` |
1292
- | ๅŽๅฐไปปๅŠกๅˆ›ๅปบ | `dg8()` |
1293
- | ่พ“ๅ‡บๆ–‡ไปถ่ทฏๅพ„ | `lY()` โ†’ `qR6()` |
1294
- | ่‡ชๅŠจๅŽๅฐ้˜ˆๅ€ผ | `czY()` |
1295
- | Handoff ๅฎกๆŸฅ | `ES8()` |
1296
- | Agent ๅฎšไน‰่งฃๆž | `mM4()`๏ผˆmarkdown๏ผ‰, `uM4()`๏ผˆJSON๏ผ‰ |
1297
- | Agent ๆณจๅ†Œ่กจ | `agentNameRegistry` in AppState |