@asterxsk/kiln 0.3.0 → 0.4.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 (267) hide show
  1. package/README.md +2 -2
  2. package/agent/version.txt +1 -1
  3. package/bin/kiln.js +10 -8
  4. package/package.json +1 -1
  5. package/agent.bak.20260905-190020/AGENTS.md +0 -67
  6. package/agent.bak.20260905-190020/README.md +0 -5
  7. package/agent.bak.20260905-190020/extensions/ask-user/index.ts +0 -418
  8. package/agent.bak.20260905-190020/extensions/ask-user/install.ps1 +0 -23
  9. package/agent.bak.20260905-190020/extensions/ask-user/install.sh +0 -21
  10. package/agent.bak.20260905-190020/extensions/ask-user/package-lock.json +0 -769
  11. package/agent.bak.20260905-190020/extensions/ask-user/package.json +0 -19
  12. package/agent.bak.20260905-190020/extensions/ask-user/prompt.ts +0 -45
  13. package/agent.bak.20260905-190020/extensions/ask-user/tsconfig.json +0 -7
  14. package/agent.bak.20260905-190020/extensions/background-terminals/docs/implementation-guide.md +0 -942
  15. package/agent.bak.20260905-190020/extensions/background-terminals/index.ts +0 -629
  16. package/agent.bak.20260905-190020/extensions/background-terminals/install.ps1 +0 -23
  17. package/agent.bak.20260905-190020/extensions/background-terminals/install.sh +0 -21
  18. package/agent.bak.20260905-190020/extensions/background-terminals/package-lock.json +0 -769
  19. package/agent.bak.20260905-190020/extensions/background-terminals/package.json +0 -17
  20. package/agent.bak.20260905-190020/extensions/background-terminals/src/domain.ts +0 -87
  21. package/agent.bak.20260905-190020/extensions/background-terminals/src/manager.ts +0 -907
  22. package/agent.bak.20260905-190020/extensions/background-terminals/src/output.ts +0 -84
  23. package/agent.bak.20260905-190020/extensions/background-terminals/src/prompt.ts +0 -142
  24. package/agent.bak.20260905-190020/extensions/background-terminals/src/result-delivery.ts +0 -27
  25. package/agent.bak.20260905-190020/extensions/background-terminals/src/runtime.ts +0 -36
  26. package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/output-view.ts +0 -79
  27. package/agent.bak.20260905-190020/extensions/background-terminals/src/ui/ps.ts +0 -621
  28. package/agent.bak.20260905-190020/extensions/background-terminals/src/widget-order.ts +0 -121
  29. package/agent.bak.20260905-190020/extensions/background-terminals/test/manager.test.ts +0 -735
  30. package/agent.bak.20260905-190020/extensions/background-terminals/test/output.test.ts +0 -109
  31. package/agent.bak.20260905-190020/extensions/background-terminals/test/prompt.test.ts +0 -125
  32. package/agent.bak.20260905-190020/extensions/background-terminals/test/ps.test.ts +0 -82
  33. package/agent.bak.20260905-190020/extensions/background-terminals/test/result-delivery.test.ts +0 -44
  34. package/agent.bak.20260905-190020/extensions/background-terminals/tsconfig.json +0 -7
  35. package/agent.bak.20260905-190020/extensions/destructive/README.md +0 -34
  36. package/agent.bak.20260905-190020/extensions/destructive/index.ts +0 -124
  37. package/agent.bak.20260905-190020/extensions/destructive/install.ps1 +0 -23
  38. package/agent.bak.20260905-190020/extensions/destructive/install.sh +0 -21
  39. package/agent.bak.20260905-190020/extensions/file-search/index.ts +0 -459
  40. package/agent.bak.20260905-190020/extensions/file-search/install.ps1 +0 -23
  41. package/agent.bak.20260905-190020/extensions/file-search/install.sh +0 -21
  42. package/agent.bak.20260905-190020/extensions/file-search/package-lock.json +0 -2253
  43. package/agent.bak.20260905-190020/extensions/file-search/package.json +0 -23
  44. package/agent.bak.20260905-190020/extensions/file-search/src/args.ts +0 -122
  45. package/agent.bak.20260905-190020/extensions/file-search/src/binaries.ts +0 -422
  46. package/agent.bak.20260905-190020/extensions/file-search/src/output.ts +0 -126
  47. package/agent.bak.20260905-190020/extensions/file-search/src/process.ts +0 -146
  48. package/agent.bak.20260905-190020/extensions/file-search/src/prompt.ts +0 -52
  49. package/agent.bak.20260905-190020/extensions/file-search/test/index.spec.ts +0 -443
  50. package/agent.bak.20260905-190020/extensions/file-search/tsconfig.json +0 -7
  51. package/agent.bak.20260905-190020/extensions/goal/README.md +0 -50
  52. package/agent.bak.20260905-190020/extensions/goal/index.ts +0 -155
  53. package/agent.bak.20260905-190020/extensions/goal/install.ps1 +0 -23
  54. package/agent.bak.20260905-190020/extensions/goal/install.sh +0 -21
  55. package/agent.bak.20260905-190020/extensions/kiln-update/README.md +0 -25
  56. package/agent.bak.20260905-190020/extensions/kiln-update/index.ts +0 -99
  57. package/agent.bak.20260905-190020/extensions/kiln-update/install.ps1 +0 -23
  58. package/agent.bak.20260905-190020/extensions/kiln-update/install.sh +0 -21
  59. package/agent.bak.20260905-190020/extensions/modelconf/PLAN.md +0 -915
  60. package/agent.bak.20260905-190020/extensions/modelconf/README.md +0 -66
  61. package/agent.bak.20260905-190020/extensions/modelconf/index.ts +0 -296
  62. package/agent.bak.20260905-190020/extensions/modelconf/install.ps1 +0 -23
  63. package/agent.bak.20260905-190020/extensions/modelconf/install.sh +0 -21
  64. package/agent.bak.20260905-190020/extensions/modelconf/package-lock.json +0 -1809
  65. package/agent.bak.20260905-190020/extensions/modelconf/package.json +0 -13
  66. package/agent.bak.20260905-190020/extensions/modelconf/src/fuzzy.ts +0 -26
  67. package/agent.bak.20260905-190020/extensions/modelconf/src/glob.ts +0 -13
  68. package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.test.ts +0 -46
  69. package/agent.bak.20260905-190020/extensions/modelconf/src/persistence.ts +0 -164
  70. package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.test.ts +0 -75
  71. package/agent.bak.20260905-190020/extensions/modelconf/src/ui/ModelConfView.ts +0 -1101
  72. package/agent.bak.20260905-190020/extensions/modelconf/tsconfig.json +0 -15
  73. package/agent.bak.20260905-190020/extensions/pi-web-access/CHANGELOG.md +0 -690
  74. package/agent.bak.20260905-190020/extensions/pi-web-access/LICENSE +0 -21
  75. package/agent.bak.20260905-190020/extensions/pi-web-access/README.md +0 -470
  76. package/agent.bak.20260905-190020/extensions/pi-web-access/SECURITY.md +0 -5
  77. package/agent.bak.20260905-190020/extensions/pi-web-access/activity.ts +0 -101
  78. package/agent.bak.20260905-190020/extensions/pi-web-access/auth-fetch.ts +0 -148
  79. package/agent.bak.20260905-190020/extensions/pi-web-access/banner.png +0 -0
  80. package/agent.bak.20260905-190020/extensions/pi-web-access/brightdata-unlocker.ts +0 -272
  81. package/agent.bak.20260905-190020/extensions/pi-web-access/chrome-cookies.ts +0 -669
  82. package/agent.bak.20260905-190020/extensions/pi-web-access/content-find.ts +0 -139
  83. package/agent.bak.20260905-190020/extensions/pi-web-access/credential-source.ts +0 -191
  84. package/agent.bak.20260905-190020/extensions/pi-web-access/data-uri-sanitize.ts +0 -406
  85. package/agent.bak.20260905-190020/extensions/pi-web-access/datalab-pdf-extract.ts +0 -568
  86. package/agent.bak.20260905-190020/extensions/pi-web-access/declared-web-links.ts +0 -173
  87. package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +0 -496
  88. package/agent.bak.20260905-190020/extensions/pi-web-access/evidence/contract-probe.mjs +0 -140
  89. package/agent.bak.20260905-190020/extensions/pi-web-access/exa.ts +0 -526
  90. package/agent.bak.20260905-190020/extensions/pi-web-access/extract.ts +0 -1196
  91. package/agent.bak.20260905-190020/extensions/pi-web-access/feature-config.ts +0 -29
  92. package/agent.bak.20260905-190020/extensions/pi-web-access/fetch-params.ts +0 -111
  93. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-adc.ts +0 -298
  94. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-api.ts +0 -353
  95. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-pdf-extract.ts +0 -108
  96. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-search.ts +0 -21
  97. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-url-context.ts +0 -128
  98. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web-config.ts +0 -101
  99. package/agent.bak.20260905-190020/extensions/pi-web-access/gemini-web.ts +0 -487
  100. package/agent.bak.20260905-190020/extensions/pi-web-access/github-api.ts +0 -197
  101. package/agent.bak.20260905-190020/extensions/pi-web-access/github-extract.ts +0 -746
  102. package/agent.bak.20260905-190020/extensions/pi-web-access/github-issue-pr.ts +0 -700
  103. package/agent.bak.20260905-190020/extensions/pi-web-access/index.ts +0 -1737
  104. package/agent.bak.20260905-190020/extensions/pi-web-access/package-lock.json +0 -5808
  105. package/agent.bak.20260905-190020/extensions/pi-web-access/package.json +0 -64
  106. package/agent.bak.20260905-190020/extensions/pi-web-access/page-query.ts +0 -96
  107. package/agent.bak.20260905-190020/extensions/pi-web-access/pdf-extract.ts +0 -409
  108. package/agent.bak.20260905-190020/extensions/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
  109. package/agent.bak.20260905-190020/extensions/pi-web-access/promise-try.d.ts +0 -7
  110. package/agent.bak.20260905-190020/extensions/pi-web-access/query-rewrite.ts +0 -51
  111. package/agent.bak.20260905-190020/extensions/pi-web-access/render-search-error.ts +0 -170
  112. package/agent.bak.20260905-190020/extensions/pi-web-access/rsc-extract.ts +0 -338
  113. package/agent.bak.20260905-190020/extensions/pi-web-access/search-types.ts +0 -20
  114. package/agent.bak.20260905-190020/extensions/pi-web-access/source-check.ts +0 -282
  115. package/agent.bak.20260905-190020/extensions/pi-web-access/ssrf-protection.ts +0 -526
  116. package/agent.bak.20260905-190020/extensions/pi-web-access/storage.ts +0 -521
  117. package/agent.bak.20260905-190020/extensions/pi-web-access/summary-model-scope.ts +0 -125
  118. package/agent.bak.20260905-190020/extensions/pi-web-access/test/auth-fetch.test.mjs +0 -208
  119. package/agent.bak.20260905-190020/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +0 -840
  120. package/agent.bak.20260905-190020/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +0 -441
  121. package/agent.bak.20260905-190020/extensions/pi-web-access/test/config-path.test.mjs +0 -283
  122. package/agent.bak.20260905-190020/extensions/pi-web-access/test/content-find.test.mjs +0 -25
  123. package/agent.bak.20260905-190020/extensions/pi-web-access/test/credential-source.test.mjs +0 -118
  124. package/agent.bak.20260905-190020/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +0 -210
  125. package/agent.bak.20260905-190020/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +0 -552
  126. package/agent.bak.20260905-190020/extensions/pi-web-access/test/declared-web-links.test.mjs +0 -212
  127. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +0 -40
  128. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +0 -334
  129. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +0 -95
  130. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-modes.test.mjs +0 -53
  131. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +0 -92
  132. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-params.test.mjs +0 -86
  133. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-render-call.test.mjs +0 -34
  134. package/agent.bak.20260905-190020/extensions/pi-web-access/test/fetch-routing.test.mjs +0 -173
  135. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +0 -257
  136. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-api-transport.test.mjs +0 -170
  137. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +0 -133
  138. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +0 -178
  139. package/agent.bak.20260905-190020/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +0 -148
  140. package/agent.bak.20260905-190020/extensions/pi-web-access/test/get-search-content.test.mjs +0 -223
  141. package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-extract.test.mjs +0 -378
  142. package/agent.bak.20260905-190020/extensions/pi-web-access/test/github-issue-pr.test.mjs +0 -565
  143. package/agent.bak.20260905-190020/extensions/pi-web-access/test/inline-content-config.test.mjs +0 -99
  144. package/agent.bak.20260905-190020/extensions/pi-web-access/test/lazy-extract-load.test.mjs +0 -118
  145. package/agent.bak.20260905-190020/extensions/pi-web-access/test/local-video-oversize.test.mjs +0 -52
  146. package/agent.bak.20260905-190020/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +0 -50
  147. package/agent.bak.20260905-190020/extensions/pi-web-access/test/page-query.test.mjs +0 -51
  148. package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-config.test.mjs +0 -140
  149. package/agent.bak.20260905-190020/extensions/pi-web-access/test/pdf-extract.test.mjs +0 -500
  150. package/agent.bak.20260905-190020/extensions/pi-web-access/test/proxy-transport.test.mjs +0 -286
  151. package/agent.bak.20260905-190020/extensions/pi-web-access/test/query-rewrite.test.mjs +0 -52
  152. package/agent.bak.20260905-190020/extensions/pi-web-access/test/rsc-fallback.test.mjs +0 -102
  153. package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-error-render.test.mjs +0 -152
  154. package/agent.bak.20260905-190020/extensions/pi-web-access/test/search-providers.test.mjs +0 -274
  155. package/agent.bak.20260905-190020/extensions/pi-web-access/test/source-check.test.mjs +0 -179
  156. package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +0 -205
  157. package/agent.bak.20260905-190020/extensions/pi-web-access/test/ssrf-protection.test.mjs +0 -456
  158. package/agent.bak.20260905-190020/extensions/pi-web-access/test/summary-model-scope.test.mjs +0 -106
  159. package/agent.bak.20260905-190020/extensions/pi-web-access/test/tool-registration-config.test.mjs +0 -182
  160. package/agent.bak.20260905-190020/extensions/pi-web-access/test/web-search-answer-render.test.mjs +0 -66
  161. package/agent.bak.20260905-190020/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +0 -64
  162. package/agent.bak.20260905-190020/extensions/pi-web-access/tsconfig.json +0 -11
  163. package/agent.bak.20260905-190020/extensions/pi-web-access/utils.ts +0 -451
  164. package/agent.bak.20260905-190020/extensions/pi-web-access/video-extract.ts +0 -392
  165. package/agent.bak.20260905-190020/extensions/pi-web-access/youtube-extract.ts +0 -328
  166. package/agent.bak.20260905-190020/extensions/shared/activity-status.ts +0 -31
  167. package/agent.bak.20260905-190020/extensions/shared/child-session.ts +0 -148
  168. package/agent.bak.20260905-190020/extensions/shared/context-utilization.ts +0 -47
  169. package/agent.bak.20260905-190020/extensions/shared/dashboard-state.ts +0 -99
  170. package/agent.bak.20260905-190020/extensions/shared/install.ps1 +0 -23
  171. package/agent.bak.20260905-190020/extensions/shared/install.sh +0 -21
  172. package/agent.bak.20260905-190020/extensions/shared/test/child-session.test.ts +0 -270
  173. package/agent.bak.20260905-190020/extensions/shared/test/context-utilization.test.ts +0 -48
  174. package/agent.bak.20260905-190020/extensions/shared/test/tool-call-timeout.test.ts +0 -117
  175. package/agent.bak.20260905-190020/extensions/shared/test/widget-order.test.ts +0 -167
  176. package/agent.bak.20260905-190020/extensions/shared/tool-call-timeout.ts +0 -104
  177. package/agent.bak.20260905-190020/extensions/skillsconf/README.md +0 -74
  178. package/agent.bak.20260905-190020/extensions/skillsconf/index.ts +0 -92
  179. package/agent.bak.20260905-190020/extensions/skillsconf/install.ps1 +0 -23
  180. package/agent.bak.20260905-190020/extensions/skillsconf/install.sh +0 -21
  181. package/agent.bak.20260905-190020/extensions/skillsconf/package-lock.json +0 -1809
  182. package/agent.bak.20260905-190020/extensions/skillsconf/package.json +0 -18
  183. package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.test.ts +0 -64
  184. package/agent.bak.20260905-190020/extensions/skillsconf/src/delete-skill.ts +0 -45
  185. package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.test.ts +0 -80
  186. package/agent.bak.20260905-190020/extensions/skillsconf/src/filter.ts +0 -74
  187. package/agent.bak.20260905-190020/extensions/skillsconf/src/fuzzy.ts +0 -26
  188. package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.test.ts +0 -72
  189. package/agent.bak.20260905-190020/extensions/skillsconf/src/persistence.ts +0 -169
  190. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.test.ts +0 -337
  191. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/SkillConfView.ts +0 -758
  192. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/text-input.ts +0 -91
  193. package/agent.bak.20260905-190020/extensions/skillsconf/src/ui/tui-helpers.ts +0 -144
  194. package/agent.bak.20260905-190020/extensions/skillsconf/tsconfig.json +0 -15
  195. package/agent.bak.20260905-190020/extensions/statusline/index.ts +0 -282
  196. package/agent.bak.20260905-190020/extensions/statusline/install.ps1 +0 -23
  197. package/agent.bak.20260905-190020/extensions/statusline/install.sh +0 -21
  198. package/agent.bak.20260905-190020/extensions/subagents/docs/design-plan.md +0 -568
  199. package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-extension-guide.md +0 -354
  200. package/agent.bak.20260905-190020/extensions/subagents/docs/effect-v4-notes.md +0 -571
  201. package/agent.bak.20260905-190020/extensions/subagents/index.ts +0 -826
  202. package/agent.bak.20260905-190020/extensions/subagents/install.ps1 +0 -23
  203. package/agent.bak.20260905-190020/extensions/subagents/install.sh +0 -21
  204. package/agent.bak.20260905-190020/extensions/subagents/package-lock.json +0 -2244
  205. package/agent.bak.20260905-190020/extensions/subagents/package.json +0 -19
  206. package/agent.bak.20260905-190020/extensions/subagents/src/backend.ts +0 -73
  207. package/agent.bak.20260905-190020/extensions/subagents/src/backends/claude.ts +0 -701
  208. package/agent.bak.20260905-190020/extensions/subagents/src/backends/codex.ts +0 -1060
  209. package/agent.bak.20260905-190020/extensions/subagents/src/backends/pi.ts +0 -575
  210. package/agent.bak.20260905-190020/extensions/subagents/src/backends/stub.ts +0 -300
  211. package/agent.bak.20260905-190020/extensions/subagents/src/by-the-way.ts +0 -21
  212. package/agent.bak.20260905-190020/extensions/subagents/src/domain.ts +0 -253
  213. package/agent.bak.20260905-190020/extensions/subagents/src/format.ts +0 -74
  214. package/agent.bak.20260905-190020/extensions/subagents/src/manager.ts +0 -736
  215. package/agent.bak.20260905-190020/extensions/subagents/src/prompt.ts +0 -92
  216. package/agent.bak.20260905-190020/extensions/subagents/src/result-delivery.ts +0 -20
  217. package/agent.bak.20260905-190020/extensions/subagents/src/runtime.ts +0 -53
  218. package/agent.bak.20260905-190020/extensions/subagents/src/ui/takeover.ts +0 -583
  219. package/agent.bak.20260905-190020/extensions/subagents/src/ui/transcript.ts +0 -201
  220. package/agent.bak.20260905-190020/extensions/subagents/src/widget-order.ts +0 -121
  221. package/agent.bak.20260905-190020/extensions/subagents/test/by-the-way.test.ts +0 -29
  222. package/agent.bak.20260905-190020/extensions/subagents/test/claude.test.ts +0 -119
  223. package/agent.bak.20260905-190020/extensions/subagents/test/codex.test.ts +0 -102
  224. package/agent.bak.20260905-190020/extensions/subagents/test/context-usage.test.ts +0 -107
  225. package/agent.bak.20260905-190020/extensions/subagents/test/manager.test.ts +0 -276
  226. package/agent.bak.20260905-190020/extensions/subagents/test/result-delivery.test.ts +0 -27
  227. package/agent.bak.20260905-190020/extensions/subagents/test/takeover.test.ts +0 -29
  228. package/agent.bak.20260905-190020/extensions/subagents/tsconfig.json +0 -7
  229. package/agent.bak.20260905-190020/extensions/taste/index.ts +0 -443
  230. package/agent.bak.20260905-190020/extensions/taste/install.ps1 +0 -23
  231. package/agent.bak.20260905-190020/extensions/taste/install.sh +0 -21
  232. package/agent.bak.20260905-190020/extensions/todo/AGENTS.md +0 -38
  233. package/agent.bak.20260905-190020/extensions/todo/LICENSE +0 -21
  234. package/agent.bak.20260905-190020/extensions/todo/config.ts +0 -55
  235. package/agent.bak.20260905-190020/extensions/todo/index.ts +0 -151
  236. package/agent.bak.20260905-190020/extensions/todo/install.ps1 +0 -23
  237. package/agent.bak.20260905-190020/extensions/todo/install.sh +0 -21
  238. package/agent.bak.20260905-190020/extensions/todo/locales/de.json +0 -17
  239. package/agent.bak.20260905-190020/extensions/todo/locales/en.json +0 -15
  240. package/agent.bak.20260905-190020/extensions/todo/locales/es.json +0 -17
  241. package/agent.bak.20260905-190020/extensions/todo/locales/fr.json +0 -17
  242. package/agent.bak.20260905-190020/extensions/todo/locales/pt-BR.json +0 -17
  243. package/agent.bak.20260905-190020/extensions/todo/locales/pt.json +0 -17
  244. package/agent.bak.20260905-190020/extensions/todo/locales/ru.json +0 -17
  245. package/agent.bak.20260905-190020/extensions/todo/locales/uk.json +0 -17
  246. package/agent.bak.20260905-190020/extensions/todo/locales/zh.json +0 -17
  247. package/agent.bak.20260905-190020/extensions/todo/package-lock.json +0 -3358
  248. package/agent.bak.20260905-190020/extensions/todo/package.json +0 -67
  249. package/agent.bak.20260905-190020/extensions/todo/state/i18n-bridge.ts +0 -64
  250. package/agent.bak.20260905-190020/extensions/todo/state/invariants.ts +0 -20
  251. package/agent.bak.20260905-190020/extensions/todo/state/replay.ts +0 -38
  252. package/agent.bak.20260905-190020/extensions/todo/state/selectors.ts +0 -107
  253. package/agent.bak.20260905-190020/extensions/todo/state/state-reducer.ts +0 -326
  254. package/agent.bak.20260905-190020/extensions/todo/state/state.ts +0 -18
  255. package/agent.bak.20260905-190020/extensions/todo/state/store.ts +0 -82
  256. package/agent.bak.20260905-190020/extensions/todo/state/task-graph.ts +0 -57
  257. package/agent.bak.20260905-190020/extensions/todo/todo-overlay.ts +0 -204
  258. package/agent.bak.20260905-190020/extensions/todo/todo.ts +0 -155
  259. package/agent.bak.20260905-190020/extensions/todo/tool/response-envelope.ts +0 -109
  260. package/agent.bak.20260905-190020/extensions/todo/tool/types.ts +0 -206
  261. package/agent.bak.20260905-190020/extensions/todo/view/format.ts +0 -177
  262. package/agent.bak.20260905-190020/extensions/todo/widget-order.ts +0 -121
  263. package/agent.bak.20260905-190020/extensions/trim-context/README.md +0 -54
  264. package/agent.bak.20260905-190020/extensions/trim-context/index.ts +0 -487
  265. package/agent.bak.20260905-190020/extensions/trim-context/install.ps1 +0 -23
  266. package/agent.bak.20260905-190020/extensions/trim-context/install.sh +0 -21
  267. package/agent.bak.20260905-190020/keybindings.json +0 -7
@@ -1,300 +0,0 @@
1
- /**
2
- * Scripted stub sessions shared by all three backend implementations while
3
- * the real integrations are pending. A stub session:
4
- *
5
- * - streams a plausible turn (thinking deltas, one fake tool cycle, text
6
- * deltas, usage ramp, a final assistant message, RunSettled) over a few
7
- * seconds so streaming UI, wait, and the footer counters are observable;
8
- * - supports send() while running (queued-steer rendering) and while idle
9
- * (fresh run);
10
- * - supports interrupt (RunSettled Interrupted -> status "error", matching v1);
11
- * - fails the run when the prompt starts with "FAIL:" (error-path testing);
12
- * - appends every event to a JSONL "session file" in tmpdir so the
13
- * "full transcript in session file" pointers resolve.
14
- */
15
-
16
- import * as fs from "node:fs";
17
- import * as os from "node:os";
18
- import * as path from "node:path";
19
- import type { Cause, Scope } from "effect";
20
- import { Duration, Effect, Fiber, Queue, Ref, Stream } from "effect";
21
- import type { SubagentBackend, SubagentSession } from "../backend.ts";
22
- import type {
23
- BackendName,
24
- QueuedMessage,
25
- SpawnTask,
26
- SubagentEvent,
27
- SubagentMeta,
28
- } from "../domain.ts";
29
- import { SendError } from "../domain.ts";
30
-
31
- export interface StubProfile {
32
- readonly backend: BackendName;
33
- readonly defaultModelLabel: string;
34
- readonly contextWindow: number;
35
- readonly toolName: string;
36
- /** Delay between scripted events; varies per backend so streams differ. */
37
- readonly cadenceMs: number;
38
- }
39
-
40
- const STUB_DIR = path.join(os.tmpdir(), "subagents-stub");
41
- let sessionCounter = 0;
42
-
43
- export function makeStubBackend(profile: StubProfile): SubagentBackend {
44
- return {
45
- name: profile.backend,
46
- capabilities: {
47
- steering: true,
48
- modelSelection: true,
49
- reasoningEffort: true,
50
- },
51
- // Real impls probe binary-on-PATH / SDK import / credentials here.
52
- available: Effect.succeed(true),
53
- spawn: (task) => makeStubSession(profile, task),
54
- };
55
- }
56
-
57
- function firstLine(text: string): string {
58
- return (
59
- text
60
- .split("\n")
61
- .find((line) => line.trim())
62
- ?.trim() ?? ""
63
- );
64
- }
65
-
66
- function chunked(text: string, size: number): string[] {
67
- const chunks: string[] = [];
68
- for (let i = 0; i < text.length; i += size)
69
- chunks.push(text.slice(i, i + size));
70
- return chunks;
71
- }
72
-
73
- const makeStubSession = (
74
- profile: StubProfile,
75
- task: SpawnTask,
76
- ): Effect.Effect<SubagentSession, never, Scope.Scope> =>
77
- Effect.gen(function* () {
78
- const sessionId = `stub-${profile.backend}-${++sessionCounter}`;
79
- const sessionFile = path.join(STUB_DIR, `${sessionId}.jsonl`);
80
-
81
- const state = {
82
- meta: {
83
- backend: profile.backend,
84
- modelLabel: task.model ?? profile.defaultModelLabel,
85
- contextWindow: profile.contextWindow,
86
- sessionFilePath: sessionFile,
87
- nativeSessionId: sessionId,
88
- } satisfies SubagentMeta as SubagentMeta,
89
- pending: [] as string[],
90
- turnCount: 0,
91
- closed: false,
92
- /** True between the driver dequeuing a prompt and registering its turn fiber. */
93
- dispatching: false,
94
- };
95
-
96
- const events = yield* Queue.make<SubagentEvent, Cause.Done>();
97
- const inbox = yield* Queue.make<string, Cause.Done>();
98
- const activeTurn = yield* Ref.make<Fiber.Fiber<void> | undefined>(
99
- undefined,
100
- );
101
-
102
- const emit = (event: SubagentEvent) =>
103
- Effect.suspend(() => {
104
- try {
105
- fs.appendFileSync(sessionFile, `${JSON.stringify(event)}\n`);
106
- } catch {
107
- // The fake session file is best-effort.
108
- }
109
- if (event._tag === "MetaChanged") {
110
- state.meta = { ...state.meta, ...event.meta };
111
- }
112
- return Queue.offer(events, event);
113
- }).pipe(Effect.asVoid);
114
-
115
- const pause = Effect.sleep(Duration.millis(profile.cadenceMs));
116
-
117
- const runTurn = (userText: string, turn: number) =>
118
- Effect.gen(function* () {
119
- yield* emit({ _tag: "RunStarted" });
120
- const failing = userText.trimStart().startsWith("FAIL:");
121
-
122
- const thinking = "Looking at the task and planning an approach...";
123
- for (const delta of chunked(thinking, 16)) {
124
- yield* emit({ _tag: "AssistantDelta", kind: "thinking", delta });
125
- yield* pause;
126
- }
127
-
128
- const toolId = `${sessionId}-tool-${turn}`;
129
- const argsPreview = `{"command":"ls ${task.cwd}"}`;
130
- yield* emit({
131
- _tag: "AssistantMessage",
132
- parts: [
133
- { type: "thinking", text: thinking },
134
- {
135
- type: "text",
136
- text: `I'll run ${profile.toolName} to look around first.`,
137
- },
138
- { type: "toolCall", toolId, name: profile.toolName, argsPreview },
139
- ],
140
- });
141
- yield* emit({
142
- _tag: "ToolStart",
143
- toolId,
144
- name: profile.toolName,
145
- argsPreview,
146
- });
147
- yield* pause;
148
- yield* emit({
149
- _tag: "ToolUpdate",
150
- toolId,
151
- outputPreview: "src docs package.json",
152
- });
153
- yield* pause;
154
- yield* emit({
155
- _tag: "ToolEnd",
156
- toolId,
157
- name: profile.toolName,
158
- isError: false,
159
- outputPreview: "src docs package.json",
160
- });
161
- yield* emit({
162
- _tag: "UsageChanged",
163
- tokens: Math.min(profile.contextWindow, 2400 * (turn + 1)),
164
- contextWindow: profile.contextWindow,
165
- });
166
-
167
- if (failing) {
168
- yield* pause;
169
- yield* emit({
170
- _tag: "RunSettled",
171
- outcome: {
172
- _tag: "Failed",
173
- errorText: `[stub:${profile.backend}] task failed as requested by FAIL: prefix`,
174
- },
175
- });
176
- return;
177
- }
178
-
179
- const finalText =
180
- `[stub:${profile.backend}] completed: ${firstLine(userText).slice(0, 200)}\n\n` +
181
- `This is a stubbed ${profile.backend} subagent turn ${turn + 1}. ` +
182
- `The real backend integration will replace this scripted output.`;
183
- for (const delta of chunked(finalText, 24)) {
184
- yield* emit({ _tag: "AssistantDelta", kind: "text", delta });
185
- yield* pause;
186
- }
187
- yield* emit({
188
- _tag: "AssistantMessage",
189
- parts: [{ type: "text", text: finalText }],
190
- });
191
- yield* emit({
192
- _tag: "UsageChanged",
193
- tokens: Math.min(profile.contextWindow, 2400 * (turn + 1) + 900),
194
- contextWindow: profile.contextWindow,
195
- });
196
- yield* emit({
197
- _tag: "RunSettled",
198
- outcome: { _tag: "Completed", finalText },
199
- });
200
- });
201
-
202
- const queuedView = (): ReadonlyArray<QueuedMessage> =>
203
- state.pending.map((text) => ({ text, kind: "steer" as const }));
204
-
205
- // Driver: one turn at a time, in submission order. Turns run as child
206
- // fibers so interrupt() stops the turn without killing the driver.
207
- const driver = Effect.gen(function* () {
208
- while (true) {
209
- const text = yield* Queue.take(inbox);
210
- state.dispatching = true;
211
- state.pending.shift();
212
- yield* emit({ _tag: "QueueChanged", queued: queuedView() });
213
- yield* emit({ _tag: "UserMessage", text });
214
- const turn = state.turnCount++;
215
- const fiber = yield* Effect.forkChild(
216
- runTurn(text, turn).pipe(
217
- Effect.onInterrupt(() =>
218
- emit({
219
- _tag: "RunSettled",
220
- outcome: { _tag: "Interrupted" },
221
- }).pipe(Effect.ignore),
222
- ),
223
- ),
224
- );
225
- yield* Ref.set(activeTurn, fiber);
226
- state.dispatching = false;
227
- yield* Fiber.await(fiber);
228
- yield* Ref.set(activeTurn, undefined);
229
- }
230
- });
231
- yield* Effect.forkScoped(driver.pipe(Effect.ignore));
232
-
233
- yield* Effect.addFinalizer(() =>
234
- Effect.gen(function* () {
235
- state.closed = true;
236
- yield* Queue.end(inbox).pipe(Effect.ignore);
237
- yield* Queue.end(events).pipe(Effect.ignore);
238
- }),
239
- );
240
-
241
- const submit = (text: string) =>
242
- Effect.gen(function* () {
243
- if (state.closed) {
244
- return yield* new SendError({
245
- message: "Subagent session is closed.",
246
- });
247
- }
248
- state.pending.push(text);
249
- const busy = (yield* Ref.get(activeTurn)) !== undefined;
250
- if (busy) {
251
- // Show the queued steer line until the driver picks it up.
252
- yield* emit({ _tag: "QueueChanged", queued: queuedView() });
253
- }
254
- yield* Queue.offer(inbox, text);
255
- });
256
-
257
- // Announce metadata, then kick off the initial run.
258
- yield* Effect.try(() => fs.mkdirSync(STUB_DIR, { recursive: true })).pipe(
259
- Effect.ignore, // The fake session file directory is best-effort.
260
- );
261
- yield* emit({ _tag: "MetaChanged", meta: state.meta });
262
- // The session cannot be closed yet, so the initial submit cannot fail.
263
- yield* submit(task.prompt).pipe(Effect.orDie);
264
-
265
- return {
266
- meta: Effect.sync(() => state.meta),
267
- events: Stream.fromQueue(events),
268
- send: submit,
269
- interrupt: Effect.gen(function* () {
270
- // Drop queued prompts so interrupting cannot immediately start
271
- // another turn, then stop the active turn. A prompt may be mid-flight
272
- // between the driver dequeuing it and registering its fiber, so wait
273
- // that window out instead of silently missing the turn.
274
- const cleared = yield* Queue.clear(inbox).pipe(
275
- Effect.orElseSucceed(() => []),
276
- );
277
- state.pending = [];
278
- yield* emit({ _tag: "QueueChanged", queued: [] });
279
- while (true) {
280
- const fiber = yield* Ref.get(activeTurn);
281
- if (fiber) {
282
- yield* Fiber.interrupt(fiber);
283
- return;
284
- }
285
- if (!state.dispatching) {
286
- // No turn ever started. If we cancelled queued prompts, the run
287
- // still needs a terminal event or it would look running forever.
288
- if (cleared.length > 0) {
289
- yield* emit({
290
- _tag: "RunSettled",
291
- outcome: { _tag: "Interrupted" },
292
- });
293
- }
294
- return;
295
- }
296
- yield* Effect.sleep(Duration.millis(5));
297
- }
298
- }),
299
- } satisfies SubagentSession;
300
- });
@@ -1,21 +0,0 @@
1
- import type { SubagentOrigin } from "./domain.ts";
2
-
3
- export const BTW_TITLE_MAX_LENGTH = 60;
4
-
5
- /** Build a compact dashboard title from the first non-empty prompt line. */
6
- export function deriveBtwTitle(prompt: string) {
7
- const firstLine = prompt
8
- .split("\n")
9
- .find((line) => line.trim())
10
- ?.trim();
11
- const title = firstLine?.replace(/\s+/g, " ") ?? "";
12
- if (!title) return "by the way";
13
- const codePoints = Array.from(title);
14
- if (codePoints.length <= BTW_TITLE_MAX_LENGTH) return title;
15
- return `${codePoints.slice(0, BTW_TITLE_MAX_LENGTH - 1).join("")}…`;
16
- }
17
-
18
- /** User asides remain visible in the dashboard but hidden from model tools. */
19
- export function isModelVisible(snap: { readonly origin: SubagentOrigin }) {
20
- return snap.origin === "model";
21
- }
@@ -1,253 +0,0 @@
1
- /**
2
- * Domain model for subagents.
3
- *
4
- * Everything downstream of a backend (manager, tools, UI) speaks only these
5
- * types. Backends translate their native streams (pi session events, Claude
6
- * Agent SDK messages, Codex app-server JSON-RPC notifications) into the
7
- * normalized `SubagentEvent` union.
8
- */
9
-
10
- import type { ModelRegistry } from "@earendil-works/pi-coding-agent";
11
- import { Data } from "effect";
12
-
13
- export const BACKEND_NAMES = ["pi", "claude", "codex"] as const;
14
- export type BackendName = (typeof BACKEND_NAMES)[number];
15
-
16
- /** Who initiated the session. User asides stay out of model-facing tooling. */
17
- export type SubagentOrigin = "model" | "btw";
18
-
19
- /**
20
- * Shared reasoning-effort scale (pi's thinking levels). Each backend maps a
21
- * value to its nearest native equivalent: pi uses it directly, codex
22
- * translates to its reasoning-effort slugs, claude translates to thinking
23
- * budgets. Omitted = backend default (pi inherits the parent level).
24
- */
25
- export const REASONING_EFFORTS = [
26
- "off",
27
- "minimal",
28
- "low",
29
- "medium",
30
- "high",
31
- "xhigh",
32
- "max",
33
- ] as const;
34
- export type ReasoningEffort = (typeof REASONING_EFFORTS)[number];
35
-
36
- export type SubagentStatus = "running" | "done" | "error";
37
-
38
- /** Parent-session context resolved by the tool layer and passed opaquely. */
39
- export interface ParentContext {
40
- readonly parentCwd: string;
41
- readonly projectTrusted: boolean;
42
- /** Parent pi model, for the pi backend's "inherit" default. */
43
- readonly inheritedModel?: { readonly provider: string; readonly id: string };
44
- readonly inheritedThinkingLevel?: string;
45
- /** Parent model registry; required by the pi backend to resolve models. */
46
- readonly modelRegistry?: ModelRegistry;
47
- }
48
-
49
- export interface SpawnTask {
50
- /** Omitted for normal tool-driven spawns. */
51
- readonly origin?: SubagentOrigin;
52
- readonly prompt: string;
53
- readonly title: string;
54
- readonly cwd: string;
55
- /**
56
- * Generic model hint, interpreted per backend:
57
- * pi: "provider/model-id" or bare model id; claude: model alias;
58
- * codex: model slug. Omitted = backend default / inherit.
59
- */
60
- readonly model?: string;
61
- /** Shared effort scale; each backend maps it to its native equivalent. */
62
- readonly reasoningEffort?: ReasoningEffort;
63
- readonly parent: ParentContext;
64
- }
65
-
66
- export interface SubagentMeta {
67
- readonly backend: BackendName;
68
- /** Display label, e.g. "anthropic/claude-opus-4-5" or "gpt-5-codex". */
69
- readonly modelLabel?: string;
70
- /** Context window capacity for utilization display, when known. */
71
- readonly contextWindow?: number;
72
- /** pi session file / Claude projects JSONL / Codex rollout path. */
73
- readonly sessionFilePath?: string;
74
- /** Claude session id / Codex conversation id. */
75
- readonly nativeSessionId?: string;
76
- }
77
-
78
- // --- Transcript ------------------------------------------------------------
79
-
80
- export type TranscriptPart =
81
- | { readonly type: "text"; readonly text: string }
82
- | {
83
- readonly type: "thinking";
84
- readonly text: string;
85
- readonly redacted?: boolean;
86
- }
87
- | {
88
- readonly type: "toolCall";
89
- readonly toolId: string;
90
- readonly name: string;
91
- readonly argsPreview?: string;
92
- };
93
-
94
- export type TranscriptItem =
95
- | { readonly kind: "user"; readonly text: string }
96
- | {
97
- readonly kind: "assistant";
98
- readonly parts: ReadonlyArray<TranscriptPart>;
99
- }
100
- | {
101
- readonly kind: "toolResult";
102
- readonly toolId: string;
103
- readonly name: string;
104
- readonly isError: boolean;
105
- readonly outputPreview?: string;
106
- };
107
-
108
- export interface LiveToolState {
109
- readonly toolId: string;
110
- readonly name: string;
111
- readonly argsPreview?: string;
112
- readonly outputPreview?: string;
113
- readonly done?: boolean;
114
- readonly isError?: boolean;
115
- }
116
-
117
- export interface QueuedMessage {
118
- readonly text: string;
119
- readonly kind: "steer" | "follow-up";
120
- }
121
-
122
- // --- Events ------------------------------------------------------------------
123
-
124
- export type RunOutcome =
125
- | { readonly _tag: "Completed"; readonly finalText: string }
126
- | {
127
- readonly _tag: "Failed";
128
- readonly errorText: string;
129
- readonly partialText?: string;
130
- }
131
- | { readonly _tag: "Interrupted"; readonly partialText?: string };
132
-
133
- /**
134
- * Normalized activity stream. Previews (`argsPreview`, `outputPreview`) are
135
- * pre-flattened single-line strings because the UI only ever renders one
136
- * sanitized line, which keeps three different native tool-result shapes out
137
- * of the interface.
138
- */
139
- export type SubagentEvent =
140
- // lifecycle (a session can run multiple turns via send())
141
- | { readonly _tag: "RunStarted" }
142
- | { readonly _tag: "RunSettled"; readonly outcome: RunOutcome }
143
- // transcript building blocks
144
- | { readonly _tag: "UserMessage"; readonly text: string }
145
- | {
146
- readonly _tag: "AssistantDelta";
147
- readonly kind: "text" | "thinking";
148
- readonly delta: string;
149
- }
150
- | {
151
- readonly _tag: "AssistantMessage";
152
- readonly parts: ReadonlyArray<TranscriptPart>;
153
- }
154
- | {
155
- readonly _tag: "ToolStart";
156
- readonly toolId: string;
157
- readonly name: string;
158
- readonly argsPreview?: string;
159
- }
160
- | {
161
- readonly _tag: "ToolUpdate";
162
- readonly toolId: string;
163
- readonly outputPreview?: string;
164
- }
165
- | {
166
- readonly _tag: "ToolEnd";
167
- readonly toolId: string;
168
- readonly name: string;
169
- readonly isError: boolean;
170
- readonly outputPreview?: string;
171
- }
172
- // bookkeeping
173
- | {
174
- readonly _tag: "QueueChanged";
175
- readonly queued: ReadonlyArray<QueuedMessage>;
176
- }
177
- | {
178
- readonly _tag: "UsageChanged";
179
- readonly tokens?: number;
180
- readonly contextWindow?: number;
181
- }
182
- | { readonly _tag: "MetaChanged"; readonly meta: Partial<SubagentMeta> }
183
- /** Non-fatal diagnostics. Fatal failures arrive as a RunSettled outcome. */
184
- | { readonly _tag: "BackendError"; readonly message: string };
185
-
186
- // --- Snapshot ---------------------------------------------------------------
187
-
188
- /**
189
- * The manager folds `SubagentEvent`s into one snapshot per subagent. This is
190
- * everything the tools, footer status, and both TUI views read.
191
- */
192
- export interface SubagentSnapshot {
193
- readonly id: string;
194
- readonly origin: SubagentOrigin;
195
- readonly backend: BackendName;
196
- readonly title: string;
197
- readonly prompt: string;
198
- readonly cwd: string;
199
- readonly status: SubagentStatus;
200
- readonly createdAt: number;
201
- readonly settledAt?: number;
202
- readonly errorText?: string;
203
- readonly meta: SubagentMeta;
204
- readonly usage: { readonly tokens?: number; readonly contextWindow?: number };
205
- readonly transcript: ReadonlyArray<TranscriptItem>;
206
- /** Streaming assistant buffers, cleared when the finalized message lands. */
207
- readonly liveAssistant?: { readonly text: string; readonly thinking: string };
208
- readonly liveTools: ReadonlyArray<LiveToolState>;
209
- readonly queued: ReadonlyArray<QueuedMessage>;
210
- /** Final text of the most recent completed run (v1 `finalOutput`). */
211
- readonly finalText: string;
212
- /** Count of finalized assistant messages (for subagent_check). */
213
- readonly turns: number;
214
- }
215
-
216
- /** Final text, or the live streaming buffer while a run is active (v1 `latestOutput`). */
217
- export function latestText(snap: SubagentSnapshot) {
218
- const live = snap.liveAssistant?.text.trim();
219
- if (live) return live;
220
- return snap.finalText;
221
- }
222
-
223
- export function formatElapsed(snap: SubagentSnapshot) {
224
- const end = snap.settledAt ?? Date.now();
225
- const totalSeconds = Math.max(0, Math.round((end - snap.createdAt) / 1000));
226
- const minutes = Math.floor(totalSeconds / 60);
227
- const seconds = totalSeconds % 60;
228
- return minutes > 0
229
- ? `${minutes}m${seconds.toString().padStart(2, "0")}s`
230
- : `${seconds}s`;
231
- }
232
-
233
- // --- Errors -------------------------------------------------------------------
234
-
235
- export class SpawnError extends Data.TaggedError("SpawnError")<{
236
- readonly message: string;
237
- }> {}
238
-
239
- export class BackendUnavailableError extends Data.TaggedError(
240
- "BackendUnavailableError",
241
- )<{
242
- readonly message: string;
243
- }> {}
244
-
245
- export class ConcurrencyLimitError extends Data.TaggedError(
246
- "ConcurrencyLimitError",
247
- )<{
248
- readonly message: string;
249
- }> {}
250
-
251
- export class SendError extends Data.TaggedError("SendError")<{
252
- readonly message: string;
253
- }> {}
@@ -1,74 +0,0 @@
1
- /**
2
- * Formatting helpers (self-contained copies of the v1 shared helpers:
3
- * context-utilization + activity-status).
4
- */
5
-
6
- import type { Theme } from "@earendil-works/pi-coding-agent";
7
-
8
- export interface ContextUtilization {
9
- /** Current conversation context occupancy; undefined while unknown. */
10
- tokens?: number | null;
11
- /** Capacity of the model currently serving the conversation. */
12
- contextWindow?: number | null;
13
- }
14
-
15
- function usableTokens(value: number | null | undefined) {
16
- return typeof value === "number" && Number.isFinite(value) && value >= 0
17
- ? value
18
- : undefined;
19
- }
20
-
21
- function usableCapacity(value: number | null | undefined) {
22
- return typeof value === "number" && Number.isFinite(value) && value > 0
23
- ? value
24
- : undefined;
25
- }
26
-
27
- export function contextPercent(usage: ContextUtilization) {
28
- const tokens = usableTokens(usage.tokens);
29
- const capacity = usableCapacity(usage.contextWindow);
30
- if (tokens === undefined || capacity === undefined) return undefined;
31
- return Math.round(Math.min(100, Math.max(0, (tokens / capacity) * 100)));
32
- }
33
-
34
- export function formatCompactTokens(count: number) {
35
- if (count < 1000) return Math.round(count).toString();
36
- if (count < 10000) return `${(count / 1000).toFixed(1)}k`;
37
- if (count < 1000000) return `${Math.round(count / 1000)}k`;
38
- return `${(count / 1000000).toFixed(1)}M`;
39
- }
40
-
41
- /**
42
- * Render `%/capacity`. If occupancy is unknown, retain the useful capacity
43
- * as `?%/capacity`; with no valid capacity, omit the statistic entirely.
44
- */
45
- export function formatContextUtilization(usage: ContextUtilization) {
46
- const capacity = usableCapacity(usage.contextWindow);
47
- if (capacity === undefined) return "";
48
- const percent = contextPercent(usage);
49
- return `${percent === undefined ? "?" : percent}%/${formatCompactTokens(capacity)}`;
50
- }
51
-
52
- interface ActivityCounts {
53
- running: number;
54
- done: number;
55
- failed: number;
56
- }
57
-
58
- const SQUARE = "■";
59
-
60
- export function formatActivityStatus(theme: Theme, counts: ActivityCounts) {
61
- const parts: string[] = [];
62
- if (counts.running > 0) {
63
- parts.push(theme.fg("warning", `${SQUARE} ${counts.running} running`));
64
- }
65
- if (counts.done > 0) {
66
- parts.push(theme.fg("success", `${SQUARE} ${counts.done} done`));
67
- }
68
- if (counts.failed > 0) {
69
- parts.push(theme.fg("error", `${SQUARE} ${counts.failed} failed`));
70
- }
71
- parts.push(theme.fg("accent", "/subagents") + theme.fg("dim", " to view"));
72
-
73
- return `${theme.fg("muted", "subagents:")} ${parts.join(theme.fg("dim", " · "))}`;
74
- }