@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.
- 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/model/custom-providers.js +1 -1
- package/dist/core/model-registry.js +5 -5
- 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/debug/index.js +9 -9
- 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/goal/index.js +6 -6
- 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/controllers/input-submit-controller.js +2 -2
- package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
- package/dist/modes/interactive/interactive-mode.js +19 -19
- 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/ai/dist/cli.js +0 -0
- package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
- 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
- package/docs/SDK-TESTING.md +364 -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/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
- package/docs/models.md +27 -27
- 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/sdk.md +27 -27
- package/docs/skills.md +27 -27
- package/docs/startup-performance-optimization.md +301 -0
- package/docs/themes.md +27 -27
- package/docs/tui.md +27 -27
- package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
- package/package.json +190 -190
- package/docs/cc-agent-design.md +0 -1297
- package/docs/cc-tui-design.md +0 -1333
- package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
- package/docs/scan-report.md +0 -3820
- package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
- 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,56 +1,56 @@
|
|
|
1
|
-
# TokenSave
|
|
2
|
-
|
|
3
|
-
TokenSave is a default-on extension that reduces noisy shell output before it enters the agent context.
|
|
4
|
-
|
|
5
|
-
## Behavior
|
|
6
|
-
|
|
7
|
-
- Commands execute with their original shell semantics.
|
|
8
|
-
- TokenSave plans commands before execution and filters output after execution.
|
|
9
|
-
- Small outputs, unsafe redirection, heredocs, and explicitly disabled commands pass through unchanged.
|
|
10
|
-
- Filtered outputs include estimated token savings and a raw recovery file path when available.
|
|
11
|
-
- Both agent-called `bash` tools and user `!` bash commands are covered. `!!` commands stay excluded from context and are not intercepted.
|
|
12
|
-
|
|
13
|
-
## Disable
|
|
14
|
-
|
|
15
|
-
Set either environment variable on a command to bypass filtering:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
TOKEN_SAVE_DISABLED=1 git status
|
|
19
|
-
TOKENSAVE_DISABLED=1 npm test
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Stats
|
|
23
|
-
|
|
24
|
-
Use:
|
|
25
|
-
|
|
26
|
-
```text
|
|
27
|
-
/tokensave
|
|
28
|
-
/tokensave history
|
|
29
|
-
/tokensave plan <command>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Config Filters
|
|
33
|
-
|
|
34
|
-
User filters load from:
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
~/.pencils/token-save/filters.json
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Project filters load from:
|
|
41
|
-
|
|
42
|
-
```text
|
|
43
|
-
.nanopencil/token-save/filters.json
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Project filters are ignored unless the project explicitly opts in with:
|
|
47
|
-
|
|
48
|
-
```json
|
|
49
|
-
{ "trusted": true }
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
at:
|
|
53
|
-
|
|
54
|
-
```text
|
|
55
|
-
.nanopencil/token-save/trust.json
|
|
56
|
-
```
|
|
1
|
+
# TokenSave
|
|
2
|
+
|
|
3
|
+
TokenSave is a default-on extension that reduces noisy shell output before it enters the agent context.
|
|
4
|
+
|
|
5
|
+
## Behavior
|
|
6
|
+
|
|
7
|
+
- Commands execute with their original shell semantics.
|
|
8
|
+
- TokenSave plans commands before execution and filters output after execution.
|
|
9
|
+
- Small outputs, unsafe redirection, heredocs, and explicitly disabled commands pass through unchanged.
|
|
10
|
+
- Filtered outputs include estimated token savings and a raw recovery file path when available.
|
|
11
|
+
- Both agent-called `bash` tools and user `!` bash commands are covered. `!!` commands stay excluded from context and are not intercepted.
|
|
12
|
+
|
|
13
|
+
## Disable
|
|
14
|
+
|
|
15
|
+
Set either environment variable on a command to bypass filtering:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
TOKEN_SAVE_DISABLED=1 git status
|
|
19
|
+
TOKENSAVE_DISABLED=1 npm test
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Stats
|
|
23
|
+
|
|
24
|
+
Use:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
/tokensave
|
|
28
|
+
/tokensave history
|
|
29
|
+
/tokensave plan <command>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Config Filters
|
|
33
|
+
|
|
34
|
+
User filters load from:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
~/.pencils/token-save/filters.json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Project filters load from:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
.nanopencil/token-save/filters.json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Project filters are ignored unless the project explicitly opts in with:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{ "trusted": true }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
at:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
.nanopencil/token-save/trust.json
|
|
56
|
+
```
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# extensions/optional/
|
|
2
|
-
|
|
3
|
-
> P2 | Parent: ../AGENT.md
|
|
4
|
-
|
|
5
|
-
Member List
|
|
6
|
-
export-html/index.ts: HTML export extension, exportSessionToHtml/exportFromFile, /export command
|
|
7
|
-
simplify/index.ts: Simplification extension, /simplify style refactoring tool
|
|
8
|
-
|
|
9
|
-
Rule: Members complete, one item per line, parent links valid, precise terms first
|
|
10
|
-
|
|
1
|
+
# extensions/optional/
|
|
2
|
+
|
|
3
|
+
> P2 | Parent: ../AGENT.md
|
|
4
|
+
|
|
5
|
+
Member List
|
|
6
|
+
export-html/index.ts: HTML export extension, exportSessionToHtml/exportFromFile, /export command
|
|
7
|
+
simplify/index.ts: Simplification extension, /simplify style refactoring tool
|
|
8
|
+
|
|
9
|
+
Rule: Members complete, one item per line, parent links valid, precise terms first
|
|
10
|
+
|
|
11
11
|
[COVENANT]: Update this file header on changes and verify against parent AGENT.md
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
2
|
-
`)}h(a,"dbg");class
|
|
1
|
+
var x=Object.defineProperty;var h=(d,e)=>x(d,"name",{value:e,configurable:!0});import*as g from"node:fs";import*as f from"node:os";import*as l from"node:path";const S=process.env.NANOPENCIL_DEBUG==="1",p=l.join(f.homedir(),".nanopencil","agent","nanopencil-debug.log");function a(d){if(S)try{g.mkdirSync(l.dirname(p),{recursive:!0}),g.appendFileSync(p,`[${new Date().toISOString()}] [submit] ${d}
|
|
2
|
+
`)}catch{}}h(a,"dbg");class I{static{h(this,"InputSubmitController")}ctx;constructor(e){this.ctx=e}async handleSubmit(e){const t=e.trim();if(!t)return;if(a(`handleSubmit: "${t.slice(0,80)}"`),await this.ctx.image.awaitPendingPaste(),await this.ctx.slash.execute(t)){a("handleSubmit \u2192 built-in slash handled");return}const s=t.match(/\s+\/persona\b/);if(s){const n=t.slice(s.index+1),r=t.slice(0,s.index).trim();this.ctx.editor.setText(""),await this.ctx.commands.handlePersonaCommand(n),r&&await this.ctx.session.promptAfterRender(r);return}if(t.startsWith("!")){const n=t.startsWith("!!"),r=n?t.slice(2).trim():t.slice(1).trim();if(r){if(this.ctx.session.isBashRunning()){this.ctx.render.showWarning("A bash command is already running. Press Esc to cancel it first."),this.ctx.editor.setText(t);return}this.ctx.editor.addToHistory(t),await this.ctx.commands.handleBashCommand(r,n),this.ctx.editor.setBashMode(!1),this.ctx.editor.updateBorderColor();return}}if(this.ctx.session.isCompacting()){this.ctx.commands.isExtensionCommand(t)?(this.ctx.editor.addToHistory(t),this.ctx.editor.setText(""),await this.ctx.session.promptAfterRender(t)):this.ctx.session.queueCompactionMessage(t,"steer");return}if(this.ctx.session.isStreaming()){await this.handleStreamingSubmit(t);return}await this.handleIdleSubmit(t)}async handleStreamingSubmit(e){this.ctx.editor.addToHistory(e),this.ctx.editor.setText("");const t=[{type:"text",text:e}];this.ctx.render.addOptimisticUserMessage(e,t),this.ctx.render.requestRender();const s=await this.ctx.image.extractImagesFromText(e),n=s.images;let r=[];const i=this.ctx.image.takePendingAttachments();i.length>0&&(r=i.map(m=>m.path));const o=this.ctx.session.getModel();(n.length>0||r.length>0)&&o&&!o.input.includes("image")&&(n.length=0,r=[],this.ctx.render.showStatus(`Images dropped: ${o.name} does not support images.${this.imageSupportSuggestion(o,!1)}`),this.ctx.render.requestRender());let c=s.text;if(r.length>0){const m=this.ctx.session.getCwd();c=r.map(u=>`@${l.relative(m,u).replace(/\\/g,"/")}`).join(" ")+" "+c}await this.ctx.session.promptAfterRender(c,{streamingBehavior:"steer",images:n.length>0?n:void 0}),this.ctx.render.updatePendingMessagesDisplay(),this.ctx.render.requestRender()}async handleIdleSubmit(e){a(`handleIdleSubmit: "${e.slice(0,80)}"`),this.ctx.render.flushPendingBashComponents(),this.ctx.editor.addToHistory(e),this.ctx.editor.setText("");const{text:t,images:s}=await this.ctx.image.extractImagesFromText(e),n=this.ctx.image.takePendingAttachments();if(n.length>0){const i=await this.ctx.image.processAttachmentFiles(n);s.push(...i)}if(s.length>0){const i=this.ctx.session.getModel();i&&!i.input.includes("image")&&(this.ctx.render.showWarning(`Model "${i.name}" does not support image input. Images have been removed from this message.${this.imageSupportSuggestion(i,!0)}`),s.length=0)}if(this.ctx.commands.isExtensionCommand(t))a("handleIdleSubmit \u2192 skipping optimistic message for extension command");else{const i=[{type:"text",text:t}];s.length>0&&i.push(...s),this.ctx.render.addOptimisticUserMessage(t,i),this.ctx.render.requestRender(),a("handleIdleSubmit \u2192 optimistic message added")}if(this.ctx.editor.handleExternalInput(e)){a("handleIdleSubmit \u2192 handed off to main loop via handleExternalInput");return}try{delete process.env.NANOPENCIL_JUST_SWITCHED_PERSONA,await this.ctx.session.promptAfterRender(t,{images:s.length>0?s:void 0}),a("handleIdleSubmit \u2192 promptAfterRender returned normally")}catch(i){a(`handleIdleSubmit \u2192 promptAfterRender threw: ${i}`),this.ctx.render.rollbackFirstOptimisticUserMessageIfMatches(t);const o=i instanceof Error?i.message:"Unknown error occurred";this.ctx.render.showError(o)}this.ctx.render.updatePendingMessagesDisplay(),this.ctx.render.requestRender(),this.ctx.image.cleanupClipboardImages()}imageSupportSuggestion(e,t){const s=t?" Try using":" Try";return e.id==="glm-5"||e.id==="glm-5-turbo"?`${s} glm-5v-turbo for image support.`:e.id==="glm-4.5"||e.id==="glm-4.5-air"?`${s} glm-4.5v for image support.`:""}}export{I as InputSubmitController};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
2
|
-
`)}u(y,"dbg");const H=5e3;class z{static{u(this,"StreamRenderController")}ctx;autoCompactionLoader=void 0;autoCompactionEscapeHandler=void 0;retryLoader=void 0;retryEscapeHandler=void 0;taskUpdateUnsubscribe=void 0;taskAutoHideTimer=void 0;constructor(t){this.ctx=t}async handle(t){y(`handle event: ${t.type}`),await this.ctx.surface.ensureInitialized(),this.ctx.layout.invalidateFooter();const e=this.ctx.state.get(),n=this.ctx.layout.getUi(),a=this.ctx.layout.getChatContainer(),o=this.ctx.layout.getStatusContainer();switch(t.type){case"agent_start":this.retryEscapeHandler&&(this.ctx.escape.setHandler(this.retryEscapeHandler),this.retryEscapeHandler=void 0),this.retryLoader&&(this.retryLoader.stop(),this.retryLoader=void 0),e.loadingAnimation&&e.loadingAnimation.stop(),o.clear(),e.loadingAnimation=new g(n,l,this.ctx.loaders.getDefaultWorkingMessage(),this.ctx.loaders.getSessionId()),o.addChild(e.loadingAnimation),this.ctx.loaders.setBuddyPetState("working","Working..."),e.pendingWorkingMessage!==void 0&&(e.workingMessageOverride=e.pendingWorkingMessage||void 0,e.pendingWorkingMessage=void 0),this.ctx.loaders.startAgentRunTimer(),this.ctx.loaders.updateWorkingMessage({resetStallTimer:!1}),this.ctx.loaders.isInPlanMode()&&(e.planProgress=D(),e.planProgressPanel=new M(n,l),o.addChild(e.planProgressPanel),e.planProgressPanel.update(e.planProgress)),this.refreshTaskPanel(e,n,o).catch(()=>{}),this.taskUpdateUnsubscribe?.(),this.taskUpdateUnsubscribe=_(()=>{this.refreshTaskPanel(e,n,o).catch(()=>{})}),this.ctx.surface.restoreEditorFocusIfPossible(),this.ctx.layout.requestRender();break;case"message_start":if(t.message.role==="custom")this.ctx.layout.addMessageToChat(t.message),this.ctx.layout.requestRender();else if(t.message.role==="user"){const s=this.ctx.surface.getUserMessageText(t.message);if(e.optimisticUserMessages.length>0&&e.optimisticUserMessages[0]?.text===s){e.optimisticUserMessages.shift(),this.ctx.layout.updatePendingMessagesDisplay(),this.ctx.layout.requestRender();break}this.ctx.layout.addMessageToChat(t.message),this.ctx.layout.updatePendingMessagesDisplay(),this.ctx.layout.requestRender()}else t.message.role==="assistant"&&(e.streamingComponent=new b(void 0,e.hideThinkingBlock,this.ctx.surface.getMarkdownThemeWithSettings()),e.streamingMessage=t.message,a.addChild(e.streamingComponent),e.streamingComponent.updateContent(e.streamingMessage),this.ctx.layout.requestRender());break;case"message_update":if(e.streamingComponent&&t.message.role==="assistant"){e.loadingAnimation&&e.loadingAnimation.resetStallTimer(),e.streamingMessage=t.message,e.streamingComponent.updateContent(e.streamingMessage),a.markDirty(e.streamingComponent);for(const s of e.streamingMessage.content)if(s.type==="toolCall"){if(!this.ctx.toolTrace.shouldRenderToolTrace(s.name))continue;if(e.pendingTools.has(s.id)){const i=e.pendingTools.get(s.id);i&&(i.updateArgs(s.arguments),a.markDirty(i))}else{a.addChild(new h("",0,0));const i=new f(s.name,s.arguments,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(s.name),n);i.setExpanded(e.toolOutputExpanded),a.addChild(i),e.pendingTools.set(s.id,i)}}this.ctx.layout.requestRender()}break;case"message_end":if(t.message.role==="user")break;if(e.streamingComponent&&t.message.role==="assistant"){e.streamingMessage=t.message;let s;if(e.streamingMessage.stopReason==="aborted"){const i=this.ctx.runtime.getRetryAttempt();s=i>0?`Aborted after ${i} retry attempt${i>1?"s":""}`:"Operation aborted",e.streamingMessage.errorMessage=s}if(e.streamingComponent.updateContent(e.streamingMessage),a.markDirty(e.streamingComponent),e.streamingMessage.stopReason==="aborted"||e.streamingMessage.stopReason==="error"){s||(s=e.streamingMessage.errorMessage||"Error");for(const[,i]of e.pendingTools.entries())i.updateResult({content:[{type:"text",text:s}],isError:!0}),a.markDirty(i);e.pendingTools.clear()}else for(const[,i]of e.pendingTools.entries())i.setArgsComplete(),a.markDirty(i);e.streamingComponent=void 0,e.streamingMessage=void 0,this.ctx.layout.invalidateFooter()}this.ctx.layout.requestRender();break;case"tool_execution_start":{if(e.planProgress&&e.planProgressPanel&&(L(e.planProgress,t.toolName,t.args),e.planProgressPanel.update(e.planProgress),this.ctx.layout.requestRender()),!this.ctx.toolTrace.shouldRenderToolTrace(t.toolName))break;if(!e.pendingTools.has(t.toolCallId)){const s=new f(t.toolName,t.args,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(t.toolName),n);s.setExpanded(e.toolOutputExpanded),a.addChild(s),e.pendingTools.set(t.toolCallId,s),this.ctx.layout.requestRender()}break}case"tool_execution_update":{const s=e.pendingTools.get(t.toolCallId);s&&(s.updateResult({...t.partialResult,isError:!1},!0),a.markDirty(s),this.ctx.layout.requestRender());break}case"tool_execution_end":{const s=e.pendingTools.get(t.toolCallId);s&&(s.updateResult({...t.result,isError:t.isError}),a.markDirty(s),e.pendingTools.delete(t.toolCallId),this.ctx.layout.requestRender());break}case"agent_end":{y("agent_end received");const s=e.agentRunStartMs!==void 0?this.ctx.loaders.formatElapsedSeconds(Date.now()-e.agentRunStartMs):void 0;this.ctx.loaders.stopAgentRunTimer(),e.agentRunStartMs=void 0,e.workingMessageOverride=void 0,e.loadingAnimation&&(e.loadingAnimation.stop(),e.loadingAnimation=void 0,o.clear()),e.streamingComponent&&(a.removeChild(e.streamingComponent),e.streamingComponent=void 0,e.streamingMessage=void 0),e.pendingTools.clear(),e.subAgentPanelComponent&&(o.removeChild(e.subAgentPanelComponent),e.subAgentPanelComponent=void 0),e.subAgentStates.clear(),e.planProgressPanel&&(o.removeChild(e.planProgressPanel),e.planProgressPanel=void 0),e.planProgress=void 0,e.taskStatusPanel&&(o.removeChild(e.taskStatusPanel),e.taskStatusPanel=void 0),this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0),this.ctx.runtime.clearAttachments(),this.ctx.loaders.setBuddyPetState("happy","Done!",{resetTo:"idle",afterMs:1800}),s&&this.ctx.surface.showStatus(`Completed in ${s}`),await this.ctx.runtime.checkShutdownRequested(),this.ctx.surface.restoreEditorFocusIfPossible(),this.ctx.layout.requestRender();break}case"sub_agent_start":{const s={id:t.subAgentId,agentType:t.agentType,description:t.description,isAsync:t.isAsync,isResolved:!1,isError:!1,toolUseCount:0,lastToolName:null,startTime:Date.now()};e.subAgentStates.set(t.subAgentId,s),e.subAgentPanelComponent||(e.subAgentPanelComponent=new S(n,l),o.addChild(e.subAgentPanelComponent)),e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender();break}case"sub_agent_tool_start":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.lastToolName=t.toolName,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"sub_agent_tool_end":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.toolUseCount+=1,s.lastToolName=null,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"sub_agent_end":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.isResolved=!0,s.isError=!t.success,s.lastToolName=null,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"auto_compaction_start":{this.autoCompactionEscapeHandler=this.ctx.escape.getHandler(),this.ctx.escape.setHandler(()=>{this.ctx.runtime.abortCompaction()}),o.clear();const s=t.reason==="overflow"?"Context overflow detected, ":"";this.autoCompactionLoader=new g(n,l,`${s}Auto-compacting... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),o.addChild(this.autoCompactionLoader),this.ctx.layout.requestRender();break}case"auto_compaction_end":{this.autoCompactionEscapeHandler&&(this.ctx.escape.setHandler(this.autoCompactionEscapeHandler),this.autoCompactionEscapeHandler=void 0),this.autoCompactionLoader&&(this.autoCompactionLoader.stop(),this.autoCompactionLoader=void 0,o.clear()),t.aborted?this.ctx.surface.showStatus("Auto-compaction cancelled"):t.result?(a.clear(),this.ctx.layout.rebuildChatFromMessages(),this.ctx.layout.addMessageToChat({role:"compactionSummary",tokensBefore:t.result.tokensBefore,summary:t.result.summary,timestamp:Date.now()}),this.ctx.layout.invalidateFooter()):t.errorMessage&&(a.addChild(new A(1)),a.addChild(new h(l.fg("error",t.errorMessage),1,0))),this.ctx.runtime.flushCompactionQueue({willRetry:t.willRetry}),this.ctx.layout.requestRender();break}case"auto_retry_start":{this.retryEscapeHandler=this.ctx.escape.getHandler(),this.ctx.escape.setHandler(()=>{this.ctx.runtime.abortRetry()}),o.clear();const s=Math.round(t.delayMs/1e3);this.retryLoader=new g(n,l,`Retrying (${t.attempt}/${t.maxAttempts}) in ${s}s... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),o.addChild(this.retryLoader),this.ctx.layout.requestRender();break}case"auto_retry_end":{this.retryEscapeHandler&&(this.ctx.escape.setHandler(this.retryEscapeHandler),this.retryEscapeHandler=void 0),this.retryLoader&&(this.retryLoader.stop(),this.retryLoader=void 0,o.clear()),t.success||this.ctx.surface.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError||"Unknown error"}`),this.ctx.layout.requestRender();break}}}static TASK_TOOL_NAMES=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskStop","TaskDelete"]);async refreshTaskPanel(t,e,n){const a=this.ctx.runtime.getAgentDir();if(a)try{const o=await x(a,m),s=o.filter(d=>!d.metadata?._internal).map(d=>({id:d.id,subject:d.subject,status:d.status,activeForm:d.activeForm,blockedBy:d.blockedBy.filter(p=>o.some(c=>c.id===p&&c.status!=="completed"))}));if(s.length===0){t.taskStatusPanel&&(n.removeChild(t.taskStatusPanel),t.taskStatusPanel=void 0),this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0);return}t.taskStatusPanel||(t.taskStatusPanel=new R(e,l),n.addChild(t.taskStatusPanel)),t.taskStatusPanel.update(s),this.ctx.layout.requestRender(),s.every(d=>d.status==="completed")?this.taskAutoHideTimer||(this.taskAutoHideTimer=setTimeout(async()=>{this.taskAutoHideTimer=void 0;const d=await x(a,m).catch(()=>[]);d.length>0&&d.every(c=>c.status==="completed")&&await w(a,m).catch(()=>{})},H)):this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0)}catch{}}}const I=["Phase 1: Initial Understanding","Phase 2: Design","Phase 3: Review","Phase 4: Final Plan","Phase 5: Call ExitPlanMode"];function D(){return{phases:I.map((r,t)=>({label:r,status:t===0?"in_progress":"pending"})),currentPhaseIndex:0,startTime:Date.now()}}u(D,"createInitialPlanProgress");function L(r,t,e){let n;if(t==="ExitPlanMode"){for(const a of r.phases)a.status="completed";r.currentPhaseIndex=r.phases.length;return}if(t==="Agent")(e.subagent_type??"").toLowerCase()==="plan"?n=1:n=0;else if(t==="Read"||t==="Grep"||t==="Find")n=2;else if(t==="Write"||t==="Edit")n=3;else return void 0;if(n>r.currentPhaseIndex){for(let a=r.currentPhaseIndex;a<n;a++)r.phases[a].status="completed";r.currentPhaseIndex=n,r.phases[n].status="in_progress"}}u(L,"detectPlanPhaseTransition");export{z as StreamRenderController};
|
|
1
|
+
var P=Object.defineProperty;var u=(i,t)=>P(i,"name",{value:t,configurable:!0});import*as h from"node:fs";import*as A from"node:os";import*as f from"node:path";import{Spacer as b,Text as y}from"@pencil-agent/tui";import{AssistantMessageComponent as S}from"../components/assistant-message.js";import{PencilLoader as g}from"../components/pencil-loader.js";import{ToolExecutionComponent as x}from"../components/tool-execution.js";import{SubAgentPanelComponent as M}from"../components/sub-agent-panel.js";import{PlanProgressPanelComponent as R}from"../components/plan-progress-panel.js";import{TaskStatusPanelComponent as _}from"../components/task-status-panel.js";import{theme as l}from"../theme/theme.js";import{listTasks as T,onTasksUpdated as w,resetTaskList as E}from"../../../extensions/builtin/task/task-store.js";import{DEFAULT_TASK_LIST_ID as m}from"../../../extensions/builtin/task/task-types.js";const z=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskStop","TaskDelete"]),H=process.env.NANOPENCIL_DEBUG==="1",k=f.join(A.homedir(),".nanopencil","agent","nanopencil-debug.log");function C(i){if(H)try{h.mkdirSync(f.dirname(k),{recursive:!0}),h.appendFileSync(k,`[${new Date().toISOString()}] [render] ${i}
|
|
2
|
+
`)}catch{}}u(C,"dbg");const I=5e3;class Y{static{u(this,"StreamRenderController")}ctx;autoCompactionLoader=void 0;autoCompactionEscapeHandler=void 0;retryLoader=void 0;retryEscapeHandler=void 0;taskUpdateUnsubscribe=void 0;taskAutoHideTimer=void 0;constructor(t){this.ctx=t}async handle(t){C(`handle event: ${t.type}`),await this.ctx.surface.ensureInitialized(),this.ctx.layout.invalidateFooter();const e=this.ctx.state.get(),n=this.ctx.layout.getUi(),a=this.ctx.layout.getChatContainer(),o=this.ctx.layout.getStatusContainer();switch(t.type){case"agent_start":this.retryEscapeHandler&&(this.ctx.escape.setHandler(this.retryEscapeHandler),this.retryEscapeHandler=void 0),this.retryLoader&&(this.retryLoader.stop(),this.retryLoader=void 0),e.loadingAnimation&&e.loadingAnimation.stop(),o.clear(),e.loadingAnimation=new g(n,l,this.ctx.loaders.getDefaultWorkingMessage(),this.ctx.loaders.getSessionId()),o.addChild(e.loadingAnimation),this.ctx.loaders.setBuddyPetState("working","Working..."),e.pendingWorkingMessage!==void 0&&(e.workingMessageOverride=e.pendingWorkingMessage||void 0,e.pendingWorkingMessage=void 0),this.ctx.loaders.startAgentRunTimer(),this.ctx.loaders.updateWorkingMessage({resetStallTimer:!1}),this.ctx.loaders.isInPlanMode()&&(e.planProgress=L(),e.planProgressPanel=new R(n,l),o.addChild(e.planProgressPanel),e.planProgressPanel.update(e.planProgress)),this.refreshTaskPanel(e,n,o).catch(()=>{}),this.taskUpdateUnsubscribe?.(),this.taskUpdateUnsubscribe=w(()=>{this.refreshTaskPanel(e,n,o).catch(()=>{})}),this.ctx.surface.restoreEditorFocusIfPossible(),this.ctx.layout.requestRender();break;case"message_start":if(t.message.role==="custom")this.ctx.layout.addMessageToChat(t.message),this.ctx.layout.requestRender();else if(t.message.role==="user"){const s=this.ctx.surface.getUserMessageText(t.message);if(e.optimisticUserMessages.length>0&&e.optimisticUserMessages[0]?.text===s){e.optimisticUserMessages.shift(),this.ctx.layout.updatePendingMessagesDisplay(),this.ctx.layout.requestRender();break}this.ctx.layout.addMessageToChat(t.message),this.ctx.layout.updatePendingMessagesDisplay(),this.ctx.layout.requestRender()}else t.message.role==="assistant"&&(e.streamingComponent=new S(void 0,e.hideThinkingBlock,this.ctx.surface.getMarkdownThemeWithSettings()),e.streamingMessage=t.message,a.addChild(e.streamingComponent),e.streamingComponent.updateContent(e.streamingMessage),this.ctx.layout.requestRender());break;case"message_update":if(e.streamingComponent&&t.message.role==="assistant"){e.loadingAnimation&&e.loadingAnimation.resetStallTimer(),e.streamingMessage=t.message,e.streamingComponent.updateContent(e.streamingMessage),a.markDirty(e.streamingComponent);for(const s of e.streamingMessage.content)if(s.type==="toolCall"){if(!this.ctx.toolTrace.shouldRenderToolTrace(s.name))continue;if(e.pendingTools.has(s.id)){const r=e.pendingTools.get(s.id);r&&(r.updateArgs(s.arguments),a.markDirty(r))}else{a.addChild(new y("",0,0));const r=new x(s.name,s.arguments,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(s.name),n);r.setExpanded(e.toolOutputExpanded),a.addChild(r),e.pendingTools.set(s.id,r)}}this.ctx.layout.requestRender()}break;case"message_end":if(t.message.role==="user")break;if(e.streamingComponent&&t.message.role==="assistant"){e.streamingMessage=t.message;let s;if(e.streamingMessage.stopReason==="aborted"){const r=this.ctx.runtime.getRetryAttempt();s=r>0?`Aborted after ${r} retry attempt${r>1?"s":""}`:"Operation aborted",e.streamingMessage.errorMessage=s}if(e.streamingComponent.updateContent(e.streamingMessage),a.markDirty(e.streamingComponent),e.streamingMessage.stopReason==="aborted"||e.streamingMessage.stopReason==="error"){s||(s=e.streamingMessage.errorMessage||"Error");for(const[,r]of e.pendingTools.entries())r.updateResult({content:[{type:"text",text:s}],isError:!0}),a.markDirty(r);e.pendingTools.clear()}else for(const[,r]of e.pendingTools.entries())r.setArgsComplete(),a.markDirty(r);e.streamingComponent=void 0,e.streamingMessage=void 0,this.ctx.layout.invalidateFooter()}this.ctx.layout.requestRender();break;case"tool_execution_start":{if(e.planProgress&&e.planProgressPanel&&(q(e.planProgress,t.toolName,t.args),e.planProgressPanel.update(e.planProgress),this.ctx.layout.requestRender()),!this.ctx.toolTrace.shouldRenderToolTrace(t.toolName))break;if(!e.pendingTools.has(t.toolCallId)){const s=new x(t.toolName,t.args,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(t.toolName),n);s.setExpanded(e.toolOutputExpanded),a.addChild(s),e.pendingTools.set(t.toolCallId,s),this.ctx.layout.requestRender()}break}case"tool_execution_update":{const s=e.pendingTools.get(t.toolCallId);s&&(s.updateResult({...t.partialResult,isError:!1},!0),a.markDirty(s),this.ctx.layout.requestRender());break}case"tool_execution_end":{const s=e.pendingTools.get(t.toolCallId);s&&(s.updateResult({...t.result,isError:t.isError}),a.markDirty(s),e.pendingTools.delete(t.toolCallId),this.ctx.layout.requestRender());break}case"agent_end":{C("agent_end received");const s=e.agentRunStartMs!==void 0?this.ctx.loaders.formatElapsedSeconds(Date.now()-e.agentRunStartMs):void 0;this.ctx.loaders.stopAgentRunTimer(),e.agentRunStartMs=void 0,e.workingMessageOverride=void 0,e.loadingAnimation&&(e.loadingAnimation.stop(),e.loadingAnimation=void 0,o.clear()),e.streamingComponent&&(a.removeChild(e.streamingComponent),e.streamingComponent=void 0,e.streamingMessage=void 0),e.pendingTools.clear(),e.subAgentPanelComponent&&(o.removeChild(e.subAgentPanelComponent),e.subAgentPanelComponent=void 0),e.subAgentStates.clear(),e.planProgressPanel&&(o.removeChild(e.planProgressPanel),e.planProgressPanel=void 0),e.planProgress=void 0,e.taskStatusPanel&&(o.removeChild(e.taskStatusPanel),e.taskStatusPanel=void 0),this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0),this.ctx.runtime.clearAttachments(),this.ctx.loaders.setBuddyPetState("happy","Done!",{resetTo:"idle",afterMs:1800}),s&&this.ctx.surface.showStatus(`Completed in ${s}`),await this.ctx.runtime.checkShutdownRequested(),this.ctx.surface.restoreEditorFocusIfPossible(),this.ctx.layout.requestRender();break}case"sub_agent_start":{const s={id:t.subAgentId,agentType:t.agentType,description:t.description,isAsync:t.isAsync,isResolved:!1,isError:!1,toolUseCount:0,lastToolName:null,startTime:Date.now()};e.subAgentStates.set(t.subAgentId,s),e.subAgentPanelComponent||(e.subAgentPanelComponent=new M(n,l),o.addChild(e.subAgentPanelComponent)),e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender();break}case"sub_agent_tool_start":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.lastToolName=t.toolName,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"sub_agent_tool_end":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.toolUseCount+=1,s.lastToolName=null,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"sub_agent_end":{const s=e.subAgentStates.get(t.subAgentId);s&&(s.isResolved=!0,s.isError=!t.success,s.lastToolName=null,e.subAgentPanelComponent&&e.subAgentPanelComponent.update(e.subAgentStates),this.ctx.layout.requestRender());break}case"auto_compaction_start":{this.autoCompactionEscapeHandler=this.ctx.escape.getHandler(),this.ctx.escape.setHandler(()=>{this.ctx.runtime.abortCompaction()}),o.clear();const s=t.reason==="overflow"?"Context overflow detected, ":"";this.autoCompactionLoader=new g(n,l,`${s}Auto-compacting... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),o.addChild(this.autoCompactionLoader),this.ctx.layout.requestRender();break}case"auto_compaction_end":{this.autoCompactionEscapeHandler&&(this.ctx.escape.setHandler(this.autoCompactionEscapeHandler),this.autoCompactionEscapeHandler=void 0),this.autoCompactionLoader&&(this.autoCompactionLoader.stop(),this.autoCompactionLoader=void 0,o.clear()),t.aborted?this.ctx.surface.showStatus("Auto-compaction cancelled"):t.result?(a.clear(),this.ctx.layout.rebuildChatFromMessages(),this.ctx.layout.addMessageToChat({role:"compactionSummary",tokensBefore:t.result.tokensBefore,summary:t.result.summary,timestamp:Date.now()}),this.ctx.layout.invalidateFooter()):t.errorMessage&&(a.addChild(new b(1)),a.addChild(new y(l.fg("error",t.errorMessage),1,0))),this.ctx.runtime.flushCompactionQueue({willRetry:t.willRetry}),this.ctx.layout.requestRender();break}case"auto_retry_start":{this.retryEscapeHandler=this.ctx.escape.getHandler(),this.ctx.escape.setHandler(()=>{this.ctx.runtime.abortRetry()}),o.clear();const s=Math.round(t.delayMs/1e3);this.retryLoader=new g(n,l,`Retrying (${t.attempt}/${t.maxAttempts}) in ${s}s... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),o.addChild(this.retryLoader),this.ctx.layout.requestRender();break}case"auto_retry_end":{this.retryEscapeHandler&&(this.ctx.escape.setHandler(this.retryEscapeHandler),this.retryEscapeHandler=void 0),this.retryLoader&&(this.retryLoader.stop(),this.retryLoader=void 0,o.clear()),t.success||this.ctx.surface.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError||"Unknown error"}`),this.ctx.layout.requestRender();break}}}static TASK_TOOL_NAMES=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskStop","TaskDelete"]);async refreshTaskPanel(t,e,n){const a=this.ctx.runtime.getAgentDir();if(a)try{const o=await T(a,m),s=o.filter(d=>!d.metadata?._internal).map(d=>({id:d.id,subject:d.subject,status:d.status,activeForm:d.activeForm,blockedBy:d.blockedBy.filter(p=>o.some(c=>c.id===p&&c.status!=="completed"))}));if(s.length===0){t.taskStatusPanel&&(n.removeChild(t.taskStatusPanel),t.taskStatusPanel=void 0),this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0);return}t.taskStatusPanel||(t.taskStatusPanel=new _(e,l),n.addChild(t.taskStatusPanel)),t.taskStatusPanel.update(s),this.ctx.layout.requestRender(),s.every(d=>d.status==="completed")?this.taskAutoHideTimer||(this.taskAutoHideTimer=setTimeout(async()=>{this.taskAutoHideTimer=void 0;const d=await T(a,m).catch(()=>[]);d.length>0&&d.every(c=>c.status==="completed")&&await E(a,m).catch(()=>{})},I)):this.taskAutoHideTimer&&(clearTimeout(this.taskAutoHideTimer),this.taskAutoHideTimer=void 0)}catch{}}}const D=["Phase 1: Initial Understanding","Phase 2: Design","Phase 3: Review","Phase 4: Final Plan","Phase 5: Call ExitPlanMode"];function L(){return{phases:D.map((i,t)=>({label:i,status:t===0?"in_progress":"pending"})),currentPhaseIndex:0,startTime:Date.now()}}u(L,"createInitialPlanProgress");function q(i,t,e){let n;if(t==="ExitPlanMode"){for(const a of i.phases)a.status="completed";i.currentPhaseIndex=i.phases.length;return}if(t==="Agent")(e.subagent_type??"").toLowerCase()==="plan"?n=1:n=0;else if(t==="Read"||t==="Grep"||t==="Find")n=2;else if(t==="Write"||t==="Edit")n=3;else return void 0;if(n>i.currentPhaseIndex){for(let a=i.currentPhaseIndex;a<n;a++)i.phases[a].status="completed";i.currentPhaseIndex=n,i.phases[n].status="in_progress"}}u(q,"detectPlanPhaseTransition");export{Y as StreamRenderController};
|