@pencil-agent/nano-pencil 2.0.0 โ 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +267 -267
- package/dist/build-meta.json +3 -3
- package/dist/core/export-html/AGENT.md +11 -11
- package/dist/core/export-html/template.css +971 -971
- package/dist/core/export-html/template.html +54 -54
- package/dist/core/mcp/mcp-client.d.ts +3 -1
- package/dist/core/mcp/mcp-client.js +6 -6
- package/dist/core/mcp/mcp-config.d.ts +3 -3
- package/dist/core/mcp/mcp-config.js +1 -1
- package/dist/core/mcp/mcp-manager.d.ts +5 -1
- package/dist/core/mcp/mcp-manager.js +1 -1
- package/dist/core/platform/config/resource-loader.d.ts +2 -0
- package/dist/core/platform/config/resource-loader.js +2 -2
- package/dist/core/runtime/agent-session.d.ts +12 -0
- package/dist/core/runtime/agent-session.js +8 -8
- package/dist/core/runtime/sdk.d.ts +8 -0
- package/dist/core/runtime/sdk.js +1 -1
- package/dist/extensions/builtin/AGENT.md +115 -115
- package/dist/extensions/builtin/browser/AGENT.md +17 -17
- package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
- package/dist/extensions/builtin/browser/browser.md +73 -73
- package/dist/extensions/builtin/browser/install.md +142 -142
- package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
- package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
- package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
- package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
- package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
- package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
- package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
- package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
- package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
- package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
- package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
- package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
- package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
- package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
- package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
- package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
- package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
- package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
- package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
- package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
- package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
- package/dist/extensions/builtin/goal/README.md +67 -67
- package/dist/extensions/builtin/grub/README.md +112 -112
- package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
- package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
- package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
- package/dist/extensions/builtin/link-world/linkworld.md +313 -313
- package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
- package/dist/extensions/builtin/loop/README.md +92 -92
- package/dist/extensions/builtin/mcp/figma-design.md +68 -68
- package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
- package/dist/extensions/builtin/recap/AGENT.md +15 -15
- package/dist/extensions/builtin/sal/README.md +72 -72
- package/dist/extensions/builtin/security-audit/README.md +289 -289
- package/dist/extensions/builtin/team/AGENT.md +112 -112
- package/dist/extensions/builtin/team/TESTING.md +299 -299
- package/dist/extensions/builtin/token-save/README.md +56 -56
- package/dist/extensions/optional/AGENT.md +10 -10
- package/dist/modes/interactive/interactive-mode.js +36 -36
- package/dist/modes/interactive/theme/dark.json +85 -85
- package/dist/modes/interactive/theme/light.json +84 -84
- package/dist/modes/interactive/theme/theme-schema.json +335 -335
- package/dist/modes/interactive/theme/warm.json +81 -81
- package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.js +3 -2
- package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.js +2 -1
- package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
- package/docs/cc-agent-design.md +1297 -0
- package/docs/cc-tui-design.md +1333 -0
- package/docs/codex-goal-command-impl.md +1055 -1055
- package/docs/codex-goal-vs-grub.md +500 -500
- package/docs/custom-provider.md +27 -27
- package/docs/extensions.md +27 -27
- package/docs/keybindings.md +27 -27
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
- 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
- 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
- package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
- package/docs/loop-usage-examples.md +214 -214
- package/docs/models.md +27 -27
- package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +170 -0
- package/docs/packages.md +27 -27
- package/docs/pi-design-philosophy.md +457 -457
- package/docs/planmode.md +1987 -1987
- package/docs/prompt-templates.md +27 -27
- package/docs/providers.md +27 -27
- package/docs/scan-report.md +3820 -0
- package/docs/sdk.md +27 -27
- package/docs/skills.md +27 -27
- package/docs/themes.md +27 -27
- package/docs/tui.md +27 -27
- package/docs//345/257/271/346/240/207Claude-Code.md +1775 -0
- 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 +261 -0
- package/package.json +190 -190
- 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 +0 -851
- package/docs/SDK-TESTING.md +0 -364
- package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +0 -593
- package/docs/startup-performance-optimization.md +0 -301
- package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +0 -47
|
@@ -0,0 +1,1297 @@
|
|
|
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 |
|