@selesai/code 0.13.4 → 0.13.5

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 (394) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/compaction/utils.js +2 -2
  5. package/dist/core/export-html/template.css +1066 -1066
  6. package/dist/core/export-html/template.html +55 -55
  7. package/dist/core/export-html/template.js +1864 -1864
  8. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  9. package/dist/core/export-html/vendor/marked.min.js +78 -78
  10. package/dist/core/messages.js +7 -7
  11. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  12. package/dist/extensions/context-compaction-reminder.ts +28 -28
  13. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +0 -0
  14. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +0 -0
  15. package/dist/extensions/pi-intercom/LICENSE +21 -21
  16. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  17. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  18. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  19. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  20. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  21. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  22. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  23. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  24. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  25. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  26. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  27. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  28. package/dist/extensions/pi-subagents/install.mjs +0 -0
  29. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  30. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  31. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  32. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  33. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  34. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  35. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  36. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  37. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  38. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  39. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  40. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  41. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  42. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  43. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  44. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  45. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  46. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  47. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  48. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  49. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  50. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +7 -1
  51. package/dist/extensions/ponytail/package.json +8 -8
  52. package/dist/extensions/question/constants.ts +30 -30
  53. package/dist/extensions/question/helpers.ts +58 -58
  54. package/dist/extensions/question/navigation.ts +14 -14
  55. package/dist/extensions/question/package.json +19 -19
  56. package/dist/extensions/question/selection-mode.ts +46 -46
  57. package/dist/extensions/question/shortcuts.ts +44 -44
  58. package/dist/extensions/question/types.ts +132 -132
  59. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  60. package/dist/extensions/test-resolve-hook.mjs +6 -6
  61. package/dist/extensions/web-agent-onboarding.ts +222 -222
  62. package/dist/package-manager-cli.js +71 -71
  63. package/dist/rpc-entry.js +0 -0
  64. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  65. package/docs/compaction.md +396 -396
  66. package/docs/containerization.md +111 -111
  67. package/docs/development.md +71 -71
  68. package/docs/docs.json +164 -164
  69. package/docs/environment-variables.md +86 -86
  70. package/docs/index.md +83 -83
  71. package/docs/json.md +82 -82
  72. package/docs/models.md +502 -502
  73. package/docs/packages.md +227 -227
  74. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  75. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  76. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  77. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  78. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  79. package/docs/prompt-templates.md +95 -95
  80. package/docs/providers.md +293 -293
  81. package/docs/security.md +59 -59
  82. package/docs/session-format.md +414 -414
  83. package/docs/sessions.md +145 -145
  84. package/docs/shared-host-extensions.md +109 -109
  85. package/docs/shell-aliases.md +13 -13
  86. package/docs/skills.md +231 -231
  87. package/docs/terminal-setup.md +142 -142
  88. package/docs/termux.md +127 -127
  89. package/docs/themes.md +295 -295
  90. package/docs/tmux.md +63 -63
  91. package/docs/tui.md +927 -927
  92. package/docs/windows.md +17 -17
  93. package/examples/README.md +25 -25
  94. package/examples/extensions/README.md +211 -211
  95. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  96. package/examples/extensions/bash-spawn-hook.ts +30 -30
  97. package/examples/extensions/bookmark.ts +50 -50
  98. package/examples/extensions/border-status-editor.ts +150 -150
  99. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  100. package/examples/extensions/claude-rules.ts +86 -86
  101. package/examples/extensions/commands.ts +72 -72
  102. package/examples/extensions/confirm-destructive.ts +59 -59
  103. package/examples/extensions/custom-compaction.ts +130 -130
  104. package/examples/extensions/custom-footer.ts +64 -64
  105. package/examples/extensions/custom-header.ts +73 -73
  106. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  107. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  108. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  109. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  110. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  111. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  112. package/examples/extensions/dirty-repo-guard.ts +56 -56
  113. package/examples/extensions/doom-overlay/README.md +46 -46
  114. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  115. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  116. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  117. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  118. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  119. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  120. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  121. package/examples/extensions/doom-overlay/index.ts +74 -74
  122. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  123. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  124. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  125. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  126. package/examples/extensions/dynamic-resources/index.ts +15 -15
  127. package/examples/extensions/dynamic-tools.ts +74 -74
  128. package/examples/extensions/event-bus.ts +43 -43
  129. package/examples/extensions/file-trigger.ts +41 -41
  130. package/examples/extensions/git-checkpoint.ts +53 -53
  131. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  132. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  133. package/examples/extensions/gondolin/index.ts +531 -531
  134. package/examples/extensions/gondolin/package-lock.json +185 -185
  135. package/examples/extensions/gondolin/package.json +19 -19
  136. package/examples/extensions/handoff.ts +199 -199
  137. package/examples/extensions/hello.ts +26 -26
  138. package/examples/extensions/hidden-thinking-label.ts +53 -53
  139. package/examples/extensions/inline-bash.ts +94 -94
  140. package/examples/extensions/input-transform-streaming.ts +39 -39
  141. package/examples/extensions/input-transform.ts +43 -43
  142. package/examples/extensions/interactive-shell.ts +196 -196
  143. package/examples/extensions/mac-system-theme.ts +47 -47
  144. package/examples/extensions/message-renderer.ts +59 -59
  145. package/examples/extensions/minimal-mode.ts +426 -426
  146. package/examples/extensions/modal-editor.ts +85 -85
  147. package/examples/extensions/model-status.ts +31 -31
  148. package/examples/extensions/notify.ts +55 -55
  149. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  150. package/examples/extensions/overlay-test.ts +153 -153
  151. package/examples/extensions/permission-gate.ts +34 -34
  152. package/examples/extensions/pirate.ts +47 -47
  153. package/examples/extensions/plan-mode/README.md +66 -66
  154. package/examples/extensions/plan-mode/index.ts +390 -390
  155. package/examples/extensions/plan-mode/utils.ts +168 -168
  156. package/examples/extensions/preset.ts +436 -436
  157. package/examples/extensions/project-trust.ts +64 -64
  158. package/examples/extensions/prompt-customizer.ts +97 -97
  159. package/examples/extensions/protected-paths.ts +30 -30
  160. package/examples/extensions/provider-payload.ts +18 -18
  161. package/examples/extensions/qna.ts +122 -122
  162. package/examples/extensions/question.ts +285 -285
  163. package/examples/extensions/questionnaire.ts +448 -448
  164. package/examples/extensions/rainbow-editor.ts +88 -88
  165. package/examples/extensions/reload-runtime.ts +37 -37
  166. package/examples/extensions/rpc-demo.ts +118 -118
  167. package/examples/extensions/sandbox/index.ts +321 -321
  168. package/examples/extensions/sandbox/package-lock.json +92 -92
  169. package/examples/extensions/sandbox/package.json +19 -19
  170. package/examples/extensions/send-user-message.ts +97 -97
  171. package/examples/extensions/session-name.ts +27 -27
  172. package/examples/extensions/shutdown-command.ts +63 -63
  173. package/examples/extensions/snake.ts +343 -343
  174. package/examples/extensions/space-invaders.ts +560 -560
  175. package/examples/extensions/ssh.ts +220 -220
  176. package/examples/extensions/status-line.ts +32 -32
  177. package/examples/extensions/structured-output.ts +65 -65
  178. package/examples/extensions/subagent/README.md +175 -175
  179. package/examples/extensions/subagent/agents/planner.md +37 -37
  180. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  181. package/examples/extensions/subagent/agents/scout.md +50 -50
  182. package/examples/extensions/subagent/agents/worker.md +24 -24
  183. package/examples/extensions/subagent/agents.ts +126 -126
  184. package/examples/extensions/subagent/index.ts +1015 -1015
  185. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  186. package/examples/extensions/subagent/prompts/implement.md +10 -10
  187. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  188. package/examples/extensions/summarize.ts +209 -209
  189. package/examples/extensions/system-prompt-header.ts +17 -17
  190. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  191. package/examples/extensions/timed-confirm.ts +70 -70
  192. package/examples/extensions/titlebar-spinner.ts +58 -58
  193. package/examples/extensions/todo.ts +297 -297
  194. package/examples/extensions/tool-override.ts +144 -144
  195. package/examples/extensions/tools.ts +146 -146
  196. package/examples/extensions/trigger-compact.ts +50 -50
  197. package/examples/extensions/truncated-tool.ts +195 -195
  198. package/examples/extensions/widget-placement.ts +9 -9
  199. package/examples/extensions/with-deps/index.ts +32 -32
  200. package/examples/extensions/with-deps/package-lock.json +31 -31
  201. package/examples/extensions/with-deps/package.json +22 -22
  202. package/examples/extensions/working-indicator.ts +123 -123
  203. package/examples/extensions/working-message-test.ts +25 -25
  204. package/examples/rpc-extension-ui.ts +632 -632
  205. package/examples/sdk/01-minimal.ts +26 -26
  206. package/examples/sdk/02-custom-model.ts +53 -53
  207. package/examples/sdk/03-custom-prompt.ts +75 -75
  208. package/examples/sdk/04-skills.ts +55 -55
  209. package/examples/sdk/05-tools.ts +48 -48
  210. package/examples/sdk/06-extensions.ts +99 -99
  211. package/examples/sdk/07-context-files.ts +47 -47
  212. package/examples/sdk/08-prompt-templates.ts +51 -51
  213. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  214. package/examples/sdk/10-settings.ts +53 -53
  215. package/examples/sdk/11-sessions.ts +52 -52
  216. package/examples/sdk/12-full-control.ts +79 -79
  217. package/examples/sdk/13-session-runtime.ts +67 -67
  218. package/examples/sdk/README.md +144 -144
  219. package/package.json +3 -2
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +0 -3
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  377. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  378. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  379. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  380. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  381. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  382. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  383. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  384. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  385. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  386. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  387. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  388. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  389. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  390. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  391. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  392. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  393. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  394. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
@@ -1,50 +1,50 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
-
3
- const COMPACT_THRESHOLD_TOKENS = 100_000;
4
-
5
- export default function (pi: ExtensionAPI) {
6
- let previousTokens: number | null | undefined;
7
-
8
- const triggerCompaction = (ctx: ExtensionContext, customInstructions?: string) => {
9
- if (ctx.hasUI) {
10
- ctx.ui.notify("Compaction started", "info");
11
- }
12
- ctx.compact({
13
- customInstructions,
14
- onComplete: () => {
15
- if (ctx.hasUI) {
16
- ctx.ui.notify("Compaction completed", "info");
17
- }
18
- },
19
- onError: (error) => {
20
- if (ctx.hasUI) {
21
- ctx.ui.notify(`Compaction failed: ${error.message}`, "error");
22
- }
23
- },
24
- });
25
- };
26
-
27
- pi.on("turn_end", (_event, ctx) => {
28
- const usage = ctx.getContextUsage();
29
- const currentTokens = usage?.tokens ?? null;
30
- if (currentTokens === null) {
31
- return;
32
- }
33
-
34
- const crossedThreshold =
35
- previousTokens !== undefined && previousTokens !== null && previousTokens <= COMPACT_THRESHOLD_TOKENS;
36
- previousTokens = currentTokens;
37
- if (!crossedThreshold || currentTokens <= COMPACT_THRESHOLD_TOKENS) {
38
- return;
39
- }
40
- triggerCompaction(ctx);
41
- });
42
-
43
- pi.registerCommand("trigger-compact", {
44
- description: "Trigger compaction immediately",
45
- handler: async (args, ctx) => {
46
- const instructions = args.trim() || undefined;
47
- triggerCompaction(ctx, instructions);
48
- },
49
- });
50
- }
1
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+
3
+ const COMPACT_THRESHOLD_TOKENS = 100_000;
4
+
5
+ export default function (pi: ExtensionAPI) {
6
+ let previousTokens: number | null | undefined;
7
+
8
+ const triggerCompaction = (ctx: ExtensionContext, customInstructions?: string) => {
9
+ if (ctx.hasUI) {
10
+ ctx.ui.notify("Compaction started", "info");
11
+ }
12
+ ctx.compact({
13
+ customInstructions,
14
+ onComplete: () => {
15
+ if (ctx.hasUI) {
16
+ ctx.ui.notify("Compaction completed", "info");
17
+ }
18
+ },
19
+ onError: (error) => {
20
+ if (ctx.hasUI) {
21
+ ctx.ui.notify(`Compaction failed: ${error.message}`, "error");
22
+ }
23
+ },
24
+ });
25
+ };
26
+
27
+ pi.on("turn_end", (_event, ctx) => {
28
+ const usage = ctx.getContextUsage();
29
+ const currentTokens = usage?.tokens ?? null;
30
+ if (currentTokens === null) {
31
+ return;
32
+ }
33
+
34
+ const crossedThreshold =
35
+ previousTokens !== undefined && previousTokens !== null && previousTokens <= COMPACT_THRESHOLD_TOKENS;
36
+ previousTokens = currentTokens;
37
+ if (!crossedThreshold || currentTokens <= COMPACT_THRESHOLD_TOKENS) {
38
+ return;
39
+ }
40
+ triggerCompaction(ctx);
41
+ });
42
+
43
+ pi.registerCommand("trigger-compact", {
44
+ description: "Trigger compaction immediately",
45
+ handler: async (args, ctx) => {
46
+ const instructions = args.trim() || undefined;
47
+ triggerCompaction(ctx, instructions);
48
+ },
49
+ });
50
+ }
@@ -1,195 +1,195 @@
1
- /**
2
- * Truncated Tool Example - Demonstrates proper output truncation for custom tools
3
- *
4
- * Custom tools MUST truncate their output to avoid overwhelming the LLM context.
5
- * The built-in limit is 50KB (~10k tokens) and 2000 lines, whichever is hit first.
6
- *
7
- * This example shows how to:
8
- * 1. Use the built-in truncation utilities
9
- * 2. Write full output to a temp file when truncated
10
- * 3. Inform the LLM where to find the complete output
11
- * 4. Custom rendering of tool calls and results
12
- *
13
- * The `rg` tool here wraps ripgrep with proper truncation. Compare this to the
14
- * built-in `grep` tool in src/core/tools/grep.ts for a more complete implementation.
15
- */
16
-
17
- import { mkdtemp, writeFile } from "node:fs/promises";
18
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
19
- import {
20
- DEFAULT_MAX_BYTES,
21
- DEFAULT_MAX_LINES,
22
- formatSize,
23
- type TruncationResult,
24
- truncateHead,
25
- withFileMutationQueue,
26
- } from "@earendil-works/pi-coding-agent";
27
- import { Text } from "@earendil-works/pi-tui";
28
- import { execSync } from "child_process";
29
- import { tmpdir } from "os";
30
- import { join } from "path";
31
- import { Type } from "typebox";
32
-
33
- const RgParams = Type.Object({
34
- pattern: Type.String({ description: "Search pattern (regex)" }),
35
- path: Type.Optional(Type.String({ description: "Directory to search (default: current directory)" })),
36
- glob: Type.Optional(Type.String({ description: "File glob pattern, e.g. '*.ts'" })),
37
- });
38
-
39
- interface RgDetails {
40
- pattern: string;
41
- path?: string;
42
- glob?: string;
43
- matchCount: number;
44
- truncation?: TruncationResult;
45
- fullOutputPath?: string;
46
- }
47
-
48
- export default function (pi: ExtensionAPI) {
49
- pi.registerTool({
50
- name: "rg",
51
- label: "ripgrep",
52
- // Document the truncation limits in the tool description so the LLM knows
53
- description: `Search file contents using ripgrep. Output is truncated to ${DEFAULT_MAX_LINES} lines or ${formatSize(DEFAULT_MAX_BYTES)} (whichever is hit first). If truncated, full output is saved to a temp file.`,
54
- parameters: RgParams,
55
-
56
- async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
57
- const { pattern, path: searchPath, glob } = params;
58
-
59
- // Build the ripgrep command
60
- const args = ["rg", "--line-number", "--color=never"];
61
- if (glob) args.push("--glob", glob);
62
- args.push(pattern);
63
- args.push(searchPath || ".");
64
-
65
- let output: string;
66
- try {
67
- output = execSync(args.join(" "), {
68
- cwd: ctx.cwd,
69
- encoding: "utf-8",
70
- maxBuffer: 100 * 1024 * 1024, // 100MB buffer to capture full output
71
- });
72
- } catch (err: any) {
73
- // ripgrep exits with 1 when no matches found
74
- if (err.status === 1) {
75
- return {
76
- content: [{ type: "text", text: "No matches found" }],
77
- details: { pattern, path: searchPath, glob, matchCount: 0 } as RgDetails,
78
- };
79
- }
80
- throw new Error(`ripgrep failed: ${err.message}`);
81
- }
82
-
83
- if (!output.trim()) {
84
- return {
85
- content: [{ type: "text", text: "No matches found" }],
86
- details: { pattern, path: searchPath, glob, matchCount: 0 } as RgDetails,
87
- };
88
- }
89
-
90
- // Apply truncation using built-in utilities
91
- // truncateHead keeps the first N lines/bytes (good for search results)
92
- // truncateTail keeps the last N lines/bytes (good for logs/command output)
93
- const truncation = truncateHead(output, {
94
- maxLines: DEFAULT_MAX_LINES,
95
- maxBytes: DEFAULT_MAX_BYTES,
96
- });
97
-
98
- // Count matches (each non-empty line with a match)
99
- const matchCount = output.split("\n").filter((line) => line.trim()).length;
100
-
101
- const details: RgDetails = {
102
- pattern,
103
- path: searchPath,
104
- glob,
105
- matchCount,
106
- };
107
-
108
- let resultText = truncation.content;
109
-
110
- if (truncation.truncated) {
111
- // Save full output to a temp file so LLM can access it if needed
112
- const tempDir = await mkdtemp(join(tmpdir(), "pi-rg-"));
113
- const tempFile = join(tempDir, "output.txt");
114
- await withFileMutationQueue(tempFile, async () => {
115
- await writeFile(tempFile, output, "utf8");
116
- });
117
-
118
- details.truncation = truncation;
119
- details.fullOutputPath = tempFile;
120
-
121
- // Add truncation notice - this helps the LLM understand the output is incomplete
122
- const truncatedLines = truncation.totalLines - truncation.outputLines;
123
- const truncatedBytes = truncation.totalBytes - truncation.outputBytes;
124
-
125
- resultText += `\n\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines`;
126
- resultText += ` (${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)}).`;
127
- resultText += ` ${truncatedLines} lines (${formatSize(truncatedBytes)}) omitted.`;
128
- resultText += ` Full output saved to: ${tempFile}]`;
129
- }
130
-
131
- return {
132
- content: [{ type: "text", text: resultText }],
133
- details,
134
- };
135
- },
136
-
137
- // Custom rendering of the tool call (shown before/during execution)
138
- renderCall(args, theme, _context) {
139
- let text = theme.fg("toolTitle", theme.bold("rg "));
140
- text += theme.fg("accent", `"${args.pattern}"`);
141
- if (args.path) {
142
- text += theme.fg("muted", ` in ${args.path}`);
143
- }
144
- if (args.glob) {
145
- text += theme.fg("dim", ` --glob ${args.glob}`);
146
- }
147
- return new Text(text, 0, 0);
148
- },
149
-
150
- // Custom rendering of the tool result
151
- renderResult(result, { expanded, isPartial }, theme, _context) {
152
- const details = result.details as RgDetails | undefined;
153
-
154
- // Handle streaming/partial results
155
- if (isPartial) {
156
- return new Text(theme.fg("warning", "Searching..."), 0, 0);
157
- }
158
-
159
- // No matches
160
- if (!details || details.matchCount === 0) {
161
- return new Text(theme.fg("dim", "No matches found"), 0, 0);
162
- }
163
-
164
- // Build result display
165
- let text = theme.fg("success", `${details.matchCount} matches`);
166
-
167
- // Show truncation warning if applicable
168
- if (details.truncation?.truncated) {
169
- text += theme.fg("warning", " (truncated)");
170
- }
171
-
172
- // In expanded view, show the actual matches
173
- if (expanded) {
174
- const content = result.content[0];
175
- if (content?.type === "text") {
176
- // Show first 20 lines in expanded view, or all if fewer
177
- const lines = content.text.split("\n").slice(0, 20);
178
- for (const line of lines) {
179
- text += `\n${theme.fg("dim", line)}`;
180
- }
181
- if (content.text.split("\n").length > 20) {
182
- text += `\n${theme.fg("muted", "... (use read tool to see full output)")}`;
183
- }
184
- }
185
-
186
- // Show temp file path if truncated
187
- if (details.fullOutputPath) {
188
- text += `\n${theme.fg("dim", `Full output: ${details.fullOutputPath}`)}`;
189
- }
190
- }
191
-
192
- return new Text(text, 0, 0);
193
- },
194
- });
195
- }
1
+ /**
2
+ * Truncated Tool Example - Demonstrates proper output truncation for custom tools
3
+ *
4
+ * Custom tools MUST truncate their output to avoid overwhelming the LLM context.
5
+ * The built-in limit is 50KB (~10k tokens) and 2000 lines, whichever is hit first.
6
+ *
7
+ * This example shows how to:
8
+ * 1. Use the built-in truncation utilities
9
+ * 2. Write full output to a temp file when truncated
10
+ * 3. Inform the LLM where to find the complete output
11
+ * 4. Custom rendering of tool calls and results
12
+ *
13
+ * The `rg` tool here wraps ripgrep with proper truncation. Compare this to the
14
+ * built-in `grep` tool in src/core/tools/grep.ts for a more complete implementation.
15
+ */
16
+
17
+ import { mkdtemp, writeFile } from "node:fs/promises";
18
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
19
+ import {
20
+ DEFAULT_MAX_BYTES,
21
+ DEFAULT_MAX_LINES,
22
+ formatSize,
23
+ type TruncationResult,
24
+ truncateHead,
25
+ withFileMutationQueue,
26
+ } from "@earendil-works/pi-coding-agent";
27
+ import { Text } from "@earendil-works/pi-tui";
28
+ import { execSync } from "child_process";
29
+ import { tmpdir } from "os";
30
+ import { join } from "path";
31
+ import { Type } from "typebox";
32
+
33
+ const RgParams = Type.Object({
34
+ pattern: Type.String({ description: "Search pattern (regex)" }),
35
+ path: Type.Optional(Type.String({ description: "Directory to search (default: current directory)" })),
36
+ glob: Type.Optional(Type.String({ description: "File glob pattern, e.g. '*.ts'" })),
37
+ });
38
+
39
+ interface RgDetails {
40
+ pattern: string;
41
+ path?: string;
42
+ glob?: string;
43
+ matchCount: number;
44
+ truncation?: TruncationResult;
45
+ fullOutputPath?: string;
46
+ }
47
+
48
+ export default function (pi: ExtensionAPI) {
49
+ pi.registerTool({
50
+ name: "rg",
51
+ label: "ripgrep",
52
+ // Document the truncation limits in the tool description so the LLM knows
53
+ description: `Search file contents using ripgrep. Output is truncated to ${DEFAULT_MAX_LINES} lines or ${formatSize(DEFAULT_MAX_BYTES)} (whichever is hit first). If truncated, full output is saved to a temp file.`,
54
+ parameters: RgParams,
55
+
56
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
57
+ const { pattern, path: searchPath, glob } = params;
58
+
59
+ // Build the ripgrep command
60
+ const args = ["rg", "--line-number", "--color=never"];
61
+ if (glob) args.push("--glob", glob);
62
+ args.push(pattern);
63
+ args.push(searchPath || ".");
64
+
65
+ let output: string;
66
+ try {
67
+ output = execSync(args.join(" "), {
68
+ cwd: ctx.cwd,
69
+ encoding: "utf-8",
70
+ maxBuffer: 100 * 1024 * 1024, // 100MB buffer to capture full output
71
+ });
72
+ } catch (err: any) {
73
+ // ripgrep exits with 1 when no matches found
74
+ if (err.status === 1) {
75
+ return {
76
+ content: [{ type: "text", text: "No matches found" }],
77
+ details: { pattern, path: searchPath, glob, matchCount: 0 } as RgDetails,
78
+ };
79
+ }
80
+ throw new Error(`ripgrep failed: ${err.message}`);
81
+ }
82
+
83
+ if (!output.trim()) {
84
+ return {
85
+ content: [{ type: "text", text: "No matches found" }],
86
+ details: { pattern, path: searchPath, glob, matchCount: 0 } as RgDetails,
87
+ };
88
+ }
89
+
90
+ // Apply truncation using built-in utilities
91
+ // truncateHead keeps the first N lines/bytes (good for search results)
92
+ // truncateTail keeps the last N lines/bytes (good for logs/command output)
93
+ const truncation = truncateHead(output, {
94
+ maxLines: DEFAULT_MAX_LINES,
95
+ maxBytes: DEFAULT_MAX_BYTES,
96
+ });
97
+
98
+ // Count matches (each non-empty line with a match)
99
+ const matchCount = output.split("\n").filter((line) => line.trim()).length;
100
+
101
+ const details: RgDetails = {
102
+ pattern,
103
+ path: searchPath,
104
+ glob,
105
+ matchCount,
106
+ };
107
+
108
+ let resultText = truncation.content;
109
+
110
+ if (truncation.truncated) {
111
+ // Save full output to a temp file so LLM can access it if needed
112
+ const tempDir = await mkdtemp(join(tmpdir(), "pi-rg-"));
113
+ const tempFile = join(tempDir, "output.txt");
114
+ await withFileMutationQueue(tempFile, async () => {
115
+ await writeFile(tempFile, output, "utf8");
116
+ });
117
+
118
+ details.truncation = truncation;
119
+ details.fullOutputPath = tempFile;
120
+
121
+ // Add truncation notice - this helps the LLM understand the output is incomplete
122
+ const truncatedLines = truncation.totalLines - truncation.outputLines;
123
+ const truncatedBytes = truncation.totalBytes - truncation.outputBytes;
124
+
125
+ resultText += `\n\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines`;
126
+ resultText += ` (${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)}).`;
127
+ resultText += ` ${truncatedLines} lines (${formatSize(truncatedBytes)}) omitted.`;
128
+ resultText += ` Full output saved to: ${tempFile}]`;
129
+ }
130
+
131
+ return {
132
+ content: [{ type: "text", text: resultText }],
133
+ details,
134
+ };
135
+ },
136
+
137
+ // Custom rendering of the tool call (shown before/during execution)
138
+ renderCall(args, theme, _context) {
139
+ let text = theme.fg("toolTitle", theme.bold("rg "));
140
+ text += theme.fg("accent", `"${args.pattern}"`);
141
+ if (args.path) {
142
+ text += theme.fg("muted", ` in ${args.path}`);
143
+ }
144
+ if (args.glob) {
145
+ text += theme.fg("dim", ` --glob ${args.glob}`);
146
+ }
147
+ return new Text(text, 0, 0);
148
+ },
149
+
150
+ // Custom rendering of the tool result
151
+ renderResult(result, { expanded, isPartial }, theme, _context) {
152
+ const details = result.details as RgDetails | undefined;
153
+
154
+ // Handle streaming/partial results
155
+ if (isPartial) {
156
+ return new Text(theme.fg("warning", "Searching..."), 0, 0);
157
+ }
158
+
159
+ // No matches
160
+ if (!details || details.matchCount === 0) {
161
+ return new Text(theme.fg("dim", "No matches found"), 0, 0);
162
+ }
163
+
164
+ // Build result display
165
+ let text = theme.fg("success", `${details.matchCount} matches`);
166
+
167
+ // Show truncation warning if applicable
168
+ if (details.truncation?.truncated) {
169
+ text += theme.fg("warning", " (truncated)");
170
+ }
171
+
172
+ // In expanded view, show the actual matches
173
+ if (expanded) {
174
+ const content = result.content[0];
175
+ if (content?.type === "text") {
176
+ // Show first 20 lines in expanded view, or all if fewer
177
+ const lines = content.text.split("\n").slice(0, 20);
178
+ for (const line of lines) {
179
+ text += `\n${theme.fg("dim", line)}`;
180
+ }
181
+ if (content.text.split("\n").length > 20) {
182
+ text += `\n${theme.fg("muted", "... (use read tool to see full output)")}`;
183
+ }
184
+ }
185
+
186
+ // Show temp file path if truncated
187
+ if (details.fullOutputPath) {
188
+ text += `\n${theme.fg("dim", `Full output: ${details.fullOutputPath}`)}`;
189
+ }
190
+ }
191
+
192
+ return new Text(text, 0, 0);
193
+ },
194
+ });
195
+ }
@@ -1,9 +1,9 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
-
3
- export default function widgetPlacementExtension(pi: ExtensionAPI) {
4
- pi.on("session_start", (_event, ctx) => {
5
- if (!ctx.hasUI) return;
6
- ctx.ui.setWidget("widget-above", ["Above editor widget"]);
7
- ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
8
- });
9
- }
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ export default function widgetPlacementExtension(pi: ExtensionAPI) {
4
+ pi.on("session_start", (_event, ctx) => {
5
+ if (!ctx.hasUI) return;
6
+ ctx.ui.setWidget("widget-above", ["Above editor widget"]);
7
+ ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
8
+ });
9
+ }
@@ -1,32 +1,32 @@
1
- /**
2
- * Example extension with its own npm dependencies.
3
- * Tests that jiti resolves modules from the extension's own node_modules.
4
- *
5
- * Requires: npm install in this directory
6
- */
7
-
8
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
9
- import ms from "ms";
10
- import { Type } from "typebox";
11
-
12
- export default function (pi: ExtensionAPI) {
13
- // Register a tool that uses ms
14
- pi.registerTool({
15
- name: "parse_duration",
16
- label: "Parse Duration",
17
- description: "Parse a human-readable duration string (e.g., '2 days', '1h', '5m') to milliseconds",
18
- parameters: Type.Object({
19
- duration: Type.String({ description: "Duration string like '2 days', '1h', '5m'" }),
20
- }),
21
- execute: async (_toolCallId, params) => {
22
- const result = ms(params.duration as ms.StringValue);
23
- if (result === undefined) {
24
- throw new Error(`Invalid duration: "${params.duration}"`);
25
- }
26
- return {
27
- content: [{ type: "text", text: `${params.duration} = ${result} milliseconds` }],
28
- details: {},
29
- };
30
- },
31
- });
32
- }
1
+ /**
2
+ * Example extension with its own npm dependencies.
3
+ * Tests that jiti resolves modules from the extension's own node_modules.
4
+ *
5
+ * Requires: npm install in this directory
6
+ */
7
+
8
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
9
+ import ms from "ms";
10
+ import { Type } from "typebox";
11
+
12
+ export default function (pi: ExtensionAPI) {
13
+ // Register a tool that uses ms
14
+ pi.registerTool({
15
+ name: "parse_duration",
16
+ label: "Parse Duration",
17
+ description: "Parse a human-readable duration string (e.g., '2 days', '1h', '5m') to milliseconds",
18
+ parameters: Type.Object({
19
+ duration: Type.String({ description: "Duration string like '2 days', '1h', '5m'" }),
20
+ }),
21
+ execute: async (_toolCallId, params) => {
22
+ const result = ms(params.duration as ms.StringValue);
23
+ if (result === undefined) {
24
+ throw new Error(`Invalid duration: "${params.duration}"`);
25
+ }
26
+ return {
27
+ content: [{ type: "text", text: `${params.duration} = ${result} milliseconds` }],
28
+ details: {},
29
+ };
30
+ },
31
+ });
32
+ }
@@ -1,31 +1,31 @@
1
- {
2
- "name": "pi-extension-with-deps",
3
- "version": "0.83.0",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "pi-extension-with-deps",
9
- "version": "0.83.0",
10
- "dependencies": {
11
- "ms": "^2.1.3"
12
- },
13
- "devDependencies": {
14
- "@types/ms": "^2.1.0"
15
- }
16
- },
17
- "node_modules/@types/ms": {
18
- "version": "2.1.0",
19
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
20
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
21
- "dev": true,
22
- "license": "MIT"
23
- },
24
- "node_modules/ms": {
25
- "version": "2.1.3",
26
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
27
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
28
- "license": "MIT"
29
- }
30
- }
31
- }
1
+ {
2
+ "name": "pi-extension-with-deps",
3
+ "version": "0.83.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "pi-extension-with-deps",
9
+ "version": "0.83.0",
10
+ "dependencies": {
11
+ "ms": "^2.1.3"
12
+ },
13
+ "devDependencies": {
14
+ "@types/ms": "^2.1.0"
15
+ }
16
+ },
17
+ "node_modules/@types/ms": {
18
+ "version": "2.1.0",
19
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
20
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
21
+ "dev": true,
22
+ "license": "MIT"
23
+ },
24
+ "node_modules/ms": {
25
+ "version": "2.1.3",
26
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
27
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
28
+ "license": "MIT"
29
+ }
30
+ }
31
+ }