@code-yeongyu/senpi 2026.9.9-2 → 2026.9.10-2

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 (1062) hide show
  1. package/CHANGELOG.md +95 -0
  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 +74 -6
  23. package/dist/core/agent-session.d.ts.map +1 -1
  24. package/dist/core/agent-session.js +161 -24
  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-binding.js +3 -0
  125. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  126. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +19 -10
  130. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
  131. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
  133. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -1
  134. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  136. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  137. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
  139. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
  140. package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.js.map +1 -1
  141. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
  143. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  144. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  145. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  146. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  147. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
  148. package/dist/core/extensions/builtin/compaction/openai-remote-convert.js.map +1 -1
  149. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  150. package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/compaction/resume-slice.d.ts +23 -0
  152. package/dist/core/extensions/builtin/compaction/resume-slice.d.ts.map +1 -0
  153. package/dist/core/extensions/builtin/compaction/resume-slice.js +99 -0
  154. package/dist/core/extensions/builtin/compaction/resume-slice.js.map +1 -0
  155. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  156. package/dist/core/extensions/builtin/compaction/summarization-retry.js.map +1 -1
  157. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  158. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  159. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
  160. package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/config-reload/reload-deferral.d.ts.map +1 -1
  162. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
  164. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
  165. package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
  166. package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js.map +1 -1
  168. package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js.map +1 -1
  170. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
  172. package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js.map +1 -1
  175. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
  176. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
  177. package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js.map +1 -1
  179. package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js.map +1 -1
  181. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  182. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  184. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  185. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -1
  186. package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -1
  188. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/goal/monitor-continuation.js +57 -4
  190. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  191. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  192. package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
  193. package/dist/core/extensions/builtin/goal/prompt.js +9 -6
  194. package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
  195. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  196. package/dist/core/extensions/builtin/goal/tool-registration.js +1 -1
  197. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  198. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -1
  199. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  200. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  201. package/dist/core/extensions/builtin/goal/wait-progress.js.map +1 -1
  202. package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -1
  203. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  204. package/dist/core/extensions/builtin/gpt-account.js +1 -0
  205. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  206. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  207. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  208. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  209. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  210. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  211. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  212. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  213. package/dist/core/extensions/builtin/help/panel.d.ts.map +1 -1
  214. package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
  215. package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
  216. package/dist/core/extensions/builtin/hooks/command-runner.js.map +1 -1
  217. package/dist/core/extensions/builtin/hooks/dispatcher.js.map +1 -1
  218. package/dist/core/extensions/builtin/hooks/plugin-loader.js.map +1 -1
  219. package/dist/core/extensions/builtin/hooks/tool-adapter.js.map +1 -1
  220. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  221. package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
  222. package/dist/core/extensions/builtin/hooks/types.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
  224. package/dist/core/extensions/builtin/imagegen/params.d.ts +10 -1
  225. package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -1
  226. package/dist/core/extensions/builtin/imagegen/params.js +29 -3
  227. package/dist/core/extensions/builtin/imagegen/params.js.map +1 -1
  228. package/dist/core/extensions/builtin/imagegen/paths.d.ts +10 -4
  229. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/imagegen/paths.js +43 -10
  231. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -1
  232. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +9 -0
  233. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -1
  234. package/dist/core/extensions/builtin/imagegen/reference-images.js +40 -25
  235. package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -1
  236. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +44 -62
  237. package/dist/core/extensions/builtin/imagegen/tool.d.ts +5 -0
  238. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/imagegen/tool.js +58 -12
  240. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
  241. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/index.js +2 -0
  243. package/dist/core/extensions/builtin/index.js.map +1 -1
  244. package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/look-at/runner.js.map +1 -1
  246. package/dist/core/extensions/builtin/loop/command.js.map +1 -1
  247. package/dist/core/extensions/builtin/loop/cron-planner.js.map +1 -1
  248. package/dist/core/extensions/builtin/loop/index.d.ts.map +1 -1
  249. package/dist/core/extensions/builtin/loop/index.js.map +1 -1
  250. package/dist/core/extensions/builtin/loop/loopfile.d.ts.map +1 -1
  251. package/dist/core/extensions/builtin/loop/scheduler.js.map +1 -1
  252. package/dist/core/extensions/builtin/loop/status.d.ts.map +1 -1
  253. package/dist/core/extensions/builtin/loop/store.d.ts.map +1 -1
  254. package/dist/core/extensions/builtin/loop/types.d.ts.map +1 -1
  255. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -1
  256. package/dist/core/extensions/builtin/loop-guard/escalation.d.ts.map +1 -1
  257. package/dist/core/extensions/builtin/loop-guard/escalation.js.map +1 -1
  258. package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -1
  259. package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -1
  260. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
  261. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -1
  262. package/dist/core/extensions/builtin/mcp/active-set.js.map +1 -1
  263. package/dist/core/extensions/builtin/mcp/auth/callback.d.ts.map +1 -1
  264. package/dist/core/extensions/builtin/mcp/auth/oauth-errors.d.ts.map +1 -1
  265. package/dist/core/extensions/builtin/mcp/auth/oauth-errors.js.map +1 -1
  266. package/dist/core/extensions/builtin/mcp/auth/oauth-provider.d.ts.map +1 -1
  267. package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.d.ts.map +1 -1
  268. package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js.map +1 -1
  269. package/dist/core/extensions/builtin/mcp/auth/oauth.js.map +1 -1
  270. package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts.map +1 -1
  271. package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
  272. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +28 -28
  273. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  274. package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
  275. package/dist/core/extensions/builtin/mcp/elicitation.d.ts.map +1 -1
  276. package/dist/core/extensions/builtin/mcp/elicitation.js.map +1 -1
  277. package/dist/core/extensions/builtin/mcp/errors.d.ts.map +1 -1
  278. package/dist/core/extensions/builtin/mcp/errors.js.map +1 -1
  279. package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
  280. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  281. package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts.map +1 -1
  282. package/dist/core/extensions/builtin/mcp/guard/output-guard.js.map +1 -1
  283. package/dist/core/extensions/builtin/mcp/log.js.map +1 -1
  284. package/dist/core/extensions/builtin/mcp/reconnect.d.ts.map +1 -1
  285. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  286. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  287. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  288. package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -1
  289. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -1
  290. package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +13 -6
  292. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -1
  293. package/dist/core/extensions/builtin/oauth-login-interaction.js +43 -19
  294. package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -1
  295. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +5 -3
  296. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -1
  297. package/dist/core/extensions/builtin/openai-image-gen/inject.js +7 -4
  298. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -1
  299. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  301. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  302. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  303. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  304. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  306. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
  307. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
  308. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
  309. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  310. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +1 -1
  311. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  312. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  313. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +1 -1
  314. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -1
  315. package/dist/core/extensions/builtin/prompt-preset/glm-5.js +1 -1
  316. package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -1
  317. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  318. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
  319. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  320. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +4 -4
  321. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  322. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +4 -4
  323. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  324. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
  325. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  326. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  327. package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -1
  328. package/dist/core/extensions/builtin/rules/commands.js.map +1 -1
  329. package/dist/core/extensions/builtin/rules/config.js.map +1 -1
  330. package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -1
  331. package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -1
  332. package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -1
  333. package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -1
  334. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  335. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  336. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  337. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  338. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  339. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -1
  340. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  341. package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -1
  342. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  343. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  344. package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -1
  345. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  346. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  347. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -1
  348. package/dist/core/extensions/builtin/todotools/todo-operations.js.map +1 -1
  349. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -1
  350. package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -1
  351. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  352. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
  353. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
  354. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
  355. package/dist/core/extensions/builtin/ttsr/detectors/leak-context.d.ts.map +1 -1
  356. package/dist/core/extensions/builtin/ttsr/detectors/token-grammar.d.ts.map +1 -1
  357. package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
  358. package/dist/core/extensions/builtin/ttsr/message-update.js.map +1 -1
  359. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -1
  360. package/dist/core/extensions/builtin/ttsr/stream-utils.d.ts.map +1 -1
  361. package/dist/core/extensions/builtin/ttsr/watch.d.ts.map +1 -1
  362. package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -1
  363. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +1 -1
  364. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  365. package/dist/core/extensions/loader.js.map +1 -1
  366. package/dist/core/extensions/notice/box.d.ts.map +1 -1
  367. package/dist/core/extensions/notice/box.js +13 -5
  368. package/dist/core/extensions/notice/box.js.map +1 -1
  369. package/dist/core/extensions/runner.d.ts +11 -0
  370. package/dist/core/extensions/runner.d.ts.map +1 -1
  371. package/dist/core/extensions/runner.js +23 -0
  372. package/dist/core/extensions/runner.js.map +1 -1
  373. package/dist/core/extensions/types.d.ts +71 -1
  374. package/dist/core/extensions/types.d.ts.map +1 -1
  375. package/dist/core/extensions/types.js.map +1 -1
  376. package/dist/core/footer-data-provider.d.ts.map +1 -1
  377. package/dist/core/footer-data-provider.js.map +1 -1
  378. package/dist/core/high-reasoning-warning.d.ts.map +1 -1
  379. package/dist/core/high-reasoning-warning.js +5 -1
  380. package/dist/core/high-reasoning-warning.js.map +1 -1
  381. package/dist/core/http-dispatcher.d.ts.map +1 -1
  382. package/dist/core/http-dispatcher.js.map +1 -1
  383. package/dist/core/keybindings.d.ts +182 -177
  384. package/dist/core/keybindings.d.ts.map +1 -1
  385. package/dist/core/keybindings.js +5 -0
  386. package/dist/core/keybindings.js.map +1 -1
  387. package/dist/core/lockfile-policy.d.ts.map +1 -1
  388. package/dist/core/manual-continue.d.ts +14 -0
  389. package/dist/core/manual-continue.d.ts.map +1 -1
  390. package/dist/core/manual-continue.js +13 -0
  391. package/dist/core/manual-continue.js.map +1 -1
  392. package/dist/core/messages.js.map +1 -1
  393. package/dist/core/model-config-schema.d.ts +150 -150
  394. package/dist/core/model-config-schema.d.ts.map +1 -1
  395. package/dist/core/model-config.d.ts.map +1 -1
  396. package/dist/core/model-config.js.map +1 -1
  397. package/dist/core/model-registry.d.ts.map +1 -1
  398. package/dist/core/model-registry.js.map +1 -1
  399. package/dist/core/model-resolver.d.ts.map +1 -1
  400. package/dist/core/model-resolver.js +1 -0
  401. package/dist/core/model-resolver.js.map +1 -1
  402. package/dist/core/model-runtime.d.ts.map +1 -1
  403. package/dist/core/model-runtime.js.map +1 -1
  404. package/dist/core/models-store.d.ts.map +1 -1
  405. package/dist/core/models-store.js.map +1 -1
  406. package/dist/core/package-manager.d.ts.map +1 -1
  407. package/dist/core/provider-display-names.d.ts.map +1 -1
  408. package/dist/core/provider-display-names.js +1 -0
  409. package/dist/core/provider-display-names.js.map +1 -1
  410. package/dist/core/remote-catalog-provider.js.map +1 -1
  411. package/dist/core/resource-loader.d.ts.map +1 -1
  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 +14 -3
  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 +35 -1
  427. package/dist/core/session-manager.d.ts.map +1 -1
  428. package/dist/core/session-manager.js +15 -0
  429. package/dist/core/session-manager.js.map +1 -1
  430. package/dist/core/session-resident-store.d.ts.map +1 -1
  431. package/dist/core/session-sidecar-store.d.ts.map +1 -1
  432. package/dist/core/session-summary-lru.d.ts.map +1 -1
  433. package/dist/core/session-work-barrier.d.ts.map +1 -1
  434. package/dist/core/settings-manager.d.ts +6 -1
  435. package/dist/core/settings-manager.d.ts.map +1 -1
  436. package/dist/core/settings-manager.js +14 -0
  437. package/dist/core/settings-manager.js.map +1 -1
  438. package/dist/core/settings-shapes.d.ts +7 -0
  439. package/dist/core/settings-shapes.d.ts.map +1 -1
  440. package/dist/core/settings-shapes.js +3 -1
  441. package/dist/core/settings-shapes.js.map +1 -1
  442. package/dist/core/telemetry.js.map +1 -1
  443. package/dist/core/timings.js.map +1 -1
  444. package/dist/core/tools/bash.d.ts.map +1 -1
  445. package/dist/core/tools/bounded-realpath.js.map +1 -1
  446. package/dist/core/tools/edit.d.ts.map +1 -1
  447. package/dist/core/tools/find.d.ts.map +1 -1
  448. package/dist/core/tools/find.js.map +1 -1
  449. package/dist/core/tools/grep.d.ts.map +1 -1
  450. package/dist/core/tools/ls.d.ts.map +1 -1
  451. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  452. package/dist/core/tools/output-accumulator.js.map +1 -1
  453. package/dist/core/tools/powershell.d.ts.map +1 -1
  454. package/dist/core/tools/read.d.ts.map +1 -1
  455. package/dist/core/tools/tail-window.d.ts.map +1 -1
  456. package/dist/core/tools/truncate.js.map +1 -1
  457. package/dist/core/tools/write-result.js.map +1 -1
  458. package/dist/core/tools/write.d.ts.map +1 -1
  459. package/dist/core/trust-manager.d.ts.map +1 -1
  460. package/dist/extensions/llama/client.d.ts.map +1 -1
  461. package/dist/extensions/llama/client.js.map +1 -1
  462. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  463. package/dist/extensions/llama/huggingface.js.map +1 -1
  464. package/dist/extensions/llama/provider.js.map +1 -1
  465. package/dist/from-source-config-guard.js.map +1 -1
  466. package/dist/main.js.map +1 -1
  467. package/dist/modes/app-server/daemon/occupancy.d.ts.map +1 -1
  468. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  469. package/dist/modes/app-server/daemon/process.js.map +1 -1
  470. package/dist/modes/app-server/daemon.js.map +1 -1
  471. package/dist/modes/app-server/protocol/collaboration-mode.d.ts.map +1 -1
  472. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts +7 -0
  473. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts.map +1 -0
  474. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js +4 -0
  475. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js.map +1 -0
  476. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts +8 -0
  477. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts.map +1 -0
  478. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js +4 -0
  479. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js.map +1 -0
  480. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts +12 -0
  481. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts.map +1 -0
  482. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js +4 -0
  483. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js.map +1 -0
  484. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts +13 -0
  485. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts.map +1 -0
  486. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js +4 -0
  487. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js.map +1 -0
  488. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts +10 -0
  489. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts.map +1 -0
  490. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js +4 -0
  491. package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js.map +1 -0
  492. package/dist/modes/app-server/protocol/index.d.ts +2 -0
  493. package/dist/modes/app-server/protocol/index.d.ts.map +1 -1
  494. package/dist/modes/app-server/protocol/index.js.map +1 -1
  495. package/dist/modes/app-server/protocol/methods.d.ts +1 -0
  496. package/dist/modes/app-server/protocol/methods.d.ts.map +1 -1
  497. package/dist/modes/app-server/protocol/methods.js +1 -0
  498. package/dist/modes/app-server/protocol/methods.js.map +1 -1
  499. package/dist/modes/app-server/rpc/errors.d.ts.map +1 -1
  500. package/dist/modes/app-server/runtime.d.ts.map +1 -1
  501. package/dist/modes/app-server/runtime.js +22 -6
  502. package/dist/modes/app-server/runtime.js.map +1 -1
  503. package/dist/modes/app-server/search/fuzzy-files.js.map +1 -1
  504. package/dist/modes/app-server/search/fuzzy-search-service.d.ts.map +1 -1
  505. package/dist/modes/app-server/server/account.js.map +1 -1
  506. package/dist/modes/app-server/server/approval-bridge.d.ts.map +1 -1
  507. package/dist/modes/app-server/server/approval-types.d.ts.map +1 -1
  508. package/dist/modes/app-server/server/approval-ui-context.d.ts +2 -1
  509. package/dist/modes/app-server/server/approval-ui-context.d.ts.map +1 -1
  510. package/dist/modes/app-server/server/approval-ui-context.js +9 -1
  511. package/dist/modes/app-server/server/approval-ui-context.js.map +1 -1
  512. package/dist/modes/app-server/server/catalogs.js.map +1 -1
  513. package/dist/modes/app-server/server/config.js.map +1 -1
  514. package/dist/modes/app-server/server/connection.d.ts.map +1 -1
  515. package/dist/modes/app-server/server/models.js.map +1 -1
  516. package/dist/modes/app-server/server/notifications.d.ts.map +1 -1
  517. package/dist/modes/app-server/server/notifications.js.map +1 -1
  518. package/dist/modes/app-server/server/server-core.d.ts.map +1 -1
  519. package/dist/modes/app-server/server/server-core.js.map +1 -1
  520. package/dist/modes/app-server/server/skills.js.map +1 -1
  521. package/dist/modes/app-server/server/user-input-bridge.d.ts +16 -0
  522. package/dist/modes/app-server/server/user-input-bridge.d.ts.map +1 -0
  523. package/dist/modes/app-server/server/user-input-bridge.js +142 -0
  524. package/dist/modes/app-server/server/user-input-bridge.js.map +1 -0
  525. package/dist/modes/app-server/server/user-input-types.d.ts +43 -0
  526. package/dist/modes/app-server/server/user-input-types.d.ts.map +1 -0
  527. package/dist/modes/app-server/server/user-input-types.js +51 -0
  528. package/dist/modes/app-server/server/user-input-types.js.map +1 -0
  529. package/dist/modes/app-server/threads/archive-state.d.ts.map +1 -1
  530. package/dist/modes/app-server/threads/handlers.js.map +1 -1
  531. package/dist/modes/app-server/threads/mcp-wire-status.d.ts.map +1 -1
  532. package/dist/modes/app-server/threads/metadata-state.d.ts.map +1 -1
  533. package/dist/modes/app-server/threads/projection-file-changes.js.map +1 -1
  534. package/dist/modes/app-server/threads/projection-message-items.d.ts.map +1 -1
  535. package/dist/modes/app-server/threads/projection-turn-diff.d.ts.map +1 -1
  536. package/dist/modes/app-server/threads/projection-web-search.js.map +1 -1
  537. package/dist/modes/app-server/threads/projection.d.ts.map +1 -1
  538. package/dist/modes/app-server/threads/registry.d.ts.map +1 -1
  539. package/dist/modes/app-server/threads/registry.js.map +1 -1
  540. package/dist/modes/app-server/threads/search-cache.d.ts.map +1 -1
  541. package/dist/modes/app-server/threads/turn-log.d.ts.map +1 -1
  542. package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
  543. package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
  544. package/dist/modes/app-server/threads/turns.js.map +1 -1
  545. package/dist/modes/app-server/threads/wire-thread.js.map +1 -1
  546. package/dist/modes/app-server/transports/unix-socket.d.ts.map +1 -1
  547. package/dist/modes/app-server/transports/unix-socket.js.map +1 -1
  548. package/dist/modes/app-server/transports/websocket.d.ts.map +1 -1
  549. package/dist/modes/app-server/turn-adapter.d.ts +3 -3
  550. package/dist/modes/app-server/turn-adapter.d.ts.map +1 -1
  551. package/dist/modes/app-server/turn-adapter.js +36 -5
  552. package/dist/modes/app-server/turn-adapter.js.map +1 -1
  553. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  554. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/armin.js.map +1 -1
  556. package/dist/modes/interactive/components/ask-user-async-widget.d.ts +39 -0
  557. package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -0
  558. package/dist/modes/interactive/components/ask-user-async-widget.js +82 -0
  559. package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -0
  560. package/dist/modes/interactive/components/ask-user-question-keys.d.ts +21 -0
  561. package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -0
  562. package/dist/modes/interactive/components/ask-user-question-keys.js +115 -0
  563. package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -0
  564. package/dist/modes/interactive/components/ask-user-question-render.d.ts +17 -0
  565. package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -0
  566. package/dist/modes/interactive/components/ask-user-question-render.js +75 -0
  567. package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -0
  568. package/dist/modes/interactive/components/ask-user-question-state.d.ts +52 -0
  569. package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -0
  570. package/dist/modes/interactive/components/ask-user-question-state.js +134 -0
  571. package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -0
  572. package/dist/modes/interactive/components/ask-user-question.d.ts +50 -0
  573. package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -0
  574. package/dist/modes/interactive/components/ask-user-question.js +148 -0
  575. package/dist/modes/interactive/components/ask-user-question.js.map +1 -0
  576. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  578. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  579. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  580. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  581. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  583. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  584. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  585. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  586. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  587. package/dist/modes/interactive/components/continuity-notice.d.ts.map +1 -1
  588. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  589. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  590. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  592. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  593. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  594. package/dist/modes/interactive/components/diff.js.map +1 -1
  595. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  596. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  597. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  598. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  600. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  602. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  603. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  604. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  606. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  607. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  608. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  610. package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -1
  611. package/dist/modes/interactive/components/render-signature.js.map +1 -1
  612. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  614. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  616. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  617. package/dist/modes/interactive/components/shortcut-overlay.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  619. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  621. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  622. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  623. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  624. package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
  626. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  628. package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/tree-selector.d.ts +4 -0
  630. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  631. package/dist/modes/interactive/components/tree-selector.js +24 -0
  632. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  633. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  634. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  635. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/user-message.js.map +1 -1
  637. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  638. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  639. package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
  640. package/dist/modes/interactive/grok/input-card.d.ts.map +1 -1
  641. package/dist/modes/interactive/grok/palette.d.ts.map +1 -1
  642. package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -1
  643. package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -1
  644. package/dist/modes/interactive/interactive-host-runtime.d.ts +6 -0
  645. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  646. package/dist/modes/interactive/interactive-host-runtime.js +32 -3
  647. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  648. package/dist/modes/interactive/interactive-mode.d.ts +48 -4
  649. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-mode.js +433 -103
  651. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  652. package/dist/modes/interactive/login-outcome.d.ts +20 -0
  653. package/dist/modes/interactive/login-outcome.d.ts.map +1 -0
  654. package/dist/modes/interactive/login-outcome.js +35 -0
  655. package/dist/modes/interactive/login-outcome.js.map +1 -0
  656. package/dist/modes/interactive/startup-tools.js.map +1 -1
  657. package/dist/modes/interactive/streaming-reveal-content.d.ts.map +1 -1
  658. package/dist/modes/interactive/streaming-reveal-content.js.map +1 -1
  659. package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -1
  660. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  661. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  662. package/dist/modes/interactive/theme/theme.js.map +1 -1
  663. package/dist/modes/interactive/tips/catalog/input-tips.d.ts +7 -7
  664. package/dist/modes/interactive/tips/catalog/input-tips.d.ts.map +1 -1
  665. package/dist/modes/interactive/tips/catalog/input-tips.js +5 -0
  666. package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
  667. package/dist/modes/interactive/tips/catalog/model-tips.d.ts +1 -1
  668. package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts +1 -1
  669. package/dist/modes/interactive/tips/scheduler.js.map +1 -1
  670. package/dist/modes/interactive/tips/working-tip.d.ts.map +1 -1
  671. package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -1
  672. package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -1
  673. package/dist/modes/print-mode.d.ts.map +1 -1
  674. package/dist/modes/print-mode.js +8 -0
  675. package/dist/modes/print-mode.js.map +1 -1
  676. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  677. package/dist/modes/provider-native-rendering.js +35 -0
  678. package/dist/modes/provider-native-rendering.js.map +1 -1
  679. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  680. package/dist/modes/rpc/connection-handler.js +75 -2
  681. package/dist/modes/rpc/connection-handler.js.map +1 -1
  682. package/dist/modes/rpc/connection-question-bridge.d.ts +18 -0
  683. package/dist/modes/rpc/connection-question-bridge.d.ts.map +1 -0
  684. package/dist/modes/rpc/connection-question-bridge.js +156 -0
  685. package/dist/modes/rpc/connection-question-bridge.js.map +1 -0
  686. package/dist/modes/rpc/custom-capability.d.ts +2 -0
  687. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  688. package/dist/modes/rpc/custom-capability.js +2 -0
  689. package/dist/modes/rpc/custom-capability.js.map +1 -1
  690. package/dist/modes/rpc/event-output-buffer.js.map +1 -1
  691. package/dist/modes/rpc/host-ensure.js.map +1 -1
  692. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  693. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  694. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  695. package/dist/modes/rpc/jsonl.js.map +1 -1
  696. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  697. package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -1
  698. package/dist/modes/rpc/ownership-safe-lock.js.map +1 -1
  699. package/dist/modes/rpc/rpc-client.d.ts +20 -1
  700. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  701. package/dist/modes/rpc/rpc-client.js +35 -3
  702. package/dist/modes/rpc/rpc-client.js.map +1 -1
  703. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  704. package/dist/modes/rpc/rpc-input-validation.js +2 -0
  705. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  706. package/dist/modes/rpc/rpc-types.d.ts +103 -3
  707. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  708. package/dist/modes/rpc/rpc-types.js +6 -0
  709. package/dist/modes/rpc/rpc-types.js.map +1 -1
  710. package/dist/modes/rpc/session-binding.js.map +1 -1
  711. package/dist/modes/rpc/session-command-router.d.ts +4 -4
  712. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  713. package/dist/modes/rpc/session-command-router.js +14 -8
  714. package/dist/modes/rpc/session-command-router.js.map +1 -1
  715. package/dist/modes/rpc/session-event-fanout.d.ts +2 -0
  716. package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
  717. package/dist/modes/rpc/session-event-fanout.js +25 -1
  718. package/dist/modes/rpc/session-event-fanout.js.map +1 -1
  719. package/dist/modes/rpc/session-event-writer.d.ts +7 -1
  720. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  721. package/dist/modes/rpc/session-event-writer.js +17 -4
  722. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  723. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  724. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  725. package/dist/modes/rpc/session-registry.js +11 -1
  726. package/dist/modes/rpc/session-registry.js.map +1 -1
  727. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  728. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  729. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
  730. package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -1
  731. package/dist/modes/rpc/session-worker-requests.js +1 -1
  732. package/dist/modes/rpc/session-worker-requests.js.map +1 -1
  733. package/dist/modes/rpc/session-worker.js +10 -2
  734. package/dist/modes/rpc/session-worker.js.map +1 -1
  735. package/dist/modes/rpc/socket-event-fanout.d.ts +14 -1
  736. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
  737. package/dist/modes/rpc/socket-event-fanout.js +48 -2
  738. package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
  739. package/dist/modes/rpc/socket-ownership.js.map +1 -1
  740. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
  741. package/dist/modes/rpc/worker-session-registry.js +2 -1
  742. package/dist/modes/rpc/worker-session-registry.js.map +1 -1
  743. package/dist/package-manager-cli.js.map +1 -1
  744. package/dist/self-update-bootstrap.js.map +1 -1
  745. package/dist/utils/ansi.js.map +1 -1
  746. package/dist/utils/clipboard-image.js.map +1 -1
  747. package/dist/utils/clipboard-native.js.map +1 -1
  748. package/dist/utils/clipboard.js.map +1 -1
  749. package/dist/utils/exif-orientation.js.map +1 -1
  750. package/dist/utils/frontmatter.d.ts.map +1 -1
  751. package/dist/utils/image-resize.js.map +1 -1
  752. package/dist/utils/management-http.js.map +1 -1
  753. package/dist/utils/paths.js.map +1 -1
  754. package/dist/utils/photon.js.map +1 -1
  755. package/dist/utils/pi-user-agent.js.map +1 -1
  756. package/dist/utils/shell.d.ts.map +1 -1
  757. package/dist/utils/shell.js.map +1 -1
  758. package/dist/utils/syntax-highlight.js.map +1 -1
  759. package/dist/utils/version-check.js.map +1 -1
  760. package/docs/app-server.md +14 -0
  761. package/docs/extensions.md +28 -1
  762. package/docs/keybindings.md +1 -0
  763. package/docs/providers.md +1 -0
  764. package/docs/rpc.md +95 -3
  765. package/docs/settings.md +18 -0
  766. package/docs/skills.md +1 -1
  767. package/docs/tui.md +6 -0
  768. package/docs/usage.md +2 -1
  769. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
  770. package/node_modules/@code-yeongyu/senpi-codemode/README.md +17 -2
  771. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  772. package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +35 -15
  773. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +13 -2
  774. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +76 -0
  775. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -77
  776. package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/run-budget.ts +107 -0
  777. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-deadlines.ts +76 -0
  778. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +25 -14
  779. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +4 -0
  780. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +47 -40
  781. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +2 -0
  782. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +5 -0
  783. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +8 -3
  784. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -187
  785. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +189 -0
  786. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +66 -56
  787. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  788. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -1
  789. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  790. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  791. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  792. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
  793. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  794. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  795. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  796. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  798. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -1
  799. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  800. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
  801. package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.d.ts.map +1 -1
  802. package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js.map +1 -1
  803. package/node_modules/@earendil-works/pi-agent-core/dist/harness/result.d.ts.map +1 -1
  804. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js.map +1 -1
  805. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
  806. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  807. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
  808. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  809. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
  810. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
  811. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
  812. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  813. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  814. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
  815. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
  816. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
  817. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
  818. package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts +36 -36
  819. package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  821. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  822. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  823. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  824. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -1
  825. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  826. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  827. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  828. package/node_modules/@earendil-works/pi-agent-core/package.json +4 -4
  829. package/node_modules/@earendil-works/pi-ai/README.md +1 -0
  830. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts +3 -1
  831. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  832. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +6 -2
  833. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  834. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  835. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  836. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
  837. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -1
  838. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
  839. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
  840. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts.map +1 -1
  841. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  842. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js.map +1 -1
  843. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
  844. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  845. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  846. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  847. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  848. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  849. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +5 -0
  850. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  851. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts +1 -1
  852. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -1
  853. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +10 -6
  854. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -1
  855. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +36 -1
  856. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -1
  857. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +36 -1
  858. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -1
  859. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts +12 -0
  860. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts.map +1 -0
  861. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js +96 -0
  862. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js.map +1 -0
  863. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +1 -1
  864. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
  865. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +13 -88
  866. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
  867. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  868. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  869. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
  870. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
  871. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  872. package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js.map +1 -1
  873. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  874. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  875. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +5 -1
  876. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
  877. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts +24 -0
  878. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
  879. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js +86 -0
  880. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js.map +1 -0
  881. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
  882. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
  883. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
  884. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts +47 -0
  885. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts.map +1 -0
  886. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js +126 -0
  887. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js.map +1 -0
  888. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
  889. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -1
  890. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts +12 -0
  891. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts.map +1 -0
  892. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js +44 -0
  893. package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js.map +1 -0
  894. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -0
  895. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  896. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +26 -35
  897. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  898. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  899. package/node_modules/@earendil-works/pi-ai/dist/cursor/model-capabilities.js.map +1 -1
  900. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
  901. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  902. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  903. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  904. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +71 -68
  905. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  906. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -1
  907. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  908. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -1
  909. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  910. package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -1
  911. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  912. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
  913. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  914. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2 -0
  915. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  916. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
  917. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  918. package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -28
  919. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  920. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts.map +1 -1
  921. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  922. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  923. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  924. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  925. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  926. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  927. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  928. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -0
  929. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  930. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  931. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js.map +1 -1
  932. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -1
  933. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts +3 -0
  934. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts.map +1 -0
  935. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js +15 -0
  936. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js.map +1 -0
  937. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts +4 -0
  938. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts.map +1 -0
  939. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js +6 -0
  940. package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js.map +1 -0
  941. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  942. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -1
  943. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -1
  944. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -1
  945. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -1
  946. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -1
  947. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -1
  948. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  949. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
  950. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
  951. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
  952. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -1
  953. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -1
  954. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -1
  955. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  956. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +20 -3
  957. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  958. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  959. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -1
  960. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  961. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts +3 -1
  962. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  963. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
  964. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -1
  965. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  966. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  967. package/node_modules/@earendil-works/pi-ai/package.json +3 -3
  968. package/node_modules/@earendil-works/pi-pty/dist/loader.d.ts.map +1 -1
  969. package/node_modules/@earendil-works/pi-pty/dist/loader.js.map +1 -1
  970. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
  971. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
  972. package/node_modules/@earendil-works/pi-pty/dist/quarantine.js.map +1 -1
  973. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
  974. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
  975. package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
  976. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  977. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  978. package/node_modules/@earendil-works/pi-pty/dist/session-bun.js.map +1 -1
  979. package/node_modules/@earendil-works/pi-pty/dist/session.d.ts.map +1 -1
  980. package/node_modules/@earendil-works/pi-pty/dist/session.js.map +1 -1
  981. package/node_modules/@earendil-works/pi-pty/package.json +2 -2
  982. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  983. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -1
  984. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  985. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  986. package/node_modules/@earendil-works/pi-tui/dist/components/alt-screen-flash.d.ts.map +1 -1
  987. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  988. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
  989. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  990. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  991. package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.d.ts.map +1 -1
  992. package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.js.map +1 -1
  993. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  994. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  995. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  996. package/node_modules/@earendil-works/pi-tui/dist/components/latex.d.ts.map +1 -1
  997. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  998. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  999. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  1000. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  1001. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
  1002. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
  1003. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  1004. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  1005. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  1006. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
  1007. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
  1008. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
  1009. package/node_modules/@earendil-works/pi-tui/dist/components/stack.d.ts.map +1 -1
  1010. package/node_modules/@earendil-works/pi-tui/dist/components/stack.js.map +1 -1
  1011. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
  1012. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
  1013. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
  1014. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
  1015. package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.d.ts.map +1 -1
  1016. package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.js.map +1 -1
  1017. package/node_modules/@earendil-works/pi-tui/dist/image-markers.d.ts.map +1 -1
  1018. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  1019. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  1020. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  1021. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  1022. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  1023. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
  1024. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  1025. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
  1026. package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js.map +1 -1
  1027. package/node_modules/@earendil-works/pi-tui/dist/paste-markers.d.ts.map +1 -1
  1028. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  1029. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  1030. package/node_modules/@earendil-works/pi-tui/dist/terminal-capabilities.js.map +1 -1
  1031. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  1032. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  1033. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  1034. package/node_modules/@earendil-works/pi-tui/dist/tmux-image-probe.js.map +1 -1
  1035. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
  1036. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
  1037. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
  1038. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  1039. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  1040. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
  1041. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  1042. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  1043. package/node_modules/css-tree/cjs/data-patch.cjs +853 -5
  1044. package/node_modules/css-tree/cjs/data.cjs +13598 -3
  1045. package/node_modules/css-tree/cjs/version.cjs +1 -3
  1046. package/node_modules/css-tree/lib/data-patch.js +853 -4
  1047. package/node_modules/css-tree/lib/data.js +13598 -5
  1048. package/node_modules/css-tree/lib/version.js +1 -5
  1049. package/package.json +8 -8
  1050. package/vendor/pi-client/client.d.ts.map +1 -1
  1051. package/vendor/pi-client/client.js.map +1 -1
  1052. package/vendor/pi-client/connection.d.ts.map +1 -1
  1053. package/vendor/pi-client/connection.js.map +1 -1
  1054. package/vendor/pi-client/errors.d.ts.map +1 -1
  1055. package/vendor/pi-client/session-handle.d.ts.map +1 -1
  1056. package/vendor/pi-client/state.d.ts.map +1 -1
  1057. package/vendor/pi-protocol/cbor/decoder.js.map +1 -1
  1058. package/vendor/pi-protocol/cbor/options.d.ts.map +1 -1
  1059. package/vendor/pi-protocol/codec.d.ts.map +1 -1
  1060. package/vendor/pi-protocol/codec.js.map +1 -1
  1061. package/vendor/pi-protocol/framing.d.ts.map +1 -1
  1062. package/vendor/pi-protocol/schemas.d.ts +678 -678
@@ -1,12 +1,12 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { mkdir, rm, writeFile } from "node:fs/promises";
3
3
  import { dirname } from "node:path";
4
- import { generateImages, parseOpenAIImageSize } from "@earendil-works/pi-ai/compat";
4
+ import { generateImages, getImageModel, parseOpenAIImageOutputOptions, parseOpenAIImageSize, } from "@earendil-works/pi-ai/compat";
5
5
  import { defineTool } from "../../types.js";
6
6
  import { resolveImageGenAuth } from "./auth.js";
7
7
  import { DEFAULT_IMAGE_MODEL, failure, IMAGE_MODEL_NAMES, Params } from "./params.js";
8
- import { displayPath, resolveTargets } from "./paths.js";
9
- import { loadReferenceImages } from "./reference-images.js";
8
+ import { displayPath, outputFormatOf, resolveTargets, withFormatExtension } from "./paths.js";
9
+ import { loadMaskImage, loadReferenceImages } from "./reference-images.js";
10
10
  import { imageGenRegistryOverride, isNativeBypass, NATIVE_BYPASS_MESSAGE } from "./state.js";
11
11
  function sourceLabel(auth) {
12
12
  if (auth.kind === "none")
@@ -24,7 +24,7 @@ function synthesizeModel(auth, id) {
24
24
  baseUrl: auth.baseUrl,
25
25
  input: ["text", "image"],
26
26
  output: ["image"],
27
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
27
+ cost: getImageModel("openai", id).cost,
28
28
  };
29
29
  return model;
30
30
  }
@@ -37,7 +37,11 @@ function collectImages(images) {
37
37
  pendingText = text.length > 0 ? text : undefined;
38
38
  continue;
39
39
  }
40
- collected.push({ data: block.data, ...(pendingText === undefined ? {} : { revisedPrompt: pendingText }) });
40
+ collected.push({
41
+ data: block.data,
42
+ mimeType: block.mimeType,
43
+ ...(pendingText === undefined ? {} : { revisedPrompt: pendingText }),
44
+ });
41
45
  pendingText = undefined;
42
46
  }
43
47
  return collected;
@@ -66,15 +70,17 @@ export const GENERATE_IMAGE_TOOL_NAME = "generate_image";
66
70
  export const generateImageTool = defineTool({
67
71
  name: GENERATE_IMAGE_TOOL_NAME,
68
72
  label: "Generate Image",
69
- description: "Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default; Flare for speed) and save it as a PNG file. Pass reference_image_paths to edit or reference existing images. Returns the saved file paths.",
70
- promptSnippet: "Generate or edit images from prompts and optional reference images, saving them as PNG files.",
73
+ description: "Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default, the most capable; Flare when speed matters more than quality) and save it as a png, jpeg, or webp file, optionally with a transparent background. Pass reference_image_paths to edit or reference existing images. Generate directly when the request is clear instead of asking for confirmation. Returns the saved file paths.",
74
+ promptSnippet: "Generate or edit images from prompts and optional reference images, saving them as png/jpeg/webp files.",
71
75
  parameters: Params,
72
76
  async execute(toolCallId, params, signal, _onUpdate, ctx) {
73
77
  const size = params.size ?? "auto";
74
78
  const quality = params.quality ?? "auto";
75
79
  const requested = params.n ?? 1;
76
80
  const modelId = params.model ?? DEFAULT_IMAGE_MODEL;
77
- const context = { model: modelId, size, quality, requested, source: "none" };
81
+ const background = params.background ?? "auto";
82
+ const outputFormat = params.output_format ?? "png";
83
+ const context = { model: modelId, size, quality, background, outputFormat, requested, source: "none" };
78
84
  const prompt = params.prompt.trim();
79
85
  if (prompt.length === 0) {
80
86
  return failure("Error: prompt must contain non-whitespace text.", "invalid_params", context);
@@ -95,7 +101,21 @@ export const generateImageTool = defineTool({
95
101
  if (!references.ok) {
96
102
  return failure(references.error, "invalid_params", { ...context, source });
97
103
  }
98
- const targets = resolveTargets(ctx.cwd, toolCallId, requested, params.output_path);
104
+ const mask = await loadMaskImage(ctx.cwd, params.mask_image_path, references.images.length);
105
+ if (mask !== undefined && !mask.ok) {
106
+ return failure(mask.error, "invalid_params", { ...context, source });
107
+ }
108
+ const outputOptions = parseOpenAIImageOutputOptions({
109
+ background,
110
+ outputFormat,
111
+ outputCompression: params.output_compression,
112
+ hasMask: mask !== undefined,
113
+ imageCount: references.images.length,
114
+ });
115
+ if (!outputOptions.ok) {
116
+ return failure(`Error: ${outputOptions.error}`, "invalid_params", { ...context, source });
117
+ }
118
+ const targets = resolveTargets(ctx.cwd, toolCallId, requested, params.output_path, outputFormat);
99
119
  if (!targets.ok) {
100
120
  return failure(targets.error, "invalid_params", { ...context, source });
101
121
  }
@@ -111,6 +131,11 @@ export const generateImageTool = defineTool({
111
131
  size,
112
132
  quality,
113
133
  n: requested,
134
+ ...(params.background === undefined ? {} : { background }),
135
+ outputFormat,
136
+ ...(params.output_compression === undefined ? {} : { outputCompression: params.output_compression }),
137
+ ...(params.moderation === undefined ? {} : { moderation: params.moderation }),
138
+ ...(mask === undefined ? {} : { mask: mask.image }),
114
139
  });
115
140
  if (images.stopReason !== "stop") {
116
141
  const message = images.errorMessage ?? `Image generation ${images.stopReason}.`;
@@ -120,11 +145,22 @@ export const generateImageTool = defineTool({
120
145
  if (generated.length === 0) {
121
146
  return failure("Error: the provider returned no images.", "provider_error", { ...context, source });
122
147
  }
123
- const writeError = await writeImages(targets.paths, generated);
148
+ // A gateway may ignore output_format; name each file after the bytes it actually holds.
149
+ const delivered = generated.map((image) => outputFormatOf(image.mimeType) ?? outputFormat);
150
+ const savedFormat = delivered[0] ?? outputFormat;
151
+ const paths = targets.paths.map((target, index) => {
152
+ const format = delivered[index];
153
+ return format === undefined || format === outputFormat ? target : withFormatExtension(target, format);
154
+ });
155
+ const renamedCollision = paths.find((target, index) => target !== targets.paths[index] && existsSync(target));
156
+ if (renamedCollision !== undefined) {
157
+ return failure(`Error: the provider returned ${savedFormat} instead of ${outputFormat} and ${displayPath(ctx.cwd, renamedCollision)} already exists. Choose another output_path.`, "write_failed", { ...context, source });
158
+ }
159
+ const writeError = await writeImages(paths, generated);
124
160
  if (writeError !== undefined) {
125
161
  return failure(writeError, "write_failed", { ...context, source });
126
162
  }
127
- const savedPaths = targets.paths.slice(0, generated.length).map((target) => displayPath(ctx.cwd, target));
163
+ const savedPaths = paths.slice(0, generated.length).map((target) => displayPath(ctx.cwd, target));
128
164
  const revisedPrompts = generated.flatMap((image) => (image.revisedPrompt ? [image.revisedPrompt] : []));
129
165
  const details = {
130
166
  paths: savedPaths,
@@ -132,19 +168,29 @@ export const generateImageTool = defineTool({
132
168
  source,
133
169
  size,
134
170
  quality,
171
+ background,
172
+ outputFormat: savedFormat,
135
173
  requested,
136
174
  generated: generated.length,
137
175
  revisedPrompts,
176
+ ...(images.background === undefined ? {} : { transparentBackground: images.background === "transparent" }),
138
177
  };
139
178
  const summary = [
140
179
  `Generated ${generated.length} image${generated.length === 1 ? "" : "s"}:`,
141
180
  ...savedPaths.map((path) => `- ${path}`),
181
+ ...(savedFormat === outputFormat
182
+ ? []
183
+ : [
184
+ `Note: the provider returned ${savedFormat} instead of the requested ${outputFormat}; saved with the matching extension.`,
185
+ ]),
186
+ ...(images.background === undefined ? [] : [`Background: ${images.background}`]),
142
187
  ...revisedPrompts.map((revised) => `Revised prompt: ${revised}`),
188
+ "The saved file is the deliverable; refer to it by path instead of re-embedding image data.",
143
189
  ].join("\n");
144
190
  return {
145
191
  content: [
146
192
  { type: "text", text: summary },
147
- ...generated.map((image) => ({ type: "image", data: image.data, mimeType: "image/png" })),
193
+ ...generated.map((image) => ({ type: "image", data: image.data, mimeType: image.mimeType })),
148
194
  ],
149
195
  details,
150
196
  ...(images.usage === undefined ? {} : { usage: images.usage }),
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/imagegen/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { AssistantImages, ImagesModel } from \"@earendil-works/pi-ai/compat\";\nimport { generateImages, parseOpenAIImageSize } from \"@earendil-works/pi-ai/compat\";\nimport { defineTool, type ExtensionContext } from \"../../types.ts\";\nimport { type ImageGenAuthResolution, resolveImageGenAuth } from \"./auth.ts\";\nimport { DEFAULT_IMAGE_MODEL, failure, type GenerateImageDetails, IMAGE_MODEL_NAMES, Params } from \"./params.ts\";\nimport { displayPath, resolveTargets } from \"./paths.ts\";\nimport { loadReferenceImages } from \"./reference-images.ts\";\nimport { imageGenRegistryOverride, isNativeBypass, NATIVE_BYPASS_MESSAGE } from \"./state.ts\";\n\nexport type { GenerateImageDetails } from \"./params.ts\";\n\nfunction sourceLabel(auth: ImageGenAuthResolution): string {\n\tif (auth.kind === \"none\") return \"none\";\n\tif (auth.provenance === \"env\") return \"env:OPENAI_API_KEY\";\n\treturn `${auth.provenance}:${auth.providerId ?? auth.kind}`;\n}\n\nfunction synthesizeModel(\n\tauth: Extract<ImageGenAuthResolution, { kind: \"native-openai\" | \"gateway\" }>,\n\tid: keyof typeof IMAGE_MODEL_NAMES,\n) {\n\tconst model: ImagesModel<\"openai-images\"> = {\n\t\tid,\n\t\tname: IMAGE_MODEL_NAMES[id],\n\t\tapi: \"openai-images\",\n\t\tprovider: auth.providerId ?? \"openai\",\n\t\tbaseUrl: auth.baseUrl,\n\t\tinput: [\"text\", \"image\"],\n\t\toutput: [\"image\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t};\n\treturn model;\n}\n\ninterface GeneratedImage {\n\tdata: string;\n\trevisedPrompt?: string;\n}\n\nfunction collectImages(images: AssistantImages): GeneratedImage[] {\n\tconst collected: GeneratedImage[] = [];\n\tlet pendingText: string | undefined;\n\tfor (const block of images.output) {\n\t\tif (block.type === \"text\") {\n\t\t\tconst text = block.text.trim();\n\t\t\tpendingText = text.length > 0 ? text : undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tcollected.push({ data: block.data, ...(pendingText === undefined ? {} : { revisedPrompt: pendingText }) });\n\t\tpendingText = undefined;\n\t}\n\treturn collected;\n}\n\nasync function writeImages(paths: string[], images: GeneratedImage[]): Promise<string | undefined> {\n\tconst written: string[] = [];\n\tfor (const [index, image] of images.entries()) {\n\t\tconst target = paths[index];\n\t\tif (target === undefined) break;\n\t\ttry {\n\t\t\tawait mkdir(dirname(target), { recursive: true });\n\t\t\tawait writeFile(target, Buffer.from(image.data, \"base64\"), { flag: \"wx\" });\n\t\t\twritten.push(target);\n\t\t} catch (error) {\n\t\t\tfor (const path of written) await rm(path, { force: true }).catch(() => undefined);\n\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\treturn `Error: failed to write generated image to ${target}: ${reason}`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport const GENERATE_IMAGE_TOOL_NAME = \"generate_image\";\n\nexport const generateImageTool = defineTool<typeof Params, GenerateImageDetails>({\n\tname: GENERATE_IMAGE_TOOL_NAME,\n\tlabel: \"Generate Image\",\n\tdescription:\n\t\t\"Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default; Flare for speed) and save it as a PNG file. Pass reference_image_paths to edit or reference existing images. Returns the saved file paths.\",\n\tpromptSnippet: \"Generate or edit images from prompts and optional reference images, saving them as PNG files.\",\n\tparameters: Params,\n\tasync execute(toolCallId, params, signal, _onUpdate, ctx: ExtensionContext) {\n\t\tconst size = params.size ?? \"auto\";\n\t\tconst quality = params.quality ?? \"auto\";\n\t\tconst requested = params.n ?? 1;\n\t\tconst modelId = params.model ?? DEFAULT_IMAGE_MODEL;\n\t\tconst context = { model: modelId, size, quality, requested, source: \"none\" };\n\n\t\tconst prompt = params.prompt.trim();\n\t\tif (prompt.length === 0) {\n\t\t\treturn failure(\"Error: prompt must contain non-whitespace text.\", \"invalid_params\", context);\n\t\t}\n\t\tif (isNativeBypass()) {\n\t\t\treturn failure(NATIVE_BYPASS_MESSAGE, \"provider_native_bypass\", context);\n\t\t}\n\n\t\tconst auth = await resolveImageGenAuth({ modelRegistry: imageGenRegistryOverride() ?? ctx.modelRegistry });\n\t\tif (auth.kind === \"none\") {\n\t\t\treturn failure(auth.reason, \"missing_config\", context);\n\t\t}\n\t\tconst source = sourceLabel(auth);\n\t\tconst parsedSize = parseOpenAIImageSize(size);\n\t\tif (!parsedSize.ok) {\n\t\t\treturn failure(`Error: ${parsedSize.error}`, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst references = await loadReferenceImages(ctx.cwd, params.reference_image_paths);\n\t\tif (!references.ok) {\n\t\t\treturn failure(references.error, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst targets = resolveTargets(ctx.cwd, toolCallId, requested, params.output_path);\n\t\tif (!targets.ok) {\n\t\t\treturn failure(targets.error, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tfor (const target of targets.paths) {\n\t\t\tif (existsSync(target)) {\n\t\t\t\treturn failure(\n\t\t\t\t\t`Error: ${displayPath(ctx.cwd, target)} already exists. Choose another output_path.`,\n\t\t\t\t\t\"invalid_params\",\n\t\t\t\t\t{ ...context, source },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst images = await generateImages(\n\t\t\tsynthesizeModel(auth, modelId),\n\t\t\t{ input: [{ type: \"text\", text: prompt }, ...references.images] },\n\t\t\t{\n\t\t\t\t...(auth.apiKey === undefined ? {} : { apiKey: auth.apiKey }),\n\t\t\t\t...(auth.headers === undefined ? {} : { headers: auth.headers }),\n\t\t\t\t...(signal === undefined ? {} : { signal }),\n\t\t\t\tsize,\n\t\t\t\tquality,\n\t\t\t\tn: requested,\n\t\t\t},\n\t\t);\n\t\tif (images.stopReason !== \"stop\") {\n\t\t\tconst message = images.errorMessage ?? `Image generation ${images.stopReason}.`;\n\t\t\treturn failure(`Error: ${message}`, \"provider_error\", { ...context, source });\n\t\t}\n\n\t\tconst generated = collectImages(images);\n\t\tif (generated.length === 0) {\n\t\t\treturn failure(\"Error: the provider returned no images.\", \"provider_error\", { ...context, source });\n\t\t}\n\t\tconst writeError = await writeImages(targets.paths, generated);\n\t\tif (writeError !== undefined) {\n\t\t\treturn failure(writeError, \"write_failed\", { ...context, source });\n\t\t}\n\n\t\tconst savedPaths = targets.paths.slice(0, generated.length).map((target) => displayPath(ctx.cwd, target));\n\t\tconst revisedPrompts = generated.flatMap((image) => (image.revisedPrompt ? [image.revisedPrompt] : []));\n\t\tconst details: GenerateImageDetails = {\n\t\t\tpaths: savedPaths,\n\t\t\tmodel: modelId,\n\t\t\tsource,\n\t\t\tsize,\n\t\t\tquality,\n\t\t\trequested,\n\t\t\tgenerated: generated.length,\n\t\t\trevisedPrompts,\n\t\t};\n\t\tconst summary = [\n\t\t\t`Generated ${generated.length} image${generated.length === 1 ? \"\" : \"s\"}:`,\n\t\t\t...savedPaths.map((path) => `- ${path}`),\n\t\t\t...revisedPrompts.map((revised) => `Revised prompt: ${revised}`),\n\t\t].join(\"\\n\");\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: summary },\n\t\t\t\t...generated.map((image) => ({ type: \"image\" as const, data: image.data, mimeType: \"image/png\" })),\n\t\t\t],\n\t\t\tdetails,\n\t\t\t...(images.usage === undefined ? {} : { usage: images.usage }),\n\t\t};\n\t},\n});\n"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/imagegen/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { AssistantImages, ImagesModel } from \"@earendil-works/pi-ai/compat\";\nimport {\n\tgenerateImages,\n\tgetImageModel,\n\tparseOpenAIImageOutputOptions,\n\tparseOpenAIImageSize,\n} from \"@earendil-works/pi-ai/compat\";\nimport { defineTool, type ExtensionContext } from \"../../types.ts\";\nimport { type ImageGenAuthResolution, resolveImageGenAuth } from \"./auth.ts\";\nimport { DEFAULT_IMAGE_MODEL, failure, type GenerateImageDetails, IMAGE_MODEL_NAMES, Params } from \"./params.ts\";\nimport { displayPath, outputFormatOf, resolveTargets, withFormatExtension } from \"./paths.ts\";\nimport { loadMaskImage, loadReferenceImages } from \"./reference-images.ts\";\nimport { imageGenRegistryOverride, isNativeBypass, NATIVE_BYPASS_MESSAGE } from \"./state.ts\";\n\nexport type { GenerateImageDetails } from \"./params.ts\";\n\nfunction sourceLabel(auth: ImageGenAuthResolution): string {\n\tif (auth.kind === \"none\") return \"none\";\n\tif (auth.provenance === \"env\") return \"env:OPENAI_API_KEY\";\n\treturn `${auth.provenance}:${auth.providerId ?? auth.kind}`;\n}\n\nfunction synthesizeModel(\n\tauth: Extract<ImageGenAuthResolution, { kind: \"native-openai\" | \"gateway\" }>,\n\tid: keyof typeof IMAGE_MODEL_NAMES,\n) {\n\tconst model: ImagesModel<\"openai-images\"> = {\n\t\tid,\n\t\tname: IMAGE_MODEL_NAMES[id],\n\t\tapi: \"openai-images\",\n\t\tprovider: auth.providerId ?? \"openai\",\n\t\tbaseUrl: auth.baseUrl,\n\t\tinput: [\"text\", \"image\"],\n\t\toutput: [\"image\"],\n\t\tcost: getImageModel(\"openai\", id).cost,\n\t};\n\treturn model;\n}\n\ninterface GeneratedImage {\n\tdata: string;\n\tmimeType: string;\n\trevisedPrompt?: string;\n}\n\nfunction collectImages(images: AssistantImages): GeneratedImage[] {\n\tconst collected: GeneratedImage[] = [];\n\tlet pendingText: string | undefined;\n\tfor (const block of images.output) {\n\t\tif (block.type === \"text\") {\n\t\t\tconst text = block.text.trim();\n\t\t\tpendingText = text.length > 0 ? text : undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tcollected.push({\n\t\t\tdata: block.data,\n\t\t\tmimeType: block.mimeType,\n\t\t\t...(pendingText === undefined ? {} : { revisedPrompt: pendingText }),\n\t\t});\n\t\tpendingText = undefined;\n\t}\n\treturn collected;\n}\n\nasync function writeImages(paths: string[], images: GeneratedImage[]): Promise<string | undefined> {\n\tconst written: string[] = [];\n\tfor (const [index, image] of images.entries()) {\n\t\tconst target = paths[index];\n\t\tif (target === undefined) break;\n\t\ttry {\n\t\t\tawait mkdir(dirname(target), { recursive: true });\n\t\t\tawait writeFile(target, Buffer.from(image.data, \"base64\"), { flag: \"wx\" });\n\t\t\twritten.push(target);\n\t\t} catch (error) {\n\t\t\tfor (const path of written) await rm(path, { force: true }).catch(() => undefined);\n\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\treturn `Error: failed to write generated image to ${target}: ${reason}`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport const GENERATE_IMAGE_TOOL_NAME = \"generate_image\";\n\nexport const generateImageTool = defineTool<typeof Params, GenerateImageDetails>({\n\tname: GENERATE_IMAGE_TOOL_NAME,\n\tlabel: \"Generate Image\",\n\tdescription:\n\t\t\"Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default, the most capable; Flare when speed matters more than quality) and save it as a png, jpeg, or webp file, optionally with a transparent background. Pass reference_image_paths to edit or reference existing images. Generate directly when the request is clear instead of asking for confirmation. Returns the saved file paths.\",\n\tpromptSnippet:\n\t\t\"Generate or edit images from prompts and optional reference images, saving them as png/jpeg/webp files.\",\n\tparameters: Params,\n\tasync execute(toolCallId, params, signal, _onUpdate, ctx: ExtensionContext) {\n\t\tconst size = params.size ?? \"auto\";\n\t\tconst quality = params.quality ?? \"auto\";\n\t\tconst requested = params.n ?? 1;\n\t\tconst modelId = params.model ?? DEFAULT_IMAGE_MODEL;\n\t\tconst background = params.background ?? \"auto\";\n\t\tconst outputFormat = params.output_format ?? \"png\";\n\t\tconst context = { model: modelId, size, quality, background, outputFormat, requested, source: \"none\" };\n\n\t\tconst prompt = params.prompt.trim();\n\t\tif (prompt.length === 0) {\n\t\t\treturn failure(\"Error: prompt must contain non-whitespace text.\", \"invalid_params\", context);\n\t\t}\n\t\tif (isNativeBypass()) {\n\t\t\treturn failure(NATIVE_BYPASS_MESSAGE, \"provider_native_bypass\", context);\n\t\t}\n\n\t\tconst auth = await resolveImageGenAuth({ modelRegistry: imageGenRegistryOverride() ?? ctx.modelRegistry });\n\t\tif (auth.kind === \"none\") {\n\t\t\treturn failure(auth.reason, \"missing_config\", context);\n\t\t}\n\t\tconst source = sourceLabel(auth);\n\t\tconst parsedSize = parseOpenAIImageSize(size);\n\t\tif (!parsedSize.ok) {\n\t\t\treturn failure(`Error: ${parsedSize.error}`, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst references = await loadReferenceImages(ctx.cwd, params.reference_image_paths);\n\t\tif (!references.ok) {\n\t\t\treturn failure(references.error, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst mask = await loadMaskImage(ctx.cwd, params.mask_image_path, references.images.length);\n\t\tif (mask !== undefined && !mask.ok) {\n\t\t\treturn failure(mask.error, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst outputOptions = parseOpenAIImageOutputOptions({\n\t\t\tbackground,\n\t\t\toutputFormat,\n\t\t\toutputCompression: params.output_compression,\n\t\t\thasMask: mask !== undefined,\n\t\t\timageCount: references.images.length,\n\t\t});\n\t\tif (!outputOptions.ok) {\n\t\t\treturn failure(`Error: ${outputOptions.error}`, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tconst targets = resolveTargets(ctx.cwd, toolCallId, requested, params.output_path, outputFormat);\n\t\tif (!targets.ok) {\n\t\t\treturn failure(targets.error, \"invalid_params\", { ...context, source });\n\t\t}\n\t\tfor (const target of targets.paths) {\n\t\t\tif (existsSync(target)) {\n\t\t\t\treturn failure(\n\t\t\t\t\t`Error: ${displayPath(ctx.cwd, target)} already exists. Choose another output_path.`,\n\t\t\t\t\t\"invalid_params\",\n\t\t\t\t\t{ ...context, source },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst images = await generateImages(\n\t\t\tsynthesizeModel(auth, modelId),\n\t\t\t{ input: [{ type: \"text\", text: prompt }, ...references.images] },\n\t\t\t{\n\t\t\t\t...(auth.apiKey === undefined ? {} : { apiKey: auth.apiKey }),\n\t\t\t\t...(auth.headers === undefined ? {} : { headers: auth.headers }),\n\t\t\t\t...(signal === undefined ? {} : { signal }),\n\t\t\t\tsize,\n\t\t\t\tquality,\n\t\t\t\tn: requested,\n\t\t\t\t...(params.background === undefined ? {} : { background }),\n\t\t\t\toutputFormat,\n\t\t\t\t...(params.output_compression === undefined ? {} : { outputCompression: params.output_compression }),\n\t\t\t\t...(params.moderation === undefined ? {} : { moderation: params.moderation }),\n\t\t\t\t...(mask === undefined ? {} : { mask: mask.image }),\n\t\t\t},\n\t\t);\n\t\tif (images.stopReason !== \"stop\") {\n\t\t\tconst message = images.errorMessage ?? `Image generation ${images.stopReason}.`;\n\t\t\treturn failure(`Error: ${message}`, \"provider_error\", { ...context, source });\n\t\t}\n\n\t\tconst generated = collectImages(images);\n\t\tif (generated.length === 0) {\n\t\t\treturn failure(\"Error: the provider returned no images.\", \"provider_error\", { ...context, source });\n\t\t}\n\t\t// A gateway may ignore output_format; name each file after the bytes it actually holds.\n\t\tconst delivered = generated.map((image) => outputFormatOf(image.mimeType) ?? outputFormat);\n\t\tconst savedFormat = delivered[0] ?? outputFormat;\n\t\tconst paths = targets.paths.map((target, index) => {\n\t\t\tconst format = delivered[index];\n\t\t\treturn format === undefined || format === outputFormat ? target : withFormatExtension(target, format);\n\t\t});\n\t\tconst renamedCollision = paths.find((target, index) => target !== targets.paths[index] && existsSync(target));\n\t\tif (renamedCollision !== undefined) {\n\t\t\treturn failure(\n\t\t\t\t`Error: the provider returned ${savedFormat} instead of ${outputFormat} and ${displayPath(ctx.cwd, renamedCollision)} already exists. Choose another output_path.`,\n\t\t\t\t\"write_failed\",\n\t\t\t\t{ ...context, source },\n\t\t\t);\n\t\t}\n\t\tconst writeError = await writeImages(paths, generated);\n\t\tif (writeError !== undefined) {\n\t\t\treturn failure(writeError, \"write_failed\", { ...context, source });\n\t\t}\n\n\t\tconst savedPaths = paths.slice(0, generated.length).map((target) => displayPath(ctx.cwd, target));\n\t\tconst revisedPrompts = generated.flatMap((image) => (image.revisedPrompt ? [image.revisedPrompt] : []));\n\t\tconst details: GenerateImageDetails = {\n\t\t\tpaths: savedPaths,\n\t\t\tmodel: modelId,\n\t\t\tsource,\n\t\t\tsize,\n\t\t\tquality,\n\t\t\tbackground,\n\t\t\toutputFormat: savedFormat,\n\t\t\trequested,\n\t\t\tgenerated: generated.length,\n\t\t\trevisedPrompts,\n\t\t\t...(images.background === undefined ? {} : { transparentBackground: images.background === \"transparent\" }),\n\t\t};\n\t\tconst summary = [\n\t\t\t`Generated ${generated.length} image${generated.length === 1 ? \"\" : \"s\"}:`,\n\t\t\t...savedPaths.map((path) => `- ${path}`),\n\t\t\t...(savedFormat === outputFormat\n\t\t\t\t? []\n\t\t\t\t: [\n\t\t\t\t\t\t`Note: the provider returned ${savedFormat} instead of the requested ${outputFormat}; saved with the matching extension.`,\n\t\t\t\t\t]),\n\t\t\t...(images.background === undefined ? [] : [`Background: ${images.background}`]),\n\t\t\t...revisedPrompts.map((revised) => `Revised prompt: ${revised}`),\n\t\t\t\"The saved file is the deliverable; refer to it by path instead of re-embedding image data.\",\n\t\t].join(\"\\n\");\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: summary },\n\t\t\t\t...generated.map((image) => ({ type: \"image\" as const, data: image.data, mimeType: image.mimeType })),\n\t\t\t],\n\t\t\tdetails,\n\t\t\t...(images.usage === undefined ? {} : { usage: images.usage }),\n\t\t};\n\t},\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAmBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAU9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,wDAAyD,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAsDtD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAmBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAU9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAuDtD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import accountExtension from "./account/index.js";
2
2
  import anthropicBashExtension from "./anthropic-bash/index.js";
3
3
  import anthropicWebSearchExtension from "./anthropic-web-search/index.js";
4
+ import askUserExtension from "./ask-user/index.js";
4
5
  import bashTimeoutExtension from "./bash-timeout/index.js";
5
6
  import btwExtension from "./btw/index.js";
6
7
  import cacheKeepAliveExtension from "./cache-keepalive/index.js";
@@ -56,6 +57,7 @@ export const builtinExtensions = [
56
57
  { id: "hooks", factory: hooksExtension },
57
58
  { id: "permission-system", factory: permissionSystemExtension },
58
59
  { id: "gpt-apply-patch", factory: gptApplyPatchExtension },
60
+ { id: "ask-user", factory: askUserExtension },
59
61
  { id: "imagegen", factory: imageGenExtension },
60
62
  // Follows imagegen so the native injector's bypass wiring observes the registered client tool.
61
63
  { id: "openai-image-gen", factory: openaiImageGenExtension },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport claudeSdkOauthExtension from \"./claude-sdk-oauth/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptAccountExtension from \"./gpt-account.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"gpt-account\", factory: gptAccountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: claudeSdkOauthExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport askUserExtension from \"./ask-user/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport claudeSdkOauthExtension from \"./claude-sdk-oauth/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptAccountExtension from \"./gpt-account.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"ask-user\", factory: askUserExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"gpt-account\", factory: gptAccountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: claudeSdkOauthExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/model-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAIxD,eAAO,MAAM,qBAAqB,6FAKxB,CAAC;AAIX,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAgED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAC9B,mBAAmB,GAAG,SAAS,CAcjC"}
1
+ {"version":3,"file":"model-selector.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/model-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAIxD,eAAO,MAAM,qBAAqB,YACjC,mBAAmB,EACnB,4BAA4B,EAC5B,kBAAkB,EAClB,SAAS,CACA,CAAC;AAIX,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAgED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAC9B,mBAAmB,GAAG,SAAS,CAcjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tContext,\n\tImageContent,\n\tModel,\n\tModelsSimpleStreamOptions,\n\tTextContent,\n\tUserMessage,\n} from \"@earendil-works/pi-ai\";\nimport type { ExtensionContext } from \"../../types.ts\";\nimport type { NormalizedLookAtArgs } from \"./arguments.ts\";\nimport { loadLookAtInputs } from \"./image-input.ts\";\nimport { resolveVisionModel } from \"./model-selector.ts\";\nimport { buildLookAtUserMessage, LOOK_AT_SYSTEM_PROMPT } from \"./prompts.ts\";\nimport { type LookAtStore, loadLookAtChain } from \"./settings.ts\";\n\nconst LOOK_AT_TIMEOUT_MS = 120_000;\n\nexport type LookAtStreamRunner = (\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions: ModelsSimpleStreamOptions,\n) => AssistantMessageEventStream;\n\nexport interface LookAtRunnerDependencies {\n\tstreamRunner?: LookAtStreamRunner;\n}\n\nexport interface LookAtRunResult {\n\tmodel: string;\n\tsources: string[];\n\tmimeTypes: string[];\n\ttext: string;\n}\n\nexport async function runLookAt(\n\targs: NormalizedLookAtArgs,\n\tsignal: AbortSignal | undefined,\n\tctx: ExtensionContext,\n\tstore: LookAtStore,\n\tdependencies: LookAtRunnerDependencies = {},\n): Promise<LookAtRunResult> {\n\tthrowIfAborted(signal);\n\tconst inputs = await loadLookAtInputs(ctx, inputPaths(args), inputData(args));\n\tconst resolved = resolveVisionModel(loadLookAtChain(ctx, store), ctx.modelRegistry.getAvailable());\n\tif (!resolved) {\n\t\tthrow new Error(\n\t\t\t\"No image-capable model is available. Configure a vision-capable provider and try look_at again.\",\n\t\t);\n\t}\n\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(resolved.model);\n\tif (!auth.ok) {\n\t\tthrow new Error(\n\t\t\t`look_at cannot use ${resolved.model.provider}/${resolved.model.id}: ${auth.error}. ` +\n\t\t\t\t`Configure credentials with /login ${resolved.model.provider} and try again.`,\n\t\t);\n\t}\n\tthrowIfAborted(signal);\n\n\tconst request = createRequestSignal(signal);\n\ttry {\n\t\tconst userMessage: UserMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t...inputs.map(toImageBlock),\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: buildLookAtUserMessage(\n\t\t\t\t\t\targs.goal,\n\t\t\t\t\t\tinputs.map((input) => input.label),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tconst streamRunner =\n\t\t\tdependencies.streamRunner ??\n\t\t\t((model, context, options) => ctx.modelRegistry.modelRuntime.streamSimple(model, context, options));\n\t\tconst reasoning = toStreamReasoning(resolved.thinkingLevel);\n\t\tconst response = await streamRunner(\n\t\t\tresolved.model,\n\t\t\t{ systemPrompt: LOOK_AT_SYSTEM_PROMPT, messages: [userMessage] },\n\t\t\t{\n\t\t\t\t...(reasoning === undefined ? {} : { reasoning }),\n\t\t\t\tmaxTokens: 4096,\n\t\t\t\tsignal: request.signal,\n\t\t\t},\n\t\t).result();\n\n\t\treturn {\n\t\t\tmodel: `${resolved.model.provider}/${resolved.model.id}`,\n\t\t\tsources: inputs.map((input) => input.label),\n\t\t\tmimeTypes: inputs.map((input) => input.mimeType),\n\t\t\ttext: responseText(response, request.signal),\n\t\t};\n\t} catch (error) {\n\t\tif (request.signal.aborted) throw new Error(\"look_at analysis was aborted.\");\n\t\tthrow error;\n\t} finally {\n\t\trequest.dispose();\n\t}\n}\n\nfunction inputPaths(args: NormalizedLookAtArgs): string[] {\n\treturn args.file_paths ?? (args.file_path ? [args.file_path] : []);\n}\n\nfunction inputData(args: NormalizedLookAtArgs): string[] {\n\treturn args.image_data_list ?? (args.image_data ? [args.image_data] : []);\n}\n\nfunction toImageBlock(input: { data: string; mimeType: string }): ImageContent {\n\treturn { type: \"image\", data: input.data, mimeType: input.mimeType };\n}\n\nfunction responseText(response: AssistantMessage, signal: AbortSignal): string {\n\tif (response.stopReason === \"error\") {\n\t\tconst providerMessage = response.errorMessage ?? \"The vision provider returned an unspecified error.\";\n\t\tthrow new Error(`Vision model failed to analyze the supplied media: ${providerMessage}`);\n\t}\n\tif (response.stopReason === \"aborted\" || signal.aborted) {\n\t\tthrow new Error(\"look_at analysis was aborted.\");\n\t}\n\tconst text = response.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n\tif (!text) {\n\t\tthrow new Error(\"Vision model returned no analysis text. Try a clearer goal or another image.\");\n\t}\n\treturn text;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw new Error(\"look_at analysis was aborted.\");\n}\n\nfunction toStreamReasoning(level: ThinkingLevel | undefined): ModelsSimpleStreamOptions[\"reasoning\"] {\n\tif (level === undefined || level === \"off\") return undefined;\n\treturn level as ModelsSimpleStreamOptions[\"reasoning\"];\n}\n\nfunction createRequestSignal(signal: AbortSignal | undefined): { signal: AbortSignal; dispose(): void } {\n\tconst controller = new AbortController();\n\tconst abortFromTool = () => controller.abort(signal?.reason);\n\tif (signal?.aborted) abortFromTool();\n\telse signal?.addEventListener(\"abort\", abortFromTool, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), LOOK_AT_TIMEOUT_MS);\n\n\treturn {\n\t\tsignal: controller.signal,\n\t\tdispose: () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", abortFromTool);\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tContext,\n\tImageContent,\n\tModel,\n\tModelsSimpleStreamOptions,\n\tTextContent,\n\tUserMessage,\n} from \"@earendil-works/pi-ai\";\nimport type { ExtensionContext } from \"../../types.ts\";\nimport type { NormalizedLookAtArgs } from \"./arguments.ts\";\nimport { loadLookAtInputs } from \"./image-input.ts\";\nimport { resolveVisionModel } from \"./model-selector.ts\";\nimport { buildLookAtUserMessage, LOOK_AT_SYSTEM_PROMPT } from \"./prompts.ts\";\nimport { type LookAtStore, loadLookAtChain } from \"./settings.ts\";\n\nconst LOOK_AT_TIMEOUT_MS = 120_000;\n\nexport type LookAtStreamRunner = (\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions: ModelsSimpleStreamOptions,\n) => AssistantMessageEventStream;\n\nexport interface LookAtRunnerDependencies {\n\tstreamRunner?: LookAtStreamRunner;\n}\n\nexport interface LookAtRunResult {\n\tmodel: string;\n\tsources: string[];\n\tmimeTypes: string[];\n\ttext: string;\n}\n\nexport async function runLookAt(\n\targs: NormalizedLookAtArgs,\n\tsignal: AbortSignal | undefined,\n\tctx: ExtensionContext,\n\tstore: LookAtStore,\n\tdependencies: LookAtRunnerDependencies = {},\n): Promise<LookAtRunResult> {\n\tthrowIfAborted(signal);\n\tconst inputs = await loadLookAtInputs(ctx, inputPaths(args), inputData(args));\n\tconst resolved = resolveVisionModel(loadLookAtChain(ctx, store), ctx.modelRegistry.getAvailable());\n\tif (!resolved) {\n\t\tthrow new Error(\n\t\t\t\"No image-capable model is available. Configure a vision-capable provider and try look_at again.\",\n\t\t);\n\t}\n\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(resolved.model);\n\tif (!auth.ok) {\n\t\tthrow new Error(\n\t\t\t`look_at cannot use ${resolved.model.provider}/${resolved.model.id}: ${auth.error}. ` +\n\t\t\t\t`Configure credentials with /login ${resolved.model.provider} and try again.`,\n\t\t);\n\t}\n\tthrowIfAborted(signal);\n\n\tconst request = createRequestSignal(signal);\n\ttry {\n\t\tconst userMessage: UserMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t...inputs.map(toImageBlock),\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: buildLookAtUserMessage(\n\t\t\t\t\t\targs.goal,\n\t\t\t\t\t\tinputs.map((input) => input.label),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tconst streamRunner =\n\t\t\tdependencies.streamRunner ??\n\t\t\t((model, context, options) => ctx.modelRegistry.modelRuntime.streamSimple(model, context, options));\n\t\tconst reasoning = toStreamReasoning(resolved.thinkingLevel);\n\t\tconst response = await streamRunner(\n\t\t\tresolved.model,\n\t\t\t{ systemPrompt: LOOK_AT_SYSTEM_PROMPT, messages: [userMessage] },\n\t\t\t{\n\t\t\t\t...(reasoning === undefined ? {} : { reasoning }),\n\t\t\t\tmaxTokens: 4096,\n\t\t\t\tsignal: request.signal,\n\t\t\t},\n\t\t).result();\n\n\t\treturn {\n\t\t\tmodel: `${resolved.model.provider}/${resolved.model.id}`,\n\t\t\tsources: inputs.map((input) => input.label),\n\t\t\tmimeTypes: inputs.map((input) => input.mimeType),\n\t\t\ttext: responseText(response, request.signal),\n\t\t};\n\t} catch (error) {\n\t\tif (request.signal.aborted) throw new Error(\"look_at analysis was aborted.\");\n\t\tthrow error;\n\t} finally {\n\t\trequest.dispose();\n\t}\n}\n\nfunction inputPaths(args: NormalizedLookAtArgs): string[] {\n\treturn args.file_paths ?? (args.file_path ? [args.file_path] : []);\n}\n\nfunction inputData(args: NormalizedLookAtArgs): string[] {\n\treturn args.image_data_list ?? (args.image_data ? [args.image_data] : []);\n}\n\nfunction toImageBlock(input: { data: string; mimeType: string }): ImageContent {\n\treturn { type: \"image\", data: input.data, mimeType: input.mimeType };\n}\n\nfunction responseText(response: AssistantMessage, signal: AbortSignal): string {\n\tif (response.stopReason === \"error\") {\n\t\tconst providerMessage = response.errorMessage ?? \"The vision provider returned an unspecified error.\";\n\t\tthrow new Error(`Vision model failed to analyze the supplied media: ${providerMessage}`);\n\t}\n\tif (response.stopReason === \"aborted\" || signal.aborted) {\n\t\tthrow new Error(\"look_at analysis was aborted.\");\n\t}\n\tconst text = response.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n\tif (!text) {\n\t\tthrow new Error(\"Vision model returned no analysis text. Try a clearer goal or another image.\");\n\t}\n\treturn text;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw new Error(\"look_at analysis was aborted.\");\n}\n\nfunction toStreamReasoning(level: ThinkingLevel | undefined): ModelsSimpleStreamOptions[\"reasoning\"] {\n\tif (level === undefined || level === \"off\") return undefined;\n\treturn level as ModelsSimpleStreamOptions[\"reasoning\"];\n}\n\nfunction createRequestSignal(signal: AbortSignal | undefined): { signal: AbortSignal; dispose(): void } {\n\tconst controller = new AbortController();\n\tconst abortFromTool = () => controller.abort(signal?.reason);\n\tif (signal?.aborted) abortFromTool();\n\telse signal?.addEventListener(\"abort\", abortFromTool, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), LOOK_AT_TIMEOUT_MS);\n\n\treturn {\n\t\tsignal: controller.signal,\n\t\tdispose: () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", abortFromTool);\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/command.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `/loop` command handler: native argument parsing and the user-facing surfaces.\n *\n * Parsing is pure native code (`parse.ts`) - the command never expands into a\n * model-facing parsing prompt. Starting a loop always goes through the extension's\n * controller, which persists and arms the schedule BEFORE dispatching the first tick,\n * so a failed first turn can never silently lose the job.\n *\n * Headless rejection: print/json modes have no interactive session, so the command\n * refuses with a one-line message and arms nothing.\n */\n\nimport type { ExtensionCommandContext } from \"../../types.ts\";\nimport type { LoopController, LoopCreateOk } from \"./index.ts\";\nimport { type LoopTarget, parseLoopArgs } from \"./parse.ts\";\nimport type { CronEntry, LoopId, LoopState } from \"./types.ts\";\n\nexport const LOOP_ARGUMENT_HINT = \"[interval] [prompt] | stop [id|all] | status | pause | resume\";\nexport const LOOP_COMMAND_DESCRIPTION =\n\t\"Repeat a prompt on a fixed interval or a self-paced schedule (e.g. /loop 5m check the deploy)\";\n\nconst LOOP_SUBCOMMANDS = [\"stop\", \"status\", \"pause\", \"resume\"] as const;\n\nconst LOOP_HEADLESS_REJECTION =\n\t\"/loop needs an interactive session; it is not available in print mode, so nothing was armed.\";\n\nexport interface LoopCommandDeps {\n\treadonly controller: LoopController;\n}\n\n/** Headless modes: single-shot output streams with no interactive transcript. */\nfunction isHeadlessMode(mode: ExtensionCommandContext[\"mode\"]): boolean {\n\treturn mode === \"print\" || mode === \"json\";\n}\n\n/**\n * Argument completions for the subcommand keywords, modeled on the todo extension's\n * verb completions: prefix-filtered, `null` when nothing matches.\n */\nexport function completeLoopArguments(argumentPrefix: string): Array<{ value: string; label: string }> | null {\n\tconst prefix = argumentPrefix.trim().toLowerCase();\n\tconst matches = LOOP_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix));\n\tif (matches.length === 0) return null;\n\treturn matches.map((subcommand) => ({ value: subcommand, label: subcommand }));\n}\n\nfunction formatExpiry(expiresAt: number | undefined): string {\n\treturn expiresAt === undefined ? \"after 7 days\" : new Date(expiresAt).toISOString();\n}\n\n/** Fixed-loop confirmation: id, cron, effective cadence, rounding notice, expiry, stop command. */\nexport function formatFixedLoopConfirmation(outcome: LoopCreateOk, requestedRaw: string): string {\n\tconst cadence = outcome.effectiveCadence ?? \"on schedule\";\n\tconst parenthetical =\n\t\toutcome.roundingNotice === undefined ? `every ${cadence}` : `every ${cadence}; requested ${requestedRaw}`;\n\tconst lines = [`Loop ${outcome.loopId} scheduled as \\`${outcome.cronExpression ?? \"\"}\\` (${parenthetical}).`];\n\tif (outcome.roundingNotice !== undefined) lines.push(outcome.roundingNotice);\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\`.`);\n\tlines.push(\"Running the first tick now.\");\n\treturn lines.join(\"\\n\");\n}\n\n/** Dynamic-loop confirmation, including the supersession line when one replaced another. */\nexport function formatDynamicLoopConfirmation(outcome: LoopCreateOk): string {\n\tconst lines = [\n\t\t`Loop ${outcome.loopId} started in dynamic mode: the model paces each iteration with \\`schedule_wakeup\\`.`,\n\t];\n\tif (outcome.supersededLoopId !== undefined) lines.push(`Superseded dynamic loop ${outcome.supersededLoopId}.`);\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\` or a \\`schedule_wakeup\\` call with \\`{ stop: true }\\`.`);\n\tlines.push(\"Running the first iteration now.\");\n\treturn lines.join(\"\\n\");\n}\n\n/** Bare-invocation confirmation; the mode comes from the entry the controller created. */\nexport function formatBareLoopConfirmation(outcome: LoopCreateOk, entry: CronEntry | undefined): string {\n\tconst mode = entry?.kind === \"fixed\" ? `fixed, every ${entry.effectiveInterval.human}` : \"dynamic pacing\";\n\tconst lines = [`Loop ${outcome.loopId} started (${mode}).`];\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\`.`);\n\tlines.push(\"Running the first tick now.\");\n\treturn lines.join(\"\\n\");\n}\n\nfunction describeLoopEntry(entry: CronEntry): string {\n\tconst mode =\n\t\tentry.kind === \"fixed\"\n\t\t\t? `fixed, \\`${entry.cronExpression}\\` (every ${entry.effectiveInterval.human})`\n\t\t\t: \"dynamic\";\n\tconst paused = entry.phase === \"suspended\" ? \" · paused\" : \"\";\n\treturn `- ${entry.id} (${mode}) · expires ${formatExpiry(entry.expiresAt)}${paused}`;\n}\n\n/**\n * The `/loop status` listing: the live status line (countdown + stop affordance) plus\n * one row per active loop.\n */\nexport function formatLoopStatusListing(statusLine: string | undefined, state: LoopState): string {\n\tconst active = Object.values(state.entries).filter((entry) => entry.phase !== \"ended\");\n\tif (active.length === 0) return \"No active loops.\";\n\tconst lines = statusLine === undefined ? [] : [statusLine];\n\tlines.push(\"Active loops:\");\n\tfor (const entry of active) lines.push(describeLoopEntry(entry));\n\treturn lines.join(\"\\n\");\n}\n\nfunction activeLoopIds(state: LoopState): readonly LoopId[] {\n\treturn Object.values(state.entries)\n\t\t.filter((entry) => entry.phase !== \"ended\")\n\t\t.map((entry) => entry.id);\n}\n\ntype TargetResolution =\n\t| { readonly action: \"apply\"; readonly value: LoopId | \"all\" }\n\t| { readonly action: \"none\" }\n\t| { readonly action: \"ambiguous\"; readonly ids: readonly LoopId[] };\n\n/**\n * Resolves a stop/pause/resume target. An implicit target names the single active loop;\n * with several armed loops the command must not guess, so it asks for disambiguation.\n */\nfunction resolveCommandTarget(target: LoopTarget, state: LoopState): TargetResolution {\n\tif (target.type === \"all\") return { action: \"apply\", value: \"all\" };\n\tif (target.type === \"id\") return { action: \"apply\", value: target.id };\n\tconst ids = activeLoopIds(state);\n\tif (ids.length === 0) return { action: \"none\" };\n\tif (ids.length === 1) return { action: \"apply\", value: ids[0] };\n\treturn { action: \"ambiguous\", ids };\n}\n\nfunction notifyAmbiguous(\n\tctx: ExtensionCommandContext,\n\tverb: \"stop\" | \"pause\" | \"resume\",\n\tids: readonly LoopId[],\n): void {\n\tconst lines = [\"Multiple loops are active:\", ...ids.map((id) => `- ${id}`)];\n\tlines.push(`Use \\`/loop ${verb} <id>\\` or \\`/loop ${verb} all\\`.`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"warning\");\n}\n\nfunction notifyUnknownId(ctx: ExtensionCommandContext, id: string, state: LoopState): void {\n\tconst ids = activeLoopIds(state);\n\tconst lines = [`No active loop with id \"${id}\".`];\n\tif (ids.length > 0) lines.push(`Active loops: ${ids.join(\", \")}.`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"warning\");\n}\n\nasync function runStop(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"stop\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.stop(resolution.value, \"user-stop\");\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Stopped ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tnotifyUnknownId(ctx, resolution.value, deps.controller.getState());\n\t\treturn;\n\t}\n\tctx.ui.notify(`Stopped loop ${resolution.value}.`, \"info\");\n}\n\nasync function runPause(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"pause\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.pause(resolution.value);\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No pausable loops.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Paused ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tctx.ui.notify(`Loop ${resolution.value} is not pausable (already paused or ended).`, \"warning\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`Paused loop ${resolution.value}.`, \"info\");\n}\n\nasync function runResume(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"resume\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.resume(resolution.value);\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No paused loops to resume.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Resumed ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tctx.ui.notify(`Loop ${resolution.value} is not paused.`, \"warning\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`Resumed loop ${resolution.value}.`, \"info\");\n}\n\nasync function reportCreateOutcome(\n\tctx: ExtensionCommandContext,\n\tdeps: LoopCommandDeps,\n\toutcome: LoopCreateOk,\n\tformat: (entry: CronEntry | undefined) => string,\n): Promise<void> {\n\tconst entry = deps.controller.getState().entries[outcome.loopId];\n\tctx.ui.notify(format(entry), \"info\");\n}\n\n/** The `/loop` command entry point. */\nexport async function runLoopCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tdeps: LoopCommandDeps,\n): Promise<void> {\n\tif (isHeadlessMode(ctx.mode)) {\n\t\tctx.ui.notify(LOOP_HEADLESS_REJECTION, \"warning\");\n\t\t// Headless hosts install a no-op UI context, so `notify` alone leaves the refusal\n\t\t// invisible (empty output, exit 0). Write to stderr as well so the message is actually\n\t\t// seen; real stdout stays reserved for `-p` result data.\n\t\tprocess.stderr.write(`${LOOP_HEADLESS_REJECTION}\\n`);\n\t\treturn;\n\t}\n\n\tconst parsed = parseLoopArgs(rawArgs);\n\ttry {\n\t\tswitch (parsed.kind) {\n\t\t\tcase \"invalid\": {\n\t\t\t\tctx.ui.notify(parsed.usage, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"fixed\": {\n\t\t\t\tconst outcome = await deps.controller.startFixed({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\tprompt: parsed.prompt,\n\t\t\t\t\trequestedInterval: parsed.interval,\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, () =>\n\t\t\t\t\tformatFixedLoopConfirmation(outcome, parsed.interval.raw),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"dynamic\": {\n\t\t\t\tconst outcome = await deps.controller.startDynamic({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\tprompt: parsed.prompt,\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, () => formatDynamicLoopConfirmation(outcome));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"bare\": {\n\t\t\t\tconst outcome = await deps.controller.startBare({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\t...(parsed.interval === undefined ? {} : { interval: parsed.interval }),\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, (entry) => formatBareLoopConfirmation(outcome, entry));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"stop\": {\n\t\t\t\tawait runStop(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"pause\": {\n\t\t\t\tawait runPause(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"resume\": {\n\t\t\t\tawait runResume(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"status\": {\n\t\t\t\tctx.ui.notify(formatLoopStatusListing(deps.controller.statusLine(), deps.controller.getState()), \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\t// A failed command must surface, not vanish: notify and stop.\n\t\tctx.ui.notify(`/loop command failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/command.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `/loop` command handler: native argument parsing and the user-facing surfaces.\n *\n * Parsing is pure native code (`parse.ts`) - the command never expands into a\n * model-facing parsing prompt. Starting a loop always goes through the extension's\n * controller, which persists and arms the schedule BEFORE dispatching the first tick,\n * so a failed first turn can never silently lose the job.\n *\n * Headless rejection: print/json modes have no interactive session, so the command\n * refuses with a one-line message and arms nothing.\n */\n\nimport type { ExtensionCommandContext } from \"../../types.ts\";\nimport type { LoopController, LoopCreateOk } from \"./index.ts\";\nimport { type LoopTarget, parseLoopArgs } from \"./parse.ts\";\nimport type { CronEntry, LoopId, LoopState } from \"./types.ts\";\n\nexport const LOOP_ARGUMENT_HINT = \"[interval] [prompt] | stop [id|all] | status | pause | resume\";\nexport const LOOP_COMMAND_DESCRIPTION =\n\t\"Repeat a prompt on a fixed interval or a self-paced schedule (e.g. /loop 5m check the deploy)\";\n\nconst LOOP_SUBCOMMANDS = [\"stop\", \"status\", \"pause\", \"resume\"] as const;\n\nconst LOOP_HEADLESS_REJECTION =\n\t\"/loop needs an interactive session; it is not available in print mode, so nothing was armed.\";\n\nexport interface LoopCommandDeps {\n\treadonly controller: LoopController;\n}\n\n/** Headless modes: single-shot output streams with no interactive transcript. */\nfunction isHeadlessMode(mode: ExtensionCommandContext[\"mode\"]): boolean {\n\treturn mode === \"print\" || mode === \"json\";\n}\n\n/**\n * Argument completions for the subcommand keywords, modeled on the todo extension's\n * verb completions: prefix-filtered, `null` when nothing matches.\n */\nexport function completeLoopArguments(argumentPrefix: string): Array<{ value: string; label: string }> | null {\n\tconst prefix = argumentPrefix.trim().toLowerCase();\n\tconst matches = LOOP_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix));\n\tif (matches.length === 0) return null;\n\treturn matches.map((subcommand) => ({ value: subcommand, label: subcommand }));\n}\n\nfunction formatExpiry(expiresAt: number | undefined): string {\n\treturn expiresAt === undefined ? \"after 7 days\" : new Date(expiresAt).toISOString();\n}\n\n/** Fixed-loop confirmation: id, cron, effective cadence, rounding notice, expiry, stop command. */\nexport function formatFixedLoopConfirmation(outcome: LoopCreateOk, requestedRaw: string): string {\n\tconst cadence = outcome.effectiveCadence ?? \"on schedule\";\n\tconst parenthetical =\n\t\toutcome.roundingNotice === undefined ? `every ${cadence}` : `every ${cadence}; requested ${requestedRaw}`;\n\tconst lines = [`Loop ${outcome.loopId} scheduled as \\`${outcome.cronExpression ?? \"\"}\\` (${parenthetical}).`];\n\tif (outcome.roundingNotice !== undefined) lines.push(outcome.roundingNotice);\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\`.`);\n\tlines.push(\"Running the first tick now.\");\n\treturn lines.join(\"\\n\");\n}\n\n/** Dynamic-loop confirmation, including the supersession line when one replaced another. */\nexport function formatDynamicLoopConfirmation(outcome: LoopCreateOk): string {\n\tconst lines = [\n\t\t`Loop ${outcome.loopId} started in dynamic mode: the model paces each iteration with \\`schedule_wakeup\\`.`,\n\t];\n\tif (outcome.supersededLoopId !== undefined) lines.push(`Superseded dynamic loop ${outcome.supersededLoopId}.`);\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\` or a \\`schedule_wakeup\\` call with \\`{ stop: true }\\`.`);\n\tlines.push(\"Running the first iteration now.\");\n\treturn lines.join(\"\\n\");\n}\n\n/** Bare-invocation confirmation; the mode comes from the entry the controller created. */\nexport function formatBareLoopConfirmation(outcome: LoopCreateOk, entry: CronEntry | undefined): string {\n\tconst mode = entry?.kind === \"fixed\" ? `fixed, every ${entry.effectiveInterval.human}` : \"dynamic pacing\";\n\tconst lines = [`Loop ${outcome.loopId} started (${mode}).`];\n\tlines.push(`It expires automatically at ${formatExpiry(outcome.expiresAt)} (7 days).`);\n\tlines.push(`Stop it with \\`/loop stop ${outcome.loopId}\\`.`);\n\tlines.push(\"Running the first tick now.\");\n\treturn lines.join(\"\\n\");\n}\n\nfunction describeLoopEntry(entry: CronEntry): string {\n\tconst mode =\n\t\tentry.kind === \"fixed\"\n\t\t\t? `fixed, \\`${entry.cronExpression}\\` (every ${entry.effectiveInterval.human})`\n\t\t\t: \"dynamic\";\n\tconst paused = entry.phase === \"suspended\" ? \" · paused\" : \"\";\n\treturn `- ${entry.id} (${mode}) · expires ${formatExpiry(entry.expiresAt)}${paused}`;\n}\n\n/**\n * The `/loop status` listing: the live status line (countdown + stop affordance) plus\n * one row per active loop.\n */\nexport function formatLoopStatusListing(statusLine: string | undefined, state: LoopState): string {\n\tconst active = Object.values(state.entries).filter((entry) => entry.phase !== \"ended\");\n\tif (active.length === 0) return \"No active loops.\";\n\tconst lines = statusLine === undefined ? [] : [statusLine];\n\tlines.push(\"Active loops:\");\n\tfor (const entry of active) lines.push(describeLoopEntry(entry));\n\treturn lines.join(\"\\n\");\n}\n\nfunction activeLoopIds(state: LoopState): readonly LoopId[] {\n\treturn Object.values(state.entries)\n\t\t.filter((entry) => entry.phase !== \"ended\")\n\t\t.map((entry) => entry.id);\n}\n\ntype TargetResolution =\n\t| { readonly action: \"apply\"; readonly value: LoopId | \"all\" }\n\t| { readonly action: \"none\" }\n\t| { readonly action: \"ambiguous\"; readonly ids: readonly LoopId[] };\n\n/**\n * Resolves a stop/pause/resume target. An implicit target names the single active loop;\n * with several armed loops the command must not guess, so it asks for disambiguation.\n */\nfunction resolveCommandTarget(target: LoopTarget, state: LoopState): TargetResolution {\n\tif (target.type === \"all\") return { action: \"apply\", value: \"all\" };\n\tif (target.type === \"id\") return { action: \"apply\", value: target.id };\n\tconst ids = activeLoopIds(state);\n\tif (ids.length === 0) return { action: \"none\" };\n\tif (ids.length === 1) return { action: \"apply\", value: ids[0] };\n\treturn { action: \"ambiguous\", ids };\n}\n\nfunction notifyAmbiguous(\n\tctx: ExtensionCommandContext,\n\tverb: \"stop\" | \"pause\" | \"resume\",\n\tids: readonly LoopId[],\n): void {\n\tconst lines = [\"Multiple loops are active:\", ...ids.map((id) => `- ${id}`)];\n\tlines.push(`Use \\`/loop ${verb} <id>\\` or \\`/loop ${verb} all\\`.`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"warning\");\n}\n\nfunction notifyUnknownId(ctx: ExtensionCommandContext, id: string, state: LoopState): void {\n\tconst ids = activeLoopIds(state);\n\tconst lines = [`No active loop with id \"${id}\".`];\n\tif (ids.length > 0) lines.push(`Active loops: ${ids.join(\", \")}.`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"warning\");\n}\n\nasync function runStop(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"stop\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.stop(resolution.value, \"user-stop\");\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Stopped ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tnotifyUnknownId(ctx, resolution.value, deps.controller.getState());\n\t\treturn;\n\t}\n\tctx.ui.notify(`Stopped loop ${resolution.value}.`, \"info\");\n}\n\nasync function runPause(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"pause\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.pause(resolution.value);\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No pausable loops.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Paused ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tctx.ui.notify(`Loop ${resolution.value} is not pausable (already paused or ended).`, \"warning\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`Paused loop ${resolution.value}.`, \"info\");\n}\n\nasync function runResume(ctx: ExtensionCommandContext, deps: LoopCommandDeps, target: LoopTarget): Promise<void> {\n\tconst resolution = resolveCommandTarget(target, deps.controller.getState());\n\tif (resolution.action === \"none\") {\n\t\tctx.ui.notify(\"No active loops.\", \"warning\");\n\t\treturn;\n\t}\n\tif (resolution.action === \"ambiguous\") {\n\t\tnotifyAmbiguous(ctx, \"resume\", resolution.ids);\n\t\treturn;\n\t}\n\tconst affected = await deps.controller.resume(resolution.value);\n\tif (resolution.value === \"all\") {\n\t\tif (affected.length === 0) {\n\t\t\tctx.ui.notify(\"No paused loops to resume.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst noun = affected.length === 1 ? \"loop\" : \"loops\";\n\t\tctx.ui.notify(`Resumed ${affected.length} ${noun}: ${affected.join(\", \")}.`, \"info\");\n\t\treturn;\n\t}\n\tif (affected.length === 0) {\n\t\tctx.ui.notify(`Loop ${resolution.value} is not paused.`, \"warning\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`Resumed loop ${resolution.value}.`, \"info\");\n}\n\nasync function reportCreateOutcome(\n\tctx: ExtensionCommandContext,\n\tdeps: LoopCommandDeps,\n\toutcome: LoopCreateOk,\n\tformat: (entry: CronEntry | undefined) => string,\n): Promise<void> {\n\tconst entry = deps.controller.getState().entries[outcome.loopId];\n\tctx.ui.notify(format(entry), \"info\");\n}\n\n/** The `/loop` command entry point. */\nexport async function runLoopCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tdeps: LoopCommandDeps,\n): Promise<void> {\n\tif (isHeadlessMode(ctx.mode)) {\n\t\tctx.ui.notify(LOOP_HEADLESS_REJECTION, \"warning\");\n\t\t// Headless hosts install a no-op UI context, so `notify` alone leaves the refusal\n\t\t// invisible (empty output, exit 0). Write to stderr as well so the message is actually\n\t\t// seen; real stdout stays reserved for `-p` result data.\n\t\tprocess.stderr.write(`${LOOP_HEADLESS_REJECTION}\\n`);\n\t\treturn;\n\t}\n\n\tconst parsed = parseLoopArgs(rawArgs);\n\ttry {\n\t\tswitch (parsed.kind) {\n\t\t\tcase \"invalid\": {\n\t\t\t\tctx.ui.notify(parsed.usage, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"fixed\": {\n\t\t\t\tconst outcome = await deps.controller.startFixed({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\tprompt: parsed.prompt,\n\t\t\t\t\trequestedInterval: parsed.interval,\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, () =>\n\t\t\t\t\tformatFixedLoopConfirmation(outcome, parsed.interval.raw),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"dynamic\": {\n\t\t\t\tconst outcome = await deps.controller.startDynamic({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\tprompt: parsed.prompt,\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, () => formatDynamicLoopConfirmation(outcome));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"bare\": {\n\t\t\t\tconst outcome = await deps.controller.startBare({\n\t\t\t\t\toriginalArgs: parsed.originalArgs,\n\t\t\t\t\t...(parsed.interval === undefined ? {} : { interval: parsed.interval }),\n\t\t\t\t});\n\t\t\t\tif (!outcome.ok) {\n\t\t\t\t\tctx.ui.notify(outcome.message, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait reportCreateOutcome(ctx, deps, outcome, (entry) => formatBareLoopConfirmation(outcome, entry));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"stop\": {\n\t\t\t\tawait runStop(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"pause\": {\n\t\t\t\tawait runPause(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"resume\": {\n\t\t\t\tawait runResume(ctx, deps, parsed.target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"status\": {\n\t\t\t\tctx.ui.notify(formatLoopStatusListing(deps.controller.statusLine(), deps.controller.getState()), \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\t// A failed command must surface, not vanish: notify and stop.\n\t\tctx.ui.notify(`/loop command failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cron-planner.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/cron-planner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EffectiveInterval, EffectiveIntervalUnit, RequestedInterval } from \"./types.ts\";\n\n// `types.ts` is the single type home for the whole extension; these are re-exported so\n// existing consumers of the planner keep importing the canonical declarations.\nexport type { EffectiveInterval, RequestedInterval };\n\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\n\nfunction pluralize(count: number, singular: string, plural: string): string {\n\treturn count === 1 ? `${count} ${singular}` : `${count} ${plural}`;\n}\n\n/**\n * Converts a user-requested interval into an effective cadence the scheduler\n * can express with the restricted display cron forms. Seconds are coarsened to\n * minutes; large minute/hour values roll up to hours/days with half-up\n * rounding. Whenever the effective value differs from the request, the result\n * carries a notice naming both the requested and effective cadence.\n */\nexport function normalizeInterval(requested: RequestedInterval): EffectiveInterval & { intervalMs: number } {\n\tlet value: number;\n\tlet unit: EffectiveIntervalUnit;\n\tlet rounded: boolean;\n\n\tswitch (requested.unit) {\n\t\tcase \"s\": {\n\t\t\tvalue = Math.max(1, Math.ceil(requested.value / 60));\n\t\t\tunit = \"m\";\n\t\t\trounded = true;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"m\": {\n\t\t\tif (requested.value >= 60) {\n\t\t\t\tvalue = Math.round(requested.value / 60);\n\t\t\t\tunit = \"h\";\n\t\t\t\trounded = true;\n\t\t\t} else {\n\t\t\t\tvalue = requested.value;\n\t\t\t\tunit = \"m\";\n\t\t\t\trounded = false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"h\": {\n\t\t\tif (requested.value >= 24) {\n\t\t\t\tvalue = Math.round(requested.value / 24);\n\t\t\t\tunit = \"d\";\n\t\t\t\trounded = true;\n\t\t\t} else {\n\t\t\t\tvalue = requested.value;\n\t\t\t\tunit = \"h\";\n\t\t\t\trounded = false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"d\": {\n\t\t\tvalue = requested.value;\n\t\t\tunit = \"d\";\n\t\t\trounded = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst human =\n\t\tunit === \"m\"\n\t\t\t? pluralize(value, \"minute\", \"minutes\")\n\t\t\t: unit === \"h\"\n\t\t\t\t? pluralize(value, \"hour\", \"hours\")\n\t\t\t\t: pluralize(value, \"day\", \"days\");\n\n\tconst intervalMs = unit === \"m\" ? value * MS_PER_MINUTE : unit === \"h\" ? value * MS_PER_HOUR : value * MS_PER_DAY;\n\n\tconst roundingNotice = rounded ? `Requested ${requested.raw} rounds to ${human}.` : undefined;\n\n\treturn { value, unit, human, rounded, roundingNotice, intervalMs };\n}\n\n/**\n * Returns a restricted 5-field cron expression for DISPLAY ONLY. The scheduler\n * uses intervalMs + absolute nextFireAt; this string is shown to the user.\n */\nexport function describeCron(effective: Pick<EffectiveInterval, \"value\" | \"unit\">): string {\n\tswitch (effective.unit) {\n\t\tcase \"m\":\n\t\t\treturn `*/${effective.value} * * * *`;\n\t\tcase \"h\":\n\t\t\treturn `0 */${effective.value} * * *`;\n\t\tcase \"d\":\n\t\t\treturn `0 0 */${effective.value} * *`;\n\t}\n}\n\n/**\n * Computes the absolute timestamp of the next scheduled fire. Pure: takes\n * nowMs as a parameter and never reads the clock internally.\n */\nexport function computeNextFireAt(nowMs: number, intervalMs: number): number {\n\treturn nowMs + intervalMs;\n}\n"]}
1
+ {"version":3,"file":"cron-planner.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/cron-planner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EffectiveInterval, EffectiveIntervalUnit, RequestedInterval } from \"./types.ts\";\n\n// `types.ts` is the single type home for the whole extension; these are re-exported so\n// existing consumers of the planner keep importing the canonical declarations.\nexport type { EffectiveInterval, RequestedInterval };\n\nconst MS_PER_MINUTE = 60_000;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\n\nfunction pluralize(count: number, singular: string, plural: string): string {\n\treturn count === 1 ? `${count} ${singular}` : `${count} ${plural}`;\n}\n\n/**\n * Converts a user-requested interval into an effective cadence the scheduler\n * can express with the restricted display cron forms. Seconds are coarsened to\n * minutes; large minute/hour values roll up to hours/days with half-up\n * rounding. Whenever the effective value differs from the request, the result\n * carries a notice naming both the requested and effective cadence.\n */\nexport function normalizeInterval(requested: RequestedInterval): EffectiveInterval & { intervalMs: number } {\n\tlet value: number;\n\tlet unit: EffectiveIntervalUnit;\n\tlet rounded: boolean;\n\n\tswitch (requested.unit) {\n\t\tcase \"s\": {\n\t\t\tvalue = Math.max(1, Math.ceil(requested.value / 60));\n\t\t\tunit = \"m\";\n\t\t\trounded = true;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"m\": {\n\t\t\tif (requested.value >= 60) {\n\t\t\t\tvalue = Math.round(requested.value / 60);\n\t\t\t\tunit = \"h\";\n\t\t\t\trounded = true;\n\t\t\t} else {\n\t\t\t\tvalue = requested.value;\n\t\t\t\tunit = \"m\";\n\t\t\t\trounded = false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"h\": {\n\t\t\tif (requested.value >= 24) {\n\t\t\t\tvalue = Math.round(requested.value / 24);\n\t\t\t\tunit = \"d\";\n\t\t\t\trounded = true;\n\t\t\t} else {\n\t\t\t\tvalue = requested.value;\n\t\t\t\tunit = \"h\";\n\t\t\t\trounded = false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"d\": {\n\t\t\tvalue = requested.value;\n\t\t\tunit = \"d\";\n\t\t\trounded = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst human =\n\t\tunit === \"m\"\n\t\t\t? pluralize(value, \"minute\", \"minutes\")\n\t\t\t: unit === \"h\"\n\t\t\t\t? pluralize(value, \"hour\", \"hours\")\n\t\t\t\t: pluralize(value, \"day\", \"days\");\n\n\tconst intervalMs = unit === \"m\" ? value * MS_PER_MINUTE : unit === \"h\" ? value * MS_PER_HOUR : value * MS_PER_DAY;\n\n\tconst roundingNotice = rounded ? `Requested ${requested.raw} rounds to ${human}.` : undefined;\n\n\treturn { value, unit, human, rounded, roundingNotice, intervalMs };\n}\n\n/**\n * Returns a restricted 5-field cron expression for DISPLAY ONLY. The scheduler\n * uses intervalMs + absolute nextFireAt; this string is shown to the user.\n */\nexport function describeCron(effective: Pick<EffectiveInterval, \"value\" | \"unit\">): string {\n\tswitch (effective.unit) {\n\t\tcase \"m\":\n\t\t\treturn `*/${effective.value} * * * *`;\n\t\tcase \"h\":\n\t\t\treturn `0 */${effective.value} * * *`;\n\t\tcase \"d\":\n\t\t\treturn `0 0 */${effective.value} * *`;\n\t}\n}\n\n/**\n * Computes the absolute timestamp of the next scheduled fire. Pure: takes\n * nowMs as a parameter and never reads the clock internally.\n */\nexport function computeNextFireAt(nowMs: number, intervalMs: number): number {\n\treturn nowMs + intervalMs;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAgB,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGtG,OAAO,EAAE,KAAK,cAAc,EAAqD,MAAM,eAAe,CAAC;AACvG,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,aAAa,EAGlB,KAAK,aAAa,EAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAA2C,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE7G,OAAO,KAAK,EAEX,UAAU,EACV,OAAO,EACP,aAAa,EACb,MAAM,EAEN,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,iBAAiB,EAEjB,MAAM,YAAY,CAAC;AAEpB,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,gFAAgF;IAChF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC9C;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnE,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvE,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjE,uFAAuF;IACvF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,cAAc,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC3D,QAAQ,IAAI,SAAS,CAAC;IACtB,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACjC,yFAAyF;IACzF,gBAAgB,IAAI,gBAAgB,GAAG,SAAS,CAAC;IACjD,sFAAsF;IACtF,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,aAAa,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,YAAY,CAAC;IAC5D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;CAClE;AAED,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,iBAAiB,CAc/D,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA6BnD;AAiFD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,iBAAsB,GAAG,gBAAgB,CAqmBlF"}