@code-yeongyu/senpi 2026.9.9 → 2026.9.10

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 (1065) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/README.md +2 -0
  3. package/dist/beta/omo-local-update-worker.js.map +1 -1
  4. package/dist/beta/omo-local-update.d.ts.map +1 -1
  5. package/dist/brand-dir-migration.js.map +1 -1
  6. package/dist/cli/args.d.ts.map +1 -1
  7. package/dist/cli/args.js +1 -0
  8. package/dist/cli/args.js.map +1 -1
  9. package/dist/cli/auth-check.js.map +1 -1
  10. package/dist/cli/experimental/command.d.ts.map +1 -1
  11. package/dist/cli/grok-neo-gate.js.map +1 -1
  12. package/dist/cli/startup-ui.js.map +1 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/client/remote-session.d.ts.map +1 -1
  15. package/dist/client/remote-session.js.map +1 -1
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +43 -19
  18. package/dist/config.js.map +1 -1
  19. package/dist/core/agent-abort-provenance.d.ts.map +1 -1
  20. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  21. package/dist/core/agent-session-runtime.js.map +1 -1
  22. package/dist/core/agent-session.d.ts +46 -7
  23. package/dist/core/agent-session.d.ts.map +1 -1
  24. package/dist/core/agent-session.js +109 -6
  25. package/dist/core/agent-session.js.map +1 -1
  26. package/dist/core/agent-settled-delivery.d.ts.map +1 -1
  27. package/dist/core/auth-providers.js.map +1 -1
  28. package/dist/core/auth-storage.d.ts.map +1 -1
  29. package/dist/core/auth-storage.js.map +1 -1
  30. package/dist/core/brand.js.map +1 -1
  31. package/dist/core/compaction/branch-summarization.js.map +1 -1
  32. package/dist/core/compaction/compaction.js.map +1 -1
  33. package/dist/core/compaction/lifecycle.d.ts.map +1 -1
  34. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
  35. package/dist/core/compaction/utils.js.map +1 -1
  36. package/dist/core/credential-accounts.js.map +1 -1
  37. package/dist/core/credential-pool/classify.js.map +1 -1
  38. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  39. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  40. package/dist/core/credential-pool/state-store.d.ts +2 -2
  41. package/dist/core/credential-pool/state-store.d.ts.map +1 -1
  42. package/dist/core/credential-pool/state-store.js.map +1 -1
  43. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  44. package/dist/core/edited-assistant-message.d.ts +24 -0
  45. package/dist/core/edited-assistant-message.d.ts.map +1 -0
  46. package/dist/core/edited-assistant-message.js +57 -0
  47. package/dist/core/edited-assistant-message.js.map +1 -0
  48. package/dist/core/experimental.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/ask-user/extension.d.ts +3 -0
  50. package/dist/core/extensions/builtin/ask-user/extension.d.ts.map +1 -0
  51. package/dist/core/extensions/builtin/ask-user/extension.js +47 -0
  52. package/dist/core/extensions/builtin/ask-user/extension.js.map +1 -0
  53. package/dist/core/extensions/builtin/ask-user/family.d.ts +8 -0
  54. package/dist/core/extensions/builtin/ask-user/family.d.ts.map +1 -0
  55. package/dist/core/extensions/builtin/ask-user/family.js +6 -0
  56. package/dist/core/extensions/builtin/ask-user/family.js.map +1 -0
  57. package/dist/core/extensions/builtin/ask-user/format.d.ts +22 -0
  58. package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -0
  59. package/dist/core/extensions/builtin/ask-user/format.js +109 -0
  60. package/dist/core/extensions/builtin/ask-user/format.js.map +1 -0
  61. package/dist/core/extensions/builtin/ask-user/index.d.ts +4 -0
  62. package/dist/core/extensions/builtin/ask-user/index.d.ts.map +1 -0
  63. package/dist/core/extensions/builtin/ask-user/index.js +4 -0
  64. package/dist/core/extensions/builtin/ask-user/index.js.map +1 -0
  65. package/dist/core/extensions/builtin/ask-user/params.d.ts +27 -0
  66. package/dist/core/extensions/builtin/ask-user/params.d.ts.map +1 -0
  67. package/dist/core/extensions/builtin/ask-user/params.js +78 -0
  68. package/dist/core/extensions/builtin/ask-user/params.js.map +1 -0
  69. package/dist/core/extensions/builtin/ask-user/pending.d.ts +58 -0
  70. package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -0
  71. package/dist/core/extensions/builtin/ask-user/pending.js +130 -0
  72. package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -0
  73. package/dist/core/extensions/builtin/ask-user/registry.d.ts +21 -0
  74. package/dist/core/extensions/builtin/ask-user/registry.d.ts.map +1 -0
  75. package/dist/core/extensions/builtin/ask-user/registry.js +20 -0
  76. package/dist/core/extensions/builtin/ask-user/registry.js.map +1 -0
  77. package/dist/core/extensions/builtin/ask-user/render.d.ts +4 -0
  78. package/dist/core/extensions/builtin/ask-user/render.d.ts.map +1 -0
  79. package/dist/core/extensions/builtin/ask-user/render.js +25 -0
  80. package/dist/core/extensions/builtin/ask-user/render.js.map +1 -0
  81. package/dist/core/extensions/builtin/ask-user/resume.d.ts +4 -0
  82. package/dist/core/extensions/builtin/ask-user/resume.d.ts.map +1 -0
  83. package/dist/core/extensions/builtin/ask-user/resume.js +85 -0
  84. package/dist/core/extensions/builtin/ask-user/resume.js.map +1 -0
  85. package/dist/core/extensions/builtin/ask-user/schema.d.ts +40 -0
  86. package/dist/core/extensions/builtin/ask-user/schema.d.ts.map +1 -0
  87. package/dist/core/extensions/builtin/ask-user/schema.js +102 -0
  88. package/dist/core/extensions/builtin/ask-user/schema.js.map +1 -0
  89. package/dist/core/extensions/builtin/ask-user/tool.d.ts +8 -0
  90. package/dist/core/extensions/builtin/ask-user/tool.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/ask-user/tool.js +195 -0
  92. package/dist/core/extensions/builtin/ask-user/tool.js.map +1 -0
  93. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  94. package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/btw/side-query.js.map +1 -1
  96. package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
  98. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
  99. package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
  100. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
  102. package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.js.map +1 -1
  104. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +11 -0
  105. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +12 -1
  107. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
  108. package/dist/core/extensions/builtin/claude-sdk-oauth/bounded-queue.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts +14 -0
  112. package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts.map +1 -0
  113. package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js +42 -0
  114. package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js.map +1 -0
  115. package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts +18 -0
  116. package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js +105 -36
  118. package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js.map +1 -1
  119. package/dist/core/extensions/builtin/claude-sdk-oauth/failover.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
  121. package/dist/core/extensions/builtin/claude-sdk-oauth/refusal.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.d.ts.map +1 -1
  126. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
  128. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  130. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +4 -1
  132. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  133. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  134. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
  137. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
  138. package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.js.map +1 -1
  139. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
  141. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  142. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  143. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  144. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  145. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/compaction/openai-remote-convert.js.map +1 -1
  147. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  148. package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts +7 -0
  150. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts.map +1 -0
  151. package/dist/core/extensions/builtin/compaction/resume-admission.js +7 -0
  152. package/dist/core/extensions/builtin/compaction/resume-admission.js.map +1 -0
  153. package/dist/core/extensions/builtin/compaction/resume-slice.d.ts +23 -0
  154. package/dist/core/extensions/builtin/compaction/resume-slice.d.ts.map +1 -0
  155. package/dist/core/extensions/builtin/compaction/resume-slice.js +99 -0
  156. package/dist/core/extensions/builtin/compaction/resume-slice.js.map +1 -0
  157. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  158. package/dist/core/extensions/builtin/compaction/summarization-retry.js.map +1 -1
  159. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  161. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
  162. package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/config-reload/reload-deferral.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
  166. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
  167. package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
  168. package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js.map +1 -1
  170. package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js.map +1 -1
  172. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
  174. package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js.map +1 -1
  177. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
  178. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
  179. package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js.map +1 -1
  181. package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts.map +1 -1
  182. package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js.map +1 -1
  183. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  184. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
  185. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  186. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  187. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -1
  188. package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/goal/monitor-continuation.js +57 -4
  192. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  193. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  194. package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
  195. package/dist/core/extensions/builtin/goal/prompt.js +9 -6
  196. package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
  197. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  198. package/dist/core/extensions/builtin/goal/tool-registration.js +1 -1
  199. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  200. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -1
  201. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  203. package/dist/core/extensions/builtin/goal/wait-progress.js.map +1 -1
  204. package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -1
  205. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  206. package/dist/core/extensions/builtin/gpt-account.js +1 -0
  207. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  208. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  209. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  210. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  211. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  212. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  213. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  214. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  215. package/dist/core/extensions/builtin/help/panel.d.ts.map +1 -1
  216. package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
  217. package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
  218. package/dist/core/extensions/builtin/hooks/command-runner.js.map +1 -1
  219. package/dist/core/extensions/builtin/hooks/dispatcher.js.map +1 -1
  220. package/dist/core/extensions/builtin/hooks/plugin-loader.js.map +1 -1
  221. package/dist/core/extensions/builtin/hooks/tool-adapter.js.map +1 -1
  222. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
  224. package/dist/core/extensions/builtin/hooks/types.d.ts.map +1 -1
  225. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
  226. package/dist/core/extensions/builtin/imagegen/params.d.ts +45 -0
  227. package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -0
  228. package/dist/core/extensions/builtin/imagegen/params.js +81 -0
  229. package/dist/core/extensions/builtin/imagegen/params.js.map +1 -0
  230. package/dist/core/extensions/builtin/imagegen/paths.d.ts +10 -4
  231. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -1
  232. package/dist/core/extensions/builtin/imagegen/paths.js +43 -10
  233. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -1
  234. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +20 -0
  235. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -0
  236. package/dist/core/extensions/builtin/imagegen/reference-images.js +70 -0
  237. package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -0
  238. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +58 -33
  239. package/dist/core/extensions/builtin/imagegen/tool.d.ts +15 -19
  240. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
  241. package/dist/core/extensions/builtin/imagegen/tool.js +74 -52
  242. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
  243. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  244. package/dist/core/extensions/builtin/index.js +2 -0
  245. package/dist/core/extensions/builtin/index.js.map +1 -1
  246. package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -1
  247. package/dist/core/extensions/builtin/look-at/runner.js.map +1 -1
  248. package/dist/core/extensions/builtin/loop/command.js.map +1 -1
  249. package/dist/core/extensions/builtin/loop/cron-planner.js.map +1 -1
  250. package/dist/core/extensions/builtin/loop/index.d.ts.map +1 -1
  251. package/dist/core/extensions/builtin/loop/index.js.map +1 -1
  252. package/dist/core/extensions/builtin/loop/loopfile.d.ts.map +1 -1
  253. package/dist/core/extensions/builtin/loop/scheduler.js.map +1 -1
  254. package/dist/core/extensions/builtin/loop/status.d.ts.map +1 -1
  255. package/dist/core/extensions/builtin/loop/store.d.ts.map +1 -1
  256. package/dist/core/extensions/builtin/loop/types.d.ts.map +1 -1
  257. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -1
  258. package/dist/core/extensions/builtin/loop-guard/escalation.d.ts.map +1 -1
  259. package/dist/core/extensions/builtin/loop-guard/escalation.js.map +1 -1
  260. package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -1
  261. package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -1
  262. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
  263. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -1
  264. package/dist/core/extensions/builtin/mcp/active-set.js.map +1 -1
  265. package/dist/core/extensions/builtin/mcp/auth/callback.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/mcp/auth/oauth-errors.d.ts.map +1 -1
  267. package/dist/core/extensions/builtin/mcp/auth/oauth-errors.js.map +1 -1
  268. package/dist/core/extensions/builtin/mcp/auth/oauth-provider.d.ts.map +1 -1
  269. package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.d.ts.map +1 -1
  270. package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js.map +1 -1
  271. package/dist/core/extensions/builtin/mcp/auth/oauth.js.map +1 -1
  272. package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts.map +1 -1
  273. package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
  274. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +28 -28
  275. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  276. package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
  277. package/dist/core/extensions/builtin/mcp/elicitation.d.ts.map +1 -1
  278. package/dist/core/extensions/builtin/mcp/elicitation.js.map +1 -1
  279. package/dist/core/extensions/builtin/mcp/errors.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/mcp/errors.js.map +1 -1
  281. package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
  282. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  283. package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/mcp/guard/output-guard.js.map +1 -1
  285. package/dist/core/extensions/builtin/mcp/log.js.map +1 -1
  286. package/dist/core/extensions/builtin/mcp/reconnect.d.ts.map +1 -1
  287. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  288. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  289. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  290. package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -1
  292. package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -1
  293. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +13 -6
  294. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -1
  295. package/dist/core/extensions/builtin/oauth-login-interaction.js +43 -19
  296. package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -1
  297. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +5 -3
  298. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -1
  299. package/dist/core/extensions/builtin/openai-image-gen/inject.js +7 -4
  300. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -1
  301. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  302. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  303. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  304. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  306. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  307. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  308. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
  309. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
  310. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
  311. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  312. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +1 -1
  313. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  314. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  315. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +1 -1
  316. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -1
  317. package/dist/core/extensions/builtin/prompt-preset/glm-5.js +1 -1
  318. package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -1
  319. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  320. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
  321. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  322. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +4 -4
  323. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  324. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +4 -4
  325. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  326. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
  327. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  328. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  329. package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -1
  330. package/dist/core/extensions/builtin/rules/commands.js.map +1 -1
  331. package/dist/core/extensions/builtin/rules/config.js.map +1 -1
  332. package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -1
  333. package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -1
  334. package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -1
  335. package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -1
  336. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  337. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  338. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  339. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  340. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  341. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -1
  342. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  343. package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -1
  344. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  345. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  346. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -1
  347. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  348. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  349. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -1
  350. package/dist/core/extensions/builtin/todotools/todo-operations.js.map +1 -1
  351. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -1
  352. package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -1
  353. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  354. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
  355. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
  356. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
  357. package/dist/core/extensions/builtin/ttsr/detectors/leak-context.d.ts.map +1 -1
  358. package/dist/core/extensions/builtin/ttsr/detectors/token-grammar.d.ts.map +1 -1
  359. package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
  360. package/dist/core/extensions/builtin/ttsr/message-update.js.map +1 -1
  361. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -1
  362. package/dist/core/extensions/builtin/ttsr/stream-utils.d.ts.map +1 -1
  363. package/dist/core/extensions/builtin/ttsr/watch.d.ts.map +1 -1
  364. package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -1
  365. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +1 -1
  366. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  367. package/dist/core/extensions/loader.d.ts +2 -1
  368. package/dist/core/extensions/loader.d.ts.map +1 -1
  369. package/dist/core/extensions/loader.js +17 -8
  370. package/dist/core/extensions/loader.js.map +1 -1
  371. package/dist/core/extensions/notice/box.d.ts.map +1 -1
  372. package/dist/core/extensions/notice/box.js +13 -5
  373. package/dist/core/extensions/notice/box.js.map +1 -1
  374. package/dist/core/extensions/runner.d.ts +11 -0
  375. package/dist/core/extensions/runner.d.ts.map +1 -1
  376. package/dist/core/extensions/runner.js +23 -0
  377. package/dist/core/extensions/runner.js.map +1 -1
  378. package/dist/core/extensions/types.d.ts +76 -1
  379. package/dist/core/extensions/types.d.ts.map +1 -1
  380. package/dist/core/extensions/types.js.map +1 -1
  381. package/dist/core/footer-data-provider.d.ts.map +1 -1
  382. package/dist/core/footer-data-provider.js.map +1 -1
  383. package/dist/core/http-dispatcher.d.ts.map +1 -1
  384. package/dist/core/http-dispatcher.js.map +1 -1
  385. package/dist/core/keybindings.d.ts +182 -177
  386. package/dist/core/keybindings.d.ts.map +1 -1
  387. package/dist/core/keybindings.js +5 -0
  388. package/dist/core/keybindings.js.map +1 -1
  389. package/dist/core/lockfile-policy.d.ts.map +1 -1
  390. package/dist/core/messages.js.map +1 -1
  391. package/dist/core/model-config-schema.d.ts +150 -150
  392. package/dist/core/model-config-schema.d.ts.map +1 -1
  393. package/dist/core/model-config.d.ts.map +1 -1
  394. package/dist/core/model-config.js.map +1 -1
  395. package/dist/core/model-registry.d.ts.map +1 -1
  396. package/dist/core/model-registry.js.map +1 -1
  397. package/dist/core/model-resolver.d.ts.map +1 -1
  398. package/dist/core/model-resolver.js +1 -0
  399. package/dist/core/model-resolver.js.map +1 -1
  400. package/dist/core/model-runtime.d.ts.map +1 -1
  401. package/dist/core/model-runtime.js.map +1 -1
  402. package/dist/core/models-store.d.ts.map +1 -1
  403. package/dist/core/models-store.js.map +1 -1
  404. package/dist/core/package-manager.d.ts.map +1 -1
  405. package/dist/core/provider-display-names.d.ts.map +1 -1
  406. package/dist/core/provider-display-names.js +1 -0
  407. package/dist/core/provider-display-names.js.map +1 -1
  408. package/dist/core/remote-catalog-provider.js.map +1 -1
  409. package/dist/core/resource-loader.d.ts +2 -0
  410. package/dist/core/resource-loader.d.ts.map +1 -1
  411. package/dist/core/resource-loader.js +11 -7
  412. package/dist/core/resource-loader.js.map +1 -1
  413. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  414. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
  415. package/dist/core/retry-fallback/cooldown.js.map +1 -1
  416. package/dist/core/retry-fallback/expansion.js.map +1 -1
  417. package/dist/core/retry-fallback/log.js.map +1 -1
  418. package/dist/core/retry-fallback/probe-scheduler.d.ts.map +1 -1
  419. package/dist/core/runtime-credentials.d.ts.map +1 -1
  420. package/dist/core/sdk.d.ts.map +1 -1
  421. package/dist/core/sdk.js +24 -1
  422. package/dist/core/sdk.js.map +1 -1
  423. package/dist/core/session-activity.d.ts.map +1 -1
  424. package/dist/core/session-cwd.d.ts.map +1 -1
  425. package/dist/core/session-log.js.map +1 -1
  426. package/dist/core/session-manager.d.ts.map +1 -1
  427. package/dist/core/session-manager.js.map +1 -1
  428. package/dist/core/session-resident-store.d.ts.map +1 -1
  429. package/dist/core/session-sidecar-store.d.ts.map +1 -1
  430. package/dist/core/session-summary-lru.d.ts.map +1 -1
  431. package/dist/core/session-work-barrier.d.ts.map +1 -1
  432. package/dist/core/settings-manager.d.ts +6 -1
  433. package/dist/core/settings-manager.d.ts.map +1 -1
  434. package/dist/core/settings-manager.js +14 -0
  435. package/dist/core/settings-manager.js.map +1 -1
  436. package/dist/core/settings-shapes.d.ts +7 -0
  437. package/dist/core/settings-shapes.d.ts.map +1 -1
  438. package/dist/core/settings-shapes.js +3 -1
  439. package/dist/core/settings-shapes.js.map +1 -1
  440. package/dist/core/telemetry.js.map +1 -1
  441. package/dist/core/timings.js.map +1 -1
  442. package/dist/core/tools/bash.d.ts.map +1 -1
  443. package/dist/core/tools/bounded-realpath.js.map +1 -1
  444. package/dist/core/tools/edit.d.ts.map +1 -1
  445. package/dist/core/tools/find.d.ts.map +1 -1
  446. package/dist/core/tools/find.js.map +1 -1
  447. package/dist/core/tools/grep.d.ts.map +1 -1
  448. package/dist/core/tools/ls.d.ts.map +1 -1
  449. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  450. package/dist/core/tools/output-accumulator.js.map +1 -1
  451. package/dist/core/tools/powershell.d.ts.map +1 -1
  452. package/dist/core/tools/read-classifiers.d.ts +17 -0
  453. package/dist/core/tools/read-classifiers.d.ts.map +1 -0
  454. package/dist/core/tools/read-classifiers.js +26 -0
  455. package/dist/core/tools/read-classifiers.js.map +1 -0
  456. package/dist/core/tools/read.d.ts +5 -1
  457. package/dist/core/tools/read.d.ts.map +1 -1
  458. package/dist/core/tools/read.js +21 -1
  459. package/dist/core/tools/read.js.map +1 -1
  460. package/dist/core/tools/tail-window.d.ts.map +1 -1
  461. package/dist/core/tools/truncate.js.map +1 -1
  462. package/dist/core/tools/write-result.js.map +1 -1
  463. package/dist/core/tools/write.d.ts.map +1 -1
  464. package/dist/core/trust-manager.d.ts.map +1 -1
  465. package/dist/extensions/llama/client.d.ts.map +1 -1
  466. package/dist/extensions/llama/client.js.map +1 -1
  467. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  468. package/dist/extensions/llama/huggingface.js.map +1 -1
  469. package/dist/extensions/llama/provider.js.map +1 -1
  470. package/dist/from-source-config-guard.js.map +1 -1
  471. package/dist/index.d.ts +1 -0
  472. package/dist/index.d.ts.map +1 -1
  473. package/dist/index.js +1 -0
  474. package/dist/index.js.map +1 -1
  475. package/dist/main.d.ts.map +1 -1
  476. package/dist/main.js +4 -0
  477. package/dist/main.js.map +1 -1
  478. package/dist/modes/app-server/daemon/occupancy.d.ts.map +1 -1
  479. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  480. package/dist/modes/app-server/daemon/process.js.map +1 -1
  481. package/dist/modes/app-server/daemon.js.map +1 -1
  482. package/dist/modes/app-server/protocol/collaboration-mode.d.ts.map +1 -1
  483. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts +7 -0
  484. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts.map +1 -0
  485. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js +4 -0
  486. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js.map +1 -0
  487. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts +8 -0
  488. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts.map +1 -0
  489. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js +4 -0
  490. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js.map +1 -0
  491. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts +12 -0
  492. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts.map +1 -0
  493. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js +4 -0
  494. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js.map +1 -0
  495. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts +13 -0
  496. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts.map +1 -0
  497. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js +4 -0
  498. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js.map +1 -0
  499. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts +10 -0
  500. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts.map +1 -0
  501. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js +4 -0
  502. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js.map +1 -0
  503. package/dist/modes/app-server/protocol/index.d.ts +2 -0
  504. package/dist/modes/app-server/protocol/index.d.ts.map +1 -1
  505. package/dist/modes/app-server/protocol/index.js.map +1 -1
  506. package/dist/modes/app-server/protocol/methods.d.ts +1 -0
  507. package/dist/modes/app-server/protocol/methods.d.ts.map +1 -1
  508. package/dist/modes/app-server/protocol/methods.js +1 -0
  509. package/dist/modes/app-server/protocol/methods.js.map +1 -1
  510. package/dist/modes/app-server/rpc/errors.d.ts.map +1 -1
  511. package/dist/modes/app-server/runtime.d.ts.map +1 -1
  512. package/dist/modes/app-server/runtime.js +22 -6
  513. package/dist/modes/app-server/runtime.js.map +1 -1
  514. package/dist/modes/app-server/search/fuzzy-files.js.map +1 -1
  515. package/dist/modes/app-server/search/fuzzy-search-service.d.ts.map +1 -1
  516. package/dist/modes/app-server/server/account.js.map +1 -1
  517. package/dist/modes/app-server/server/approval-bridge.d.ts.map +1 -1
  518. package/dist/modes/app-server/server/approval-types.d.ts.map +1 -1
  519. package/dist/modes/app-server/server/approval-ui-context.d.ts +2 -1
  520. package/dist/modes/app-server/server/approval-ui-context.d.ts.map +1 -1
  521. package/dist/modes/app-server/server/approval-ui-context.js +9 -1
  522. package/dist/modes/app-server/server/approval-ui-context.js.map +1 -1
  523. package/dist/modes/app-server/server/catalogs.js.map +1 -1
  524. package/dist/modes/app-server/server/config.js.map +1 -1
  525. package/dist/modes/app-server/server/connection.d.ts.map +1 -1
  526. package/dist/modes/app-server/server/models.js.map +1 -1
  527. package/dist/modes/app-server/server/notifications.d.ts.map +1 -1
  528. package/dist/modes/app-server/server/notifications.js.map +1 -1
  529. package/dist/modes/app-server/server/server-core.d.ts.map +1 -1
  530. package/dist/modes/app-server/server/server-core.js.map +1 -1
  531. package/dist/modes/app-server/server/skills.js.map +1 -1
  532. package/dist/modes/app-server/server/user-input-bridge.d.ts +16 -0
  533. package/dist/modes/app-server/server/user-input-bridge.d.ts.map +1 -0
  534. package/dist/modes/app-server/server/user-input-bridge.js +142 -0
  535. package/dist/modes/app-server/server/user-input-bridge.js.map +1 -0
  536. package/dist/modes/app-server/server/user-input-types.d.ts +43 -0
  537. package/dist/modes/app-server/server/user-input-types.d.ts.map +1 -0
  538. package/dist/modes/app-server/server/user-input-types.js +51 -0
  539. package/dist/modes/app-server/server/user-input-types.js.map +1 -0
  540. package/dist/modes/app-server/threads/archive-state.d.ts.map +1 -1
  541. package/dist/modes/app-server/threads/handlers.js.map +1 -1
  542. package/dist/modes/app-server/threads/mcp-wire-status.d.ts.map +1 -1
  543. package/dist/modes/app-server/threads/metadata-state.d.ts.map +1 -1
  544. package/dist/modes/app-server/threads/projection-file-changes.js.map +1 -1
  545. package/dist/modes/app-server/threads/projection-message-items.d.ts.map +1 -1
  546. package/dist/modes/app-server/threads/projection-turn-diff.d.ts.map +1 -1
  547. package/dist/modes/app-server/threads/projection-web-search.js.map +1 -1
  548. package/dist/modes/app-server/threads/projection.d.ts.map +1 -1
  549. package/dist/modes/app-server/threads/registry.d.ts.map +1 -1
  550. package/dist/modes/app-server/threads/registry.js.map +1 -1
  551. package/dist/modes/app-server/threads/search-cache.d.ts.map +1 -1
  552. package/dist/modes/app-server/threads/turn-log.d.ts.map +1 -1
  553. package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
  554. package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
  555. package/dist/modes/app-server/threads/turns.js.map +1 -1
  556. package/dist/modes/app-server/threads/wire-thread.js.map +1 -1
  557. package/dist/modes/app-server/transports/unix-socket.d.ts.map +1 -1
  558. package/dist/modes/app-server/transports/unix-socket.js.map +1 -1
  559. package/dist/modes/app-server/transports/websocket.d.ts.map +1 -1
  560. package/dist/modes/app-server/turn-adapter.d.ts +3 -3
  561. package/dist/modes/app-server/turn-adapter.d.ts.map +1 -1
  562. package/dist/modes/app-server/turn-adapter.js +36 -5
  563. package/dist/modes/app-server/turn-adapter.js.map +1 -1
  564. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  565. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  566. package/dist/modes/interactive/components/armin.js.map +1 -1
  567. package/dist/modes/interactive/components/ask-user-async-widget.d.ts +39 -0
  568. package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -0
  569. package/dist/modes/interactive/components/ask-user-async-widget.js +82 -0
  570. package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -0
  571. package/dist/modes/interactive/components/ask-user-question-keys.d.ts +21 -0
  572. package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -0
  573. package/dist/modes/interactive/components/ask-user-question-keys.js +115 -0
  574. package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -0
  575. package/dist/modes/interactive/components/ask-user-question-render.d.ts +17 -0
  576. package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -0
  577. package/dist/modes/interactive/components/ask-user-question-render.js +75 -0
  578. package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -0
  579. package/dist/modes/interactive/components/ask-user-question-state.d.ts +52 -0
  580. package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -0
  581. package/dist/modes/interactive/components/ask-user-question-state.js +134 -0
  582. package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -0
  583. package/dist/modes/interactive/components/ask-user-question.d.ts +50 -0
  584. package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -0
  585. package/dist/modes/interactive/components/ask-user-question.js +148 -0
  586. package/dist/modes/interactive/components/ask-user-question.js.map +1 -0
  587. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  588. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  589. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  590. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  592. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  593. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  594. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  596. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  597. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  598. package/dist/modes/interactive/components/continuity-notice.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  600. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  602. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  603. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  604. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/diff.js.map +1 -1
  606. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  607. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  608. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  610. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  611. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  612. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  613. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  614. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  616. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  617. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  619. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -1
  622. package/dist/modes/interactive/components/render-signature.js.map +1 -1
  623. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  624. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  625. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  626. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  628. package/dist/modes/interactive/components/shortcut-overlay.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  630. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  631. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  632. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  633. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  634. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  635. package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
  637. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  638. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  639. package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -1
  640. package/dist/modes/interactive/components/tree-selector.d.ts +4 -0
  641. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  642. package/dist/modes/interactive/components/tree-selector.js +17 -0
  643. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  644. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  645. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  646. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  647. package/dist/modes/interactive/components/user-message.js.map +1 -1
  648. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  649. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  650. package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
  651. package/dist/modes/interactive/grok/input-card.d.ts.map +1 -1
  652. package/dist/modes/interactive/grok/palette.d.ts.map +1 -1
  653. package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -1
  654. package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-host-runtime.d.ts +6 -0
  656. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  657. package/dist/modes/interactive/interactive-host-runtime.js +32 -3
  658. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  659. package/dist/modes/interactive/interactive-mode.d.ts +35 -0
  660. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  661. package/dist/modes/interactive/interactive-mode.js +413 -100
  662. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  663. package/dist/modes/interactive/login-outcome.d.ts +20 -0
  664. package/dist/modes/interactive/login-outcome.d.ts.map +1 -0
  665. package/dist/modes/interactive/login-outcome.js +35 -0
  666. package/dist/modes/interactive/login-outcome.js.map +1 -0
  667. package/dist/modes/interactive/startup-tools.js.map +1 -1
  668. package/dist/modes/interactive/streaming-reveal-content.d.ts.map +1 -1
  669. package/dist/modes/interactive/streaming-reveal-content.js.map +1 -1
  670. package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -1
  671. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  672. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  673. package/dist/modes/interactive/theme/theme.js.map +1 -1
  674. package/dist/modes/interactive/tips/catalog/input-tips.d.ts +7 -7
  675. package/dist/modes/interactive/tips/catalog/input-tips.d.ts.map +1 -1
  676. package/dist/modes/interactive/tips/catalog/input-tips.js +5 -0
  677. package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
  678. package/dist/modes/interactive/tips/catalog/model-tips.d.ts +1 -1
  679. package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts +1 -1
  680. package/dist/modes/interactive/tips/scheduler.js.map +1 -1
  681. package/dist/modes/interactive/tips/working-tip.d.ts.map +1 -1
  682. package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -1
  683. package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -1
  684. package/dist/modes/print-mode.d.ts.map +1 -1
  685. package/dist/modes/print-mode.js +8 -0
  686. package/dist/modes/print-mode.js.map +1 -1
  687. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  688. package/dist/modes/provider-native-rendering.js +35 -0
  689. package/dist/modes/provider-native-rendering.js.map +1 -1
  690. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  691. package/dist/modes/rpc/connection-handler.js +72 -1
  692. package/dist/modes/rpc/connection-handler.js.map +1 -1
  693. package/dist/modes/rpc/connection-question-bridge.d.ts +18 -0
  694. package/dist/modes/rpc/connection-question-bridge.d.ts.map +1 -0
  695. package/dist/modes/rpc/connection-question-bridge.js +156 -0
  696. package/dist/modes/rpc/connection-question-bridge.js.map +1 -0
  697. package/dist/modes/rpc/custom-capability.d.ts +2 -0
  698. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  699. package/dist/modes/rpc/custom-capability.js +2 -0
  700. package/dist/modes/rpc/custom-capability.js.map +1 -1
  701. package/dist/modes/rpc/event-output-buffer.js.map +1 -1
  702. package/dist/modes/rpc/host-ensure.js.map +1 -1
  703. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  704. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  705. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  706. package/dist/modes/rpc/jsonl.js.map +1 -1
  707. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  708. package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -1
  709. package/dist/modes/rpc/ownership-safe-lock.js.map +1 -1
  710. package/dist/modes/rpc/rpc-client.d.ts +20 -1
  711. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  712. package/dist/modes/rpc/rpc-client.js +35 -3
  713. package/dist/modes/rpc/rpc-client.js.map +1 -1
  714. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  715. package/dist/modes/rpc/rpc-types.d.ts +103 -3
  716. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  717. package/dist/modes/rpc/rpc-types.js +6 -0
  718. package/dist/modes/rpc/rpc-types.js.map +1 -1
  719. package/dist/modes/rpc/session-binding.js.map +1 -1
  720. package/dist/modes/rpc/session-command-router.d.ts +4 -4
  721. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  722. package/dist/modes/rpc/session-command-router.js +14 -8
  723. package/dist/modes/rpc/session-command-router.js.map +1 -1
  724. package/dist/modes/rpc/session-event-fanout.d.ts +2 -0
  725. package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
  726. package/dist/modes/rpc/session-event-fanout.js +25 -1
  727. package/dist/modes/rpc/session-event-fanout.js.map +1 -1
  728. package/dist/modes/rpc/session-event-writer.d.ts +7 -1
  729. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  730. package/dist/modes/rpc/session-event-writer.js +17 -4
  731. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  732. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  733. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  734. package/dist/modes/rpc/session-registry.js +11 -1
  735. package/dist/modes/rpc/session-registry.js.map +1 -1
  736. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  737. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  738. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
  739. package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -1
  740. package/dist/modes/rpc/session-worker-requests.js +1 -1
  741. package/dist/modes/rpc/session-worker-requests.js.map +1 -1
  742. package/dist/modes/rpc/session-worker.js +10 -2
  743. package/dist/modes/rpc/session-worker.js.map +1 -1
  744. package/dist/modes/rpc/socket-event-fanout.d.ts +14 -1
  745. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
  746. package/dist/modes/rpc/socket-event-fanout.js +48 -2
  747. package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
  748. package/dist/modes/rpc/socket-ownership.js.map +1 -1
  749. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
  750. package/dist/modes/rpc/worker-session-registry.js +2 -1
  751. package/dist/modes/rpc/worker-session-registry.js.map +1 -1
  752. package/dist/package-manager-cli.js.map +1 -1
  753. package/dist/self-update-bootstrap.js.map +1 -1
  754. package/dist/utils/ansi.js.map +1 -1
  755. package/dist/utils/clipboard-image.js.map +1 -1
  756. package/dist/utils/clipboard-native.js.map +1 -1
  757. package/dist/utils/clipboard.js.map +1 -1
  758. package/dist/utils/exif-orientation.js.map +1 -1
  759. package/dist/utils/frontmatter.d.ts.map +1 -1
  760. package/dist/utils/image-resize.js.map +1 -1
  761. package/dist/utils/management-http.js.map +1 -1
  762. package/dist/utils/paths.js.map +1 -1
  763. package/dist/utils/photon.js.map +1 -1
  764. package/dist/utils/pi-user-agent.js.map +1 -1
  765. package/dist/utils/shell.d.ts.map +1 -1
  766. package/dist/utils/shell.js.map +1 -1
  767. package/dist/utils/syntax-highlight.js.map +1 -1
  768. package/dist/utils/version-check.js.map +1 -1
  769. package/docs/app-server.md +14 -0
  770. package/docs/extensions.md +28 -1
  771. package/docs/keybindings.md +1 -0
  772. package/docs/providers.md +1 -0
  773. package/docs/rpc.md +95 -3
  774. package/docs/settings.md +18 -0
  775. package/docs/skills.md +1 -1
  776. package/docs/tui.md +6 -0
  777. package/docs/usage.md +2 -1
  778. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
  779. package/node_modules/@code-yeongyu/senpi-codemode/README.md +17 -2
  780. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  781. package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +35 -15
  782. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +13 -2
  783. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +76 -0
  784. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -77
  785. package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/run-budget.ts +107 -0
  786. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-deadlines.ts +76 -0
  787. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +25 -14
  788. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +4 -0
  789. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +47 -40
  790. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +2 -0
  791. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +5 -0
  792. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +8 -3
  793. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -187
  794. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +189 -0
  795. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +66 -56
  796. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -1
  798. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  799. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  800. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  801. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
  802. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  803. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  804. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  805. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  806. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  807. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -1
  808. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  809. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
  810. package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.d.ts.map +1 -1
  811. package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js.map +1 -1
  812. package/node_modules/@earendil-works/pi-agent-core/dist/harness/result.d.ts.map +1 -1
  813. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js.map +1 -1
  814. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
  815. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  816. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
  817. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  818. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
  819. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
  821. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  822. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  823. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
  824. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
  825. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
  826. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
  827. package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts +36 -36
  828. package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts.map +1 -1
  829. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  830. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  831. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  832. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  833. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -1
  834. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  835. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  836. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  837. package/node_modules/@earendil-works/pi-agent-core/package.json +4 -4
  838. package/node_modules/@earendil-works/pi-ai/README.md +1 -0
  839. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts +3 -1
  840. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  841. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +6 -2
  842. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  843. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  844. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  845. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
  846. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -1
  847. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
  848. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
  849. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts.map +1 -1
  850. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  851. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js.map +1 -1
  852. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
  853. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  854. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  855. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  856. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  857. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  858. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +5 -0
  859. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  860. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts +4 -0
  861. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -0
  862. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +15 -0
  863. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -0
  864. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +60 -0
  865. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -0
  866. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +93 -0
  867. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -0
  868. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts +12 -0
  869. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts.map +1 -0
  870. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js +96 -0
  871. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js.map +1 -0
  872. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +3 -6
  873. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
  874. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +26 -119
  875. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
  876. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  877. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  878. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
  879. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
  880. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  881. package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js.map +1 -1
  882. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  883. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
  884. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
  885. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
  886. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts +47 -0
  887. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts.map +1 -0
  888. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js +126 -0
  889. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js.map +1 -0
  890. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
  891. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -1
  892. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts +12 -0
  893. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts.map +1 -0
  894. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js +44 -0
  895. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js.map +1 -0
  896. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -0
  897. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  898. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +26 -35
  899. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  900. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  901. package/node_modules/@earendil-works/pi-ai/dist/cursor/model-capabilities.js.map +1 -1
  902. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
  903. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  904. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  905. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  906. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +99 -66
  907. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  908. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +34 -1
  909. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  910. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -0
  911. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  912. package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -0
  913. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  914. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
  915. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  916. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2 -0
  917. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  918. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
  919. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  920. package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -28
  921. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  922. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts.map +1 -1
  923. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  924. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  925. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  926. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  927. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  928. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  929. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  930. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  931. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -0
  932. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  933. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  934. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js.map +1 -1
  935. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -1
  936. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts +3 -0
  937. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts.map +1 -0
  938. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js +15 -0
  939. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js.map +1 -0
  940. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts +4 -0
  941. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts.map +1 -0
  942. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js +6 -0
  943. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js.map +1 -0
  944. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  945. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -1
  946. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -1
  947. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -1
  948. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -1
  949. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -1
  950. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -1
  951. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  952. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
  953. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
  954. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
  955. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -1
  956. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -1
  957. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -1
  958. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  959. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +20 -3
  960. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  961. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  962. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -1
  963. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  964. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts +3 -1
  965. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  966. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
  967. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -1
  968. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  969. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  970. package/node_modules/@earendil-works/pi-ai/package.json +3 -3
  971. package/node_modules/@earendil-works/pi-pty/dist/loader.d.ts.map +1 -1
  972. package/node_modules/@earendil-works/pi-pty/dist/loader.js.map +1 -1
  973. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
  974. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
  975. package/node_modules/@earendil-works/pi-pty/dist/quarantine.js.map +1 -1
  976. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
  977. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
  978. package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
  979. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  980. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  981. package/node_modules/@earendil-works/pi-pty/dist/session-bun.js.map +1 -1
  982. package/node_modules/@earendil-works/pi-pty/dist/session.d.ts.map +1 -1
  983. package/node_modules/@earendil-works/pi-pty/dist/session.js.map +1 -1
  984. package/node_modules/@earendil-works/pi-pty/package.json +2 -2
  985. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  986. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -1
  987. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  988. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  989. package/node_modules/@earendil-works/pi-tui/dist/components/alt-screen-flash.d.ts.map +1 -1
  990. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  991. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
  992. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  993. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  994. package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.d.ts.map +1 -1
  995. package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.js.map +1 -1
  996. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  997. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  998. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  999. package/node_modules/@earendil-works/pi-tui/dist/components/latex.d.ts.map +1 -1
  1000. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  1001. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  1002. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  1003. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  1004. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
  1005. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
  1006. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  1007. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  1008. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  1009. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
  1010. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
  1011. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
  1012. package/node_modules/@earendil-works/pi-tui/dist/components/stack.d.ts.map +1 -1
  1013. package/node_modules/@earendil-works/pi-tui/dist/components/stack.js.map +1 -1
  1014. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
  1015. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
  1016. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
  1017. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
  1018. package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.d.ts.map +1 -1
  1019. package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.js.map +1 -1
  1020. package/node_modules/@earendil-works/pi-tui/dist/image-markers.d.ts.map +1 -1
  1021. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  1022. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  1023. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  1024. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  1025. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  1026. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
  1027. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  1028. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
  1029. package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js.map +1 -1
  1030. package/node_modules/@earendil-works/pi-tui/dist/paste-markers.d.ts.map +1 -1
  1031. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  1032. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  1033. package/node_modules/@earendil-works/pi-tui/dist/terminal-capabilities.js.map +1 -1
  1034. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  1035. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  1036. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  1037. package/node_modules/@earendil-works/pi-tui/dist/tmux-image-probe.js.map +1 -1
  1038. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
  1039. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
  1040. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
  1041. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  1042. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  1043. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
  1044. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  1045. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  1046. package/node_modules/css-tree/cjs/data-patch.cjs +853 -5
  1047. package/node_modules/css-tree/cjs/data.cjs +13598 -3
  1048. package/node_modules/css-tree/cjs/version.cjs +1 -3
  1049. package/node_modules/css-tree/lib/data-patch.js +853 -4
  1050. package/node_modules/css-tree/lib/data.js +13598 -5
  1051. package/node_modules/css-tree/lib/version.js +1 -5
  1052. package/package.json +8 -8
  1053. package/vendor/pi-client/client.d.ts.map +1 -1
  1054. package/vendor/pi-client/client.js.map +1 -1
  1055. package/vendor/pi-client/connection.d.ts.map +1 -1
  1056. package/vendor/pi-client/connection.js.map +1 -1
  1057. package/vendor/pi-client/errors.d.ts.map +1 -1
  1058. package/vendor/pi-client/session-handle.d.ts.map +1 -1
  1059. package/vendor/pi-client/state.d.ts.map +1 -1
  1060. package/vendor/pi-protocol/cbor/decoder.js.map +1 -1
  1061. package/vendor/pi-protocol/cbor/options.d.ts.map +1 -1
  1062. package/vendor/pi-protocol/codec.d.ts.map +1 -1
  1063. package/vendor/pi-protocol/codec.js.map +1 -1
  1064. package/vendor/pi-protocol/framing.d.ts.map +1 -1
  1065. package/vendor/pi-protocol/schemas.d.ts +678 -678
@@ -0,0 +1,102 @@
1
+ export { CLAUDE_PARAMS, CODEX_PARAMS } from "./params.js";
2
+ export const WAIT_FLAG_STEER_TEXT = "This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.";
3
+ export const DEFAULT_ASK_USER_TIMEOUT_MS = 30 * 60 * 1000;
4
+ const HEADER_MAX = 12;
5
+ const SNAKE_CASE = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;
6
+ const LIMITS = {
7
+ codex: { maxQuestions: 3, minOptions: 2, maxOptions: 3, optionsRequired: true },
8
+ claude: { maxQuestions: 4, minOptions: 2, maxOptions: 4, optionsRequired: false },
9
+ };
10
+ export class AskUserSchemaError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = "AskUserSchemaError";
14
+ }
15
+ }
16
+ function isRecord(value) {
17
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18
+ }
19
+ function readWaitFlag(variant, args) {
20
+ const value = args[variant === "codex" ? "wait_for_answer" : "waitForAnswer"];
21
+ if (typeof value !== "boolean") {
22
+ throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);
23
+ }
24
+ return value;
25
+ }
26
+ function parseOptions(raw, min, max, required, requireDescription) {
27
+ if (raw === undefined) {
28
+ if (required)
29
+ throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);
30
+ return [];
31
+ }
32
+ if (!Array.isArray(raw))
33
+ throw new AskUserSchemaError("options must be an array");
34
+ if (raw.length < min || raw.length > max) {
35
+ throw new AskUserSchemaError(required
36
+ ? `options must contain ${min} to ${max} items`
37
+ : `options must contain ${min} to ${max} items when present`);
38
+ }
39
+ const options = [];
40
+ for (const item of raw) {
41
+ if (!isRecord(item))
42
+ throw new AskUserSchemaError("each option must be an object");
43
+ const label = typeof item.label === "string" ? item.label.trim() : "";
44
+ if (label.length === 0)
45
+ throw new AskUserSchemaError("option label must be non-empty");
46
+ const description = typeof item.description === "string" ? item.description.trim() : undefined;
47
+ if (requireDescription && (description === undefined || description.length === 0)) {
48
+ throw new AskUserSchemaError("option description is required");
49
+ }
50
+ options.push(description === undefined || description.length === 0 ? { label } : { label, description });
51
+ }
52
+ return options;
53
+ }
54
+ function parseQuestion(variant, raw, index) {
55
+ if (!isRecord(raw))
56
+ throw new AskUserSchemaError("each question must be an object");
57
+ const limits = LIMITS[variant];
58
+ const header = typeof raw.header === "string" ? raw.header.trim() : "";
59
+ if (header.length === 0)
60
+ throw new AskUserSchemaError("header must be non-empty");
61
+ if (header.length > HEADER_MAX)
62
+ throw new AskUserSchemaError("header must be 12 or fewer characters");
63
+ const question = typeof raw.question === "string" ? raw.question.trim() : "";
64
+ if (question.length === 0)
65
+ throw new AskUserSchemaError("question must be non-empty");
66
+ const options = parseOptions(raw.options, limits.minOptions, limits.maxOptions, limits.optionsRequired, variant === "codex");
67
+ let id;
68
+ if (variant === "claude") {
69
+ id = `q${index + 1}`;
70
+ }
71
+ else {
72
+ id = typeof raw.id === "string" ? raw.id.trim() : "";
73
+ if (!SNAKE_CASE.test(id))
74
+ throw new AskUserSchemaError("id must be snake_case");
75
+ }
76
+ let multiSelect;
77
+ if (variant === "claude") {
78
+ if (typeof raw.multiSelect !== "boolean")
79
+ throw new AskUserSchemaError("multiSelect is required");
80
+ multiSelect = raw.multiSelect;
81
+ }
82
+ else {
83
+ multiSelect = raw.multiSelect === true;
84
+ }
85
+ return { id, header, question, options, multiSelect };
86
+ }
87
+ export function toCanonical(variant, args, options) {
88
+ if (!isRecord(args))
89
+ throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);
90
+ const waitForAnswer = readWaitFlag(variant, args);
91
+ const limits = LIMITS[variant];
92
+ if (!Array.isArray(args.questions) || args.questions.length < 1 || args.questions.length > limits.maxQuestions) {
93
+ throw new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);
94
+ }
95
+ return {
96
+ requestId: options?.requestId ?? crypto.randomUUID(),
97
+ questions: args.questions.map((question, index) => parseQuestion(variant, question, index)),
98
+ waitForAnswer,
99
+ timeoutMs: options?.timeoutMs ?? DEFAULT_ASK_USER_TIMEOUT_MS,
100
+ };
101
+ }
102
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/schema.ts"],"names":[],"mappings":"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","sourcesContent":["export { CLAUDE_PARAMS, CODEX_PARAMS } from \"./params.ts\";\n\n// TODO(t3-merge): re-export from ../../types.ts\nexport interface QuestionRequest {\n\trequestId: string;\n\tquestions: Array<{\n\t\tid: string;\n\t\theader: string;\n\t\tquestion: string;\n\t\toptions: Array<{ label: string; description?: string }>;\n\t\tmultiSelect: boolean;\n\t}>;\n\twaitForAnswer: boolean;\n\ttimeoutMs: number;\n}\n\n// TODO(t3-merge): re-export from ../../types.ts\nexport interface QuestionResponse {\n\tstatus: \"answered\" | \"comment-submitted\" | \"timed_out\" | \"cancelled\" | \"orphaned-after-restart\" | \"unavailable\";\n\tanswers: Record<string, { selected: string[]; text?: string }>;\n\tcomment?: string;\n\tunanswered: string[];\n\tautoResolvedAfterMs?: number;\n}\n\nexport type AskUserVariant = \"codex\" | \"claude\";\nexport type Question = QuestionRequest[\"questions\"][number];\nexport type QuestionOption = Question[\"options\"][number];\n\nexport const WAIT_FLAG_STEER_TEXT =\n\t\"This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.\";\n\nexport const DEFAULT_ASK_USER_TIMEOUT_MS = 30 * 60 * 1000;\n\nconst HEADER_MAX = 12;\nconst SNAKE_CASE = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;\nconst LIMITS = {\n\tcodex: { maxQuestions: 3, minOptions: 2, maxOptions: 3, optionsRequired: true },\n\tclaude: { maxQuestions: 4, minOptions: 2, maxOptions: 4, optionsRequired: false },\n} as const;\n\nexport class AskUserSchemaError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AskUserSchemaError\";\n\t}\n}\n\nexport type ToCanonicalOptions = {\n\trequestId?: string;\n\ttimeoutMs?: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWaitFlag(variant: AskUserVariant, args: Record<string, unknown>): boolean {\n\tconst value = args[variant === \"codex\" ? \"wait_for_answer\" : \"waitForAnswer\"];\n\tif (typeof value !== \"boolean\") {\n\t\tthrow new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\t}\n\treturn value;\n}\n\nfunction parseOptions(\n\traw: unknown,\n\tmin: number,\n\tmax: number,\n\trequired: boolean,\n\trequireDescription: boolean,\n): QuestionOption[] {\n\tif (raw === undefined) {\n\t\tif (required) throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);\n\t\treturn [];\n\t}\n\tif (!Array.isArray(raw)) throw new AskUserSchemaError(\"options must be an array\");\n\tif (raw.length < min || raw.length > max) {\n\t\tthrow new AskUserSchemaError(\n\t\t\trequired\n\t\t\t\t? `options must contain ${min} to ${max} items`\n\t\t\t\t: `options must contain ${min} to ${max} items when present`,\n\t\t);\n\t}\n\tconst options: QuestionOption[] = [];\n\tfor (const item of raw) {\n\t\tif (!isRecord(item)) throw new AskUserSchemaError(\"each option must be an object\");\n\t\tconst label = typeof item.label === \"string\" ? item.label.trim() : \"\";\n\t\tif (label.length === 0) throw new AskUserSchemaError(\"option label must be non-empty\");\n\t\tconst description = typeof item.description === \"string\" ? item.description.trim() : undefined;\n\t\tif (requireDescription && (description === undefined || description.length === 0)) {\n\t\t\tthrow new AskUserSchemaError(\"option description is required\");\n\t\t}\n\t\toptions.push(description === undefined || description.length === 0 ? { label } : { label, description });\n\t}\n\treturn options;\n}\n\nfunction parseQuestion(variant: AskUserVariant, raw: unknown, index: number): Question {\n\tif (!isRecord(raw)) throw new AskUserSchemaError(\"each question must be an object\");\n\tconst limits = LIMITS[variant];\n\tconst header = typeof raw.header === \"string\" ? raw.header.trim() : \"\";\n\tif (header.length === 0) throw new AskUserSchemaError(\"header must be non-empty\");\n\tif (header.length > HEADER_MAX) throw new AskUserSchemaError(\"header must be 12 or fewer characters\");\n\tconst question = typeof raw.question === \"string\" ? raw.question.trim() : \"\";\n\tif (question.length === 0) throw new AskUserSchemaError(\"question must be non-empty\");\n\tconst options = parseOptions(\n\t\traw.options,\n\t\tlimits.minOptions,\n\t\tlimits.maxOptions,\n\t\tlimits.optionsRequired,\n\t\tvariant === \"codex\",\n\t);\n\tlet id: string;\n\tif (variant === \"claude\") {\n\t\tid = `q${index + 1}`;\n\t} else {\n\t\tid = typeof raw.id === \"string\" ? raw.id.trim() : \"\";\n\t\tif (!SNAKE_CASE.test(id)) throw new AskUserSchemaError(\"id must be snake_case\");\n\t}\n\tlet multiSelect: boolean;\n\tif (variant === \"claude\") {\n\t\tif (typeof raw.multiSelect !== \"boolean\") throw new AskUserSchemaError(\"multiSelect is required\");\n\t\tmultiSelect = raw.multiSelect;\n\t} else {\n\t\tmultiSelect = raw.multiSelect === true;\n\t}\n\treturn { id, header, question, options, multiSelect };\n}\n\nexport function toCanonical(variant: AskUserVariant, args: unknown, options?: ToCanonicalOptions): QuestionRequest {\n\tif (!isRecord(args)) throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\tconst waitForAnswer = readWaitFlag(variant, args);\n\tconst limits = LIMITS[variant];\n\tif (!Array.isArray(args.questions) || args.questions.length < 1 || args.questions.length > limits.maxQuestions) {\n\t\tthrow new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);\n\t}\n\treturn {\n\t\trequestId: options?.requestId ?? crypto.randomUUID(),\n\t\tquestions: args.questions.map((question, index) => parseQuestion(variant, question, index)),\n\t\twaitForAnswer,\n\t\ttimeoutMs: options?.timeoutMs ?? DEFAULT_ASK_USER_TIMEOUT_MS,\n\t};\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionAPI, ToolDefinition } from "../../types.ts";
2
+ import { type AskUserVariant } from "./schema.ts";
3
+ export interface AskUserState {
4
+ timedOut: boolean;
5
+ unavailable: boolean;
6
+ }
7
+ export declare function createAskUserTool(variant: AskUserVariant, pi: ExtensionAPI, state: AskUserState): ToolDefinition;
8
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrF,OAAO,EAEN,KAAK,cAAc,EAMnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACrB;AAkID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAgEhH"}
@@ -0,0 +1,195 @@
1
+ import { WAKE_SOURCE_STATE_EVENT } from "../monitor-state-event.js";
2
+ import { TOOL_NAMES } from "./family.js";
3
+ import { formatResultDetails, formatResultText, formatUserMessage } from "./format.js";
4
+ import { createPendingQuestion } from "./pending.js";
5
+ import { getPendingQuestions, registerPendingQuestion } from "./registry.js";
6
+ import { renderCall, renderResult } from "./render.js";
7
+ import { AskUserSchemaError, CLAUDE_PARAMS, CODEX_PARAMS, toCanonical, } from "./schema.js";
8
+ const REASK = "The user did not answer the previous question this turn; continue without asking again.";
9
+ function result(variant, response, request, text) {
10
+ return {
11
+ content: [{ type: "text", text: text ?? formatResultText(variant, response, request.questions) }],
12
+ details: formatResultDetails(variant, response, request.questions),
13
+ };
14
+ }
15
+ /**
16
+ * Deliver a settled async answer as one framed user message. The extension owns
17
+ * this so every surface (interactive TUI, RPC, app-server) only has to RESOLVE
18
+ * the question; a surface that delivered on its own would send it twice. It
19
+ * steers into a running turn and follows up when idle - a follow-up always
20
+ * triggers a turn, which is what wakes the model after a timeout. A cancelled
21
+ * question stays silent: it was dismissed, superseded, or aborted.
22
+ */
23
+ function deliverAnswer(pi, ctx, request, response) {
24
+ if (response.status === "cancelled")
25
+ return;
26
+ pi.sendUserMessage(formatUserMessage(response, request.requestId, request.questions), {
27
+ deliverAs: ctx.isIdle() ? "followUp" : "steer",
28
+ });
29
+ }
30
+ function emitWake(pi, sessionId) {
31
+ const entries = getPendingQuestions(sessionId).filter((e) => !e.request.waitForAnswer);
32
+ const event = {
33
+ source: "ask-user",
34
+ activeCount: entries.length,
35
+ items: entries.map((e) => ({
36
+ id: e.request.requestId,
37
+ description: e.request.questions.map((q) => q.header).join(", "),
38
+ })),
39
+ };
40
+ pi.events.emit(WAKE_SOURCE_STATE_EVENT, event);
41
+ }
42
+ function startQuestion(pi, ctx, request, signal, state) {
43
+ const question = ctx.ui.question;
44
+ if (!question)
45
+ throw new Error("Question UI is unavailable");
46
+ const sessionId = ctx.sessionManager.getSessionId();
47
+ const controller = new AbortController();
48
+ const completion = Promise.withResolvers();
49
+ let settled = false;
50
+ let unregister = () => { };
51
+ const finish = (response) => {
52
+ if (settled)
53
+ return;
54
+ settled = true;
55
+ if (response.status === "timed_out")
56
+ state.timedOut = true;
57
+ unregister();
58
+ signal?.removeEventListener("abort", abort);
59
+ if (!request.waitForAnswer)
60
+ emitWake(pi, sessionId);
61
+ completion.resolve(response);
62
+ // This extension owns the authoritative idle timer (pending.ts), so a UI
63
+ // bridge that is still waiting learns the outcome only from this abort.
64
+ // Carry the resolved status as the abort reason: a bare abort reads as a
65
+ // dismissal, and the RPC bridge would broadcast a timeout as "cancelled".
66
+ const abortReason = response.status;
67
+ controller.abort(abortReason);
68
+ };
69
+ const pending = createPendingQuestion({
70
+ request,
71
+ now: Date.now,
72
+ idleTimeoutMs: request.timeoutMs,
73
+ onTimeout: finish,
74
+ });
75
+ const cancel = (message) => {
76
+ const response = pending.cancel();
77
+ finish(message ? { ...response, comment: message } : response);
78
+ };
79
+ const abort = () => cancel();
80
+ unregister = registerPendingQuestion(sessionId, { request, pending, completion: completion.promise, cancel });
81
+ if (!request.waitForAnswer)
82
+ emitWake(pi, sessionId);
83
+ signal?.addEventListener("abort", abort, { once: true });
84
+ let draft = { answers: {} };
85
+ const opts = {
86
+ timeout: request.timeoutMs,
87
+ signal: controller.signal,
88
+ deliver: request.waitForAnswer ? "tool-result" : "user-message",
89
+ hardDeadlineAtMs: Date.now() + 7_200_000,
90
+ onProgress: (progress) => {
91
+ draft = { ...draft, ...progress, answers: progress.answers ?? draft.answers };
92
+ pending.touch(draft);
93
+ },
94
+ };
95
+ const accept = (response) => {
96
+ if (settled)
97
+ return;
98
+ pending.touch({ answers: response.answers, comment: response.comment });
99
+ if (response.status === "timed_out") {
100
+ finish(response);
101
+ pending.timeout();
102
+ return;
103
+ }
104
+ if (response.status === "answered" || response.status === "comment-submitted") {
105
+ // The UI owns partial submission validation; retain its response verbatim.
106
+ pending.submit(response.answers, response.comment);
107
+ if (pending.state === "pending")
108
+ pending.cancel();
109
+ }
110
+ else
111
+ pending.cancel(response.status);
112
+ finish(response);
113
+ };
114
+ const fail = (error) => {
115
+ if (settled)
116
+ return;
117
+ const message = `Question UI failed: ${error instanceof Error ? error.message : String(error)}`;
118
+ cancel(message);
119
+ ctx.ui.notify(message, "error");
120
+ };
121
+ if (signal?.aborted)
122
+ abort();
123
+ else {
124
+ try {
125
+ question.call(ctx.ui, request, opts).then(accept, fail);
126
+ }
127
+ catch (error) {
128
+ fail(error);
129
+ }
130
+ }
131
+ if (!request.waitForAnswer)
132
+ void completion.promise.then((response) => deliverAnswer(pi, ctx, request, response));
133
+ return completion.promise;
134
+ }
135
+ export function createAskUserTool(variant, pi, state) {
136
+ const flag = variant === "codex" ? "wait_for_answer" : "waitForAnswer";
137
+ const opener = variant === "codex"
138
+ ? "Request user input for one to three short questions."
139
+ : "Ask the user one to four concise questions.";
140
+ return {
141
+ name: TOOL_NAMES[variant],
142
+ label: "Ask user",
143
+ exposure: "direct",
144
+ allowLazyActivation: false,
145
+ parameters: variant === "codex" ? CODEX_PARAMS : CLAUDE_PARAMS,
146
+ promptSnippet: "Ask a material question, explicitly choosing whether to wait or receive the answer later.",
147
+ description: `${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant === "claude" ? " Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option." : ""} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,
148
+ prepareArguments(args) {
149
+ toCanonical(variant, args);
150
+ return args;
151
+ },
152
+ async execute(toolCallId, params, signal, _onUpdate, ctx) {
153
+ let request;
154
+ try {
155
+ request = toCanonical(variant, params, {
156
+ requestId: toolCallId,
157
+ timeoutMs: (ctx.getAskUserSettings?.().timeoutMinutes ?? 30) * 60_000,
158
+ });
159
+ }
160
+ catch (error) {
161
+ if (!(error instanceof AskUserSchemaError))
162
+ throw error;
163
+ return { content: [{ type: "text", text: error.message }], details: { status: "unavailable" } };
164
+ }
165
+ const unavailable = {
166
+ status: "unavailable",
167
+ answers: {},
168
+ unanswered: request.questions.map((q) => q.id),
169
+ };
170
+ if (state.timedOut)
171
+ return result(variant, unavailable, request, REASK);
172
+ if (state.unavailable ||
173
+ ctx.getAskUserSettings?.().enabled === false ||
174
+ pi.getFlag("no-ask-user") === true ||
175
+ ctx.mode === "print" ||
176
+ ctx.mode === "json" ||
177
+ !ctx.ui.question) {
178
+ state.unavailable = true;
179
+ pi.setActiveTools(pi.getActiveTools().filter((name) => !Object.values(TOOL_NAMES).includes(name)));
180
+ return result(variant, unavailable, request);
181
+ }
182
+ const completion = startQuestion(pi, ctx, request, signal, state);
183
+ if (!request.waitForAnswer)
184
+ return {
185
+ content: [{ type: "text", text: "Question accepted; the answer will arrive as a user message." }],
186
+ details: { accepted: true, requestId: request.requestId, status: "pending" },
187
+ };
188
+ const response = await completion;
189
+ return result(variant, response, request, response.status === "cancelled" && response.comment ? response.comment : undefined);
190
+ },
191
+ renderCall,
192
+ renderResult,
193
+ };
194
+ }
195
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionContext, ToolDefinition } from \"../../types.ts\";\nimport { WAKE_SOURCE_STATE_EVENT, type WakeSourceStateEvent } from \"../monitor-state-event.ts\";\nimport { TOOL_NAMES } from \"./family.ts\";\nimport { formatResultDetails, formatResultText, formatUserMessage } from \"./format.ts\";\nimport { createPendingQuestion } from \"./pending.ts\";\nimport { getPendingQuestions, type QuestionDialogOptions, registerPendingQuestion } from \"./registry.ts\";\nimport { renderCall, renderResult } from \"./render.ts\";\nimport {\n\tAskUserSchemaError,\n\ttype AskUserVariant,\n\tCLAUDE_PARAMS,\n\tCODEX_PARAMS,\n\ttype QuestionRequest,\n\ttype QuestionResponse,\n\ttoCanonical,\n} from \"./schema.ts\";\n\nexport interface AskUserState {\n\ttimedOut: boolean;\n\tunavailable: boolean;\n}\nconst REASK = \"The user did not answer the previous question this turn; continue without asking again.\";\nfunction result(\n\tvariant: AskUserVariant,\n\tresponse: QuestionResponse,\n\trequest: QuestionRequest,\n\ttext?: string,\n): Awaited<ReturnType<ToolDefinition[\"execute\"]>> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: text ?? formatResultText(variant, response, request.questions) }],\n\t\tdetails: formatResultDetails(variant, response, request.questions),\n\t};\n}\n/**\n * Deliver a settled async answer as one framed user message. The extension owns\n * this so every surface (interactive TUI, RPC, app-server) only has to RESOLVE\n * the question; a surface that delivered on its own would send it twice. It\n * steers into a running turn and follows up when idle - a follow-up always\n * triggers a turn, which is what wakes the model after a timeout. A cancelled\n * question stays silent: it was dismissed, superseded, or aborted.\n */\nfunction deliverAnswer(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\trequest: QuestionRequest,\n\tresponse: QuestionResponse,\n): void {\n\tif (response.status === \"cancelled\") return;\n\tpi.sendUserMessage(formatUserMessage(response, request.requestId, request.questions), {\n\t\tdeliverAs: ctx.isIdle() ? \"followUp\" : \"steer\",\n\t});\n}\nfunction emitWake(pi: ExtensionAPI, sessionId: string) {\n\tconst entries = getPendingQuestions(sessionId).filter((e) => !e.request.waitForAnswer);\n\tconst event: WakeSourceStateEvent = {\n\t\tsource: \"ask-user\",\n\t\tactiveCount: entries.length,\n\t\titems: entries.map((e) => ({\n\t\t\tid: e.request.requestId,\n\t\t\tdescription: e.request.questions.map((q) => q.header).join(\", \"),\n\t\t})),\n\t};\n\tpi.events.emit(WAKE_SOURCE_STATE_EVENT, event);\n}\nfunction startQuestion(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\trequest: QuestionRequest,\n\tsignal: AbortSignal | undefined,\n\tstate: AskUserState,\n) {\n\tconst question = ctx.ui.question;\n\tif (!question) throw new Error(\"Question UI is unavailable\");\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tconst controller = new AbortController();\n\tconst completion = Promise.withResolvers<QuestionResponse>();\n\tlet settled = false;\n\tlet unregister = () => {};\n\tconst finish = (response: QuestionResponse) => {\n\t\tif (settled) return;\n\t\tsettled = true;\n\t\tif (response.status === \"timed_out\") state.timedOut = true;\n\t\tunregister();\n\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\tif (!request.waitForAnswer) emitWake(pi, sessionId);\n\t\tcompletion.resolve(response);\n\t\t// This extension owns the authoritative idle timer (pending.ts), so a UI\n\t\t// bridge that is still waiting learns the outcome only from this abort.\n\t\t// Carry the resolved status as the abort reason: a bare abort reads as a\n\t\t// dismissal, and the RPC bridge would broadcast a timeout as \"cancelled\".\n\t\tconst abortReason: QuestionResponse[\"status\"] = response.status;\n\t\tcontroller.abort(abortReason);\n\t};\n\tconst pending = createPendingQuestion({\n\t\trequest,\n\t\tnow: Date.now,\n\t\tidleTimeoutMs: request.timeoutMs,\n\t\tonTimeout: finish,\n\t});\n\tconst cancel = (message?: string) => {\n\t\tconst response = pending.cancel();\n\t\tfinish(message ? { ...response, comment: message } : response);\n\t};\n\tconst abort = () => cancel();\n\tunregister = registerPendingQuestion(sessionId, { request, pending, completion: completion.promise, cancel });\n\tif (!request.waitForAnswer) emitWake(pi, sessionId);\n\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\tlet draft: { answers: QuestionResponse[\"answers\"]; comment?: string } = { answers: {} };\n\tconst opts: QuestionDialogOptions = {\n\t\ttimeout: request.timeoutMs,\n\t\tsignal: controller.signal,\n\t\tdeliver: request.waitForAnswer ? \"tool-result\" : \"user-message\",\n\t\thardDeadlineAtMs: Date.now() + 7_200_000,\n\t\tonProgress: (progress) => {\n\t\t\tdraft = { ...draft, ...progress, answers: progress.answers ?? draft.answers };\n\t\t\tpending.touch(draft);\n\t\t},\n\t};\n\tconst accept = (response: QuestionResponse) => {\n\t\tif (settled) return;\n\t\tpending.touch({ answers: response.answers, comment: response.comment });\n\t\tif (response.status === \"timed_out\") {\n\t\t\tfinish(response);\n\t\t\tpending.timeout();\n\t\t\treturn;\n\t\t}\n\t\tif (response.status === \"answered\" || response.status === \"comment-submitted\") {\n\t\t\t// The UI owns partial submission validation; retain its response verbatim.\n\t\t\tpending.submit(response.answers, response.comment);\n\t\t\tif (pending.state === \"pending\") pending.cancel();\n\t\t} else pending.cancel(response.status);\n\t\tfinish(response);\n\t};\n\tconst fail = (error: unknown) => {\n\t\tif (settled) return;\n\t\tconst message = `Question UI failed: ${error instanceof Error ? error.message : String(error)}`;\n\t\tcancel(message);\n\t\tctx.ui.notify(message, \"error\");\n\t};\n\tif (signal?.aborted) abort();\n\telse {\n\t\ttry {\n\t\t\tquestion.call(ctx.ui, request, opts).then(accept, fail);\n\t\t} catch (error: unknown) {\n\t\t\tfail(error);\n\t\t}\n\t}\n\tif (!request.waitForAnswer) void completion.promise.then((response) => deliverAnswer(pi, ctx, request, response));\n\treturn completion.promise;\n}\nexport function createAskUserTool(variant: AskUserVariant, pi: ExtensionAPI, state: AskUserState): ToolDefinition {\n\tconst flag = variant === \"codex\" ? \"wait_for_answer\" : \"waitForAnswer\";\n\tconst opener =\n\t\tvariant === \"codex\"\n\t\t\t? \"Request user input for one to three short questions.\"\n\t\t\t: \"Ask the user one to four concise questions.\";\n\treturn {\n\t\tname: TOOL_NAMES[variant],\n\t\tlabel: \"Ask user\",\n\t\texposure: \"direct\",\n\t\tallowLazyActivation: false,\n\t\tparameters: variant === \"codex\" ? CODEX_PARAMS : CLAUDE_PARAMS,\n\t\tpromptSnippet: \"Ask a material question, explicitly choosing whether to wait or receive the answer later.\",\n\t\tdescription: `${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant === \"claude\" ? \" Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option.\" : \"\"} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,\n\t\tprepareArguments(args) {\n\t\t\ttoCanonical(variant, args);\n\t\t\treturn args;\n\t\t},\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tlet request: QuestionRequest;\n\t\t\ttry {\n\t\t\t\trequest = toCanonical(variant, params, {\n\t\t\t\t\trequestId: toolCallId,\n\t\t\t\t\ttimeoutMs: (ctx.getAskUserSettings?.().timeoutMinutes ?? 30) * 60_000,\n\t\t\t\t});\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (!(error instanceof AskUserSchemaError)) throw error;\n\t\t\t\treturn { content: [{ type: \"text\", text: error.message }], details: { status: \"unavailable\" } };\n\t\t\t}\n\t\t\tconst unavailable: QuestionResponse = {\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\tanswers: {},\n\t\t\t\tunanswered: request.questions.map((q) => q.id),\n\t\t\t};\n\t\t\tif (state.timedOut) return result(variant, unavailable, request, REASK);\n\t\t\tif (\n\t\t\t\tstate.unavailable ||\n\t\t\t\tctx.getAskUserSettings?.().enabled === false ||\n\t\t\t\tpi.getFlag(\"no-ask-user\") === true ||\n\t\t\t\tctx.mode === \"print\" ||\n\t\t\t\tctx.mode === \"json\" ||\n\t\t\t\t!ctx.ui.question\n\t\t\t) {\n\t\t\t\tstate.unavailable = true;\n\t\t\t\tpi.setActiveTools(pi.getActiveTools().filter((name) => !Object.values(TOOL_NAMES).includes(name)));\n\t\t\t\treturn result(variant, unavailable, request);\n\t\t\t}\n\t\t\tconst completion = startQuestion(pi, ctx, request, signal, state);\n\t\t\tif (!request.waitForAnswer)\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Question accepted; the answer will arrive as a user message.\" }],\n\t\t\t\t\tdetails: { accepted: true, requestId: request.requestId, status: \"pending\" },\n\t\t\t\t};\n\t\t\tconst response = await completion;\n\t\t\treturn result(\n\t\t\t\tvariant,\n\t\t\t\tresponse,\n\t\t\t\trequest,\n\t\t\t\tresponse.status === \"cancelled\" && response.comment ? response.comment : undefined,\n\t\t\t);\n\t\t},\n\t\trenderCall,\n\t\trenderResult,\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/bash-timeout/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAS7C,SAAS,gBAAgB,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,EAAE,+BAA+B,EAAE,cAAc,EAAE,2BAA2B,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IACzG,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,4BAA4B,CAAC;IACxF,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,wBAAwB,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAC/B,KAAa,EACb,QAA6B;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAYD,MAAM,UAAU,sBAAsB,CAAC,QAA6B,EAAE,UAAoC,EAAE;IAC3G,MAAM,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC1G,MAAM,WAAW,GAChB,uBAAuB,KAAK,SAAS;QACpC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,yCAAyC,uBAAuB,+NAA+N,CAAC;IACpS,OAAO,wNAAwN,QAAQ,CAAC,cAAc,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,6FAA6F,QAAQ,CAAC,UAAU,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,wGAAwG,WAAW,EAAE,CAAC;AACriB,CAAC","sourcesContent":["export const BASH_DEFAULT_TIMEOUT_SECONDS = 1800;\nexport const BASH_MAX_TIMEOUT_SECONDS = 1800;\n\nexport interface BashTimeoutDefaults {\n\tdefaultSeconds: number;\n\tmaxSeconds: number;\n}\n\ntype EnvLike = Record<string, string | undefined>;\n\nfunction parsePositiveInt(value: string | undefined): number | undefined {\n\tif (!value) return undefined;\n\tconst parsed = Number.parseInt(value, 10);\n\tif (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n\treturn parsed;\n}\n\nexport function resolveBashTimeoutDefaults(env: EnvLike): BashTimeoutDefaults {\n\tconst { PI_BASH_DEFAULT_TIMEOUT_SECONDS: defaultTimeout, PI_BASH_MAX_TIMEOUT_SECONDS: maxTimeout } = env;\n\tconst defaultSeconds = parsePositiveInt(defaultTimeout) ?? BASH_DEFAULT_TIMEOUT_SECONDS;\n\tconst rawMax = parsePositiveInt(maxTimeout) ?? BASH_MAX_TIMEOUT_SECONDS;\n\tconst maxSeconds = Math.max(rawMax, defaultSeconds);\n\treturn { defaultSeconds, maxSeconds };\n}\n\nexport interface BashToolInputLike {\n\tcommand: string;\n\ttimeout?: number;\n\t[key: string]: unknown;\n}\n\nexport function applyBashTimeout<TInput extends BashToolInputLike>(\n\tinput: TInput,\n\tdefaults: BashTimeoutDefaults,\n): TInput {\n\tconst current = input.timeout;\n\tif (current === undefined || current <= 0) {\n\t\treturn { ...input, timeout: defaults.defaultSeconds };\n\t}\n\treturn input;\n}\n\nexport interface BashTimeoutPromptOptions {\n\t/**\n\t * `undefined` when no PTY bash tool is live (native Anthropic bash replaces\n\t * it). Nothing implements auto-detach then, so the policy must not promise\n\t * it — a prompt that describes impossible behavior is worse than a silent one.\n\t */\n\treadonly foregroundWindowSeconds?: number;\n\t/** True when the session routes shell tools through eval cells, so call shapes must be `tool.<name>(`. */\n}\n\nexport function buildBashTimeoutPrompt(defaults: BashTimeoutDefaults, options: BashTimeoutPromptOptions = {}): string {\n\tconst { foregroundWindowSeconds } = options;\n\tconst minutes = (seconds: number): string => (seconds % 60 === 0 ? `${seconds / 60} min` : `${seconds}s`);\n\tconst detachRules =\n\t\tforegroundWindowSeconds === undefined\n\t\t\t? \"\"\n\t\t\t: `\\n- Foreground blocking stops at the ~${foregroundWindowSeconds}s window. A command still running then auto-detaches alive to a background session with a \\`bash_id\\` and keeps running until it exits or hits the kill deadline; the session tools in the terminal section steer or stop it.`;\n\treturn `\\n## Bash Tool Timeout Policy\\n\\nThe \\`bash\\` tool's \\`timeout\\` parameter is the process kill deadline, not how long you wait for output: the command is killed when it reaches the deadline.\\n\\n- Default timeout: ${defaults.defaultSeconds}s (${minutes(defaults.defaultSeconds)}). Applied automatically when you do not set \\`timeout\\`.\\n- Recommended maximum timeout: ${defaults.maxSeconds}s (${minutes(defaults.maxSeconds)}). Explicit \\`timeout\\` values are preserved because different hosts may use different timeout units.${detachRules}`;\n}\n"]}
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/bash-timeout/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAS7C,SAAS,gBAAgB,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,EAAE,+BAA+B,EAAE,cAAc,EAAE,2BAA2B,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IACzG,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,4BAA4B,CAAC;IACxF,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,wBAAwB,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAC/B,KAAa,EACb,QAA6B;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAYD,MAAM,UAAU,sBAAsB,CAAC,QAA6B,EAAE,OAAO,GAA6B,EAAE;IAC3G,MAAM,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC1G,MAAM,WAAW,GAChB,uBAAuB,KAAK,SAAS;QACpC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,yCAAyC,uBAAuB,+NAA+N,CAAC;IACpS,OAAO,wNAAwN,QAAQ,CAAC,cAAc,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,6FAA6F,QAAQ,CAAC,UAAU,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,wGAAwG,WAAW,EAAE,CAAC;AACriB,CAAC","sourcesContent":["export const BASH_DEFAULT_TIMEOUT_SECONDS = 1800;\nexport const BASH_MAX_TIMEOUT_SECONDS = 1800;\n\nexport interface BashTimeoutDefaults {\n\tdefaultSeconds: number;\n\tmaxSeconds: number;\n}\n\ntype EnvLike = Record<string, string | undefined>;\n\nfunction parsePositiveInt(value: string | undefined): number | undefined {\n\tif (!value) return undefined;\n\tconst parsed = Number.parseInt(value, 10);\n\tif (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n\treturn parsed;\n}\n\nexport function resolveBashTimeoutDefaults(env: EnvLike): BashTimeoutDefaults {\n\tconst { PI_BASH_DEFAULT_TIMEOUT_SECONDS: defaultTimeout, PI_BASH_MAX_TIMEOUT_SECONDS: maxTimeout } = env;\n\tconst defaultSeconds = parsePositiveInt(defaultTimeout) ?? BASH_DEFAULT_TIMEOUT_SECONDS;\n\tconst rawMax = parsePositiveInt(maxTimeout) ?? BASH_MAX_TIMEOUT_SECONDS;\n\tconst maxSeconds = Math.max(rawMax, defaultSeconds);\n\treturn { defaultSeconds, maxSeconds };\n}\n\nexport interface BashToolInputLike {\n\tcommand: string;\n\ttimeout?: number;\n\t[key: string]: unknown;\n}\n\nexport function applyBashTimeout<TInput extends BashToolInputLike>(\n\tinput: TInput,\n\tdefaults: BashTimeoutDefaults,\n): TInput {\n\tconst current = input.timeout;\n\tif (current === undefined || current <= 0) {\n\t\treturn { ...input, timeout: defaults.defaultSeconds };\n\t}\n\treturn input;\n}\n\nexport interface BashTimeoutPromptOptions {\n\t/**\n\t * `undefined` when no PTY bash tool is live (native Anthropic bash replaces\n\t * it). Nothing implements auto-detach then, so the policy must not promise\n\t * it — a prompt that describes impossible behavior is worse than a silent one.\n\t */\n\treadonly foregroundWindowSeconds?: number;\n\t/** True when the session routes shell tools through eval cells, so call shapes must be `tool.<name>(`. */\n}\n\nexport function buildBashTimeoutPrompt(defaults: BashTimeoutDefaults, options: BashTimeoutPromptOptions = {}): string {\n\tconst { foregroundWindowSeconds } = options;\n\tconst minutes = (seconds: number): string => (seconds % 60 === 0 ? `${seconds / 60} min` : `${seconds}s`);\n\tconst detachRules =\n\t\tforegroundWindowSeconds === undefined\n\t\t\t? \"\"\n\t\t\t: `\\n- Foreground blocking stops at the ~${foregroundWindowSeconds}s window. A command still running then auto-detaches alive to a background session with a \\`bash_id\\` and keeps running until it exits or hits the kill deadline; the session tools in the terminal section steer or stop it.`;\n\treturn `\\n## Bash Tool Timeout Policy\\n\\nThe \\`bash\\` tool's \\`timeout\\` parameter is the process kill deadline, not how long you wait for output: the command is killed when it reaches the deadline.\\n\\n- Default timeout: ${defaults.defaultSeconds}s (${minutes(defaults.defaultSeconds)}). Applied automatically when you do not set \\`timeout\\`.\\n- Recommended maximum timeout: ${defaults.maxSeconds}s (${minutes(defaults.maxSeconds)}). Explicit \\`timeout\\` values are preserved because different hosts may use different timeout units.${detachRules}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAExE,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAM;gBAER,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK;IAYpD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/B,QAAQ,IAAI,IAAI;IAKhB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMhC,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,OAAO;CAsBf"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAExE,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAM;IAEpB,YAAY,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAUnD;IAED,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG9B;IAED,QAAQ,IAAI,IAAI,CAGf;IAED,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/B;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,OAAO,CAAC,OAAO;CAsBf"}
@@ -1 +1 @@
1
- {"version":3,"file":"side-query.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/side-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tContext,\n\tMessage,\n\tModel,\n\tProviderHeaders,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tThinkingLevel,\n} from \"@earendil-works/pi-ai/compat\";\nimport { streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport { BUILTIN_CONTEXT_REDUCTION_OPTIONS, reduceContextMessages } from \"../compaction/context-reduction.ts\";\nimport { getPromptContextWindow } from \"../compaction/index.ts\";\nimport { pruneOldMessagesToBudget } from \"../compaction/overflow-retry.ts\";\nimport { repairOrphanedToolResults } from \"../compaction/repair-tool-pairs.ts\";\n\nexport const SIDE_QUERY_INSTRUCTION = [\n\t\"The user is asking a side question about the conversation so far, outside the main task.\",\n\t\"Answer it directly and concisely from the context above.\",\n\t\"Do not continue any task, do not modify anything, and do not treat this as new work.\",\n].join(\" \");\n\nexport const DEFAULT_ESTABLISHMENT_TIMEOUT_MS = 30_000;\n\nexport interface SideQueryContextInput {\n\tsystemPrompt: string;\n\thistory: readonly Message[];\n\tquestion: string;\n\tpromptContextWindow?: number;\n}\n\nfunction estimateMessagesTokens(messages: readonly Message[]): number {\n\treturn messages.reduce((total, message) => total + estimateTokens(message), 0);\n}\n\nfunction estimateSystemPromptTokens(systemPrompt: string): number {\n\treturn estimateTokens({ role: \"user\", content: systemPrompt, timestamp: 0 });\n}\n\nfunction boundSideQueryMessages(\n\tmessages: Message[],\n\tsystemPrompt: string,\n\tpromptContextWindow: number | undefined,\n): Message[] {\n\tif (typeof promptContextWindow !== \"number\" || !Number.isFinite(promptContextWindow) || promptContextWindow <= 0) {\n\t\treturn messages;\n\t}\n\n\tconst messageBudget = promptContextWindow - estimateSystemPromptTokens(systemPrompt);\n\tconst question = messages.at(-1);\n\tif (question === undefined || messageBudget < estimateMessagesTokens([question])) {\n\t\tthrow new Error(\"/btw question does not fit this model's context window; shorten it or run /compact first.\");\n\t}\n\tif (estimateMessagesTokens(messages) <= messageBudget) return messages;\n\n\tconst reduced = convertToLlm(reduceContextMessages(messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages);\n\tconst repaired = repairOrphanedToolResults(reduced);\n\tconst pruned = convertToLlm(pruneOldMessagesToBudget(repaired, messageBudget));\n\tconst bounded = repairOrphanedToolResults(pruned);\n\tif (estimateMessagesTokens(bounded) > messageBudget) {\n\t\tthrow new Error(\"/btw context is too large for this model; run /compact first.\");\n\t}\n\treturn bounded;\n}\n\nexport function getSideQueryPromptContextWindow(model: Pick<Model<string>, \"contextWindow\" | \"maxTokens\">): number {\n\treturn getPromptContextWindow(model.contextWindow, model.maxTokens);\n}\n\nexport function buildSideQueryContext(input: SideQueryContextInput): Context {\n\tconst systemPrompt = `${input.systemPrompt}\\n\\n${SIDE_QUERY_INSTRUCTION}`;\n\tconst messages = boundSideQueryMessages(\n\t\t[...input.history, { role: \"user\", content: input.question, timestamp: Date.now() }],\n\t\tsystemPrompt,\n\t\tinput.promptContextWindow,\n\t);\n\treturn {\n\t\tsystemPrompt,\n\t\tmessages,\n\t\ttools: [],\n\t};\n}\n\nexport interface SideQueryAuth {\n\tapiKey?: string;\n\theaders?: ProviderHeaders;\n\textraBody?: Record<string, unknown>;\n}\n\nexport interface SideQueryDeps {\n\tmodel: Model<any>;\n\tauth: SideQueryAuth;\n\tsessionId: string;\n\tthinkingLevel?: ThinkingLevel;\n\tstreamFn?: StreamFunction;\n\testablishmentTimeoutMs?: number;\n}\n\nexport interface SideQueryCallbacks {\n\tonTextDelta?: (delta: string) => void;\n\tsignal?: AbortSignal;\n}\n\nexport interface SideQueryResult {\n\treplyText: string;\n}\n\nexport async function runSideQuery(\n\tdeps: SideQueryDeps,\n\tcontext: Context,\n\tcallbacks: SideQueryCallbacks = {},\n): Promise<SideQueryResult> {\n\tcallbacks.signal?.throwIfAborted();\n\tconst streamFn = deps.streamFn ?? streamSimple;\n\tconst establishment = new AbortController();\n\tconst signal = callbacks.signal ? AbortSignal.any([callbacks.signal, establishment.signal]) : establishment.signal;\n\tconst timeoutMs = deps.establishmentTimeoutMs ?? DEFAULT_ESTABLISHMENT_TIMEOUT_MS;\n\tconst timeoutError = new Error(`/btw provider did not produce an event within ${Math.round(timeoutMs / 1000)}s`);\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\ttry {\n\t\tconst options: SimpleStreamOptions = {\n\t\t\tapiKey: deps.auth.apiKey,\n\t\t\theaders: deps.auth.headers,\n\t\t\textraBody: deps.auth.extraBody,\n\t\t\tsessionId: `${deps.sessionId}:btw:${crypto.randomUUID()}`,\n\t\t\treasoning: deps.thinkingLevel,\n\t\t\tsignal,\n\t\t};\n\t\ttimer = setTimeout(() => establishment.abort(timeoutError), timeoutMs);\n\t\ttimer.unref?.();\n\t\tconst stream = await streamFn(deps.model, context, options);\n\t\tlet established = false;\n\t\tlet replyText = \"\";\n\t\tfor await (const event of stream) {\n\t\t\tif (!established && event.type !== \"start\") {\n\t\t\t\testablished = true;\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t\tif (event.type === \"text_delta\") {\n\t\t\t\treplyText += event.delta;\n\t\t\t\tcallbacks.onTextDelta?.(event.delta);\n\t\t\t} else if (event.type === \"done\") {\n\t\t\t\tbreak;\n\t\t\t} else if (event.type === \"error\") {\n\t\t\t\tthrow new Error(event.error.errorMessage || \"Side query failed\");\n\t\t\t}\n\t\t}\n\t\tsignal.throwIfAborted();\n\t\treturn { replyText };\n\t} catch (error) {\n\t\tif (establishment.signal.aborted && !callbacks.signal?.aborted) {\n\t\t\tthrow timeoutError;\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tif (timer) clearTimeout(timer);\n\t}\n}\n"]}
1
+ {"version":3,"file":"side-query.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/side-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tContext,\n\tMessage,\n\tModel,\n\tProviderHeaders,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tThinkingLevel,\n} from \"@earendil-works/pi-ai/compat\";\nimport { streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport { BUILTIN_CONTEXT_REDUCTION_OPTIONS, reduceContextMessages } from \"../compaction/context-reduction.ts\";\nimport { getPromptContextWindow } from \"../compaction/index.ts\";\nimport { pruneOldMessagesToBudget } from \"../compaction/overflow-retry.ts\";\nimport { repairOrphanedToolResults } from \"../compaction/repair-tool-pairs.ts\";\n\nexport const SIDE_QUERY_INSTRUCTION = [\n\t\"The user is asking a side question about the conversation so far, outside the main task.\",\n\t\"Answer it directly and concisely from the context above.\",\n\t\"Do not continue any task, do not modify anything, and do not treat this as new work.\",\n].join(\" \");\n\nexport const DEFAULT_ESTABLISHMENT_TIMEOUT_MS = 30_000;\n\nexport interface SideQueryContextInput {\n\tsystemPrompt: string;\n\thistory: readonly Message[];\n\tquestion: string;\n\tpromptContextWindow?: number;\n}\n\nfunction estimateMessagesTokens(messages: readonly Message[]): number {\n\treturn messages.reduce((total, message) => total + estimateTokens(message), 0);\n}\n\nfunction estimateSystemPromptTokens(systemPrompt: string): number {\n\treturn estimateTokens({ role: \"user\", content: systemPrompt, timestamp: 0 });\n}\n\nfunction boundSideQueryMessages(\n\tmessages: Message[],\n\tsystemPrompt: string,\n\tpromptContextWindow: number | undefined,\n): Message[] {\n\tif (typeof promptContextWindow !== \"number\" || !Number.isFinite(promptContextWindow) || promptContextWindow <= 0) {\n\t\treturn messages;\n\t}\n\n\tconst messageBudget = promptContextWindow - estimateSystemPromptTokens(systemPrompt);\n\tconst question = messages.at(-1);\n\tif (question === undefined || messageBudget < estimateMessagesTokens([question])) {\n\t\tthrow new Error(\"/btw question does not fit this model's context window; shorten it or run /compact first.\");\n\t}\n\tif (estimateMessagesTokens(messages) <= messageBudget) return messages;\n\n\tconst reduced = convertToLlm(reduceContextMessages(messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages);\n\tconst repaired = repairOrphanedToolResults(reduced);\n\tconst pruned = convertToLlm(pruneOldMessagesToBudget(repaired, messageBudget));\n\tconst bounded = repairOrphanedToolResults(pruned);\n\tif (estimateMessagesTokens(bounded) > messageBudget) {\n\t\tthrow new Error(\"/btw context is too large for this model; run /compact first.\");\n\t}\n\treturn bounded;\n}\n\nexport function getSideQueryPromptContextWindow(model: Pick<Model<string>, \"contextWindow\" | \"maxTokens\">): number {\n\treturn getPromptContextWindow(model.contextWindow, model.maxTokens);\n}\n\nexport function buildSideQueryContext(input: SideQueryContextInput): Context {\n\tconst systemPrompt = `${input.systemPrompt}\\n\\n${SIDE_QUERY_INSTRUCTION}`;\n\tconst messages = boundSideQueryMessages(\n\t\t[...input.history, { role: \"user\", content: input.question, timestamp: Date.now() }],\n\t\tsystemPrompt,\n\t\tinput.promptContextWindow,\n\t);\n\treturn {\n\t\tsystemPrompt,\n\t\tmessages,\n\t\ttools: [],\n\t};\n}\n\nexport interface SideQueryAuth {\n\tapiKey?: string;\n\theaders?: ProviderHeaders;\n\textraBody?: Record<string, unknown>;\n}\n\nexport interface SideQueryDeps {\n\tmodel: Model<any>;\n\tauth: SideQueryAuth;\n\tsessionId: string;\n\tthinkingLevel?: ThinkingLevel;\n\tstreamFn?: StreamFunction;\n\testablishmentTimeoutMs?: number;\n}\n\nexport interface SideQueryCallbacks {\n\tonTextDelta?: (delta: string) => void;\n\tsignal?: AbortSignal;\n}\n\nexport interface SideQueryResult {\n\treplyText: string;\n}\n\nexport async function runSideQuery(\n\tdeps: SideQueryDeps,\n\tcontext: Context,\n\tcallbacks: SideQueryCallbacks = {},\n): Promise<SideQueryResult> {\n\tcallbacks.signal?.throwIfAborted();\n\tconst streamFn = deps.streamFn ?? streamSimple;\n\tconst establishment = new AbortController();\n\tconst signal = callbacks.signal ? AbortSignal.any([callbacks.signal, establishment.signal]) : establishment.signal;\n\tconst timeoutMs = deps.establishmentTimeoutMs ?? DEFAULT_ESTABLISHMENT_TIMEOUT_MS;\n\tconst timeoutError = new Error(`/btw provider did not produce an event within ${Math.round(timeoutMs / 1000)}s`);\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\ttry {\n\t\tconst options: SimpleStreamOptions = {\n\t\t\tapiKey: deps.auth.apiKey,\n\t\t\theaders: deps.auth.headers,\n\t\t\textraBody: deps.auth.extraBody,\n\t\t\tsessionId: `${deps.sessionId}:btw:${crypto.randomUUID()}`,\n\t\t\treasoning: deps.thinkingLevel,\n\t\t\tsignal,\n\t\t};\n\t\ttimer = setTimeout(() => establishment.abort(timeoutError), timeoutMs);\n\t\ttimer.unref?.();\n\t\tconst stream = await streamFn(deps.model, context, options);\n\t\tlet established = false;\n\t\tlet replyText = \"\";\n\t\tfor await (const event of stream) {\n\t\t\tif (!established && event.type !== \"start\") {\n\t\t\t\testablished = true;\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t\tif (event.type === \"text_delta\") {\n\t\t\t\treplyText += event.delta;\n\t\t\t\tcallbacks.onTextDelta?.(event.delta);\n\t\t\t} else if (event.type === \"done\") {\n\t\t\t\tbreak;\n\t\t\t} else if (event.type === \"error\") {\n\t\t\t\tthrow new Error(event.error.errorMessage || \"Side query failed\");\n\t\t\t}\n\t\t}\n\t\tsignal.throwIfAborted();\n\t\treturn { replyText };\n\t} catch (error) {\n\t\tif (establishment.signal.aborted && !callbacks.signal?.aborted) {\n\t\t\tthrow timeoutError;\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\tif (timer) clearTimeout(timer);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,OAAO,EAEZ,KAAK,KAAK,EAGV,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE1B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,aAAa,EAAkC,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGtG,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD,UAAU,YAAY;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC1B;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED,UAAU,YAAY;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9E,KAAK,iBAAiB,GAAG,CACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,uBAAuB,CAS3E,CAAC;AAEH,wBAAgB,6BAA6B,CAC5C,YAAY,GAAE;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,iBAAiB,CAAA;CAAO,GACjE,gBAAgB,CA+MlB;;AAuDD,wBAA+C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,OAAO,EAEZ,KAAK,KAAK,EAGV,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE1B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,aAAa,EAAkC,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGtG,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAC5D,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD,UAAU,YAAY;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC1B;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED,UAAU,YAAY;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9E,KAAK,iBAAiB,GAAG,CACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,uBAAuB,CAS3E,CAAC;AAEH,wBAAgB,6BAA6B,CAC5C,YAAY,GAAE;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,iBAAiB,CAAA;CAAO,GACjE,gBAAgB,CA+MlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Context,\n\tisAnthropicApiBaseUrl,\n\ttype Model,\n\tresolvePromptCacheTtlSeconds,\n\ttype Tool,\n\ttype WarmPromptCacheOptions,\n\ttype WarmPromptCacheResult,\n\twarmPromptCache,\n} from \"@earendil-works/pi-ai\";\nimport { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer, ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../types.ts\";\nimport { formatWarmTokenCount } from \"../goal/cache-warm.ts\";\n\nexport const CACHE_KEEPALIVE_ENTRY_TYPE = \"cache-keepalive\";\nexport const CACHE_WARM_PING_EVENT = \"cache_warm_ping\";\n\ninterface StartedEntry {\n\treadonly phase: \"started\";\n}\n\ninterface PingEntry {\n\treadonly phase: \"ping\";\n\treadonly iteration: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly estimatedCostUsd: number;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\ninterface StoppedEntry {\n\treadonly phase: \"stopped\";\n\treadonly iterations: number;\n\treadonly stopReason: string;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\nexport type CacheKeepAliveEntryData = StartedEntry | PingEntry | StoppedEntry;\n\ntype WarmPromptCacheFn = (\n\tmodel: Model<any>,\n\tcontext: Context,\n\toptions?: WarmPromptCacheOptions,\n) => Promise<WarmPromptCacheResult>;\n\nexport const renderCacheKeepAliveEntry: EntryRenderer<CacheKeepAliveEntryData> = noticeEntryRenderer((entry) => {\n\tconst data = entry.data;\n\tif (data?.phase !== \"ping\") return undefined;\n\tconst refreshed = data.cacheRead + data.cacheWrite;\n\treturn {\n\t\ttitle: `⚡ Warm ping #${data.iteration} · ~${formatWarmTokenCount(refreshed)} tokens refreshed · ${formatUsd(data.estimatedCostUsd)}`,\n\t\twhy: \"Refreshed the active Anthropic prompt cache while the session was idle.\",\n\t\texpandedLine: `cache read ${data.cacheRead} · cache write ${data.cacheWrite} · session total ${formatUsd(data.cumulativeEstimatedUsd)}`,\n\t};\n});\n\nexport function createCacheKeepAliveExtension(\n\tdependencies: { readonly warmPromptCache?: WarmPromptCacheFn } = {},\n): ExtensionFactory {\n\tconst warm = dependencies.warmPromptCache ?? warmPromptCache;\n\treturn (pi: ExtensionAPI) => {\n\t\tlet ctx: ExtensionContext | undefined;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tlet inFlight = false;\n\t\tlet generation = 0;\n\t\tlet active = false;\n\t\tlet attempts = 0;\n\t\tlet cumulativeEstimatedUsd = 0;\n\t\tlet lastCompletedAtMs: number | undefined;\n\t\tlet lastMessages: AgentMessage[] = [];\n\t\tlet lastUsage: { input: number; cacheRead: number; cacheWrite: number } | undefined;\n\n\t\tpi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE, renderCacheKeepAliveEntry);\n\n\t\t// No goal-timer coupling: an armed goal continuation timer issues no\n\t\t// provider request until it fires, and `promptCache.goalBackstopMaxSeconds`\n\t\t// may place that past the TTL, so it cannot be relied on to refresh the\n\t\t// prompt cache on this loop's behalf.\n\t\tfunction append(data: CacheKeepAliveEntryData): void {\n\t\t\tpi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE, data);\n\t\t}\n\n\t\tfunction stop(reason: string, forceEntry = false): void {\n\t\t\tconst shouldAppend = active || inFlight || timer !== undefined || forceEntry;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tactive = false;\n\t\t\tif (shouldAppend) {\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"stopped\",\n\t\t\t\t\titerations: attempts,\n\t\t\t\t\tstopReason: reason,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction arm(): void {\n\t\t\tif (timer !== undefined || inFlight) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (!settings?.enabled || current?.model === undefined || lastCompletedAtMs === undefined) return;\n\t\t\tif (!isWarmSupportedModel(current.model)) return;\n\t\t\tif (!current.isIdle()) {\n\t\t\t\tstop(\"agent-busy\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (current.hasPendingMessages()) {\n\t\t\t\tstop(\"pending-messages\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst safeWaitSeconds = current.getPromptCacheSafeWaitSeconds?.();\n\t\t\tif (safeWaitSeconds === undefined || !Number.isFinite(safeWaitSeconds)) return;\n\t\t\tif (attempts >= Math.max(0, settings.maxRequestsPerSession)) {\n\t\t\t\tstop(\"max-requests\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst projectedUsd = projectedPingCost(current.model, lastUsage);\n\t\t\tif (cumulativeEstimatedUsd + projectedUsd > Math.max(0, settings.maxCostUsdPerSession)) {\n\t\t\t\tstop(\"cost-cap\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\tactive = true;\n\t\t\t\tappend({ phase: \"started\" });\n\t\t\t}\n\t\t\tconst intervalMs = Math.max(0, safeWaitSeconds - Math.max(0, settings.marginSeconds)) * 1000;\n\t\t\tconst delayMs = Math.max(0, lastCompletedAtMs + intervalMs - Date.now());\n\t\t\tconst scheduledGeneration = generation;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tvoid ping(scheduledGeneration);\n\t\t\t}, delayMs);\n\t\t}\n\n\t\tasync function ping(scheduledGeneration: number): Promise<void> {\n\t\t\tif (scheduledGeneration !== generation) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (\n\t\t\t\tcurrent === undefined ||\n\t\t\t\tsettings?.enabled !== true ||\n\t\t\t\tcurrent.model === undefined ||\n\t\t\t\t!isWarmSupportedModel(current.model) ||\n\t\t\t\t!current.isIdle() ||\n\t\t\t\tcurrent.hasPendingMessages() ||\n\t\t\t\tattempts >= Math.max(0, settings.maxRequestsPerSession) ||\n\t\t\t\tcumulativeEstimatedUsd + projectedPingCost(current.model, lastUsage) >\n\t\t\t\t\tMath.max(0, settings.maxCostUsdPerSession)\n\t\t\t) {\n\t\t\t\tarm();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinFlight = true;\n\t\t\tattempts += 1;\n\t\t\tconst iteration = attempts;\n\t\t\tconst pingGeneration = generation;\n\t\t\ttry {\n\t\t\t\tconst preparation = await current.prepareProviderRequest?.(lastMessages);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst preparedMessages = preparation?.messages ?? lastMessages;\n\t\t\t\tconst activeToolNames = new Set(pi.getActiveTools());\n\t\t\t\tconst tools: Tool[] = pi\n\t\t\t\t\t.getAllTools()\n\t\t\t\t\t.filter((tool) => activeToolNames.has(tool.name))\n\t\t\t\t\t.map(({ name, description, parameters }) => ({ name, description, parameters }));\n\t\t\t\tconst auth = await current.modelRegistry.getApiKeyAndHeaders(current.model);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!auth.ok) throw new Error(auth.error);\n\t\t\t\tconst authHeaders = auth.headers ?? {};\n\t\t\t\tconst headers = preparation ? await preparation.transformHeaders(authHeaders) : authHeaders;\n\t\t\t\tconst result = await warm(\n\t\t\t\t\tcurrent.model,\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemPrompt: current.getSystemPrompt(),\n\t\t\t\t\t\tmessages: convertToLlm(filterContextExcludedMessages(preparedMessages)),\n\t\t\t\t\t\t...(tools.length > 0 ? { tools } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tsessionId: current.sessionManager.getSessionId(),\n\t\t\t\t\t\tcacheRetention: current.model.cacheRetention,\n\t\t\t\t\t\tonPayload: preparation ? async (payload) => await preparation.transformPayload(payload) : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!result.supported) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tstop(\"unsupported-model\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst estimatedCostUsd = actualPingCost(current.model, result.usage);\n\t\t\t\tcumulativeEstimatedUsd += estimatedCostUsd;\n\t\t\t\tlastCompletedAtMs = Date.now();\n\t\t\t\tconst cachedTokens = result.usage.cacheRead + result.usage.cacheWrite;\n\t\t\t\tconst ttlSeconds = resolvePromptCacheTtlSeconds(current.model) ?? 0;\n\t\t\t\tpi.events?.emit(CACHE_WARM_PING_EVENT, { iteration, cachedTokens, ttlSeconds, estimatedCostUsd });\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"ping\",\n\t\t\t\t\titeration,\n\t\t\t\t\tcacheRead: result.usage.cacheRead,\n\t\t\t\t\tcacheWrite: result.usage.cacheWrite,\n\t\t\t\t\testimatedCostUsd,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t\tinFlight = false;\n\t\t\t\tarm();\n\t\t\t} catch {\n\t\t\t\tinFlight = false;\n\t\t\t\tif (pingGeneration === generation) stop(\"provider-error\");\n\t\t\t\telse arm();\n\t\t\t}\n\t\t}\n\n\t\tpi.on(\"session_start\", (_event, nextCtx) => {\n\t\t\tstop(\"session-restart\");\n\t\t\tctx = nextCtx;\n\t\t\tattempts = 0;\n\t\t\tcumulativeEstimatedUsd = 0;\n\t\t\tlastMessages = nextCtx.sessionManager.buildSessionContext().messages;\n\t\t\tconst usage = lastAssistantUsage(lastMessages);\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = lastAssistantTimestamp(lastMessages);\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"agent_end\", (event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tconst usage = lastAssistantUsage(event.messages);\n\t\t\tif (usage?.stopReason === \"error\") {\n\t\t\t\tstop(\"provider-error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastMessages = [...event.messages];\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = Date.now();\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"model_select\", (_event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tstop(\"model-changed\");\n\t\t\tarm();\n\t\t});\n\t\tpi.on(\"agent_start\", () => stop(\"agent-busy\"));\n\t\tpi.on(\"input\", () => stop(\"user-input\"));\n\t\tpi.on(\"session_shutdown\", () => {\n\t\t\tstop(\"session-dispose\");\n\t\t\tctx = undefined;\n\t\t});\n\t};\n}\n\nfunction isWarmSupportedModel(model: Model<any>): model is Model<\"anthropic-messages\"> {\n\treturn model.api === \"anthropic-messages\" && isAnthropicApiBaseUrl(model.baseUrl);\n}\n\nfunction lastAssistantUsage(\n\tmessages: readonly AgentMessage[],\n): { input: number; cacheRead: number; cacheWrite: number; stopReason?: string } | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") continue;\n\t\treturn {\n\t\t\tinput: finiteTokens(message.usage.input),\n\t\t\tcacheRead: finiteTokens(message.usage.cacheRead),\n\t\t\tcacheWrite: finiteTokens(message.usage.cacheWrite),\n\t\t\tstopReason: message.stopReason,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction lastAssistantTimestamp(messages: readonly AgentMessage[]): number | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && Number.isFinite(message.timestamp)) return message.timestamp;\n\t}\n\treturn undefined;\n}\n\nfunction projectedPingCost(\n\tmodel: Model<any>,\n\tusage: { input: number; cacheRead: number; cacheWrite: number } | undefined,\n): number {\n\tconst promptTokens = (usage?.input ?? 0) + (usage?.cacheRead ?? 0) + (usage?.cacheWrite ?? 0);\n\treturn (promptTokens * Math.max(model.cost.cacheRead, model.cost.cacheWrite)) / 1_000_000;\n}\n\nfunction actualPingCost(model: Model<any>, usage: { input: number; cacheRead: number; cacheWrite: number }): number {\n\treturn (\n\t\t(usage.cacheRead * model.cost.cacheRead +\n\t\t\tusage.cacheWrite * model.cost.cacheWrite +\n\t\t\tusage.input * model.cost.input) /\n\t\t1_000_000\n\t);\n}\n\nfunction finiteTokens(value: number): number {\n\treturn Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(3)}`;\n}\n\nexport default createCacheKeepAliveExtension();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cache-keepalive/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Context,\n\tisAnthropicApiBaseUrl,\n\ttype Model,\n\tresolvePromptCacheTtlSeconds,\n\ttype Tool,\n\ttype WarmPromptCacheOptions,\n\ttype WarmPromptCacheResult,\n\twarmPromptCache,\n} from \"@earendil-works/pi-ai\";\nimport { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer, ExtensionAPI, ExtensionContext, ExtensionFactory } from \"../../types.ts\";\nimport { formatWarmTokenCount } from \"../goal/cache-warm.ts\";\n\nexport const CACHE_KEEPALIVE_ENTRY_TYPE = \"cache-keepalive\";\nexport const CACHE_WARM_PING_EVENT = \"cache_warm_ping\";\n\ninterface StartedEntry {\n\treadonly phase: \"started\";\n}\n\ninterface PingEntry {\n\treadonly phase: \"ping\";\n\treadonly iteration: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly estimatedCostUsd: number;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\ninterface StoppedEntry {\n\treadonly phase: \"stopped\";\n\treadonly iterations: number;\n\treadonly stopReason: string;\n\treadonly cumulativeEstimatedUsd: number;\n}\n\nexport type CacheKeepAliveEntryData = StartedEntry | PingEntry | StoppedEntry;\n\ntype WarmPromptCacheFn = (\n\tmodel: Model<any>,\n\tcontext: Context,\n\toptions?: WarmPromptCacheOptions,\n) => Promise<WarmPromptCacheResult>;\n\nexport const renderCacheKeepAliveEntry: EntryRenderer<CacheKeepAliveEntryData> = noticeEntryRenderer((entry) => {\n\tconst data = entry.data;\n\tif (data?.phase !== \"ping\") return undefined;\n\tconst refreshed = data.cacheRead + data.cacheWrite;\n\treturn {\n\t\ttitle: `⚡ Warm ping #${data.iteration} · ~${formatWarmTokenCount(refreshed)} tokens refreshed · ${formatUsd(data.estimatedCostUsd)}`,\n\t\twhy: \"Refreshed the active Anthropic prompt cache while the session was idle.\",\n\t\texpandedLine: `cache read ${data.cacheRead} · cache write ${data.cacheWrite} · session total ${formatUsd(data.cumulativeEstimatedUsd)}`,\n\t};\n});\n\nexport function createCacheKeepAliveExtension(\n\tdependencies: { readonly warmPromptCache?: WarmPromptCacheFn } = {},\n): ExtensionFactory {\n\tconst warm = dependencies.warmPromptCache ?? warmPromptCache;\n\treturn (pi: ExtensionAPI) => {\n\t\tlet ctx: ExtensionContext | undefined;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tlet inFlight = false;\n\t\tlet generation = 0;\n\t\tlet active = false;\n\t\tlet attempts = 0;\n\t\tlet cumulativeEstimatedUsd = 0;\n\t\tlet lastCompletedAtMs: number | undefined;\n\t\tlet lastMessages: AgentMessage[] = [];\n\t\tlet lastUsage: { input: number; cacheRead: number; cacheWrite: number } | undefined;\n\n\t\tpi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE, renderCacheKeepAliveEntry);\n\n\t\t// No goal-timer coupling: an armed goal continuation timer issues no\n\t\t// provider request until it fires, and `promptCache.goalBackstopMaxSeconds`\n\t\t// may place that past the TTL, so it cannot be relied on to refresh the\n\t\t// prompt cache on this loop's behalf.\n\t\tfunction append(data: CacheKeepAliveEntryData): void {\n\t\t\tpi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE, data);\n\t\t}\n\n\t\tfunction stop(reason: string, forceEntry = false): void {\n\t\t\tconst shouldAppend = active || inFlight || timer !== undefined || forceEntry;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tactive = false;\n\t\t\tif (shouldAppend) {\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"stopped\",\n\t\t\t\t\titerations: attempts,\n\t\t\t\t\tstopReason: reason,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction arm(): void {\n\t\t\tif (timer !== undefined || inFlight) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (!settings?.enabled || current?.model === undefined || lastCompletedAtMs === undefined) return;\n\t\t\tif (!isWarmSupportedModel(current.model)) return;\n\t\t\tif (!current.isIdle()) {\n\t\t\t\tstop(\"agent-busy\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (current.hasPendingMessages()) {\n\t\t\t\tstop(\"pending-messages\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst safeWaitSeconds = current.getPromptCacheSafeWaitSeconds?.();\n\t\t\tif (safeWaitSeconds === undefined || !Number.isFinite(safeWaitSeconds)) return;\n\t\t\tif (attempts >= Math.max(0, settings.maxRequestsPerSession)) {\n\t\t\t\tstop(\"max-requests\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst projectedUsd = projectedPingCost(current.model, lastUsage);\n\t\t\tif (cumulativeEstimatedUsd + projectedUsd > Math.max(0, settings.maxCostUsdPerSession)) {\n\t\t\t\tstop(\"cost-cap\", true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\tactive = true;\n\t\t\t\tappend({ phase: \"started\" });\n\t\t\t}\n\t\t\tconst intervalMs = Math.max(0, safeWaitSeconds - Math.max(0, settings.marginSeconds)) * 1000;\n\t\t\tconst delayMs = Math.max(0, lastCompletedAtMs + intervalMs - Date.now());\n\t\t\tconst scheduledGeneration = generation;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tvoid ping(scheduledGeneration);\n\t\t\t}, delayMs);\n\t\t}\n\n\t\tasync function ping(scheduledGeneration: number): Promise<void> {\n\t\t\tif (scheduledGeneration !== generation) return;\n\t\t\tconst current = ctx;\n\t\t\tconst settings = current?.getPromptCacheKeepAliveSettings?.();\n\t\t\tif (\n\t\t\t\tcurrent === undefined ||\n\t\t\t\tsettings?.enabled !== true ||\n\t\t\t\tcurrent.model === undefined ||\n\t\t\t\t!isWarmSupportedModel(current.model) ||\n\t\t\t\t!current.isIdle() ||\n\t\t\t\tcurrent.hasPendingMessages() ||\n\t\t\t\tattempts >= Math.max(0, settings.maxRequestsPerSession) ||\n\t\t\t\tcumulativeEstimatedUsd + projectedPingCost(current.model, lastUsage) >\n\t\t\t\t\tMath.max(0, settings.maxCostUsdPerSession)\n\t\t\t) {\n\t\t\t\tarm();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinFlight = true;\n\t\t\tattempts += 1;\n\t\t\tconst iteration = attempts;\n\t\t\tconst pingGeneration = generation;\n\t\t\ttry {\n\t\t\t\tconst preparation = await current.prepareProviderRequest?.(lastMessages);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst preparedMessages = preparation?.messages ?? lastMessages;\n\t\t\t\tconst activeToolNames = new Set(pi.getActiveTools());\n\t\t\t\tconst tools: Tool[] = pi\n\t\t\t\t\t.getAllTools()\n\t\t\t\t\t.filter((tool) => activeToolNames.has(tool.name))\n\t\t\t\t\t.map(({ name, description, parameters }) => ({ name, description, parameters }));\n\t\t\t\tconst auth = await current.modelRegistry.getApiKeyAndHeaders(current.model);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!auth.ok) throw new Error(auth.error);\n\t\t\t\tconst authHeaders = auth.headers ?? {};\n\t\t\t\tconst headers = preparation ? await preparation.transformHeaders(authHeaders) : authHeaders;\n\t\t\t\tconst result = await warm(\n\t\t\t\t\tcurrent.model,\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemPrompt: current.getSystemPrompt(),\n\t\t\t\t\t\tmessages: convertToLlm(filterContextExcludedMessages(preparedMessages)),\n\t\t\t\t\t\t...(tools.length > 0 ? { tools } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tsessionId: current.sessionManager.getSessionId(),\n\t\t\t\t\t\tcacheRetention: current.model.cacheRetention,\n\t\t\t\t\t\tonPayload: preparation ? async (payload) => await preparation.transformPayload(payload) : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (pingGeneration !== generation) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tarm();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!result.supported) {\n\t\t\t\t\tinFlight = false;\n\t\t\t\t\tstop(\"unsupported-model\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst estimatedCostUsd = actualPingCost(current.model, result.usage);\n\t\t\t\tcumulativeEstimatedUsd += estimatedCostUsd;\n\t\t\t\tlastCompletedAtMs = Date.now();\n\t\t\t\tconst cachedTokens = result.usage.cacheRead + result.usage.cacheWrite;\n\t\t\t\tconst ttlSeconds = resolvePromptCacheTtlSeconds(current.model) ?? 0;\n\t\t\t\tpi.events?.emit(CACHE_WARM_PING_EVENT, { iteration, cachedTokens, ttlSeconds, estimatedCostUsd });\n\t\t\t\tappend({\n\t\t\t\t\tphase: \"ping\",\n\t\t\t\t\titeration,\n\t\t\t\t\tcacheRead: result.usage.cacheRead,\n\t\t\t\t\tcacheWrite: result.usage.cacheWrite,\n\t\t\t\t\testimatedCostUsd,\n\t\t\t\t\tcumulativeEstimatedUsd,\n\t\t\t\t});\n\t\t\t\tinFlight = false;\n\t\t\t\tarm();\n\t\t\t} catch {\n\t\t\t\tinFlight = false;\n\t\t\t\tif (pingGeneration === generation) stop(\"provider-error\");\n\t\t\t\telse arm();\n\t\t\t}\n\t\t}\n\n\t\tpi.on(\"session_start\", (_event, nextCtx) => {\n\t\t\tstop(\"session-restart\");\n\t\t\tctx = nextCtx;\n\t\t\tattempts = 0;\n\t\t\tcumulativeEstimatedUsd = 0;\n\t\t\tlastMessages = nextCtx.sessionManager.buildSessionContext().messages;\n\t\t\tconst usage = lastAssistantUsage(lastMessages);\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = lastAssistantTimestamp(lastMessages);\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"agent_end\", (event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tconst usage = lastAssistantUsage(event.messages);\n\t\t\tif (usage?.stopReason === \"error\") {\n\t\t\t\tstop(\"provider-error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastMessages = [...event.messages];\n\t\t\tlastUsage = usage;\n\t\t\tlastCompletedAtMs = Date.now();\n\t\t\tarm();\n\t\t});\n\n\t\tpi.on(\"model_select\", (_event, nextCtx) => {\n\t\t\tctx = nextCtx;\n\t\t\tstop(\"model-changed\");\n\t\t\tarm();\n\t\t});\n\t\tpi.on(\"agent_start\", () => stop(\"agent-busy\"));\n\t\tpi.on(\"input\", () => stop(\"user-input\"));\n\t\tpi.on(\"session_shutdown\", () => {\n\t\t\tstop(\"session-dispose\");\n\t\t\tctx = undefined;\n\t\t});\n\t};\n}\n\nfunction isWarmSupportedModel(model: Model<any>): model is Model<\"anthropic-messages\"> {\n\treturn model.api === \"anthropic-messages\" && isAnthropicApiBaseUrl(model.baseUrl);\n}\n\nfunction lastAssistantUsage(\n\tmessages: readonly AgentMessage[],\n): { input: number; cacheRead: number; cacheWrite: number; stopReason?: string } | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") continue;\n\t\treturn {\n\t\t\tinput: finiteTokens(message.usage.input),\n\t\t\tcacheRead: finiteTokens(message.usage.cacheRead),\n\t\t\tcacheWrite: finiteTokens(message.usage.cacheWrite),\n\t\t\tstopReason: message.stopReason,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction lastAssistantTimestamp(messages: readonly AgentMessage[]): number | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"assistant\" && Number.isFinite(message.timestamp)) return message.timestamp;\n\t}\n\treturn undefined;\n}\n\nfunction projectedPingCost(\n\tmodel: Model<any>,\n\tusage: { input: number; cacheRead: number; cacheWrite: number } | undefined,\n): number {\n\tconst promptTokens = (usage?.input ?? 0) + (usage?.cacheRead ?? 0) + (usage?.cacheWrite ?? 0);\n\treturn (promptTokens * Math.max(model.cost.cacheRead, model.cost.cacheWrite)) / 1_000_000;\n}\n\nfunction actualPingCost(model: Model<any>, usage: { input: number; cacheRead: number; cacheWrite: number }): number {\n\treturn (\n\t\t(usage.cacheRead * model.cost.cacheRead +\n\t\t\tusage.cacheWrite * model.cost.cacheWrite +\n\t\t\tusage.input * model.cost.input) /\n\t\t1_000_000\n\t);\n}\n\nfunction finiteTokens(value: number): number {\n\treturn Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(3)}`;\n}\n\nexport default createCacheKeepAliveExtension();\n"]}