@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,67 +1,67 @@
1
- ---
2
- name: network-routing
3
- description: Decide whether a task should use NanoPencil's web_search, link_world tools, or browser automation.
4
- ---
5
-
6
- # Network Routing
7
-
8
- NanoPencil has two different network paths:
9
-
10
- - `web_search` and `web_fetch` when those high-level tools are actually available in the current session
11
- - `link_world_*` as the durable lower-level integration path
12
- - `browser` and `browser_admin` for direct browser control and page interaction
13
-
14
- Choose the path by task shape, not by habit.
15
-
16
- ## Use `web_search` First
17
-
18
- Use `web_search` when it is available and the user needs:
19
-
20
- - current facts
21
- - recent news
22
- - API/library documentation lookup
23
- - general web research
24
- - "what is", "find", "latest", "look up", "compare", or "summarize" style requests
25
-
26
- If setup is uncertain, call `link_world_admin` with `status` or `doctor` first.
27
-
28
- ## Use `web_fetch` When The URL Is Known
29
-
30
- Use `web_fetch` when it is available and:
31
-
32
- - the user already gave a URL
33
- - a prior search step found the exact page you need
34
- - you need page content, not browser interaction
35
- - the task is fetch-and-read rather than click-and-drive
36
-
37
- ## Use `browser` First
38
-
39
- Use `browser` when the user needs:
40
-
41
- - login-gated pages
42
- - clicking, typing, uploads, downloads, tabs, screenshots
43
- - form submission
44
- - navigating a live web app
45
- - inspecting visible UI state
46
- - browser-based verification
47
-
48
- If setup is uncertain, call `browser_admin` with `status` or `setup` first.
49
-
50
- ## Fallback Order
51
-
52
- 1. If `web_search` is available, use it for current knowledge discovery.
53
- 2. If `web_fetch` is available and the target URL is already known, use it.
54
- 3. If the answer requires interacting with a page, switch to `browser`.
55
- 4. If high-level link-world tools are unavailable but internet runtime is present, use `link_world_exec`.
56
- 5. Only fall back to `bash` for external CLIs when the dedicated tools are unavailable.
57
-
58
- ## Working Rule
59
-
60
- Prefer NanoPencil's named tools over raw shell commands. The integration boundary should stay inside:
61
-
62
- - `link_world_admin`
63
- - `web_search`
64
- - `web_fetch`
65
- - `link_world_exec`
66
- - `browser_admin`
67
- - `browser`
1
+ ---
2
+ name: network-routing
3
+ description: Decide whether a task should use NanoPencil's web_search, link_world tools, or browser automation.
4
+ ---
5
+
6
+ # Network Routing
7
+
8
+ NanoPencil has two different network paths:
9
+
10
+ - `web_search` and `web_fetch` when those high-level tools are actually available in the current session
11
+ - `link_world_*` as the durable lower-level integration path
12
+ - `browser` and `browser_admin` for direct browser control and page interaction
13
+
14
+ Choose the path by task shape, not by habit.
15
+
16
+ ## Use `web_search` First
17
+
18
+ Use `web_search` when it is available and the user needs:
19
+
20
+ - current facts
21
+ - recent news
22
+ - API/library documentation lookup
23
+ - general web research
24
+ - "what is", "find", "latest", "look up", "compare", or "summarize" style requests
25
+
26
+ If setup is uncertain, call `link_world_admin` with `status` or `doctor` first.
27
+
28
+ ## Use `web_fetch` When The URL Is Known
29
+
30
+ Use `web_fetch` when it is available and:
31
+
32
+ - the user already gave a URL
33
+ - a prior search step found the exact page you need
34
+ - you need page content, not browser interaction
35
+ - the task is fetch-and-read rather than click-and-drive
36
+
37
+ ## Use `browser` First
38
+
39
+ Use `browser` when the user needs:
40
+
41
+ - login-gated pages
42
+ - clicking, typing, uploads, downloads, tabs, screenshots
43
+ - form submission
44
+ - navigating a live web app
45
+ - inspecting visible UI state
46
+ - browser-based verification
47
+
48
+ If setup is uncertain, call `browser_admin` with `status` or `setup` first.
49
+
50
+ ## Fallback Order
51
+
52
+ 1. If `web_search` is available, use it for current knowledge discovery.
53
+ 2. If `web_fetch` is available and the target URL is already known, use it.
54
+ 3. If the answer requires interacting with a page, switch to `browser`.
55
+ 4. If high-level link-world tools are unavailable but internet runtime is present, use `link_world_exec`.
56
+ 5. Only fall back to `bash` for external CLIs when the dedicated tools are unavailable.
57
+
58
+ ## Working Rule
59
+
60
+ Prefer NanoPencil's named tools over raw shell commands. The integration boundary should stay inside:
61
+
62
+ - `link_world_admin`
63
+ - `web_search`
64
+ - `web_fetch`
65
+ - `link_world_exec`
66
+ - `browser_admin`
67
+ - `browser`
@@ -1,92 +1,92 @@
1
- # Loop Extension
2
-
3
- `/loop` schedules a recurring prompt or slash command for the current session.
4
- Uses the unified **cron scheduler** architecture per the refactoring plan.
5
-
6
- For the autonomous "keep digging until done" runner, see the sibling
7
- [`grub` extension](../grub/README.md).
8
-
9
- ## Architecture
10
-
11
- ```
12
- /loop command ──→ addCronTask ──→ unified store ──→ cron scheduler ──→ onFire ──→ dispatch
13
- │ │
14
- CronCreate tool file watcher (3s reload)
15
- CronDelete tool jitter + lock
16
- CronList tool 7-day expiry
17
- ```
18
-
19
- **Key design decisions**:
20
- - Single scheduler (cron scheduler) for all tasks
21
- - Single storage (`.nanopencil/cron-tasks.json` for durable, memory for session)
22
- - `/loop` command and CronCreate tool both use `addCronTask`
23
- - Enhanced features (--name, --max, --quiet, pause/resume) built on top
24
-
25
- ## Quick start
26
-
27
- ```
28
- /loop check the build # every 10m (default)
29
- /loop 5m /grub status # slash command every 5 minutes
30
- /loop every 10m Review test failures
31
- /loop Drink water every 30m --name hydrate --max 8 --quiet
32
- /loop Check build every 5m --durable # persists across sessions
33
- ```
34
-
35
- ## Manage
36
-
37
- ```
38
- /loop list # all scheduled loops
39
- /loop status <ref> # detail one loop (ref = name or id)
40
- /loop pause <ref>
41
- /loop resume <ref>
42
- /loop run <ref> # fire immediately
43
- /loop cancel <ref> # remove one
44
- /loop clear # remove all
45
- ```
46
-
47
- `<ref>` can be either the auto-generated id or the `--name` slug.
48
-
49
- ## Flags
50
-
51
- - `--name <slug>` — give the loop a friendly handle so you can `pause hydrate`
52
- instead of memorising hex ids.
53
- - `--max <n>` — auto-cancel after `n` runs.
54
- - `--quiet` (or `-q`) — suppress per-tick UI messages. Errors and terminal
55
- events still surface; routine ticks are still recorded via `appendEntry`.
56
- - `--durable` (or `-d`) — persist the loop across sessions. Durable loops are
57
- saved to `.nanopencil/cron-tasks.json` and will resume when you reopen the
58
- project.
59
-
60
- ## Notes
61
-
62
- - By default, loops are **session-scoped**: closing the session clears them.
63
- - Use `--durable` to persist loops across sessions.
64
- - Durable loops are stored in `.nanopencil/cron-tasks.json` in your project
65
- directory.
66
- - **Auto-expiry**: Durable loops automatically expire after 7 days to prevent
67
- zombie tasks from accumulating.
68
- - Due tasks wait for the agent to be idle; missed intervals collapse to one
69
- pending run.
70
- - Slash-command payloads are detected at parse time and dispatched through
71
- `executeCommand`; everything else is delivered through `sendUserMessage` as
72
- a follow-up turn.
73
- - After each loop tick the last assistant message is captured (truncated to
74
- 120 chars) and shown in `/loop status <ref>` as `Last output`.
75
- - Supports `s/m/h/d` durations and `hourly`/`daily` shortcuts.
76
- - **Jitter**: Tasks have deterministic jitter (based on task ID) to avoid
77
- traffic spikes at round times.
78
- - **Scheduler lock**: Multiple sessions in the same project use proper-lockfile
79
- to prevent duplicate task execution.
80
-
81
- ## Cron Tools
82
-
83
- The extension also registers three tools for the model to use directly:
84
-
85
- | Tool | Purpose |
86
- |------|---------|
87
- | `CronCreate` | Create a scheduled task with cron expression |
88
- | `CronDelete` | Delete a scheduled task by ID |
89
- | `CronList` | List all active scheduled tasks |
90
-
91
- This allows the model to create and manage scheduled tasks through natural
92
- language understanding, following the refactoring plan's architecture.
1
+ # Loop Extension
2
+
3
+ `/loop` schedules a recurring prompt or slash command for the current session.
4
+ Uses the unified **cron scheduler** architecture per the refactoring plan.
5
+
6
+ For the autonomous "keep digging until done" runner, see the sibling
7
+ [`grub` extension](../grub/README.md).
8
+
9
+ ## Architecture
10
+
11
+ ```
12
+ /loop command ──→ addCronTask ──→ unified store ──→ cron scheduler ──→ onFire ──→ dispatch
13
+ │ │
14
+ CronCreate tool file watcher (3s reload)
15
+ CronDelete tool jitter + lock
16
+ CronList tool 7-day expiry
17
+ ```
18
+
19
+ **Key design decisions**:
20
+ - Single scheduler (cron scheduler) for all tasks
21
+ - Single storage (`.nanopencil/cron-tasks.json` for durable, memory for session)
22
+ - `/loop` command and CronCreate tool both use `addCronTask`
23
+ - Enhanced features (--name, --max, --quiet, pause/resume) built on top
24
+
25
+ ## Quick start
26
+
27
+ ```
28
+ /loop check the build # every 10m (default)
29
+ /loop 5m /grub status # slash command every 5 minutes
30
+ /loop every 10m Review test failures
31
+ /loop Drink water every 30m --name hydrate --max 8 --quiet
32
+ /loop Check build every 5m --durable # persists across sessions
33
+ ```
34
+
35
+ ## Manage
36
+
37
+ ```
38
+ /loop list # all scheduled loops
39
+ /loop status <ref> # detail one loop (ref = name or id)
40
+ /loop pause <ref>
41
+ /loop resume <ref>
42
+ /loop run <ref> # fire immediately
43
+ /loop cancel <ref> # remove one
44
+ /loop clear # remove all
45
+ ```
46
+
47
+ `<ref>` can be either the auto-generated id or the `--name` slug.
48
+
49
+ ## Flags
50
+
51
+ - `--name <slug>` — give the loop a friendly handle so you can `pause hydrate`
52
+ instead of memorising hex ids.
53
+ - `--max <n>` — auto-cancel after `n` runs.
54
+ - `--quiet` (or `-q`) — suppress per-tick UI messages. Errors and terminal
55
+ events still surface; routine ticks are still recorded via `appendEntry`.
56
+ - `--durable` (or `-d`) — persist the loop across sessions. Durable loops are
57
+ saved to `.nanopencil/cron-tasks.json` and will resume when you reopen the
58
+ project.
59
+
60
+ ## Notes
61
+
62
+ - By default, loops are **session-scoped**: closing the session clears them.
63
+ - Use `--durable` to persist loops across sessions.
64
+ - Durable loops are stored in `.nanopencil/cron-tasks.json` in your project
65
+ directory.
66
+ - **Auto-expiry**: Durable loops automatically expire after 7 days to prevent
67
+ zombie tasks from accumulating.
68
+ - Due tasks wait for the agent to be idle; missed intervals collapse to one
69
+ pending run.
70
+ - Slash-command payloads are detected at parse time and dispatched through
71
+ `executeCommand`; everything else is delivered through `sendUserMessage` as
72
+ a follow-up turn.
73
+ - After each loop tick the last assistant message is captured (truncated to
74
+ 120 chars) and shown in `/loop status <ref>` as `Last output`.
75
+ - Supports `s/m/h/d` durations and `hourly`/`daily` shortcuts.
76
+ - **Jitter**: Tasks have deterministic jitter (based on task ID) to avoid
77
+ traffic spikes at round times.
78
+ - **Scheduler lock**: Multiple sessions in the same project use proper-lockfile
79
+ to prevent duplicate task execution.
80
+
81
+ ## Cron Tools
82
+
83
+ The extension also registers three tools for the model to use directly:
84
+
85
+ | Tool | Purpose |
86
+ |------|---------|
87
+ | `CronCreate` | Create a scheduled task with cron expression |
88
+ | `CronDelete` | Delete a scheduled task by ID |
89
+ | `CronList` | List all active scheduled tasks |
90
+
91
+ This allows the model to create and manage scheduled tasks through natural
92
+ language understanding, following the refactoring plan's architecture.
@@ -1,68 +1,68 @@
1
- ---
2
- name: figma-design
3
- description: Use this skill when the user wants NanoPencil to inspect, create, or edit designs in Figma through MCP.
4
- ---
5
-
6
- # Figma Design
7
-
8
- Use this skill when the user asks NanoPencil to:
9
-
10
- - Generate a design in Figma
11
- - Edit an existing Figma file
12
- - Turn requirements into Figma frames, components, or styles
13
- - Read design context from Figma before implementing UI
14
-
15
- ## Preferred integration path
16
-
17
- Prefer the official Figma Remote MCP server first. Use the desktop server as a fallback or as an additional local-context path.
18
-
19
- NanoPencil includes two built-in disabled MCP presets:
20
-
21
- - Server ID: `figma-remote`
22
- - URL: `https://mcp.figma.com/mcp`
23
- - Auth: `/figma auth` tries a standalone browser OAuth flow first. If Figma blocks first-time client registration on this machine, NanoPencil can fall back to importing an existing official local session.
24
-
25
- - Server ID: `figma-desktop`
26
- - URL: `http://127.0.0.1:3845/mcp`
27
-
28
- ## First-time setup flow
29
-
30
- If the Figma MCP tools are not available yet:
31
-
32
- 1. Prefer the remote setup first:
33
-
34
- ```text
35
- /figma auth
36
- /figma remote
37
- ```
38
-
39
- If the user already has dedicated Figma OAuth credentials for NanoPencil, they can also set:
40
-
41
- ```text
42
- NANOPENCIL_FIGMA_CLIENT_ID
43
- NANOPENCIL_FIGMA_CLIENT_SECRET
44
- ```
45
-
46
- 2. If the user wants the local desktop route instead, ask them to open the Figma desktop app and enable the desktop MCP server in Figma Dev Mode.
47
- 3. Then tell them to run:
48
-
49
- ```text
50
- /figma setup
51
- ```
52
-
53
- 4. After reload, check whether MCP tools from a Figma server are available.
54
-
55
- ## How to work once Figma tools are available
56
-
57
- - First inspect the available Figma MCP tools in the current session.
58
- - Prefer reading the current file or selection context before writing.
59
- - Then create or update frames, components, text, styles, or variables as needed.
60
- - When the user wants generated UI, write the result into Figma instead of only describing it in chat.
61
-
62
- ## Important guidance
63
-
64
- - Prefer the remote path when possible because it is closer to the Codex/Claude-style setup.
65
- - If the remote path is not authenticated yet, guide the user through `/figma auth` before falling back to desktop.
66
- - The official write-capable path is MCP, not the read-heavy REST API.
67
- - If tools are missing after enabling either server, remind the user to run `/reload`.
68
- - If the remote path fails but the user already has a valid local desktop MCP server, use the desktop route so the design task can still move forward.
1
+ ---
2
+ name: figma-design
3
+ description: Use this skill when the user wants NanoPencil to inspect, create, or edit designs in Figma through MCP.
4
+ ---
5
+
6
+ # Figma Design
7
+
8
+ Use this skill when the user asks NanoPencil to:
9
+
10
+ - Generate a design in Figma
11
+ - Edit an existing Figma file
12
+ - Turn requirements into Figma frames, components, or styles
13
+ - Read design context from Figma before implementing UI
14
+
15
+ ## Preferred integration path
16
+
17
+ Prefer the official Figma Remote MCP server first. Use the desktop server as a fallback or as an additional local-context path.
18
+
19
+ NanoPencil includes two built-in disabled MCP presets:
20
+
21
+ - Server ID: `figma-remote`
22
+ - URL: `https://mcp.figma.com/mcp`
23
+ - Auth: `/figma auth` tries a standalone browser OAuth flow first. If Figma blocks first-time client registration on this machine, NanoPencil can fall back to importing an existing official local session.
24
+
25
+ - Server ID: `figma-desktop`
26
+ - URL: `http://127.0.0.1:3845/mcp`
27
+
28
+ ## First-time setup flow
29
+
30
+ If the Figma MCP tools are not available yet:
31
+
32
+ 1. Prefer the remote setup first:
33
+
34
+ ```text
35
+ /figma auth
36
+ /figma remote
37
+ ```
38
+
39
+ If the user already has dedicated Figma OAuth credentials for NanoPencil, they can also set:
40
+
41
+ ```text
42
+ NANOPENCIL_FIGMA_CLIENT_ID
43
+ NANOPENCIL_FIGMA_CLIENT_SECRET
44
+ ```
45
+
46
+ 2. If the user wants the local desktop route instead, ask them to open the Figma desktop app and enable the desktop MCP server in Figma Dev Mode.
47
+ 3. Then tell them to run:
48
+
49
+ ```text
50
+ /figma setup
51
+ ```
52
+
53
+ 4. After reload, check whether MCP tools from a Figma server are available.
54
+
55
+ ## How to work once Figma tools are available
56
+
57
+ - First inspect the available Figma MCP tools in the current session.
58
+ - Prefer reading the current file or selection context before writing.
59
+ - Then create or update frames, components, text, styles, or variables as needed.
60
+ - When the user wants generated UI, write the result into Figma instead of only describing it in chat.
61
+
62
+ ## Important guidance
63
+
64
+ - Prefer the remote path when possible because it is closer to the Codex/Claude-style setup.
65
+ - If the remote path is not authenticated yet, guide the user through `/figma auth` before falling back to desktop.
66
+ - The official write-capable path is MCP, not the read-heavy REST API.
67
+ - If tools are missing after enabling either server, remind the user to run `/reload`.
68
+ - If the remote path fails but the user already has a valid local desktop MCP server, use the desktop route so the design task can still move forward.
@@ -1,85 +1,85 @@
1
- ---
2
- name: mcp-management
3
- description: Use this skill when the user asks to install, configure, debug, enable, or disable MCP servers or MCP tools in NanoPencil.
4
- ---
5
-
6
- # MCP Management
7
-
8
- Use this skill when the user asks for any of the following:
9
-
10
- - Install a new MCP server
11
- - Configure an existing MCP server
12
- - Enable or disable MCP servers in NanoPencil
13
- - Debug why MCP tools are missing
14
- - Add API keys or environment variables for an MCP server
15
-
16
- ## What NanoPencil already does
17
-
18
- - MCP is enabled by default in NanoPencil unless the user launched it with `--no-mcp` or in offline mode.
19
- - NanoPencil reads MCP server definitions from `~/.nanopencil/agent/mcp.json`.
20
- - MCP tools are loaded into the current session at startup and on `/reload`.
21
-
22
- Important:
23
-
24
- - Editing `mcp.json` alone does not make new MCP tools appear immediately in the current session.
25
- - After changing MCP config, tell the user to run `/reload`, or explain that a restart/reload is needed before the new tools can be used.
26
-
27
- ## How to inspect the current MCP setup
28
-
29
- 1. Read `~/.nanopencil/agent/mcp.json` if it exists.
30
- 2. Check whether the target server already exists in `mcpServers`.
31
- 3. Check whether it is enabled.
32
- 4. Check whether required environment variables are present.
33
-
34
- If the file does not exist, NanoPencil will create a default one when MCP config is first loaded.
35
-
36
- ## How to add a new MCP server
37
-
38
- 1. Find the official install/start command from the server's documentation.
39
- 2. Prefer stable commands such as:
40
- - `npx -y <package>`
41
- - `uvx <package>`
42
- - `python -m <module>`
43
- - `node /absolute/path/to/server.js`
44
- 3. Add a server entry to `~/.nanopencil/agent/mcp.json`.
45
- 4. Set `enabled: true` only if the command and required credentials are ready.
46
- 5. Tell the user that `/reload` is required to apply the change.
47
-
48
- ## Config shape reminder
49
-
50
- Use this structure:
51
-
52
- ```json
53
- {
54
- "mcpServers": [
55
- {
56
- "id": "example",
57
- "name": "Example",
58
- "command": "npx",
59
- "args": ["-y", "@example/server"],
60
- "enabled": true,
61
- "transport": "stdio",
62
- "toolTimeout": 30000
63
- }
64
- ]
65
- }
66
- ```
67
-
68
- For remote HTTP/SSE MCP servers, use the server's documented transport and URL fields supported by NanoPencil's MCP config.
69
-
70
- ## Safe operating rules
71
-
72
- - Do not invent MCP package names. Check the server's official docs first.
73
- - Do not claim the new MCP tools are ready until the config is written and the user has reloaded.
74
- - If credentials are required, ask the user for the missing values instead of guessing.
75
- - If an install command modifies global system state, tell the user what will be installed.
76
-
77
- ## Good response pattern
78
-
79
- When the user asks you to install an MCP server:
80
-
81
- 1. Inspect `mcp.json`
82
- 2. Install or configure the server
83
- 3. Update `mcp.json`
84
- 4. Tell the user exactly what changed
85
- 5. Ask them to run `/reload` if the current session needs to pick up the new tools
1
+ ---
2
+ name: mcp-management
3
+ description: Use this skill when the user asks to install, configure, debug, enable, or disable MCP servers or MCP tools in NanoPencil.
4
+ ---
5
+
6
+ # MCP Management
7
+
8
+ Use this skill when the user asks for any of the following:
9
+
10
+ - Install a new MCP server
11
+ - Configure an existing MCP server
12
+ - Enable or disable MCP servers in NanoPencil
13
+ - Debug why MCP tools are missing
14
+ - Add API keys or environment variables for an MCP server
15
+
16
+ ## What NanoPencil already does
17
+
18
+ - MCP is enabled by default in NanoPencil unless the user launched it with `--no-mcp` or in offline mode.
19
+ - NanoPencil reads MCP server definitions from `~/.nanopencil/agent/mcp.json`.
20
+ - MCP tools are loaded into the current session at startup and on `/reload`.
21
+
22
+ Important:
23
+
24
+ - Editing `mcp.json` alone does not make new MCP tools appear immediately in the current session.
25
+ - After changing MCP config, tell the user to run `/reload`, or explain that a restart/reload is needed before the new tools can be used.
26
+
27
+ ## How to inspect the current MCP setup
28
+
29
+ 1. Read `~/.nanopencil/agent/mcp.json` if it exists.
30
+ 2. Check whether the target server already exists in `mcpServers`.
31
+ 3. Check whether it is enabled.
32
+ 4. Check whether required environment variables are present.
33
+
34
+ If the file does not exist, NanoPencil will create a default one when MCP config is first loaded.
35
+
36
+ ## How to add a new MCP server
37
+
38
+ 1. Find the official install/start command from the server's documentation.
39
+ 2. Prefer stable commands such as:
40
+ - `npx -y <package>`
41
+ - `uvx <package>`
42
+ - `python -m <module>`
43
+ - `node /absolute/path/to/server.js`
44
+ 3. Add a server entry to `~/.nanopencil/agent/mcp.json`.
45
+ 4. Set `enabled: true` only if the command and required credentials are ready.
46
+ 5. Tell the user that `/reload` is required to apply the change.
47
+
48
+ ## Config shape reminder
49
+
50
+ Use this structure:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": [
55
+ {
56
+ "id": "example",
57
+ "name": "Example",
58
+ "command": "npx",
59
+ "args": ["-y", "@example/server"],
60
+ "enabled": true,
61
+ "transport": "stdio",
62
+ "toolTimeout": 30000
63
+ }
64
+ ]
65
+ }
66
+ ```
67
+
68
+ For remote HTTP/SSE MCP servers, use the server's documented transport and URL fields supported by NanoPencil's MCP config.
69
+
70
+ ## Safe operating rules
71
+
72
+ - Do not invent MCP package names. Check the server's official docs first.
73
+ - Do not claim the new MCP tools are ready until the config is written and the user has reloaded.
74
+ - If credentials are required, ask the user for the missing values instead of guessing.
75
+ - If an install command modifies global system state, tell the user what will be installed.
76
+
77
+ ## Good response pattern
78
+
79
+ When the user asks you to install an MCP server:
80
+
81
+ 1. Inspect `mcp.json`
82
+ 2. Install or configure the server
83
+ 3. Update `mcp.json`
84
+ 4. Tell the user exactly what changed
85
+ 5. Ask them to run `/reload` if the current session needs to pick up the new tools
@@ -21,4 +21,4 @@ The user approved the following plan in a previous context. Implement it now:
21
21
 
22
22
  ${r}`};T(n);const o=f(e,n),{mode:l,needsPlanModeExitAttachment:s,hasExitedPlanModeInSession:i,planAttachmentCount:v}=o.state;if(l!=="plan"&&s){o.state.needsPlanModeExitAttachment=!1,y(e,o);const g=h(e.events),c=P(e.events)!==null;return{appendSystemPrompt:H(g,c,o.state.lastAllowedPrompts)}}if(l==="plan"){I(n,e);const g=h(e.events),c=P(e.events),E=G(n);if(o.state.lastPlanAttachmentHumanTurn!==void 0&&E-o.state.lastPlanAttachmentHumanTurn<$.TURNS_BETWEEN_ATTACHMENTS)return;if(i&&c!==null){o.state.hasExitedPlanModeInSession=!1,o.state.lastPlanAttachmentHumanTurn=E,y(e,o);const S=b(g),A=R(o,g,c,"full");return{appendSystemPrompt:S+`
23
23
 
24
- `+A}}const w=v%$.FULL_REMINDER_EVERY_N===0?"full":"sparse";return o.state.planAttachmentCount+=1,o.state.lastPlanAttachmentHumanTurn=E,o.state.planSnapshot=c??void 0,y(e,o),{appendSystemPrompt:R(o,g,c,w)}}}),e.registerShortcut("ctrl+g",{description:"Open plan file in external editor",handler:u(async a=>{if(f(e,a).state.mode!=="plan"){a.ui.notify("Not in plan mode.","info");return}const r=h(e.events);if(P(e.events)||await M(e.events,""),process.env.VISUAL||process.env.EDITOR)if(await a.ui.openExternalEditor(r,"Edit Plan")){const l=f(e,a);l.state.planSnapshot=P(e.events)??void 0,y(e,l),a.ui.notify(`Opened plan in editor: ${r}`,"info")}else a.ui.notify("Failed to open plan in external editor.","warning");else a.ui.notify("No $VISUAL or $EDITOR set. Cannot open external editor.","warning")},"handler")}),e.on("session_start",(a,n)=>{T(n),f(e,n).state.mode==="plan"&&I(n,e)}),e.on("session_shutdown",()=>{})}u(X,"planExtension");export{X as default};
24
+ `+A}}const w=v%$.FULL_REMINDER_EVERY_N===0?"full":"sparse";return o.state.planAttachmentCount+=1,o.state.lastPlanAttachmentHumanTurn=E,o.state.planSnapshot=c??void 0,y(e,o),{appendSystemPrompt:R(o,g,c,w)}}}),e.registerShortcut("alt+g",{description:"Open plan file in external editor",handler:u(async a=>{if(f(e,a).state.mode!=="plan"){a.ui.notify("Not in plan mode.","info");return}const r=h(e.events);if(P(e.events)||await M(e.events,""),process.env.VISUAL||process.env.EDITOR)if(await a.ui.openExternalEditor(r,"Edit Plan")){const l=f(e,a);l.state.planSnapshot=P(e.events)??void 0,y(e,l),a.ui.notify(`Opened plan in editor: ${r}`,"info")}else a.ui.notify("Failed to open plan in external editor.","warning");else a.ui.notify("No $VISUAL or $EDITOR set. Cannot open external editor.","warning")},"handler")}),e.on("session_start",(a,n)=>{T(n),f(e,n).state.mode==="plan"&&I(n,e)}),e.on("session_shutdown",()=>{})}u(X,"planExtension");export{X as default};