@pencil-agent/nano-pencil 2.0.0-beta.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/extensions-host/index.d.ts +1 -1
  7. package/dist/core/extensions-host/loader.js +1 -1
  8. package/dist/core/extensions-host/runner.d.ts +1 -0
  9. package/dist/core/extensions-host/runner.js +2 -2
  10. package/dist/core/extensions-host/types.d.ts +17 -22
  11. package/dist/core/lib/ai/src/types.d.ts +12 -2
  12. package/dist/core/persona/persona-manager.js +5 -2
  13. package/dist/core/runtime/agent-session.js +3 -3
  14. package/dist/core/runtime/extension-core-bindings.d.ts +1 -0
  15. package/dist/core/runtime/extension-core-bindings.js +2 -2
  16. package/dist/extensions/builtin/AGENT.md +115 -115
  17. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  18. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  19. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  20. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  91. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  92. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  93. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  94. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  95. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  96. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  97. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  98. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  99. package/dist/extensions/builtin/browser/browser.md +73 -73
  100. package/dist/extensions/builtin/browser/install.md +142 -142
  101. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  102. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  103. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  104. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  105. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  107. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  108. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  109. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  110. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  111. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  112. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  113. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  114. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  115. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  116. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  117. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  118. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  119. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  120. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  121. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  122. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  123. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  124. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  125. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  126. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  127. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  128. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  129. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  130. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  131. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  132. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  133. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  134. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  135. package/dist/extensions/builtin/goal/README.md +67 -67
  136. package/dist/extensions/builtin/goal/goal-controller.d.ts +39 -10
  137. package/dist/extensions/builtin/goal/goal-controller.js +1 -1
  138. package/dist/extensions/builtin/goal/goal-format.js +1 -1
  139. package/dist/extensions/builtin/goal/goal-prompts.d.ts +2 -0
  140. package/dist/extensions/builtin/goal/goal-prompts.js +5 -4
  141. package/dist/extensions/builtin/goal/goal-store.js +1 -1
  142. package/dist/extensions/builtin/goal/index.d.ts +1 -1
  143. package/dist/extensions/builtin/goal/index.js +10 -7
  144. package/dist/extensions/builtin/grub/README.md +112 -112
  145. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  146. package/dist/extensions/builtin/link-world/index.js +6 -6
  147. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  148. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  149. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  150. package/dist/extensions/builtin/link-world/{network-routing.md → network-routing/network-routing.md} +67 -67
  151. package/dist/extensions/builtin/loop/README.md +92 -92
  152. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  153. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  154. package/dist/extensions/builtin/plan/index.js +1 -1
  155. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  156. package/dist/extensions/builtin/sal/README.md +72 -72
  157. package/dist/extensions/builtin/security-audit/README.md +289 -289
  158. package/dist/extensions/builtin/task/task-store.d.ts +4 -0
  159. package/dist/extensions/builtin/task/task-store.js +1 -1
  160. package/dist/extensions/builtin/team/AGENT.md +112 -112
  161. package/dist/extensions/builtin/team/TESTING.md +299 -299
  162. package/dist/extensions/builtin/token-save/README.md +56 -56
  163. package/dist/extensions/optional/AGENT.md +10 -10
  164. package/dist/index.d.ts +5 -30
  165. package/dist/index.js +1 -1
  166. package/dist/models.d.ts +7 -0
  167. package/dist/models.js +1 -0
  168. package/dist/modes/interactive/components/footer.js +1 -1
  169. package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
  170. package/dist/modes/interactive/components/task-status-panel.js +1 -0
  171. package/dist/modes/interactive/controllers/stream-render-controller.d.ts +7 -0
  172. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  173. package/dist/modes/interactive/interactive-mode.js +40 -40
  174. package/dist/modes/interactive/state/interactive-state.d.ts +2 -0
  175. package/dist/modes/interactive/state/interactive-state.js +1 -1
  176. package/dist/modes/interactive/theme/dark.json +85 -85
  177. package/dist/modes/interactive/theme/light.json +84 -84
  178. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  179. package/dist/modes/interactive/theme/warm.json +81 -81
  180. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  181. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  182. package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.js +2 -2
  183. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.js +5 -5
  184. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.js +1 -1
  185. package/dist/node_modules/@pencil-agent/ai/dist/stream.js +1 -1
  186. package/dist/packages/protocol/src/commands.d.ts +33 -0
  187. package/dist/packages/protocol/src/flags.d.ts +20 -0
  188. package/dist/packages/protocol/src/hooks.d.ts +17 -0
  189. package/dist/packages/protocol/src/hooks.js +0 -0
  190. package/dist/packages/{extension-sdk → protocol}/src/index.d.ts +7 -4
  191. package/dist/packages/protocol/src/index.js +1 -0
  192. package/dist/packages/{extension-sdk → protocol}/src/lifecycle.d.ts +15 -27
  193. package/dist/packages/protocol/src/lifecycle.js +0 -0
  194. package/dist/packages/{extension-sdk → protocol}/src/tools.d.ts +1 -1
  195. package/dist/packages/protocol/src/tools.js +0 -0
  196. package/dist/public-config.d.ts +12 -0
  197. package/dist/public-config.js +1 -0
  198. package/dist/runtime.d.ts +9 -0
  199. package/dist/runtime.js +1 -0
  200. package/dist/session-compaction.d.ts +7 -0
  201. package/dist/session-compaction.js +1 -0
  202. package/dist/session.d.ts +7 -0
  203. package/dist/session.js +1 -0
  204. package/dist/skills.d.ts +7 -0
  205. package/dist/skills.js +1 -0
  206. package/dist/tools.d.ts +7 -0
  207. package/dist/tools.js +1 -0
  208. 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
  209. package/docs/SDK-TESTING.md +364 -0
  210. package/docs/codex-goal-command-impl.md +1055 -1055
  211. package/docs/codex-goal-vs-grub.md +500 -500
  212. package/docs/custom-provider.md +27 -27
  213. package/docs/extensions.md +27 -27
  214. package/docs/keybindings.md +27 -27
  215. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  216. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  217. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  218. 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
  219. 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
  220. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  221. package/docs/loop-usage-examples.md +214 -214
  222. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  223. package/docs/models.md +27 -27
  224. package/docs/packages.md +27 -27
  225. package/docs/pi-design-philosophy.md +457 -457
  226. package/docs/planmode.md +1987 -1987
  227. package/docs/prompt-templates.md +27 -27
  228. package/docs/providers.md +27 -27
  229. package/docs/sdk.md +27 -27
  230. package/docs/skills.md +27 -27
  231. package/docs/startup-performance-optimization.md +301 -0
  232. package/docs/themes.md +27 -27
  233. package/docs/tui.md +27 -27
  234. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  235. package/package.json +190 -162
  236. package/dist/packages/extension-sdk/src/index.js +0 -1
  237. package/docs/cc-agent-design.md +0 -1297
  238. package/docs/cc-tui-design.md +0 -1333
  239. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  240. /package/dist/packages/{extension-sdk/src/lifecycle.js → protocol/src/commands.js} +0 -0
  241. /package/dist/packages/{extension-sdk/src/tools.js → protocol/src/flags.js} +0 -0
@@ -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
package/dist/index.d.ts CHANGED
@@ -1,34 +1,9 @@
1
1
  /**
2
- * [WHO]: Package barrel exports - NanoPencil public API
3
- * [FROM]: Depends on config, core/*, modes/*
4
- * [TO]: Consumed by external packages and internal extension loader
5
- * [HERE]: index.ts - main package entry point
2
+ * [WHO]: Stable root SDK exports for @pencil-agent/nano-pencil
3
+ * [FROM]: Depends on config, core/runtime/sdk, core/runtime/pencil-agent
4
+ * [TO]: Consumed by external SDK embedders via the package root
5
+ * [HERE]: index.ts - intentionally narrow root package entry; advanced APIs live in subpaths
6
6
  */
7
7
  export { getAgentDir, VERSION } from "./config.js";
8
- export { AgentSession, type AgentSessionConfig, type AgentSessionEvent, type AgentSessionEventListener, type ModelCycleResult, type ParsedSkillBlock, type PromptOptions, parseSkillBlock, type SessionStats, } from "./core/runtime/agent-session.js";
9
- export { type ApiKeyCredential, type AuthCredential, AuthStorage, type AuthStorageBackend, FileAuthStorageBackend, InMemoryAuthStorageBackend, type OAuthCredential, } from "./core/platform/config/auth-storage.js";
10
- export { type BranchPreparation, type BranchSummaryResult, type CollectEntriesResult, type CompactionResult, type CutPointResult, calculateContextTokens, collectEntriesForBranchSummary, compact, DEFAULT_COMPACTION_SETTINGS, estimateTokens, type FileOperations, findCutPoint, findTurnStartIndex, type GenerateBranchSummaryOptions, generateBranchSummary, generateSummary, getLastAssistantUsage, prepareBranchEntries, serializeConversation, shouldCompact, } from "./core/session/compaction/index.js";
11
- export { createEventBus, type EventBus, type EventBusController } from "./core/runtime/event-bus.js";
12
8
  export { PencilAgent, quickAgent, type PencilAgentOptions, } from "./core/runtime/pencil-agent.js";
13
- export { type SDKLogger, silentLogger, defaultLogger, } from "./core/runtime/sdk.js";
14
- export type { AgentEndEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppAction, BashToolCallEvent, BeforeAgentStartEvent, CompactOptions, ContextEvent, ContextUsage, CustomToolCallEvent, EditToolCallEvent, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, GrepToolCallEvent, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, MessageRenderer, MessageRenderOptions, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, RegisteredCommand, RegisteredTool, SessionBeforeCompactEvent, SessionBeforeForkEvent, SessionBeforeSwitchEvent, SessionBeforeTreeEvent, SessionCompactEvent, SessionForkEvent, SessionShutdownEvent, SessionStartEvent, SessionSwitchEvent, SessionTreeEvent, SlashCommandInfo, SlashCommandLocation, SlashCommandSource, TerminalInputHandler, ToolCallEvent, ToolDefinition, ToolInfo, ToolRenderResultOptions, ToolResultEvent, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WriteToolCallEvent, } from "./core/extensions-host/index.js";
15
- export { createExtensionRuntime, discoverAndLoadExtensions, ExtensionRunner, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isToolCallEventType, isWriteToolResult, wrapRegisteredTool, wrapRegisteredTools, wrapToolsWithExtensions, wrapToolWithExtensions, } from "./core/extensions-host/index.js";
16
- export type { ReadonlyFooterDataProvider } from "./modes/interactive/footer-data-provider.js";
17
- export { convertToLlm } from "./core/messages.js";
18
- export { ModelRegistry } from "./core/model-registry.js";
19
- export type { PackageManager, PathMetadata, ProgressCallback, ProgressEvent, ResolvedPaths, ResolvedResource, } from "./core/package-manager.js";
20
- export { DefaultPackageManager } from "./core/package-manager.js";
21
- export type { ResourceCollision, ResourceDiagnostic, ResourceLoader } from "./core/platform/config/resource-loader.js";
22
- export { DefaultResourceLoader } from "./core/platform/config/resource-loader.js";
23
- export { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, createBashTool, createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, type PromptTemplate, readOnlyTools, } from "./core/runtime/sdk.js";
24
- export { type BranchSummaryEntry, buildSessionContext, type CompactionEntry, CURRENT_SESSION_VERSION, type CustomEntry, type CustomMessageEntry, type FileEntry, getLatestCompactionEntry, type ModelChangeEntry, migrateSessionEntries, type NewSessionOptions, parseSessionEntries, type SessionContext, type SessionEntry, type SessionEntryBase, type SessionHeader, type SessionInfo, type SessionInfoEntry, SessionManager, type SessionMessageEntry, type ThinkingLevelChangeEntry, } from "./core/session/session-manager.js";
25
- export { type CompactionSettings, type ImageSettings, type PackageSource, type RetrySettings, SettingsManager, } from "./core/platform/config/settings-manager.js";
26
- export { formatSkillsForPrompt, type LoadSkillsFromDirOptions, type LoadSkillsResult, loadSkills, loadSkillsFromDir, type Skill, type SkillFrontmatter, } from "./core/skills.js";
27
- export { type BashOperations, type BashSpawnContext, type BashSpawnHook, type BashToolDetails, type BashToolInput, type BashToolOptions, bashTool, codingTools, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, type EditOperations, type EditToolDetails, type EditToolInput, type EditToolOptions, editTool, type FindOperations, type FindToolDetails, type FindToolInput, type FindToolOptions, findTool, formatSize, type GrepOperations, type GrepToolDetails, type GrepToolInput, type GrepToolOptions, grepTool, type LsOperations, type LsToolDetails, type LsToolInput, type LsToolOptions, lsTool, type ReadOperations, type ReadToolDetails, type ReadToolInput, type ReadToolOptions, readTool, type ToolsOptions, type TruncationOptions, type TruncationResult, truncateHead, truncateLine, truncateTail, type WriteOperations, type WriteToolInput, type WriteToolOptions, writeTool, } from "./core/tools/index.js";
28
- export { main } from "./main.js";
29
- export { InteractiveMode, type InteractiveModeOptions, type PrintModeOptions, runPrintMode, runRpcMode, } from "./modes/index.js";
30
- export { ArminComponent, AssistantMessageComponent, appKey, appKeyHint, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, editorKey, FooterComponent, keyHint, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, type RenderDiffOptions, rawKeyHint, renderDiff, SessionSelectorComponent, type SettingsCallbacks, type SettingsConfig, SettingsSelectorComponent, ShowImagesSelectorComponent, SkillInvocationMessageComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, type ToolExecutionOptions, TreeSelectorComponent, truncateToVisualLines, UserMessageComponent, UserMessageSelectorComponent, type VisualTruncateResult, } from "./modes/interactive/components/index.js";
31
- export { getLanguageFromPath, getMarkdownTheme, getSelectListTheme, getSettingsListTheme, highlightCode, initTheme, type Theme, type ThemeColor, } from "./modes/interactive/theme/theme.js";
32
- export { copyToClipboard } from "./modes/utils/clipboard.js";
33
- export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
34
- export { getShellConfig } from "./core/platform/utils/shell.js";
9
+ export { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, createBashTool, createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, defaultLogger, type PromptTemplate, readOnlyTools, type SDKLogger, silentLogger, } from "./core/runtime/sdk.js";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{getAgentDir as t,VERSION as r}from"./config.js";import{AgentSession as s,parseSkillBlock as a}from"./core/runtime/agent-session.js";import{AuthStorage as l,FileAuthStorageBackend as m,InMemoryAuthStorageBackend as p}from"./core/platform/config/auth-storage.js";import{calculateContextTokens as T,collectEntriesForBranchSummary as g,compact as S,DEFAULT_COMPACTION_SETTINGS as d,estimateTokens as u,findCutPoint as C,findTurnStartIndex as x,generateBranchSummary as f,generateSummary as E,getLastAssistantUsage as h,prepareBranchEntries as R,serializeConversation as L,shouldCompact as M}from"./core/session/compaction/index.js";import{createEventBus as y}from"./core/runtime/event-bus.js";import{PencilAgent as B,quickAgent as F}from"./core/runtime/pencil-agent.js";import{silentLogger as D,defaultLogger as w}from"./core/runtime/sdk.js";import{createExtensionRuntime as _,discoverAndLoadExtensions as v,ExtensionRunner as N,isBashToolResult as P,isEditToolResult as U,isFindToolResult as H,isGrepToolResult as K,isLsToolResult as W,isReadToolResult as b,isToolCallEventType as G,isWriteToolResult as V,wrapRegisteredTool as z,wrapRegisteredTools as X,wrapToolsWithExtensions as q,wrapToolWithExtensions as Y}from"./core/extensions-host/index.js";import{convertToLlm as J}from"./core/messages.js";import{ModelRegistry as Z}from"./core/model-registry.js";import{DefaultPackageManager as ee}from"./core/package-manager.js";import{DefaultResourceLoader as te}from"./core/platform/config/resource-loader.js";import{createAgentSession as ne,createBashTool as se,createCodingTools as ae,createEditTool as ie,createFindTool as le,createGrepTool as me,createLsTool as pe,createReadOnlyTools as ce,createReadTool as Te,createWriteTool as ge,readOnlyTools as Se}from"./core/runtime/sdk.js";import{buildSessionContext as ue,CURRENT_SESSION_VERSION as Ce,getLatestCompactionEntry as xe,migrateSessionEntries as fe,parseSessionEntries as Ee,SessionManager as he}from"./core/session/session-manager.js";import{SettingsManager as Le}from"./core/platform/config/settings-manager.js";import{formatSkillsForPrompt as Ae,loadSkills as ye,loadSkillsFromDir as ke}from"./core/skills.js";import{bashTool as Fe,codingTools as Ie,DEFAULT_MAX_BYTES as De,DEFAULT_MAX_LINES as we,editTool as Oe,findTool as _e,formatSize as ve,grepTool as Ne,lsTool as Pe,readTool as Ue,truncateHead as He,truncateLine as Ke,truncateTail as We,writeTool as be}from"./core/tools/index.js";import{main as Ve}from"./main.js";import{InteractiveMode as Xe,runPrintMode as qe,runRpcMode as Ye}from"./modes/index.js";import{ArminComponent as Je,AssistantMessageComponent as Qe,appKey as Ze,appKeyHint as $e,BashExecutionComponent as eo,BorderedLoader as oo,BranchSummaryMessageComponent as to,CompactionSummaryMessageComponent as ro,CustomEditor as no,CustomMessageComponent as so,DynamicBorder as ao,ExtensionEditorComponent as io,ExtensionInputComponent as lo,ExtensionSelectorComponent as mo,editorKey as po,FooterComponent as co,keyHint as To,LoginDialogComponent as go,ModelSelectorComponent as So,OAuthSelectorComponent as uo,rawKeyHint as Co,renderDiff as xo,SessionSelectorComponent as fo,SettingsSelectorComponent as Eo,ShowImagesSelectorComponent as ho,SkillInvocationMessageComponent as Ro,ThemeSelectorComponent as Lo,ThinkingSelectorComponent as Mo,ToolExecutionComponent as Ao,TreeSelectorComponent as yo,truncateToVisualLines as ko,UserMessageComponent as Bo,UserMessageSelectorComponent as Fo}from"./modes/interactive/components/index.js";import{getLanguageFromPath as Do,getMarkdownTheme as wo,getSelectListTheme as Oo,getSettingsListTheme as _o,highlightCode as vo,initTheme as No}from"./modes/interactive/theme/theme.js";import{copyToClipboard as Uo}from"./modes/utils/clipboard.js";import{parseFrontmatter as Ko,stripFrontmatter as Wo}from"./utils/frontmatter.js";import{getShellConfig as Go}from"./core/platform/utils/shell.js";export{s as AgentSession,Je as ArminComponent,Qe as AssistantMessageComponent,l as AuthStorage,eo as BashExecutionComponent,oo as BorderedLoader,to as BranchSummaryMessageComponent,Ce as CURRENT_SESSION_VERSION,ro as CompactionSummaryMessageComponent,no as CustomEditor,so as CustomMessageComponent,d as DEFAULT_COMPACTION_SETTINGS,De as DEFAULT_MAX_BYTES,we as DEFAULT_MAX_LINES,ee as DefaultPackageManager,te as DefaultResourceLoader,ao as DynamicBorder,io as ExtensionEditorComponent,lo as ExtensionInputComponent,N as ExtensionRunner,mo as ExtensionSelectorComponent,m as FileAuthStorageBackend,co as FooterComponent,p as InMemoryAuthStorageBackend,Xe as InteractiveMode,go as LoginDialogComponent,Z as ModelRegistry,So as ModelSelectorComponent,uo as OAuthSelectorComponent,B as PencilAgent,he as SessionManager,fo as SessionSelectorComponent,Le as SettingsManager,Eo as SettingsSelectorComponent,ho as ShowImagesSelectorComponent,Ro as SkillInvocationMessageComponent,Lo as ThemeSelectorComponent,Mo as ThinkingSelectorComponent,Ao as ToolExecutionComponent,yo as TreeSelectorComponent,Bo as UserMessageComponent,Fo as UserMessageSelectorComponent,r as VERSION,Ze as appKey,$e as appKeyHint,Fe as bashTool,ue as buildSessionContext,T as calculateContextTokens,Ie as codingTools,g as collectEntriesForBranchSummary,S as compact,J as convertToLlm,Uo as copyToClipboard,ne as createAgentSession,se as createBashTool,ae as createCodingTools,ie as createEditTool,y as createEventBus,_ as createExtensionRuntime,le as createFindTool,me as createGrepTool,pe as createLsTool,ce as createReadOnlyTools,Te as createReadTool,ge as createWriteTool,w as defaultLogger,v as discoverAndLoadExtensions,Oe as editTool,po as editorKey,u as estimateTokens,C as findCutPoint,_e as findTool,x as findTurnStartIndex,ve as formatSize,Ae as formatSkillsForPrompt,f as generateBranchSummary,E as generateSummary,t as getAgentDir,Do as getLanguageFromPath,h as getLastAssistantUsage,xe as getLatestCompactionEntry,wo as getMarkdownTheme,Oo as getSelectListTheme,_o as getSettingsListTheme,Go as getShellConfig,Ne as grepTool,vo as highlightCode,No as initTheme,P as isBashToolResult,U as isEditToolResult,H as isFindToolResult,K as isGrepToolResult,W as isLsToolResult,b as isReadToolResult,G as isToolCallEventType,V as isWriteToolResult,To as keyHint,ye as loadSkills,ke as loadSkillsFromDir,Pe as lsTool,Ve as main,fe as migrateSessionEntries,Ko as parseFrontmatter,Ee as parseSessionEntries,a as parseSkillBlock,R as prepareBranchEntries,F as quickAgent,Co as rawKeyHint,Se as readOnlyTools,Ue as readTool,xo as renderDiff,qe as runPrintMode,Ye as runRpcMode,L as serializeConversation,M as shouldCompact,D as silentLogger,Wo as stripFrontmatter,He as truncateHead,Ke as truncateLine,We as truncateTail,ko as truncateToVisualLines,z as wrapRegisteredTool,X as wrapRegisteredTools,Y as wrapToolWithExtensions,q as wrapToolsWithExtensions,be as writeTool};
1
+ import{getAgentDir as r,VERSION as t}from"./config.js";import{PencilAgent as l,quickAgent as c}from"./core/runtime/pencil-agent.js";import{createAgentSession as g,createBashTool as T,createCodingTools as i,createEditTool as s,createFindTool as d,createGrepTool as f,createLsTool as p,createReadOnlyTools as A,createReadTool as m,createWriteTool as x,defaultLogger as L,readOnlyTools as O,silentLogger as R}from"./core/runtime/sdk.js";export{l as PencilAgent,t as VERSION,g as createAgentSession,T as createBashTool,i as createCodingTools,s as createEditTool,d as createFindTool,f as createGrepTool,p as createLsTool,A as createReadOnlyTools,m as createReadTool,x as createWriteTool,L as defaultLogger,r as getAgentDir,c as quickAgent,O as readOnlyTools,R as silentLogger};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * [WHO]: Public models subpath exports for model registry APIs
3
+ * [FROM]: Re-exports core/model-registry.js
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/models
5
+ * [HERE]: models.ts - package subpath entry for model APIs
6
+ */
7
+ export { ModelRegistry } from "./core/model-registry.js";
package/dist/models.js ADDED
@@ -0,0 +1 @@
1
+ import{ModelRegistry as r}from"./core/model-registry.js";export{r as ModelRegistry};
@@ -1 +1 @@
1
- var V=Object.defineProperty;var u=(s,e)=>V(s,"name",{value:e,configurable:!0});import{truncateToWidth as q,visibleWidth as k}from"@pencil-agent/tui";import{theme as r}from"../theme/theme.js";function w(s){return s.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}u(w,"sanitizeStatusText");function p(s){return s<1e3?s.toString():s<1e4?`${(s/1e3).toFixed(1)}k`:s<1e6?`${Math.round(s/1e3)}k`:s<1e7?`${(s/1e6).toFixed(1)}M`:`${Math.round(s/1e6)}M`}u(p,"formatTokens");function J(s,e=12){const o=Math.max(0,Math.floor(e)),i=Number.isFinite(s)?s:0,g=Math.min(100,Math.max(0,i)),$=Math.min(o,Math.max(0,Math.round(g/100*o))),C=Math.max(0,o-$),m=i>90?"error":i>70?"warning":"success";return r.fg("dim","[")+r.fg(m,"\u2588".repeat($))+r.fg("dim","\u2591".repeat(C))+r.fg("dim","]")}u(J,"renderContextProgressBar");class Y{static{u(this,"FooterComponent")}session;footerData;autoCompactEnabled=!0;showTokenStats=!0;constructor(e,o,i=!0){this.session=e,this.footerData=o,this.showTokenStats=i}setAutoCompactEnabled(e){this.autoCompactEnabled=e}setShowTokenStats(e){this.showTokenStats=e}invalidate(){}dispose(){}render(e){const o=this.session.state;let i=0,g=0,$=0,C=0,m=0;for(const t of this.session.sessionManager.getBranch())t.type==="message"&&t.message.role==="assistant"&&(i+=t.message.usage.input,g+=t.message.usage.output,$+=t.message.usage.cacheRead,C+=t.message.usage.cacheWrite,m+=t.message.usage.cost.total);const x=this.session.getContextUsage(),F=x?.contextWindow??o.model?.contextWindow??0,S=x?.percent??0,P=x?.percent!==null?S.toFixed(1):"?";let n=this.session.cwd;const W=process.env.HOME||process.env.USERPROFILE;W&&n.startsWith(W)&&(n=`~${n.slice(W.length)}`);const y=this.footerData.getGitBranch();y&&(n=`${n} (${y})`);const D=this.session.sessionManager.getSessionName();if(D&&(n=`${n} \u2022 ${D}`),n.length>e){const t=Math.floor(e/2)-2;if(t>1){const d=n.slice(0,t),c=n.slice(-(t-1));n=`${d}...${c}`}else n=n.slice(0,Math.max(1,e))}const h=[];if(this.showTokenStats){i&&h.push(`\u2191${p(i)}`),g&&h.push(`\u2193${p(g)}`);const t=o.model?this.session.modelRegistry.isUsingOAuth(o.model):!1;if(m||t){const d=`$${m.toFixed(3)}${t?" (sub)":""}`;h.push(d)}}let v;const B=this.autoCompactEnabled?" (auto)":"",N=x?.tokens??null;let L="";e>80&&S>0&&P!=="?"&&(L=`${J(S)} `);const A=P==="?"||N===null?`${L}?/${p(F)}${B}`:`${L}${P}% ${p(N??0)}/${p(F)}${B}`;S>90?v=r.fg("error",A):v=A,h.push(v);let a=h.join(" ");const R=o.model?.id||"no-model";let l=k(a);l>e&&(a=`${a.replace(/\x1b\[[0-9;]*m/g,"").substring(0,e-3)}...`,l=k(a));const T=2;let M=R;if(o.model?.reasoning){const t=o.thinkingLevel||"off";M=t==="off"?`${R} \u2022 thinking off`:`${R} \u2022 ${t}`}let f=M;this.footerData.getAvailableProviderCount()>1&&o.model&&(f=`(${o.model.provider}) ${M}`,l+T+k(f)>e&&(f=M));const O=k(f),j=l+T+O;let b;if(j<=e){const t=" ".repeat(e-l-O);b=a+t+f}else{const t=e-l-T;if(t>3){const c=f.replace(/\x1b\[[0-9;]*m/g,"").substring(0,t),E=" ".repeat(e-l-c.length);b=a+E+c}else b=a}const z=r.fg("dim",a),G=b.slice(a.length),H=r.fg("dim",G),U=[r.fg("dim",n),z+H],I=this.footerData.getExtensionStatuses();if(I.size>0){const d=Array.from(I.entries()).sort(([c],[E])=>c.localeCompare(E)).map(([,c])=>w(c)).join(" ");U.push(q(d,e,r.fg("dim","...")))}return U}}export{Y as FooterComponent,J as renderContextProgressBar};
1
+ var K=Object.defineProperty;var u=(s,e)=>K(s,"name",{value:e,configurable:!0});import{theme as o}from"../theme/theme.js";function Q(s){return s.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}u(Q,"sanitizeStatusText");function $(s){return s<1e3?s.toString():s<1e4?`${(s/1e3).toFixed(1)}k`:s<1e6?`${Math.round(s/1e3)}k`:s<1e7?`${(s/1e6).toFixed(1)}M`:`${Math.round(s/1e6)}M`}u($,"formatTokens");function X(s,e=12){const a=Math.max(0,Math.floor(e)),c=Number.isFinite(s)?s:0,p=Math.min(100,Math.max(0,c)),M=Math.min(a,Math.max(0,Math.round(p/100*a))),P=Math.max(0,a-M),x=c>90?"error":c>70?"warning":"success";return o.fg("dim","[")+o.fg(x,"\u2588".repeat(M))+o.fg("dim","\u2591".repeat(P))+o.fg("dim","]")}u(X,"renderContextProgressBar");class _{static{u(this,"FooterComponent")}session;footerData;autoCompactEnabled=!0;showTokenStats=!0;constructor(e,a,c=!0){this.session=e,this.footerData=a,this.showTokenStats=c}setAutoCompactEnabled(e){this.autoCompactEnabled=e}setShowTokenStats(e){this.showTokenStats=e}invalidate(){}dispose(){}render(e){const a=this.session.state;let c=0,p=0,M=0,P=0,x=0;for(const t of this.session.sessionManager.getBranch())t.type==="message"&&t.message.role==="assistant"&&(c+=t.message.usage.input,p+=t.message.usage.output,M+=t.message.usage.cacheRead,P+=t.message.usage.cacheWrite,x+=t.message.usage.cost.total);const S=this.session.getContextUsage(),T=S?.contextWindow??a.model?.contextWindow??0,k=S?.percent??0,v=S?.percent!==null?k.toFixed(1):"?";let n=this.session.cwd;const E=process.env.HOME||process.env.USERPROFILE;E&&n.startsWith(E)&&(n=`~${n.slice(E.length)}`);const y=this.footerData.getGitBranch();y&&(n=`${n} (${y})`);const D=this.session.sessionManager.getSessionName();D&&(n=`${n} \u2022 ${D}`);const f=[];if(this.showTokenStats){c&&f.push(`\u2191${$(c)}`),p&&f.push(`\u2193${$(p)}`);const t=a.model?this.session.modelRegistry.isUsingOAuth(a.model):!1;if(x||t){const l=`$${x.toFixed(3)}${t?" (sub)":""}`;f.push(l)}}const A=this.autoCompactEnabled?" (auto)":"",B=S?.tokens??null;let F="";e>80&&k>0&&v!=="?"&&(F=`${X(k)} `);const R=v==="?"||B===null?`${F}?/${$(T)}${A}`:`${F}${v}% ${$(B??0)}/${$(T)}${A}`;k>90?f.push(o.fg("error",R)):f.push(R);const d=f.join(" "),N=a.model?.id||"no-model";let m=N;if(a.model?.reasoning){const t=a.thinkingLevel||"off";m=t==="off"?`${N} \u2022 thinking off`:`${N} \u2022 ${t}`}this.footerData.getAvailableProviderCount()>1&&a.model&&(m=`(${a.model.provider}) ${m}`);let h="";const O=this.footerData.getExtensionStatuses();O.size>0&&(h=Array.from(O.entries()).sort(([l],[J])=>l.localeCompare(J)).map(([,l])=>Q(l)).join(" "));const r=o.fg("dim"," \xB7 "),i=3,U=u(t=>t.replace(/\x1b\[[0-9;]*m/g,""),"stripAnsi"),C=n.length,g=U(d).length,W=U(m).length,w=h.length,I=h?r+h:"",L=C+i+g+i+W+(h?i+w:0);if(L<=e){const t=" ".repeat(Math.max(0,e-L));return[o.fg("dim",n)+r+d+r+o.fg("dim",m)+I+t]}const j=C+i+g+i+W;if(j<=e){const t=" ".repeat(Math.max(0,e-j));return[o.fg("dim",n)+r+d+r+o.fg("dim",m)+t]}const z=C+i+g+(h?i+w:0);if(z<=e){const t=" ".repeat(Math.max(0,e-z));return[o.fg("dim",n)+r+d+I+t]}const G=C+i+g;if(G<=e){const t=" ".repeat(Math.max(0,e-G));return[o.fg("dim",n)+r+d+t]}const H=Math.max(10,e-i-g-i-Math.min(W,10)),b=n.length>H?n.slice(0,H-1)+"\u2026":n,V=e-b.length-i-g;if(V>i+3){const t=" ".repeat(Math.max(0,V-i-W));return[o.fg("dim",b)+r+d+r+o.fg("dim",m)+t]}const q=" ".repeat(Math.max(0,e-b.length-i-g));return[o.fg("dim",b)+r+d+q]}}export{_ as FooterComponent,X as renderContextProgressBar};
@@ -0,0 +1,36 @@
1
+ /**
2
+ * [WHO]: TaskStatusPanelComponent - renders persistent task status with checkboxes
3
+ * [FROM]: Depends on @pencil-agent/tui, extensions/builtin/task/task-store
4
+ * [TO]: Consumed by StreamRenderController
5
+ * [HERE]: modes/interactive/components/task-status-panel.ts - CC-style task status TUI panel
6
+ */
7
+ import { Container, type TUI } from "@pencil-agent/tui";
8
+ import type { Theme } from "../theme/theme.js";
9
+ export interface TaskStatusEntry {
10
+ id: string;
11
+ subject: string;
12
+ status: "pending" | "in_progress" | "completed";
13
+ activeForm?: string;
14
+ blockedBy?: string[];
15
+ }
16
+ export declare class TaskStatusPanelComponent extends Container {
17
+ private tui;
18
+ private theme;
19
+ private spinnerFrame;
20
+ private headerText;
21
+ private taskLines;
22
+ private overflowLine;
23
+ private lastTasks;
24
+ constructor(tui: TUI, theme: Theme);
25
+ /** Rebuild the panel from current task list. */
26
+ update(tasks: TaskStatusEntry[]): void;
27
+ /**
28
+ * Prioritize tasks for display:
29
+ * 1. in_progress (most important — user needs to see what's happening)
30
+ * 2. pending (what's next)
31
+ * 3. completed (least important, show most recent first)
32
+ */
33
+ private prioritizeTasks;
34
+ /** Get the last known tasks. */
35
+ getLastTasks(): TaskStatusEntry[];
36
+ }
@@ -0,0 +1 @@
1
+ var y=Object.defineProperty;var c=(T,t)=>y(T,"name",{value:t,configurable:!0});import{Container as I,Spacer as F,Text as g,truncateToWidth as j}from"@pencil-agent/tui";const L=["\u28FE","\u28FD","\u28FB","\u28BF","\u287F","\u28DF","\u28EF","\u28F7"],B=10,M=3;class V extends I{static{c(this,"TaskStatusPanelComponent")}tui;theme;spinnerFrame=0;headerText;taskLines=[];overflowLine;lastTasks=[];constructor(t,i){super(),this.tui=t,this.theme=i,this.headerText=new g("",0,0),this.addChild(new F(1)),this.addChild(this.headerText)}update(t){this.lastTasks=t;for(const e of this.taskLines)super.removeChild(e);if(this.taskLines=[],this.overflowLine&&(super.removeChild(this.overflowLine),this.overflowLine=void 0),t.length===0){this.headerText.setText("");return}const i=t.filter(e=>e.status==="completed").length,l=t.filter(e=>e.status==="in_progress").length,a=t.length-i-l,m=l>0,n=i===t.length;m&&(this.spinnerFrame=(this.spinnerFrame+1)%L.length);const b=m?this.theme.fg("accent",L[this.spinnerFrame]):n?this.theme.fg("success","\u2714"):this.theme.fg("dim","\u25FC"),p=[];i>0&&p.push(`${i} done`),l>0&&p.push(`${l} in progress`),a>0&&p.push(`${a} open`);const w=p.join(", ");this.headerText.setText(` ${b} ${this.theme.bold("Tasks")} ${this.theme.fg("dim",`(${w})`)}`);const v=this.tui.terminal?.rows??24,f=Math.min(B,Math.max(M,v-14)),S=this.prioritizeTasks(t,f).slice(0,f),x=t.length-f,_=this.tui.terminal?.columns??80,C=Math.max(_-10,20);for(const e of S){let o,h;e.status==="completed"?(o=this.theme.fg("success","\u2714"),h=c(r=>this.theme.fg("dim",r),"subjectStyle")):e.status==="in_progress"?(o=this.theme.fg("accent","\u25FC"),h=c(r=>this.theme.bold(r),"subjectStyle")):(o=this.theme.fg("dim","\u25FB"),h=c(r=>this.theme.fg("dim",r),"subjectStyle"));const u=e.status==="in_progress"&&e.activeForm?e.activeForm:e.subject,d=j(u,C,"\u2026");let s=` ${o} ${h(d)}`;if(e.blockedBy&&e.blockedBy.length>0&&e.status!=="completed"){const r=e.blockedBy.map(k=>`#${k}`).join(", ");s+=this.theme.fg("dim",` \u23BF blocked by ${r}`)}const $=new g(s,0,0);this.taskLines.push($),this.addChild($)}if(x>0){const e=t.slice(f),o=e.filter(s=>s.status==="in_progress").length,h=e.filter(s=>s.status==="pending").length,u=e.filter(s=>s.status==="completed").length,d=[];o>0&&d.push(`${o} in progress`),h>0&&d.push(`${h} pending`),u>0&&d.push(`${u} completed`),this.overflowLine=new g(this.theme.fg("dim",` \u2026 +${x} ${d.join(", ")}`),0,0),this.addChild(this.overflowLine)}}prioritizeTasks(t,i){const l=t.filter(n=>n.status==="in_progress"),a=t.filter(n=>n.status==="pending"),m=t.filter(n=>n.status==="completed");return[...l,...a,...m]}getLastTasks(){return this.lastTasks}}export{V as TaskStatusPanelComponent};
@@ -69,6 +69,7 @@ export interface StreamRenderRuntimePort {
69
69
  }): void;
70
70
  checkShutdownRequested(): Promise<void>;
71
71
  clearAttachments(): void;
72
+ getAgentDir(): string;
72
73
  }
73
74
  /** The single controlled channel onto defaultEditor.onEscape, shared with InterruptController. */
74
75
  export interface StreamRenderEscapePort {
@@ -98,6 +99,12 @@ export declare class StreamRenderController {
98
99
  private autoCompactionEscapeHandler;
99
100
  private retryLoader;
100
101
  private retryEscapeHandler;
102
+ private taskUpdateUnsubscribe;
103
+ private taskAutoHideTimer;
101
104
  constructor(ctx: StreamRenderContext);
102
105
  handle(event: AgentSessionEvent): Promise<void>;
106
+ /** Task tool names that should trigger a panel refresh. */
107
+ private static readonly TASK_TOOL_NAMES;
108
+ /** Refresh the task status panel from disk. */
109
+ private refreshTaskPanel;
103
110
  }
@@ -1,2 +1,2 @@
1
- var m=Object.defineProperty;var l=(r,t)=>m(r,"name",{value:t,configurable:!0});import*as h from"node:fs";import*as f from"node:os";import*as x from"node:path";import{Spacer as y,Text as u}from"@pencil-agent/tui";import{AssistantMessageComponent as C}from"../components/assistant-message.js";import{PencilLoader as c}from"../components/pencil-loader.js";import{ToolExecutionComponent as g}from"../components/tool-execution.js";import{SubAgentPanelComponent as P}from"../components/sub-agent-panel.js";import{PlanProgressPanelComponent as b}from"../components/plan-progress-panel.js";import{theme as d}from"../theme/theme.js";const A=x.join(f.homedir(),".nanopencil","agent","nanopencil-debug.log");function p(r){h.appendFileSync(A,`[${new Date().toISOString()}] [render] ${r}
2
- `)}l(p,"dbg");class L{static{l(this,"StreamRenderController")}ctx;autoCompactionLoader=void 0;autoCompactionEscapeHandler=void 0;retryLoader=void 0;retryEscapeHandler=void 0;constructor(t){this.ctx=t}async handle(t){p(`handle event: ${t.type}`),await this.ctx.surface.ensureInitialized(),this.ctx.layout.invalidateFooter();const e=this.ctx.state.get(),o=this.ctx.layout.getUi(),a=this.ctx.layout.getChatContainer(),i=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(),i.clear(),e.loadingAnimation=new c(o,d,this.ctx.loaders.getDefaultWorkingMessage(),this.ctx.loaders.getSessionId()),i.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=R(),e.planProgressPanel=new b(o,d),i.addChild(e.planProgressPanel),e.planProgressPanel.update(e.planProgress)),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 C(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 n=e.pendingTools.get(s.id);n&&(n.updateArgs(s.arguments),a.markDirty(n))}else{a.addChild(new u("",0,0));const n=new g(s.name,s.arguments,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(s.name),o);n.setExpanded(e.toolOutputExpanded),a.addChild(n),e.pendingTools.set(s.id,n)}}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 n=this.ctx.runtime.getRetryAttempt();s=n>0?`Aborted after ${n} retry attempt${n>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[,n]of e.pendingTools.entries())n.updateResult({content:[{type:"text",text:s}],isError:!0}),a.markDirty(n);e.pendingTools.clear()}else for(const[,n]of e.pendingTools.entries())n.setArgsComplete(),a.markDirty(n);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&&(M(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 g(t.toolName,t.args,{showImages:this.ctx.toolTrace.getShowImages()},this.ctx.toolTrace.getRegisteredToolDefinition(t.toolName),o);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":{p("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,i.clear()),e.streamingComponent&&(a.removeChild(e.streamingComponent),e.streamingComponent=void 0,e.streamingMessage=void 0),e.pendingTools.clear(),e.subAgentPanelComponent&&(i.removeChild(e.subAgentPanelComponent),e.subAgentPanelComponent=void 0),e.subAgentStates.clear(),e.planProgressPanel&&(i.removeChild(e.planProgressPanel),e.planProgressPanel=void 0),e.planProgress=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 P(o,d),i.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()}),i.clear();const s=t.reason==="overflow"?"Context overflow detected, ":"";this.autoCompactionLoader=new c(o,d,`${s}Auto-compacting... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),i.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,i.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 y(1)),a.addChild(new u(d.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()}),i.clear();const s=Math.round(t.delayMs/1e3);this.retryLoader=new c(o,d,`Retrying (${t.attempt}/${t.maxAttempts}) in ${s}s... (${this.ctx.loaders.getInterruptKeyHint()} to cancel)`),i.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,i.clear()),t.success||this.ctx.surface.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError||"Unknown error"}`),this.ctx.layout.requestRender();break}}}}const T=["Phase 1: Initial Understanding","Phase 2: Design","Phase 3: Review","Phase 4: Final Plan","Phase 5: Call ExitPlanMode"];function R(){return{phases:T.map((r,t)=>({label:r,status:t===0?"in_progress":"pending"})),currentPhaseIndex:0,startTime:Date.now()}}l(R,"createInitialPlanProgress");function M(r,t,e){let o;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"?o=1:o=0;else if(t==="Read"||t==="Grep"||t==="Find")o=2;else if(t==="Write"||t==="Edit")o=3;else return void 0;if(o>r.currentPhaseIndex){for(let a=r.currentPhaseIndex;a<o;a++)r.phases[a].status="completed";r.currentPhaseIndex=o,r.phases[o].status="in_progress"}}l(M,"detectPlanPhaseTransition");export{L as StreamRenderController};
1
+ var T=Object.defineProperty;var u=(r,t)=>T(r,"name",{value:t,configurable:!0});import*as k from"node:fs";import*as C from"node:os";import*as P from"node:path";import{Spacer as A,Text as h}from"@pencil-agent/tui";import{AssistantMessageComponent as b}from"../components/assistant-message.js";import{PencilLoader as g}from"../components/pencil-loader.js";import{ToolExecutionComponent as f}from"../components/tool-execution.js";import{SubAgentPanelComponent as S}from"../components/sub-agent-panel.js";import{PlanProgressPanelComponent as M}from"../components/plan-progress-panel.js";import{TaskStatusPanelComponent as R}from"../components/task-status-panel.js";import{theme as l}from"../theme/theme.js";import{listTasks as x,onTasksUpdated as _,resetTaskList as w}from"../../../extensions/builtin/task/task-store.js";import{DEFAULT_TASK_LIST_ID as m}from"../../../extensions/builtin/task/task-types.js";const Q=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskStop","TaskDelete"]),E=P.join(C.homedir(),".nanopencil","agent","nanopencil-debug.log");function y(r){k.appendFileSync(E,`[${new Date().toISOString()}] [render] ${r}
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};