@asterxsk/kiln 0.1.0 → 0.3.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 (491) hide show
  1. package/README.md +155 -170
  2. package/agent/AGENTS.md +67 -67
  3. package/agent/README.md +5 -5
  4. package/agent/extensions/ask-user/index.ts +418 -418
  5. package/agent/extensions/ask-user/install.ps1 +4 -0
  6. package/agent/extensions/ask-user/install.sh +3 -0
  7. package/agent/extensions/ask-user/package-lock.json +769 -769
  8. package/agent/extensions/ask-user/package.json +19 -19
  9. package/agent/extensions/ask-user/prompt.ts +45 -45
  10. package/agent/extensions/ask-user/tsconfig.json +7 -7
  11. package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
  12. package/agent/extensions/background-terminals/index.ts +627 -627
  13. package/agent/extensions/background-terminals/install.ps1 +4 -0
  14. package/agent/extensions/background-terminals/install.sh +3 -0
  15. package/agent/extensions/background-terminals/manager.test.ts +735 -735
  16. package/agent/extensions/background-terminals/output.test.ts +109 -109
  17. package/agent/extensions/background-terminals/package-lock.json +769 -769
  18. package/agent/extensions/background-terminals/package.json +17 -17
  19. package/agent/extensions/background-terminals/prompt.test.ts +125 -125
  20. package/agent/extensions/background-terminals/ps.test.ts +82 -82
  21. package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
  22. package/agent/extensions/background-terminals/src/domain.ts +87 -87
  23. package/agent/extensions/background-terminals/src/manager.ts +907 -907
  24. package/agent/extensions/background-terminals/src/output.ts +84 -84
  25. package/agent/extensions/background-terminals/src/prompt.ts +142 -142
  26. package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
  27. package/agent/extensions/background-terminals/src/runtime.ts +36 -36
  28. package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
  29. package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
  30. package/agent/extensions/background-terminals/tsconfig.json +7 -7
  31. package/agent/extensions/destructive/install.ps1 +4 -0
  32. package/agent/extensions/destructive/install.sh +3 -0
  33. package/agent/extensions/file-search/index.spec.ts +443 -443
  34. package/agent/extensions/file-search/index.ts +459 -459
  35. package/agent/extensions/file-search/install.ps1 +4 -0
  36. package/agent/extensions/file-search/install.sh +3 -0
  37. package/agent/extensions/file-search/package-lock.json +2253 -2253
  38. package/agent/extensions/file-search/package.json +23 -23
  39. package/agent/extensions/file-search/src/args.ts +122 -122
  40. package/agent/extensions/file-search/src/binaries.ts +422 -422
  41. package/agent/extensions/file-search/src/output.ts +126 -126
  42. package/agent/extensions/file-search/src/process.ts +146 -146
  43. package/agent/extensions/file-search/src/prompt.ts +52 -52
  44. package/agent/extensions/file-search/tsconfig.json +7 -7
  45. package/agent/extensions/goal/install.ps1 +4 -0
  46. package/agent/extensions/goal/install.sh +3 -0
  47. package/agent/extensions/herdr-agent-state.ts +257 -0
  48. package/agent/extensions/kiln-update/README.md +25 -0
  49. package/agent/extensions/kiln-update/index.ts +99 -0
  50. package/agent/extensions/kiln-update/install.ps1 +27 -0
  51. package/agent/extensions/kiln-update/install.sh +24 -0
  52. package/agent/extensions/modelconf/PLAN.md +915 -915
  53. package/agent/extensions/modelconf/index.ts +296 -296
  54. package/agent/extensions/modelconf/install.ps1 +4 -0
  55. package/agent/extensions/modelconf/install.sh +3 -0
  56. package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
  57. package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
  58. package/agent/extensions/pi-web-access/LICENSE +21 -21
  59. package/agent/extensions/pi-web-access/README.md +470 -470
  60. package/agent/extensions/pi-web-access/SECURITY.md +5 -5
  61. package/agent/extensions/pi-web-access/activity.ts +101 -101
  62. package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
  63. package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
  64. package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
  65. package/agent/extensions/pi-web-access/content-find.ts +139 -139
  66. package/agent/extensions/pi-web-access/credential-source.ts +191 -191
  67. package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
  68. package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
  69. package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
  70. package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
  71. package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
  72. package/agent/extensions/pi-web-access/exa.ts +526 -526
  73. package/agent/extensions/pi-web-access/extract.ts +1196 -1196
  74. package/agent/extensions/pi-web-access/feature-config.ts +29 -29
  75. package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
  76. package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
  77. package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
  78. package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
  79. package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
  80. package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
  81. package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
  82. package/agent/extensions/pi-web-access/github-api.ts +197 -197
  83. package/agent/extensions/pi-web-access/github-extract.ts +746 -746
  84. package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
  85. package/agent/extensions/pi-web-access/index.ts +1737 -1737
  86. package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
  87. package/agent/extensions/pi-web-access/package.json +64 -64
  88. package/agent/extensions/pi-web-access/page-query.ts +96 -96
  89. package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
  90. package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
  91. package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
  92. package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
  93. package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
  94. package/agent/extensions/pi-web-access/source-check.ts +282 -282
  95. package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
  96. package/agent/extensions/pi-web-access/storage.ts +521 -521
  97. package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
  98. package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
  99. package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
  100. package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
  101. package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
  102. package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
  103. package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
  104. package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
  105. package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
  106. package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
  107. package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
  108. package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
  109. package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
  110. package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
  111. package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
  112. package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
  113. package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
  114. package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
  115. package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
  116. package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
  117. package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
  118. package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
  119. package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
  120. package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
  121. package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
  122. package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
  123. package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
  124. package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
  125. package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
  126. package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
  127. package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
  128. package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
  129. package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
  130. package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
  131. package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
  132. package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
  133. package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
  134. package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
  135. package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
  136. package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
  137. package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
  138. package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
  139. package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
  140. package/agent/extensions/pi-web-access/tsconfig.json +11 -11
  141. package/agent/extensions/pi-web-access/utils.ts +451 -451
  142. package/agent/extensions/pi-web-access/video-extract.ts +392 -392
  143. package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
  144. package/agent/extensions/shared/activity-status.ts +31 -31
  145. package/agent/extensions/shared/child-session.test.ts +270 -270
  146. package/agent/extensions/shared/child-session.ts +148 -148
  147. package/agent/extensions/shared/context-utilization.test.ts +48 -48
  148. package/agent/extensions/shared/context-utilization.ts +47 -47
  149. package/agent/extensions/shared/dashboard-state.ts +99 -99
  150. package/agent/extensions/shared/install.ps1 +4 -0
  151. package/agent/extensions/shared/install.sh +3 -0
  152. package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
  153. package/agent/extensions/shared/tool-call-timeout.ts +104 -104
  154. package/agent/extensions/skillsconf/install.ps1 +4 -0
  155. package/agent/extensions/skillsconf/install.sh +3 -0
  156. package/agent/extensions/statusline/index.ts +282 -0
  157. package/agent/extensions/statusline/install.ps1 +27 -0
  158. package/agent/extensions/statusline/install.sh +24 -0
  159. package/agent/extensions/subagents/by-the-way.test.ts +29 -29
  160. package/agent/extensions/subagents/claude.test.ts +119 -119
  161. package/agent/extensions/subagents/codex.test.ts +102 -102
  162. package/agent/extensions/subagents/context-usage.test.ts +107 -107
  163. package/agent/extensions/subagents/docs/design-plan.md +568 -568
  164. package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
  165. package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
  166. package/agent/extensions/subagents/index.ts +779 -779
  167. package/agent/extensions/subagents/install.ps1 +4 -0
  168. package/agent/extensions/subagents/install.sh +3 -0
  169. package/agent/extensions/subagents/manager.test.ts +276 -276
  170. package/agent/extensions/subagents/package-lock.json +2244 -2244
  171. package/agent/extensions/subagents/package.json +19 -19
  172. package/agent/extensions/subagents/result-delivery.test.ts +27 -27
  173. package/agent/extensions/subagents/src/backend.ts +73 -73
  174. package/agent/extensions/subagents/src/backends/claude.ts +701 -701
  175. package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
  176. package/agent/extensions/subagents/src/backends/pi.ts +575 -575
  177. package/agent/extensions/subagents/src/backends/stub.ts +300 -300
  178. package/agent/extensions/subagents/src/by-the-way.ts +21 -21
  179. package/agent/extensions/subagents/src/domain.ts +253 -253
  180. package/agent/extensions/subagents/src/format.ts +74 -74
  181. package/agent/extensions/subagents/src/manager.ts +736 -736
  182. package/agent/extensions/subagents/src/prompt.ts +92 -92
  183. package/agent/extensions/subagents/src/result-delivery.ts +20 -20
  184. package/agent/extensions/subagents/src/runtime.ts +53 -53
  185. package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
  186. package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
  187. package/agent/extensions/subagents/takeover.test.ts +29 -29
  188. package/agent/extensions/subagents/tsconfig.json +7 -7
  189. package/agent/extensions/taste/install.ps1 +4 -0
  190. package/agent/extensions/taste/install.sh +3 -0
  191. package/agent/extensions/todo/AGENTS.md +38 -38
  192. package/agent/extensions/todo/LICENSE +21 -21
  193. package/agent/extensions/todo/config.ts +55 -55
  194. package/agent/extensions/todo/index.ts +151 -151
  195. package/agent/extensions/todo/install.ps1 +4 -0
  196. package/agent/extensions/todo/install.sh +3 -0
  197. package/agent/extensions/todo/locales/de.json +17 -17
  198. package/agent/extensions/todo/locales/en.json +15 -15
  199. package/agent/extensions/todo/locales/es.json +17 -17
  200. package/agent/extensions/todo/locales/fr.json +17 -17
  201. package/agent/extensions/todo/locales/pt-BR.json +17 -17
  202. package/agent/extensions/todo/locales/pt.json +17 -17
  203. package/agent/extensions/todo/locales/ru.json +17 -17
  204. package/agent/extensions/todo/locales/uk.json +17 -17
  205. package/agent/extensions/todo/locales/zh.json +17 -17
  206. package/agent/extensions/todo/package-lock.json +3358 -3358
  207. package/agent/extensions/todo/package.json +67 -67
  208. package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
  209. package/agent/extensions/todo/state/invariants.ts +20 -20
  210. package/agent/extensions/todo/state/replay.ts +38 -38
  211. package/agent/extensions/todo/state/selectors.ts +107 -107
  212. package/agent/extensions/todo/state/state-reducer.ts +326 -326
  213. package/agent/extensions/todo/state/state.ts +18 -18
  214. package/agent/extensions/todo/state/store.ts +82 -82
  215. package/agent/extensions/todo/state/task-graph.ts +57 -57
  216. package/agent/extensions/todo/todo-overlay.ts +200 -200
  217. package/agent/extensions/todo/todo.ts +155 -155
  218. package/agent/extensions/todo/tool/response-envelope.ts +109 -109
  219. package/agent/extensions/todo/tool/types.ts +206 -206
  220. package/agent/extensions/todo/view/format.ts +177 -177
  221. package/agent/extensions/trim-context/install.ps1 +4 -0
  222. package/agent/extensions/trim-context/install.sh +3 -0
  223. package/agent/keybindings.json +7 -7
  224. package/agent/version.txt +1 -0
  225. package/agent.bak.20260905-190020/AGENTS.md +67 -0
  226. package/agent.bak.20260905-190020/README.md +5 -0
  227. package/agent.bak.20260905-190020/extensions/ask-user/index.ts +418 -0
  228. package/agent.bak.20260905-190020/extensions/ask-user/package-lock.json +769 -0
  229. package/agent.bak.20260905-190020/extensions/ask-user/package.json +19 -0
  230. package/agent.bak.20260905-190020/extensions/ask-user/prompt.ts +45 -0
  231. package/agent.bak.20260905-190020/extensions/ask-user/tsconfig.json +7 -0
  232. package/agent.bak.20260905-190020/extensions/background-terminals/docs/implementation-guide.md +942 -0
  233. package/agent.bak.20260905-190020/extensions/background-terminals/index.ts +629 -0
  234. package/agent.bak.20260905-190020/extensions/background-terminals/install.ps1 +23 -0
  235. package/agent.bak.20260905-190020/extensions/background-terminals/install.sh +21 -0
  236. package/agent.bak.20260905-190020/extensions/background-terminals/package-lock.json +769 -0
  237. package/agent.bak.20260905-190020/extensions/background-terminals/package.json +17 -0
  238. package/agent.bak.20260905-190020/extensions/background-terminals/src/domain.ts +87 -0
  239. package/agent.bak.20260905-190020/extensions/background-terminals/src/manager.ts +907 -0
  240. package/agent.bak.20260905-190020/extensions/background-terminals/src/output.ts +84 -0
  241. package/agent.bak.20260905-190020/extensions/background-terminals/src/prompt.ts +142 -0
  242. package/agent.bak.20260905-190020/extensions/background-terminals/src/result-delivery.ts +27 -0
  243. package/agent.bak.20260905-190020/extensions/background-terminals/src/runtime.ts +36 -0
  244. package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/output-view.ts +79 -0
  245. package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/ps.ts +621 -0
  246. package/agent.bak.20260905-190020/extensions/background-terminals/src/widget-order.ts +121 -0
  247. package/agent.bak.20260905-190020/extensions/background-terminals/test/manager.test.ts +735 -0
  248. package/agent.bak.20260905-190020/extensions/background-terminals/test/output.test.ts +109 -0
  249. package/agent.bak.20260905-190020/extensions/background-terminals/test/prompt.test.ts +125 -0
  250. package/agent.bak.20260905-190020/extensions/background-terminals/test/ps.test.ts +82 -0
  251. package/agent.bak.20260905-190020/extensions/background-terminals/test/result-delivery.test.ts +44 -0
  252. package/agent.bak.20260905-190020/extensions/background-terminals/tsconfig.json +7 -0
  253. package/agent.bak.20260905-190020/extensions/destructive/README.md +34 -0
  254. package/agent.bak.20260905-190020/extensions/destructive/index.ts +124 -0
  255. package/agent.bak.20260905-190020/extensions/destructive/install.ps1 +23 -0
  256. package/agent.bak.20260905-190020/extensions/destructive/install.sh +21 -0
  257. package/agent.bak.20260905-190020/extensions/file-search/index.ts +459 -0
  258. package/agent.bak.20260905-190020/extensions/file-search/install.ps1 +23 -0
  259. package/agent.bak.20260905-190020/extensions/file-search/install.sh +21 -0
  260. package/agent.bak.20260905-190020/extensions/file-search/package-lock.json +2253 -0
  261. package/agent.bak.20260905-190020/extensions/file-search/package.json +23 -0
  262. package/agent.bak.20260905-190020/extensions/file-search/src/args.ts +122 -0
  263. package/agent.bak.20260905-190020/extensions/file-search/src/binaries.ts +422 -0
  264. package/agent.bak.20260905-190020/extensions/file-search/src/output.ts +126 -0
  265. package/agent.bak.20260905-190020/extensions/file-search/src/process.ts +146 -0
  266. package/agent.bak.20260905-190020/extensions/file-search/src/prompt.ts +52 -0
  267. package/agent.bak.20260905-190020/extensions/file-search/test/index.spec.ts +443 -0
  268. package/agent.bak.20260905-190020/extensions/file-search/tsconfig.json +7 -0
  269. package/agent.bak.20260905-190020/extensions/goal/README.md +50 -0
  270. package/agent.bak.20260905-190020/extensions/goal/index.ts +155 -0
  271. package/agent.bak.20260905-190020/extensions/goal/install.ps1 +23 -0
  272. package/agent.bak.20260905-190020/extensions/goal/install.sh +21 -0
  273. package/agent.bak.20260905-190020/extensions/kiln-update/README.md +25 -0
  274. package/agent.bak.20260905-190020/extensions/kiln-update/index.ts +99 -0
  275. package/agent.bak.20260905-190020/extensions/kiln-update/install.ps1 +23 -0
  276. package/agent.bak.20260905-190020/extensions/kiln-update/install.sh +21 -0
  277. package/agent.bak.20260905-190020/extensions/modelconf/PLAN.md +915 -0
  278. package/agent.bak.20260905-190020/extensions/modelconf/README.md +66 -0
  279. package/agent.bak.20260905-190020/extensions/modelconf/index.ts +296 -0
  280. package/agent.bak.20260905-190020/extensions/modelconf/install.ps1 +23 -0
  281. package/agent.bak.20260905-190020/extensions/modelconf/install.sh +21 -0
  282. package/agent.bak.20260905-190020/extensions/modelconf/package-lock.json +1809 -0
  283. package/agent.bak.20260905-190020/extensions/modelconf/package.json +13 -0
  284. package/agent.bak.20260905-190020/extensions/modelconf/src/fuzzy.ts +26 -0
  285. package/agent.bak.20260905-190020/extensions/modelconf/src/glob.ts +13 -0
  286. package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.test.ts +46 -0
  287. package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.ts +164 -0
  288. package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.test.ts +75 -0
  289. package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.ts +1101 -0
  290. package/agent.bak.20260905-190020/extensions/modelconf/tsconfig.json +15 -0
  291. package/agent.bak.20260905-190020/extensions/pi-web-access/CHANGELOG.md +690 -0
  292. package/agent.bak.20260905-190020/extensions/pi-web-access/LICENSE +21 -0
  293. package/agent.bak.20260905-190020/extensions/pi-web-access/README.md +470 -0
  294. package/agent.bak.20260905-190020/extensions/pi-web-access/SECURITY.md +5 -0
  295. package/agent.bak.20260905-190020/extensions/pi-web-access/activity.ts +101 -0
  296. package/agent.bak.20260905-190020/extensions/pi-web-access/auth-fetch.ts +148 -0
  297. package/agent.bak.20260905-190020/extensions/pi-web-access/banner.png +0 -0
  298. package/agent.bak.20260905-190020/extensions/pi-web-access/brightdata-unlocker.ts +272 -0
  299. package/agent.bak.20260905-190020/extensions/pi-web-access/chrome-cookies.ts +669 -0
  300. package/agent.bak.20260905-190020/extensions/pi-web-access/content-find.ts +139 -0
  301. package/agent.bak.20260905-190020/extensions/pi-web-access/credential-source.ts +191 -0
  302. package/agent.bak.20260905-190020/extensions/pi-web-access/data-uri-sanitize.ts +406 -0
  303. package/agent.bak.20260905-190020/extensions/pi-web-access/datalab-pdf-extract.ts +568 -0
  304. package/agent.bak.20260905-190020/extensions/pi-web-access/declared-web-links.ts +173 -0
  305. package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -0
  306. package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/contract-probe.mjs +140 -0
  307. package/agent.bak.20260905-190020/extensions/pi-web-access/exa.ts +526 -0
  308. package/agent.bak.20260905-190020/extensions/pi-web-access/extract.ts +1196 -0
  309. package/agent.bak.20260905-190020/extensions/pi-web-access/feature-config.ts +29 -0
  310. package/agent.bak.20260905-190020/extensions/pi-web-access/fetch-params.ts +111 -0
  311. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-adc.ts +298 -0
  312. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-api.ts +353 -0
  313. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-pdf-extract.ts +108 -0
  314. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-search.ts +21 -0
  315. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-url-context.ts +128 -0
  316. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web-config.ts +101 -0
  317. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web.ts +487 -0
  318. package/agent.bak.20260905-190020/extensions/pi-web-access/github-api.ts +197 -0
  319. package/agent.bak.20260905-190020/extensions/pi-web-access/github-extract.ts +746 -0
  320. package/agent.bak.20260905-190020/extensions/pi-web-access/github-issue-pr.ts +700 -0
  321. package/agent.bak.20260905-190020/extensions/pi-web-access/index.ts +1737 -0
  322. package/agent.bak.20260905-190020/extensions/pi-web-access/package-lock.json +5808 -0
  323. package/agent.bak.20260905-190020/extensions/pi-web-access/package.json +64 -0
  324. package/agent.bak.20260905-190020/extensions/pi-web-access/page-query.ts +96 -0
  325. package/agent.bak.20260905-190020/extensions/pi-web-access/pdf-extract.ts +409 -0
  326. package/agent.bak.20260905-190020/extensions/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
  327. package/agent.bak.20260905-190020/extensions/pi-web-access/promise-try.d.ts +7 -0
  328. package/agent.bak.20260905-190020/extensions/pi-web-access/query-rewrite.ts +51 -0
  329. package/agent.bak.20260905-190020/extensions/pi-web-access/render-search-error.ts +170 -0
  330. package/agent.bak.20260905-190020/extensions/pi-web-access/rsc-extract.ts +338 -0
  331. package/agent.bak.20260905-190020/extensions/pi-web-access/search-types.ts +20 -0
  332. package/agent.bak.20260905-190020/extensions/pi-web-access/source-check.ts +282 -0
  333. package/agent.bak.20260905-190020/extensions/pi-web-access/ssrf-protection.ts +526 -0
  334. package/agent.bak.20260905-190020/extensions/pi-web-access/storage.ts +521 -0
  335. package/agent.bak.20260905-190020/extensions/pi-web-access/summary-model-scope.ts +125 -0
  336. package/agent.bak.20260905-190020/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -0
  337. package/agent.bak.20260905-190020/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -0
  338. package/agent.bak.20260905-190020/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -0
  339. package/agent.bak.20260905-190020/extensions/pi-web-access/test/config-path.test.mjs +283 -0
  340. package/agent.bak.20260905-190020/extensions/pi-web-access/test/content-find.test.mjs +25 -0
  341. package/agent.bak.20260905-190020/extensions/pi-web-access/test/credential-source.test.mjs +118 -0
  342. package/agent.bak.20260905-190020/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -0
  343. package/agent.bak.20260905-190020/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -0
  344. package/agent.bak.20260905-190020/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -0
  345. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -0
  346. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -0
  347. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -0
  348. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -0
  349. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -0
  350. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-params.test.mjs +86 -0
  351. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -0
  352. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -0
  353. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -0
  354. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -0
  355. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -0
  356. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -0
  357. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -0
  358. package/agent.bak.20260905-190020/extensions/pi-web-access/test/get-search-content.test.mjs +223 -0
  359. package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-extract.test.mjs +378 -0
  360. package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -0
  361. package/agent.bak.20260905-190020/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -0
  362. package/agent.bak.20260905-190020/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -0
  363. package/agent.bak.20260905-190020/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -0
  364. package/agent.bak.20260905-190020/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -0
  365. package/agent.bak.20260905-190020/extensions/pi-web-access/test/page-query.test.mjs +51 -0
  366. package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-config.test.mjs +140 -0
  367. package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -0
  368. package/agent.bak.20260905-190020/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -0
  369. package/agent.bak.20260905-190020/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -0
  370. package/agent.bak.20260905-190020/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -0
  371. package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-error-render.test.mjs +152 -0
  372. package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-providers.test.mjs +274 -0
  373. package/agent.bak.20260905-190020/extensions/pi-web-access/test/source-check.test.mjs +179 -0
  374. package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -0
  375. package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -0
  376. package/agent.bak.20260905-190020/extensions/pi-web-access/test/summary-model-scope.test.mjs +106 -0
  377. package/agent.bak.20260905-190020/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -0
  378. package/agent.bak.20260905-190020/extensions/pi-web-access/test/web-search-answer-render.test.mjs +66 -0
  379. package/agent.bak.20260905-190020/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -0
  380. package/agent.bak.20260905-190020/extensions/pi-web-access/tsconfig.json +11 -0
  381. package/agent.bak.20260905-190020/extensions/pi-web-access/utils.ts +451 -0
  382. package/agent.bak.20260905-190020/extensions/pi-web-access/video-extract.ts +392 -0
  383. package/agent.bak.20260905-190020/extensions/pi-web-access/youtube-extract.ts +328 -0
  384. package/agent.bak.20260905-190020/extensions/shared/activity-status.ts +31 -0
  385. package/agent.bak.20260905-190020/extensions/shared/child-session.ts +148 -0
  386. package/agent.bak.20260905-190020/extensions/shared/context-utilization.ts +47 -0
  387. package/agent.bak.20260905-190020/extensions/shared/dashboard-state.ts +99 -0
  388. package/agent.bak.20260905-190020/extensions/shared/install.ps1 +23 -0
  389. package/agent.bak.20260905-190020/extensions/shared/install.sh +21 -0
  390. package/agent.bak.20260905-190020/extensions/shared/test/child-session.test.ts +270 -0
  391. package/agent.bak.20260905-190020/extensions/shared/test/context-utilization.test.ts +48 -0
  392. package/agent.bak.20260905-190020/extensions/shared/test/tool-call-timeout.test.ts +117 -0
  393. package/agent.bak.20260905-190020/extensions/shared/test/widget-order.test.ts +167 -0
  394. package/agent.bak.20260905-190020/extensions/shared/tool-call-timeout.ts +104 -0
  395. package/agent.bak.20260905-190020/extensions/skillsconf/README.md +74 -0
  396. package/agent.bak.20260905-190020/extensions/skillsconf/index.ts +92 -0
  397. package/agent.bak.20260905-190020/extensions/skillsconf/install.ps1 +23 -0
  398. package/agent.bak.20260905-190020/extensions/skillsconf/install.sh +21 -0
  399. package/agent.bak.20260905-190020/extensions/skillsconf/package-lock.json +1809 -0
  400. package/agent.bak.20260905-190020/extensions/skillsconf/package.json +18 -0
  401. package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.test.ts +64 -0
  402. package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.ts +45 -0
  403. package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.test.ts +80 -0
  404. package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.ts +74 -0
  405. package/agent.bak.20260905-190020/extensions/skillsconf/src/fuzzy.ts +26 -0
  406. package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.test.ts +72 -0
  407. package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.ts +169 -0
  408. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.test.ts +337 -0
  409. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.ts +758 -0
  410. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/text-input.ts +91 -0
  411. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/tui-helpers.ts +144 -0
  412. package/agent.bak.20260905-190020/extensions/skillsconf/tsconfig.json +15 -0
  413. package/agent.bak.20260905-190020/extensions/statusline/install.ps1 +23 -0
  414. package/agent.bak.20260905-190020/extensions/statusline/install.sh +21 -0
  415. package/agent.bak.20260905-190020/extensions/subagents/docs/design-plan.md +568 -0
  416. package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-extension-guide.md +354 -0
  417. package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-notes.md +571 -0
  418. package/agent.bak.20260905-190020/extensions/subagents/index.ts +826 -0
  419. package/agent.bak.20260905-190020/extensions/subagents/install.ps1 +23 -0
  420. package/agent.bak.20260905-190020/extensions/subagents/install.sh +21 -0
  421. package/agent.bak.20260905-190020/extensions/subagents/package-lock.json +2244 -0
  422. package/agent.bak.20260905-190020/extensions/subagents/package.json +19 -0
  423. package/agent.bak.20260905-190020/extensions/subagents/src/backend.ts +73 -0
  424. package/agent.bak.20260905-190020/extensions/subagents/src/backends/claude.ts +701 -0
  425. package/agent.bak.20260905-190020/extensions/subagents/src/backends/codex.ts +1060 -0
  426. package/agent.bak.20260905-190020/extensions/subagents/src/backends/pi.ts +575 -0
  427. package/agent.bak.20260905-190020/extensions/subagents/src/backends/stub.ts +300 -0
  428. package/agent.bak.20260905-190020/extensions/subagents/src/by-the-way.ts +21 -0
  429. package/agent.bak.20260905-190020/extensions/subagents/src/domain.ts +253 -0
  430. package/agent.bak.20260905-190020/extensions/subagents/src/format.ts +74 -0
  431. package/agent.bak.20260905-190020/extensions/subagents/src/manager.ts +736 -0
  432. package/agent.bak.20260905-190020/extensions/subagents/src/prompt.ts +92 -0
  433. package/agent.bak.20260905-190020/extensions/subagents/src/result-delivery.ts +20 -0
  434. package/agent.bak.20260905-190020/extensions/subagents/src/runtime.ts +53 -0
  435. package/agent.bak.20260905-190020/extensions/subagents/src/ui/takeover.ts +583 -0
  436. package/agent.bak.20260905-190020/extensions/subagents/src/ui/transcript.ts +201 -0
  437. package/agent.bak.20260905-190020/extensions/subagents/src/widget-order.ts +121 -0
  438. package/agent.bak.20260905-190020/extensions/subagents/test/by-the-way.test.ts +29 -0
  439. package/agent.bak.20260905-190020/extensions/subagents/test/claude.test.ts +119 -0
  440. package/agent.bak.20260905-190020/extensions/subagents/test/codex.test.ts +102 -0
  441. package/agent.bak.20260905-190020/extensions/subagents/test/context-usage.test.ts +107 -0
  442. package/agent.bak.20260905-190020/extensions/subagents/test/manager.test.ts +276 -0
  443. package/agent.bak.20260905-190020/extensions/subagents/test/result-delivery.test.ts +27 -0
  444. package/agent.bak.20260905-190020/extensions/subagents/test/takeover.test.ts +29 -0
  445. package/agent.bak.20260905-190020/extensions/subagents/tsconfig.json +7 -0
  446. package/agent.bak.20260905-190020/extensions/taste/index.ts +443 -0
  447. package/agent.bak.20260905-190020/extensions/taste/install.ps1 +23 -0
  448. package/agent.bak.20260905-190020/extensions/taste/install.sh +21 -0
  449. package/agent.bak.20260905-190020/extensions/todo/AGENTS.md +38 -0
  450. package/agent.bak.20260905-190020/extensions/todo/LICENSE +21 -0
  451. package/agent.bak.20260905-190020/extensions/todo/config.ts +55 -0
  452. package/agent.bak.20260905-190020/extensions/todo/index.ts +151 -0
  453. package/agent.bak.20260905-190020/extensions/todo/install.ps1 +23 -0
  454. package/agent.bak.20260905-190020/extensions/todo/install.sh +21 -0
  455. package/agent.bak.20260905-190020/extensions/todo/locales/de.json +17 -0
  456. package/agent.bak.20260905-190020/extensions/todo/locales/en.json +15 -0
  457. package/agent.bak.20260905-190020/extensions/todo/locales/es.json +17 -0
  458. package/agent.bak.20260905-190020/extensions/todo/locales/fr.json +17 -0
  459. package/agent.bak.20260905-190020/extensions/todo/locales/pt-BR.json +17 -0
  460. package/agent.bak.20260905-190020/extensions/todo/locales/pt.json +17 -0
  461. package/agent.bak.20260905-190020/extensions/todo/locales/ru.json +17 -0
  462. package/agent.bak.20260905-190020/extensions/todo/locales/uk.json +17 -0
  463. package/agent.bak.20260905-190020/extensions/todo/locales/zh.json +17 -0
  464. package/agent.bak.20260905-190020/extensions/todo/package-lock.json +3358 -0
  465. package/agent.bak.20260905-190020/extensions/todo/package.json +67 -0
  466. package/agent.bak.20260905-190020/extensions/todo/state/i18n-bridge.ts +64 -0
  467. package/agent.bak.20260905-190020/extensions/todo/state/invariants.ts +20 -0
  468. package/agent.bak.20260905-190020/extensions/todo/state/replay.ts +38 -0
  469. package/agent.bak.20260905-190020/extensions/todo/state/selectors.ts +107 -0
  470. package/agent.bak.20260905-190020/extensions/todo/state/state-reducer.ts +326 -0
  471. package/agent.bak.20260905-190020/extensions/todo/state/state.ts +18 -0
  472. package/agent.bak.20260905-190020/extensions/todo/state/store.ts +82 -0
  473. package/agent.bak.20260905-190020/extensions/todo/state/task-graph.ts +57 -0
  474. package/agent.bak.20260905-190020/extensions/todo/todo-overlay.ts +204 -0
  475. package/agent.bak.20260905-190020/extensions/todo/todo.ts +155 -0
  476. package/agent.bak.20260905-190020/extensions/todo/tool/response-envelope.ts +109 -0
  477. package/agent.bak.20260905-190020/extensions/todo/tool/types.ts +206 -0
  478. package/agent.bak.20260905-190020/extensions/todo/view/format.ts +177 -0
  479. package/agent.bak.20260905-190020/extensions/todo/widget-order.ts +121 -0
  480. package/agent.bak.20260905-190020/extensions/trim-context/README.md +54 -0
  481. package/agent.bak.20260905-190020/extensions/trim-context/index.ts +487 -0
  482. package/agent.bak.20260905-190020/extensions/trim-context/install.ps1 +23 -0
  483. package/agent.bak.20260905-190020/extensions/trim-context/install.sh +21 -0
  484. package/agent.bak.20260905-190020/keybindings.json +7 -0
  485. package/bin/kiln.js +588 -358
  486. package/package.json +27 -21
  487. package/agent/install.ps1 +0 -527
  488. package/agent/install.sh +0 -511
  489. /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/ask-user}/install.ps1 +0 -0
  490. /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/ask-user}/install.sh +0 -0
  491. /package/{agent/extensions/status line → agent.bak.20260905-190020/extensions/statusline}/index.ts +0 -0
@@ -2,6 +2,9 @@
2
2
  # Per-extension installer — macOS / Linux
3
3
  # Installs npm dependencies for this extension. No-op if no package.json.
4
4
  set -eu
5
+ # Drop npm_config_allow_scripts inherited from a parent npm/npx process:
6
+ # npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
7
+ unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
5
8
  EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
6
9
  if [ ! -f "$EXT_DIR/package.json" ]; then
7
10
  echo " · no package.json — skipping"
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Status Line — custom footer for pi
3
+ *
4
+ * Left: provider/model using {thinking} effort • {percent}%/{window}
5
+ * Right: $cost • path
6
+ *
7
+ * Colors:
8
+ * - model / thinking / cost → white (theme "text")
9
+ * - path → blue (theme "accent")
10
+ * - context → white under 262k tokens, red over 262k
11
+ * - separators (•, spaces) → dim
12
+ *
13
+ * Example (Muse Spark 1.2 contributor on high, 1% of 1M, $0.002, ~/.pi):
14
+ * left: opencode-go/muse-spark-1.2-contributer using high effort • 1%/1M
15
+ * right: $0.002 • ~/.pi
16
+ *
17
+ * Visibility: shown in chat and in overlay views (e.g. the subagent interactive
18
+ * takeover, which is a fullscreen overlay). Hidden during editor takeovers such
19
+ * as /settings, /model, modelconf, or skillsconf — detected by tracking TUI
20
+ * focus: every takeover moves focus away from the chat editor (and returns it
21
+ * on close), while overlays keep hasOverlay() true.
22
+ */
23
+
24
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
25
+ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
26
+ import type { TUI } from "@earendil-works/pi-tui";
27
+ import { appendFileSync } from "node:fs";
28
+ import { fileURLToPath } from "node:url";
29
+
30
+ // DEBUG: bump to confirm the loaded build; dumps raw render bytes to status-line-debug.log
31
+ const DEBUG_VERSION = 5;
32
+ const DEBUG_LOG = fileURLToPath(new URL("./status-line-debug.log", import.meta.url));
33
+ function debugLog(msg: string) {
34
+ try {
35
+ appendFileSync(DEBUG_LOG, `${new Date().toISOString()} v${DEBUG_VERSION} ${msg}\n`);
36
+ } catch {}
37
+ }
38
+
39
+ // ---- helpers ----
40
+
41
+ function formatCwd(cwd: string): string {
42
+ const home = process.env.HOME ?? process.env.USERPROFILE;
43
+ if (!home) return cwd;
44
+ // Normalize windows backslashes for comparison
45
+ const normCwd = cwd.replace(/\\/g, "/");
46
+ const normHome = home.replace(/\\/g, "/");
47
+ if (normCwd === normHome) return "~";
48
+ if (normCwd.startsWith(normHome + "/")) {
49
+ return `~${normCwd.slice(normHome.length)}`;
50
+ }
51
+ return cwd;
52
+ }
53
+
54
+ function formatWindow(n: number): string {
55
+ if (n >= 1_000_000) {
56
+ const m = n / 1_000_000;
57
+ // Keep one decimal if not round, e.g. 1.1M; otherwise 1M
58
+ if (Number.isInteger(m)) return `${m}M`;
59
+ return `${m.toFixed(1)}M`;
60
+ }
61
+ if (n >= 1000) {
62
+ const k = n / 1000;
63
+ if (Number.isInteger(k)) return `${k}k`;
64
+ return `${k.toFixed(1)}k`;
65
+ }
66
+ return String(n);
67
+ }
68
+
69
+ function formatContext(ctx: ExtensionContext): { text: string; over: boolean } {
70
+ const usage = ctx.getContextUsage();
71
+ const window = usage?.contextWindow ?? ctx.model?.contextWindow;
72
+
73
+ if (!usage || usage.tokens === null || usage.percent === null || !window) {
74
+ // Unknown tokens — show placeholder but never red
75
+ return { text: window ? `?%/${formatWindow(window)}` : "?%/??", over: false };
76
+ }
77
+
78
+ const percent = Math.round(usage.percent);
79
+ const over = usage.tokens > 262_000;
80
+ return { text: `${percent}%/${formatWindow(window)}`, over };
81
+ }
82
+
83
+ function formatThinking(level: string | undefined): string {
84
+ if (!level || level === "off") return "off";
85
+ return `using ${level} effort`;
86
+ }
87
+
88
+ function computeCost(ctx: ExtensionContext): number {
89
+ let total = 0;
90
+ try {
91
+ for (const e of ctx.sessionManager.getBranch()) {
92
+ if (e.type === "message" && (e as unknown as { message?: { role?: string; usage?: { cost?: { total?: number } } } }).message?.role === "assistant") {
93
+ const usage = (e as unknown as { message: { usage?: { cost?: { total?: number } } } }).message.usage;
94
+ if (usage?.cost?.total) total += usage.cost.total;
95
+ }
96
+ }
97
+ } catch {
98
+ // ignore
99
+ }
100
+ return total;
101
+ }
102
+
103
+ // ---- takeover visibility ----
104
+ //
105
+ // Hide the footer when a full-screen takeover view is open (/settings, /model,
106
+ // modelconf, skillsconf, login, …) but keep it visible in chat and in overlay
107
+ // views (e.g. the subagent interactive takeover, which is a fullscreen overlay).
108
+ //
109
+ // Two signals, both fail-open (the footer stays visible unless we are sure a
110
+ // takeover is open):
111
+ // 1. Extension UI (ctx.ui.custom/select/input/confirm/editor) always emits
112
+ // ui_prompt_start/end around the prompt. An active prompt without an overlay
113
+ // means the editor was replaced by a takeover view.
114
+ // 2. Core takeovers (/settings, /model, login, reload notice) emit no events,
115
+ // but they move TUI focus to a well-known component class, so match those
116
+ // names. Inline widgets like autocomplete never move focus, so the footer
117
+ // stays visible while completing.
118
+
119
+ // Matches core takeover views (all setFocus targets without ui_prompt
120
+ // events): SettingsSelectorComponent, ModelSelectorComponent,
121
+ // LoginDialogComponent, and the reload-notice Container.
122
+
123
+ const CORE_TAKEOVER_FOCUS = /(SelectorComponent|DialogComponent)$/;
124
+
125
+ function coreTakeoverName(tui: TUI): string | null {
126
+ let focused: object | null = null;
127
+ try {
128
+ focused = (tui as unknown as { getFocusedComponent?: () => object | null }).getFocusedComponent?.() ?? null;
129
+ } catch {
130
+ return null;
131
+ }
132
+ if (!focused) return null;
133
+ const name = (focused as { constructor?: { name?: string } }).constructor?.name ?? "?";
134
+ if (name === "Container" || CORE_TAKEOVER_FOCUS.test(name)) return name;
135
+ return null;
136
+ }
137
+
138
+ function hasVisibleOverlay(tui: TUI): boolean {
139
+ try {
140
+ return typeof tui.hasOverlay === "function" && tui.hasOverlay();
141
+ } catch {
142
+ return false;
143
+ }
144
+ }
145
+
146
+ // ---- extension ----
147
+
148
+ export default function (pi: ExtensionAPI) {
149
+ debugLog("extension factory loaded");
150
+ let activeTui: TUI | undefined;
151
+ let lastHideReason: string | null | undefined;
152
+ // Active extension UI prompts (ctx.ui.custom/select/input/confirm/editor).
153
+ // Any prompt without a visible overlay is an editor takeover.
154
+ let uiPromptDepth = 0;
155
+
156
+ pi.on("ui_prompt_start", () => {
157
+ uiPromptDepth++;
158
+ activeTui?.requestRender();
159
+ });
160
+ pi.on("ui_prompt_end", () => {
161
+ uiPromptDepth = Math.max(0, uiPromptDepth - 1);
162
+ activeTui?.requestRender();
163
+ });
164
+ // Re-render footer when model/thinking/tools change outside the normal render loop
165
+ pi.on("model_select", () => activeTui?.requestRender());
166
+ pi.on("thinking_level_select", () => activeTui?.requestRender());
167
+ pi.on("tool_result", () => activeTui?.requestRender());
168
+ pi.on("message_update", () => activeTui?.requestRender());
169
+ // Session switches / compaction can change context window
170
+ pi.on("session_start", async (_event, ctx) => {
171
+ if (ctx.mode !== "tui") return;
172
+
173
+ ctx.ui.setFooter((tui, theme, footerData) => {
174
+ activeTui = tui;
175
+ const unsubBranch = footerData.onBranchChange(() => tui.requestRender());
176
+
177
+ // Keep cost/context fresh during streaming token updates
178
+ // message_update fires per-token; requestRender is cheap & coalesced
179
+ const unsubSession = (ctx as unknown as { sessionManager: { on?: (ev: string, fn: () => void) => () => void } }).sessionManager.on?.("update" as never, () => tui.requestRender());
180
+
181
+ return {
182
+ dispose() {
183
+ try {
184
+ unsubBranch();
185
+ } catch {}
186
+ if (typeof unsubSession === "function") {
187
+ try {
188
+ (unsubSession as () => void)();
189
+ } catch {}
190
+ }
191
+ if (activeTui === tui) activeTui = undefined;
192
+ },
193
+ invalidate() {},
194
+ render(width: number): string[] {
195
+ if (width <= 0) return [""];
196
+ // Overlay views (subagent takeover, pickers) keep the footer.
197
+ let hideReason: string | null = null;
198
+ if (!hasVisibleOverlay(tui)) {
199
+ hideReason = uiPromptDepth > 0 ? "ui-prompt" : coreTakeoverName(tui);
200
+ }
201
+ if (hideReason !== lastHideReason) {
202
+ lastHideReason = hideReason;
203
+ debugLog(hideReason ? `hidden (${hideReason})` : "shown");
204
+ }
205
+ if (hideReason) return [""];
206
+ const modelId = ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "no-model";
207
+ const thinkingLevel = (pi.getThinkingLevel() as string | undefined) ?? (ctx.thinkingLevel as string | undefined) ?? "off";
208
+ const thinkingText = formatThinking(thinkingLevel);
209
+ const { text: ctxText, over } = formatContext(ctx);
210
+ const cost = computeCost(ctx);
211
+ const costStr = `$${cost.toFixed(3)}`;
212
+ const cwdStr = formatCwd(ctx.cwd);
213
+
214
+ // --- plain strings for width math (no ANSI, so hyphens can't lose color in truncate/wrap) ---
215
+ const leftPlain = `${modelId} ${thinkingText} • ${ctxText}`;
216
+ const rightPlain = `${costStr} • ${cwdStr}`;
217
+ const leftW = leftPlain.length; // all ascii, visibleWidth == length
218
+ const rightW = rightPlain.length;
219
+ if (width === 1) return [theme.fg("dim", "─")];
220
+
221
+ // Colors — force true white (#FFFFFF) so "-" never falls back to dim grey
222
+ const W_OPEN = "\x1b[38;2;255;255;255m";
223
+ const W_CLOSE = "\x1b[39m";
224
+ const white = (s: string) => `${W_OPEN}${s}${W_CLOSE}`;
225
+ const blue = (s: string) => theme.fg("accent", s);
226
+ const dim = (s: string) => theme.fg("dim", s);
227
+ const red = (s: string) => theme.fg("error", s);
228
+ const sepPlain = " • ";
229
+ const sep = dim(sepPlain);
230
+
231
+ // Build ANSI line only after width decisions
232
+ let left: string;
233
+ let right: string;
234
+ const gapPlain = Math.max(1, width - leftW - rightW);
235
+ if (leftW + 1 + rightW <= width) {
236
+ left = white(modelId) + dim(" ") + white(thinkingText) + sep + (over ? red(ctxText) : white(ctxText));
237
+ right = white(costStr) + sep + blue(cwdStr);
238
+ const gap = " ".repeat(gapPlain);
239
+ return [left + gap + right];
240
+ }
241
+ // Not enough width: truncate leftPlain first (keep right intact), then color the truncated pieces
242
+ const maxLeft = Math.max(0, width - rightW - 1);
243
+ let leftTruncPlain = leftPlain;
244
+ if (leftPlain.length > maxLeft) {
245
+ leftTruncPlain = maxLeft <= 3 ? leftPlain.slice(0, maxLeft) : leftPlain.slice(0, maxLeft - 3) + "...";
246
+ }
247
+ // Re-derive left parts from truncated plain (approx: truncate from the end)
248
+ // Simpler: color the whole truncated left as white, but keep "•" dim and ctx red/white tail
249
+ // Find where " • " sits in leftPlain
250
+ const sepIdx = leftPlain.lastIndexOf(sepPlain);
251
+ if (sepIdx !== -1 && leftTruncPlain.length > sepIdx) {
252
+ const head = leftTruncPlain.slice(0, sepIdx);
253
+ const tail = leftTruncPlain.slice(sepIdx + sepPlain.length);
254
+ left = white(head) + sep + (over ? red(tail) : white(tail));
255
+ } else {
256
+ left = white(leftTruncPlain);
257
+ }
258
+ right = white(costStr) + sep + blue(cwdStr);
259
+ let line = left + " " + right;
260
+ // Final safety: truncateToWidth handles ANSI correctly for the final line
261
+ if (visibleWidth(line) > width) line = truncateToWidth(line, width);
262
+ debugLog(`width=${width} line=${JSON.stringify(line)}`);
263
+ return [line];
264
+ },
265
+ };
266
+ });
267
+ });
268
+
269
+ pi.on("session_shutdown", async (_event, ctx) => {
270
+ // Never leave a stale prompt count behind (would hide the footer forever).
271
+ uiPromptDepth = 0;
272
+ // Restore default footer when session tears down (avoid stale closure)
273
+ try {
274
+ if (ctx.mode === "tui") ctx.ui.setFooter(undefined);
275
+ } catch {}
276
+ activeTui = undefined;
277
+ });
278
+
279
+ // Streaming: request render for live cost/context updates
280
+ pi.on("agent_start", () => activeTui?.requestRender());
281
+ pi.on("agent_settled", () => activeTui?.requestRender());
282
+ }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env pwsh
2
+ # Per-extension installer — Windows / PowerShell
3
+ # Installs npm dependencies for this extension. No-op if no package.json.
4
+ $ErrorActionPreference = "Stop"
5
+ # Drop npm_config_allow_scripts inherited from a parent npm/npx process:
6
+ # npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
7
+ Remove-Item Env:\npm_config_allow_scripts -ErrorAction SilentlyContinue
8
+ Remove-Item Env:\NPM_CONFIG_ALLOW_SCRIPTS -ErrorAction SilentlyContinue
9
+ $extDir = $PSScriptRoot
10
+ if (-not $extDir) { $extDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
11
+ if (-not (Test-Path "$extDir/package.json")) {
12
+ Write-Host " - no package.json — skipping" -ForegroundColor DarkGray
13
+ exit 0
14
+ }
15
+ if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
16
+ Write-Host " x npm not found — install Node.js 22+" -ForegroundColor Red
17
+ exit 1
18
+ }
19
+ if (Test-Path "$extDir/package-lock.json") {
20
+ Write-Host " - npm ci" -ForegroundColor DarkGray
21
+ npm --prefix $extDir ci --no-audit --no-fund
22
+ } else {
23
+ Write-Host " - npm install" -ForegroundColor DarkGray
24
+ npm --prefix $extDir install --no-audit --no-fund
25
+ }
26
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
27
+ Write-Host " + done" -ForegroundColor Green
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+ # Per-extension installer — macOS / Linux
3
+ # Installs npm dependencies for this extension. No-op if no package.json.
4
+ set -eu
5
+ # Drop npm_config_allow_scripts inherited from a parent npm/npx process:
6
+ # npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
7
+ unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
8
+ EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
9
+ if [ ! -f "$EXT_DIR/package.json" ]; then
10
+ echo " · no package.json — skipping"
11
+ exit 0
12
+ fi
13
+ if ! command -v npm >/dev/null 2>&1; then
14
+ echo " ✖ npm not found — install Node.js 22+" >&2
15
+ exit 1
16
+ fi
17
+ if [ -f "$EXT_DIR/package-lock.json" ]; then
18
+ echo " · npm ci"
19
+ npm --prefix "$EXT_DIR" ci --no-audit --no-fund
20
+ else
21
+ echo " · npm install"
22
+ npm --prefix "$EXT_DIR" install --no-audit --no-fund
23
+ fi
24
+ echo " ✓ done"
@@ -1,29 +1,29 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import {
4
- BTW_TITLE_MAX_LENGTH,
5
- deriveBtwTitle,
6
- isModelVisible,
7
- } from "./src/by-the-way.ts";
8
-
9
- test("deriveBtwTitle uses the first non-empty line and bounds the title", () => {
10
- assert.equal(
11
- deriveBtwTitle("\n Why does this work? \nignore me"),
12
- "Why does this work?",
13
- );
14
- assert.equal(deriveBtwTitle(" \n\t"), "by the way");
15
-
16
- const title = deriveBtwTitle("x".repeat(BTW_TITLE_MAX_LENGTH + 10));
17
- assert.equal(title.length, BTW_TITLE_MAX_LENGTH);
18
- assert.equal(title, `${"x".repeat(BTW_TITLE_MAX_LENGTH - 1)}…`);
19
-
20
- const emojiTitle = deriveBtwTitle(
21
- `${"x".repeat(BTW_TITLE_MAX_LENGTH - 2)}😀 more`,
22
- );
23
- assert.equal(emojiTitle, `${"x".repeat(BTW_TITLE_MAX_LENGTH - 2)}😀…`);
24
- });
25
-
26
- test("only model-origin snapshots are visible to model-facing tools", () => {
27
- assert.equal(isModelVisible({ origin: "model" }), true);
28
- assert.equal(isModelVisible({ origin: "btw" }), false);
29
- });
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import {
4
+ BTW_TITLE_MAX_LENGTH,
5
+ deriveBtwTitle,
6
+ isModelVisible,
7
+ } from "./src/by-the-way.ts";
8
+
9
+ test("deriveBtwTitle uses the first non-empty line and bounds the title", () => {
10
+ assert.equal(
11
+ deriveBtwTitle("\n Why does this work? \nignore me"),
12
+ "Why does this work?",
13
+ );
14
+ assert.equal(deriveBtwTitle(" \n\t"), "by the way");
15
+
16
+ const title = deriveBtwTitle("x".repeat(BTW_TITLE_MAX_LENGTH + 10));
17
+ assert.equal(title.length, BTW_TITLE_MAX_LENGTH);
18
+ assert.equal(title, `${"x".repeat(BTW_TITLE_MAX_LENGTH - 1)}…`);
19
+
20
+ const emojiTitle = deriveBtwTitle(
21
+ `${"x".repeat(BTW_TITLE_MAX_LENGTH - 2)}😀 more`,
22
+ );
23
+ assert.equal(emojiTitle, `${"x".repeat(BTW_TITLE_MAX_LENGTH - 2)}😀…`);
24
+ });
25
+
26
+ test("only model-origin snapshots are visible to model-facing tools", () => {
27
+ assert.equal(isModelVisible({ origin: "model" }), true);
28
+ assert.equal(isModelVisible({ origin: "btw" }), false);
29
+ });
@@ -1,119 +1,119 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import { Effect } from "effect";
4
- import { SubagentManager } from "./src/manager.ts";
5
- import { claudeBackend } from "./src/backends/claude.ts";
6
- import type { ParentContext, SpawnTask } from "./src/domain.ts";
7
- import { createSubagentRuntime, runTool } from "./src/runtime.ts";
8
-
9
- const parent: ParentContext = {
10
- parentCwd: process.cwd(),
11
- projectTrusted: false,
12
- };
13
-
14
- function task(prompt: string): SpawnTask {
15
- return {
16
- prompt,
17
- title: "live Claude test",
18
- cwd: process.cwd(),
19
- model: "haiku",
20
- reasoningEffort: "off",
21
- parent,
22
- };
23
- }
24
-
25
- async function claudeAvailable() {
26
- return Effect.runPromise(claudeBackend.available);
27
- }
28
-
29
- /** Rejecting deadline so a hung wait still reaches finally() and disposes. */
30
- function deadline<A>(operation: Promise<A>, timeoutMs: number) {
31
- let timer: ReturnType<typeof setTimeout> | undefined;
32
- const timeout = new Promise<never>((_resolve, reject) => {
33
- timer = setTimeout(
34
- () => reject(new Error(`Live Claude test exceeded ${timeoutMs}ms`)),
35
- timeoutMs,
36
- );
37
- });
38
- return Promise.race([operation, timeout]).finally(() => {
39
- if (timer) clearTimeout(timer);
40
- });
41
- }
42
-
43
- test(
44
- "Claude backend completes a live manager run",
45
- { timeout: 60_000 },
46
- async (t) => {
47
- if (!(await claudeAvailable())) {
48
- t.skip("Claude Code executable is unavailable");
49
- return;
50
- }
51
-
52
- const runtime = createSubagentRuntime();
53
- try {
54
- const manager = await runtime.runPromise(SubagentManager);
55
- const started = await runTool(
56
- runtime,
57
- manager.spawn("claude", task("Reply with exactly: hello claude")),
58
- );
59
- await deadline(runTool(runtime, manager.waitFor([started.id])), 45_000);
60
-
61
- const done = manager.view.get(started.id);
62
- assert.equal(done?.status, "done");
63
- assert.match(done?.finalText ?? "", /hello claude/i);
64
- assert.ok(done?.meta.nativeSessionId);
65
- assert.ok(done?.meta.sessionFilePath?.endsWith(".jsonl"));
66
- } finally {
67
- await runtime.dispose();
68
- }
69
- },
70
- );
71
-
72
- test(
73
- "Claude backend interrupt settles a live run as aborted",
74
- { timeout: 60_000 },
75
- async (t) => {
76
- if (!(await claudeAvailable())) {
77
- t.skip("Claude Code executable is unavailable");
78
- return;
79
- }
80
-
81
- const runtime = createSubagentRuntime();
82
- try {
83
- const manager = await runtime.runPromise(SubagentManager);
84
- const started = await runTool(
85
- runtime,
86
- manager.spawn(
87
- "claude",
88
- task(
89
- "Write a detailed 10,000-word essay about the history of computing.",
90
- ),
91
- ),
92
- );
93
-
94
- // Wait for streamed output so cancellation definitely lands mid-run and
95
- // exercises the SDK's normal interrupt receipt/result path.
96
- const streamDeadline = Date.now() + 15_000;
97
- while (
98
- manager.view.get(started.id)?.status === "running" &&
99
- !manager.view.get(started.id)?.liveAssistant?.text &&
100
- Date.now() < streamDeadline
101
- ) {
102
- await new Promise((resolve) => setTimeout(resolve, 20));
103
- }
104
- assert.equal(manager.view.get(started.id)?.status, "running");
105
- assert.ok(manager.view.get(started.id)?.liveAssistant?.text);
106
-
107
- const report = await deadline(
108
- runTool(runtime, manager.cancel([started.id])),
109
- 20_000,
110
- );
111
-
112
- assert.equal(report[0]?.cancelled, true);
113
- assert.equal(manager.view.get(started.id)?.status, "error");
114
- assert.equal(manager.view.get(started.id)?.errorText, "Run was aborted");
115
- } finally {
116
- await runtime.dispose();
117
- }
118
- },
119
- );
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { Effect } from "effect";
4
+ import { SubagentManager } from "./src/manager.ts";
5
+ import { claudeBackend } from "./src/backends/claude.ts";
6
+ import type { ParentContext, SpawnTask } from "./src/domain.ts";
7
+ import { createSubagentRuntime, runTool } from "./src/runtime.ts";
8
+
9
+ const parent: ParentContext = {
10
+ parentCwd: process.cwd(),
11
+ projectTrusted: false,
12
+ };
13
+
14
+ function task(prompt: string): SpawnTask {
15
+ return {
16
+ prompt,
17
+ title: "live Claude test",
18
+ cwd: process.cwd(),
19
+ model: "haiku",
20
+ reasoningEffort: "off",
21
+ parent,
22
+ };
23
+ }
24
+
25
+ async function claudeAvailable() {
26
+ return Effect.runPromise(claudeBackend.available);
27
+ }
28
+
29
+ /** Rejecting deadline so a hung wait still reaches finally() and disposes. */
30
+ function deadline<A>(operation: Promise<A>, timeoutMs: number) {
31
+ let timer: ReturnType<typeof setTimeout> | undefined;
32
+ const timeout = new Promise<never>((_resolve, reject) => {
33
+ timer = setTimeout(
34
+ () => reject(new Error(`Live Claude test exceeded ${timeoutMs}ms`)),
35
+ timeoutMs,
36
+ );
37
+ });
38
+ return Promise.race([operation, timeout]).finally(() => {
39
+ if (timer) clearTimeout(timer);
40
+ });
41
+ }
42
+
43
+ test(
44
+ "Claude backend completes a live manager run",
45
+ { timeout: 60_000 },
46
+ async (t) => {
47
+ if (!(await claudeAvailable())) {
48
+ t.skip("Claude Code executable is unavailable");
49
+ return;
50
+ }
51
+
52
+ const runtime = createSubagentRuntime();
53
+ try {
54
+ const manager = await runtime.runPromise(SubagentManager);
55
+ const started = await runTool(
56
+ runtime,
57
+ manager.spawn("claude", task("Reply with exactly: hello claude")),
58
+ );
59
+ await deadline(runTool(runtime, manager.waitFor([started.id])), 45_000);
60
+
61
+ const done = manager.view.get(started.id);
62
+ assert.equal(done?.status, "done");
63
+ assert.match(done?.finalText ?? "", /hello claude/i);
64
+ assert.ok(done?.meta.nativeSessionId);
65
+ assert.ok(done?.meta.sessionFilePath?.endsWith(".jsonl"));
66
+ } finally {
67
+ await runtime.dispose();
68
+ }
69
+ },
70
+ );
71
+
72
+ test(
73
+ "Claude backend interrupt settles a live run as aborted",
74
+ { timeout: 60_000 },
75
+ async (t) => {
76
+ if (!(await claudeAvailable())) {
77
+ t.skip("Claude Code executable is unavailable");
78
+ return;
79
+ }
80
+
81
+ const runtime = createSubagentRuntime();
82
+ try {
83
+ const manager = await runtime.runPromise(SubagentManager);
84
+ const started = await runTool(
85
+ runtime,
86
+ manager.spawn(
87
+ "claude",
88
+ task(
89
+ "Write a detailed 10,000-word essay about the history of computing.",
90
+ ),
91
+ ),
92
+ );
93
+
94
+ // Wait for streamed output so cancellation definitely lands mid-run and
95
+ // exercises the SDK's normal interrupt receipt/result path.
96
+ const streamDeadline = Date.now() + 15_000;
97
+ while (
98
+ manager.view.get(started.id)?.status === "running" &&
99
+ !manager.view.get(started.id)?.liveAssistant?.text &&
100
+ Date.now() < streamDeadline
101
+ ) {
102
+ await new Promise((resolve) => setTimeout(resolve, 20));
103
+ }
104
+ assert.equal(manager.view.get(started.id)?.status, "running");
105
+ assert.ok(manager.view.get(started.id)?.liveAssistant?.text);
106
+
107
+ const report = await deadline(
108
+ runTool(runtime, manager.cancel([started.id])),
109
+ 20_000,
110
+ );
111
+
112
+ assert.equal(report[0]?.cancelled, true);
113
+ assert.equal(manager.view.get(started.id)?.status, "error");
114
+ assert.equal(manager.view.get(started.id)?.errorText, "Run was aborted");
115
+ } finally {
116
+ await runtime.dispose();
117
+ }
118
+ },
119
+ );