@code-yeongyu/senpi 2026.8.28 → 2026.8.30-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 (380) hide show
  1. package/CHANGELOG.md +196 -0
  2. package/dist/cli/args.d.ts +2 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +4 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +2 -0
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +50 -1
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +330 -29
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auth-storage.d.ts +1 -0
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +3 -0
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/bash-executor.d.ts.map +1 -1
  18. package/dist/core/bash-executor.js +155 -37
  19. package/dist/core/bash-executor.js.map +1 -1
  20. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  21. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  22. package/dist/core/compaction/compaction-execution.js +121 -0
  23. package/dist/core/compaction/compaction-execution.js.map +1 -0
  24. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  25. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  26. package/dist/core/compaction/compaction-settings.js +17 -0
  27. package/dist/core/compaction/compaction-settings.js.map +1 -0
  28. package/dist/core/compaction/compaction.d.ts +13 -26
  29. package/dist/core/compaction/compaction.d.ts.map +1 -1
  30. package/dist/core/compaction/compaction.js +7 -136
  31. package/dist/core/compaction/compaction.js.map +1 -1
  32. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  33. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  34. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  35. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  36. package/dist/core/compaction-settings-access.d.ts +19 -0
  37. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  38. package/dist/core/compaction-settings-access.js +10 -0
  39. package/dist/core/compaction-settings-access.js.map +1 -0
  40. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  41. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  42. package/dist/core/compaction-settings-resolver.js +46 -0
  43. package/dist/core/compaction-settings-resolver.js.map +1 -0
  44. package/dist/core/credential-accounts.d.ts.map +1 -1
  45. package/dist/core/credential-accounts.js +45 -21
  46. package/dist/core/credential-accounts.js.map +1 -1
  47. package/dist/core/credential-pool/classify.d.ts +6 -1
  48. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  49. package/dist/core/credential-pool/classify.js +22 -5
  50. package/dist/core/credential-pool/classify.js.map +1 -1
  51. package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
  52. package/dist/core/credential-pool/env-slots.js +2 -0
  53. package/dist/core/credential-pool/env-slots.js.map +1 -1
  54. package/dist/core/credential-pool/failover.d.ts +8 -0
  55. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  56. package/dist/core/credential-pool/failover.js +24 -6
  57. package/dist/core/credential-pool/failover.js.map +1 -1
  58. package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
  59. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
  60. package/dist/core/credential-pool/rotation-stream.js +97 -10
  61. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  62. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +17 -0
  63. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  64. package/dist/core/extensions/builtin/compaction/context-pipeline.js +28 -0
  65. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  66. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
  67. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +163 -48
  69. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  70. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  71. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  73. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  74. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  75. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  77. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  78. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  79. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  81. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  82. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  83. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/compaction/index.js +121 -147
  85. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  86. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  87. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  89. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  90. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  91. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  93. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  94. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  95. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  97. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  98. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  99. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  100. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  101. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +56 -0
  102. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  103. package/dist/core/extensions/builtin/compaction/orchestration.js +136 -0
  104. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  105. package/dist/core/extensions/builtin/compaction/policy.d.ts +5 -2
  106. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/compaction/policy.js +43 -26
  108. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  109. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
  111. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  113. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  114. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  115. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  116. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  117. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  118. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  119. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  120. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +22 -0
  121. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  122. package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -0
  123. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  124. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  125. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  126. package/dist/core/extensions/builtin/compaction/speculative.js +7 -196
  127. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  128. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +18 -0
  129. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  130. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +18 -0
  131. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  132. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +36 -0
  133. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/compaction/tool-admission.js +92 -0
  135. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  136. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
  137. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
  138. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  139. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/goal/index.js +7 -0
  141. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  142. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
  144. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  145. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
  147. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  148. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/service-tier.js +13 -0
  150. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  151. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  152. package/dist/core/extensions/builtin/terminal/extension.js +4 -2
  153. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  154. package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
  155. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  156. package/dist/core/extensions/builtin/terminal/manager.js +31 -3
  157. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  158. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
  159. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
  160. package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
  161. package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
  162. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
  163. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
  165. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  166. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
  168. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  169. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  170. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
  171. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  172. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
  173. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
  175. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  176. package/dist/core/model-config-schema.d.ts +4 -4
  177. package/dist/core/model-resolver.js +2 -2
  178. package/dist/core/model-resolver.js.map +1 -1
  179. package/dist/core/model-runtime.d.ts +2 -0
  180. package/dist/core/model-runtime.d.ts.map +1 -1
  181. package/dist/core/model-runtime.js +74 -37
  182. package/dist/core/model-runtime.js.map +1 -1
  183. package/dist/core/retry-fallback/chains.d.ts +23 -1
  184. package/dist/core/retry-fallback/chains.d.ts.map +1 -1
  185. package/dist/core/retry-fallback/chains.js +59 -3
  186. package/dist/core/retry-fallback/chains.js.map +1 -1
  187. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  188. package/dist/core/retry-fallback/controller.js +9 -2
  189. package/dist/core/retry-fallback/controller.js.map +1 -1
  190. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  191. package/dist/core/retry-fallback/settings.js +9 -0
  192. package/dist/core/retry-fallback/settings.js.map +1 -1
  193. package/dist/core/retry-fallback/validate.js +1 -1
  194. package/dist/core/retry-fallback/validate.js.map +1 -1
  195. package/dist/core/sdk.js +1 -1
  196. package/dist/core/sdk.js.map +1 -1
  197. package/dist/core/session-manager.d.ts +9 -0
  198. package/dist/core/session-manager.d.ts.map +1 -1
  199. package/dist/core/session-manager.js +40 -0
  200. package/dist/core/session-manager.js.map +1 -1
  201. package/dist/core/settings-manager.d.ts +15 -85
  202. package/dist/core/settings-manager.d.ts.map +1 -1
  203. package/dist/core/settings-manager.js +15 -17
  204. package/dist/core/settings-manager.js.map +1 -1
  205. package/dist/core/settings-public-types.d.ts +11 -0
  206. package/dist/core/settings-public-types.d.ts.map +1 -0
  207. package/dist/core/settings-public-types.js +2 -0
  208. package/dist/core/settings-public-types.js.map +1 -0
  209. package/dist/core/settings-shapes.d.ts +36 -0
  210. package/dist/core/settings-shapes.d.ts.map +1 -0
  211. package/dist/core/settings-shapes.js +2 -0
  212. package/dist/core/settings-shapes.js.map +1 -0
  213. package/dist/core/shared-host-policy.d.ts +6 -0
  214. package/dist/core/shared-host-policy.d.ts.map +1 -0
  215. package/dist/core/shared-host-policy.js +7 -0
  216. package/dist/core/shared-host-policy.js.map +1 -0
  217. package/dist/core/terminal-settings.d.ts +22 -0
  218. package/dist/core/terminal-settings.d.ts.map +1 -0
  219. package/dist/core/terminal-settings.js +2 -0
  220. package/dist/core/terminal-settings.js.map +1 -0
  221. package/dist/core/tools/bash.d.ts.map +1 -1
  222. package/dist/core/tools/bash.js +97 -15
  223. package/dist/core/tools/bash.js.map +1 -1
  224. package/dist/core/tools/index.d.ts +1 -0
  225. package/dist/core/tools/index.d.ts.map +1 -1
  226. package/dist/core/tools/index.js +8 -0
  227. package/dist/core/tools/index.js.map +1 -1
  228. package/dist/core/tools/output-accumulator.d.ts +1 -1
  229. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  230. package/dist/core/tools/output-accumulator.js +76 -34
  231. package/dist/core/tools/output-accumulator.js.map +1 -1
  232. package/dist/main.d.ts +7 -0
  233. package/dist/main.d.ts.map +1 -1
  234. package/dist/main.js +27 -6
  235. package/dist/main.js.map +1 -1
  236. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/favorite-models-selector.js +2 -2
  238. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  239. package/dist/modes/interactive/components/footer.d.ts +7 -0
  240. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  241. package/dist/modes/interactive/components/footer.js +34 -8
  242. package/dist/modes/interactive/components/footer.js.map +1 -1
  243. package/dist/modes/interactive/grok/chrome.d.ts +2 -0
  244. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  245. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  246. package/dist/modes/interactive/interactive-host-runtime.d.ts +121 -1
  247. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  248. package/dist/modes/interactive/interactive-host-runtime.js +606 -45
  249. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  250. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  251. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  252. package/dist/modes/interactive/interactive-mode.js +390 -239
  253. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  254. package/dist/modes/rpc/connection-handler.d.ts +8 -1
  255. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  256. package/dist/modes/rpc/connection-handler.js +268 -63
  257. package/dist/modes/rpc/connection-handler.js.map +1 -1
  258. package/dist/modes/rpc/host-ensure.d.ts +19 -0
  259. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  260. package/dist/modes/rpc/host-ensure.js +79 -15
  261. package/dist/modes/rpc/host-ensure.js.map +1 -1
  262. package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
  263. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  264. package/dist/modes/rpc/host-lifecycle.js +96 -25
  265. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  266. package/dist/modes/rpc/host-watchdog.d.ts +2 -0
  267. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  268. package/dist/modes/rpc/host-watchdog.js +23 -12
  269. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  270. package/dist/modes/rpc/multi-session-host.js +20 -8
  271. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  272. package/dist/modes/rpc/rpc-client.d.ts +91 -16
  273. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/dist/modes/rpc/rpc-client.js +131 -37
  275. package/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
  277. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  278. package/dist/modes/rpc/rpc-input-validation.js +66 -0
  279. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  280. package/dist/modes/rpc/rpc-mode.d.ts +3 -1
  281. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  282. package/dist/modes/rpc/rpc-mode.js +3 -1
  283. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  284. package/dist/modes/rpc/rpc-types.d.ts +248 -3
  285. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  286. package/dist/modes/rpc/rpc-types.js.map +1 -1
  287. package/dist/modes/rpc/session-binding.d.ts +1 -0
  288. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  289. package/dist/modes/rpc/session-binding.js +21 -1
  290. package/dist/modes/rpc/session-binding.js.map +1 -1
  291. package/dist/modes/rpc/session-command-router.d.ts +22 -0
  292. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  293. package/dist/modes/rpc/session-command-router.js +148 -16
  294. package/dist/modes/rpc/session-command-router.js.map +1 -1
  295. package/dist/modes/rpc/session-event-writer.d.ts +4 -0
  296. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  297. package/dist/modes/rpc/session-event-writer.js +58 -7
  298. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  299. package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
  300. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  301. package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
  302. package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
  303. package/dist/modes/rpc/session-registry.d.ts +17 -2
  304. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  305. package/dist/modes/rpc/session-registry.js +67 -4
  306. package/dist/modes/rpc/session-registry.js.map +1 -1
  307. package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
  308. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
  309. package/dist/modes/rpc/socket-event-fanout.js +84 -0
  310. package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
  311. package/docs/rpc.md +55 -2
  312. package/docs/settings.md +34 -0
  313. package/docs/windows.md +2 -0
  314. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +74 -0
  315. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  316. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
  317. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
  318. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  319. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +6 -3
  320. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  321. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +40 -20
  323. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +3 -3
  325. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  326. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  327. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
  328. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
  330. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  332. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +67 -38
  334. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  335. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +20 -0
  336. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
  337. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
  338. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
  339. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
  340. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  341. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +2 -0
  342. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  346. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  347. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  348. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  349. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  350. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  352. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  364. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  365. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  366. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  367. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +7 -0
  368. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  369. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
  370. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  371. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
  372. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
  373. package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
  374. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  375. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -0
  376. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +19 -0
  378. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  380. package/package.json +7 -7
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Always-on admission cap for tool results.
3
+ *
4
+ * Oversized tool output is the dominant driver of single-step context bursts, so it is
5
+ * capped at the entrance instead of waiting for an emergency/compaction-budget pass
6
+ * (see `tool-truncation.ts`). The full output is spilled to disk and the model gets a
7
+ * head/tail excerpt plus a pointer it can re-read with the read tool.
8
+ */
9
+ import { createHash } from "node:crypto";
10
+ import { mkdirSync, writeFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { estimateTokens } from "../../../compaction/index.js";
13
+ const MAX_ADMISSION_CAP_TOKENS = 50_000;
14
+ const MIN_ADMISSION_CAP_TOKENS = 8192;
15
+ const ADMISSION_CAP_FRACTION = 0.05;
16
+ const HEAD_BUDGET_FRACTION = 0.6;
17
+ const TAIL_BUDGET_FRACTION = 0.2;
18
+ export const TOOL_ADMISSION_MARKER_PREFIX = "[tool result truncated:";
19
+ /**
20
+ * A whole line of the exact shape emitted by `buildMarker`. Anchored per line (`m` flag)
21
+ * so the marker is found wherever it sits - including the middle of a head/tail excerpt -
22
+ * while ordinary output that merely mentions the prefix mid-line is not matched.
23
+ */
24
+ const TOOL_ADMISSION_MARKER_LINE = /^\[tool result truncated: kept \d+ of ~\d+ tokens; full output at .+ - read it with the read tool if needed\]$/m;
25
+ /** True when `text` already carries an admission marker line, at any position. */
26
+ export function containsToolAdmissionMarker(text) {
27
+ return TOOL_ADMISSION_MARKER_LINE.test(text);
28
+ }
29
+ /** Token budget a single tool result may occupy before it is spilled to disk. */
30
+ export function resolveToolResultAdmissionCapTokens(contextWindow) {
31
+ return Math.min(MAX_ADMISSION_CAP_TOKENS, Math.max(MIN_ADMISSION_CAP_TOKENS, Math.floor(ADMISSION_CAP_FRACTION * contextWindow)));
32
+ }
33
+ function estimateTextTokens(text) {
34
+ return estimateTokens({ role: "user", content: text, timestamp: 0 });
35
+ }
36
+ export function buildAdmissionMarker(keptTokens, totalTokens, spillPath) {
37
+ return `${TOOL_ADMISSION_MARKER_PREFIX} kept ${keptTokens} of ~${totalTokens} tokens; full output at ${spillPath} - read it with the read tool if needed]`;
38
+ }
39
+ export function estimateAdmissionMarkerTokens(totalTokens, spillPath) {
40
+ return estimateTextTokens(buildAdmissionMarker(0, totalTokens, spillPath));
41
+ }
42
+ function spillToFile(spillDir, text) {
43
+ mkdirSync(spillDir, { recursive: true });
44
+ const digest = createHash("sha256").update(text).digest("hex").slice(0, 16);
45
+ const spillPath = join(spillDir, `tool-result-${Number.parseInt(digest.slice(0, 10), 16)}-${digest.slice(10, 16)}.txt`);
46
+ writeFileSync(spillPath, text, "utf-8");
47
+ return spillPath;
48
+ }
49
+ function buildExcerpt(text, budgetChars, totalTokens, spillPath) {
50
+ const headChars = Math.max(1, Math.floor(budgetChars * HEAD_BUDGET_FRACTION));
51
+ const tailChars = Math.max(1, Math.floor(budgetChars * TAIL_BUDGET_FRACTION));
52
+ const head = text.slice(0, headChars);
53
+ const tail = text.slice(Math.max(headChars, text.length - tailChars));
54
+ const keptTokens = estimateTextTokens(head) + estimateTextTokens(tail);
55
+ return `${head}\n${buildAdmissionMarker(keptTokens, totalTokens, spillPath)}\n${tail}`;
56
+ }
57
+ /**
58
+ * Cap a tool result at admission time. Under-cap text passes through untouched; over-cap
59
+ * text is written to `spillDir` in full and replaced by a head/tail excerpt.
60
+ *
61
+ * Already-admitted text is returned unchanged: re-spilling an excerpt would persist the
62
+ * excerpt (not the original output) and break the read-back pointer chain. This matters
63
+ * when a model switch shrinks the context window below the cap the excerpt was built for.
64
+ */
65
+ export function admitToolResult(input) {
66
+ const { text, contextWindow, spillDir } = input;
67
+ const capTokens = input.capTokens ?? resolveToolResultAdmissionCapTokens(contextWindow);
68
+ const totalTokens = estimateTextTokens(text);
69
+ if (totalTokens <= capTokens)
70
+ return { text, spilled: false };
71
+ let spillPath;
72
+ try {
73
+ spillPath = spillToFile(spillDir, text);
74
+ }
75
+ catch {
76
+ // Admission is a safety boundary: if persistence fails, still cap model-visible text.
77
+ }
78
+ const pointer = spillPath ?? "(spill unavailable)";
79
+ const charsPerToken = text.length / Math.max(1, totalTokens);
80
+ let budgetChars = Math.floor(capTokens * charsPerToken);
81
+ let excerpt = buildExcerpt(text, budgetChars, totalTokens, pointer);
82
+ while (estimateTextTokens(excerpt) > capTokens && budgetChars > 0) {
83
+ budgetChars = Math.floor(budgetChars / 2);
84
+ excerpt = budgetChars > 0 ? buildExcerpt(text, budgetChars, totalTokens, pointer) : "";
85
+ }
86
+ if (estimateTextTokens(excerpt) > capTokens || budgetChars === 0) {
87
+ const marker = buildAdmissionMarker(0, totalTokens, pointer);
88
+ excerpt = estimateTextTokens(marker) <= capTokens ? marker : "";
89
+ }
90
+ return { text: excerpt, spilled: true, ...(spillPath ? { spillPath } : {}) };
91
+ }
92
+ //# sourceMappingURL=tool-admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-admission.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/tool-admission.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Always-on admission cap for tool results.\n *\n * Oversized tool output is the dominant driver of single-step context bursts, so it is\n * capped at the entrance instead of waiting for an emergency/compaction-budget pass\n * (see `tool-truncation.ts`). The full output is spilled to disk and the model gets a\n * head/tail excerpt plus a pointer it can re-read with the read tool.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { estimateTokens } from \"../../../compaction/index.ts\";\n\nconst MAX_ADMISSION_CAP_TOKENS = 50_000;\nconst MIN_ADMISSION_CAP_TOKENS = 8192;\nconst ADMISSION_CAP_FRACTION = 0.05;\nconst HEAD_BUDGET_FRACTION = 0.6;\nconst TAIL_BUDGET_FRACTION = 0.2;\n\nexport const TOOL_ADMISSION_MARKER_PREFIX = \"[tool result truncated:\";\n\n/**\n * A whole line of the exact shape emitted by `buildMarker`. Anchored per line (`m` flag)\n * so the marker is found wherever it sits - including the middle of a head/tail excerpt -\n * while ordinary output that merely mentions the prefix mid-line is not matched.\n */\nconst TOOL_ADMISSION_MARKER_LINE =\n\t/^\\[tool result truncated: kept \\d+ of ~\\d+ tokens; full output at .+ - read it with the read tool if needed\\]$/m;\n\n/** True when `text` already carries an admission marker line, at any position. */\nexport function containsToolAdmissionMarker(text: string): boolean {\n\treturn TOOL_ADMISSION_MARKER_LINE.test(text);\n}\n\nexport interface AdmitToolResultInput {\n\ttext: string;\n\tcontextWindow: number;\n\tspillDir: string;\n\tcapTokens?: number;\n}\n\nexport interface AdmitToolResultOutput {\n\ttext: string;\n\tspilled: boolean;\n\tspillPath?: string;\n}\n\n/** Token budget a single tool result may occupy before it is spilled to disk. */\nexport function resolveToolResultAdmissionCapTokens(contextWindow: number): number {\n\treturn Math.min(\n\t\tMAX_ADMISSION_CAP_TOKENS,\n\t\tMath.max(MIN_ADMISSION_CAP_TOKENS, Math.floor(ADMISSION_CAP_FRACTION * contextWindow)),\n\t);\n}\n\nfunction estimateTextTokens(text: string): number {\n\treturn estimateTokens({ role: \"user\", content: text, timestamp: 0 });\n}\n\nexport function buildAdmissionMarker(keptTokens: number, totalTokens: number, spillPath: string): string {\n\treturn `${TOOL_ADMISSION_MARKER_PREFIX} kept ${keptTokens} of ~${totalTokens} tokens; full output at ${spillPath} - read it with the read tool if needed]`;\n}\n\nexport function estimateAdmissionMarkerTokens(totalTokens: number, spillPath: string): number {\n\treturn estimateTextTokens(buildAdmissionMarker(0, totalTokens, spillPath));\n}\n\nfunction spillToFile(spillDir: string, text: string): string {\n\tmkdirSync(spillDir, { recursive: true });\n\tconst digest = createHash(\"sha256\").update(text).digest(\"hex\").slice(0, 16);\n\tconst spillPath = join(\n\t\tspillDir,\n\t\t`tool-result-${Number.parseInt(digest.slice(0, 10), 16)}-${digest.slice(10, 16)}.txt`,\n\t);\n\twriteFileSync(spillPath, text, \"utf-8\");\n\treturn spillPath;\n}\n\nfunction buildExcerpt(text: string, budgetChars: number, totalTokens: number, spillPath: string): string {\n\tconst headChars = Math.max(1, Math.floor(budgetChars * HEAD_BUDGET_FRACTION));\n\tconst tailChars = Math.max(1, Math.floor(budgetChars * TAIL_BUDGET_FRACTION));\n\tconst head = text.slice(0, headChars);\n\tconst tail = text.slice(Math.max(headChars, text.length - tailChars));\n\tconst keptTokens = estimateTextTokens(head) + estimateTextTokens(tail);\n\treturn `${head}\\n${buildAdmissionMarker(keptTokens, totalTokens, spillPath)}\\n${tail}`;\n}\n\n/**\n * Cap a tool result at admission time. Under-cap text passes through untouched; over-cap\n * text is written to `spillDir` in full and replaced by a head/tail excerpt.\n *\n * Already-admitted text is returned unchanged: re-spilling an excerpt would persist the\n * excerpt (not the original output) and break the read-back pointer chain. This matters\n * when a model switch shrinks the context window below the cap the excerpt was built for.\n */\nexport function admitToolResult(input: AdmitToolResultInput): AdmitToolResultOutput {\n\tconst { text, contextWindow, spillDir } = input;\n\tconst capTokens = input.capTokens ?? resolveToolResultAdmissionCapTokens(contextWindow);\n\tconst totalTokens = estimateTextTokens(text);\n\tif (totalTokens <= capTokens) return { text, spilled: false };\n\n\tlet spillPath: string | undefined;\n\ttry {\n\t\tspillPath = spillToFile(spillDir, text);\n\t} catch {\n\t\t// Admission is a safety boundary: if persistence fails, still cap model-visible text.\n\t}\n\tconst pointer = spillPath ?? \"(spill unavailable)\";\n\tconst charsPerToken = text.length / Math.max(1, totalTokens);\n\tlet budgetChars = Math.floor(capTokens * charsPerToken);\n\tlet excerpt = buildExcerpt(text, budgetChars, totalTokens, pointer);\n\twhile (estimateTextTokens(excerpt) > capTokens && budgetChars > 0) {\n\t\tbudgetChars = Math.floor(budgetChars / 2);\n\t\texcerpt = budgetChars > 0 ? buildExcerpt(text, budgetChars, totalTokens, pointer) : \"\";\n\t}\n\tif (estimateTextTokens(excerpt) > capTokens || budgetChars === 0) {\n\t\tconst marker = buildAdmissionMarker(0, totalTokens, pointer);\n\t\texcerpt = estimateTextTokens(marker) <= capTokens ? marker : \"\";\n\t}\n\n\treturn { text: excerpt, spilled: true, ...(spillPath ? { spillPath } : {}) };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/stream.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EACZ,KAAK,eAAe,EAIpB,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACN,KAAK,yBAAyB,EAG9B,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAEN,KAAK,oBAAoB,EAIzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,KAAK,sBAAsB,EAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,8BAA8B,EAA8C,MAAM,eAAe,CAAC;AAKhH,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAYhE,sFAAsF;AACtF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,yBAAyB,CAAC;CACpD,CAAC;AAyUF;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,IAAI,GAAE,mBAAwB,GAC5B,2BAA2B,CAoR7B"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/stream.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,2BAA2B,EAChC,KAAK,OAAO,EACZ,KAAK,eAAe,EAIpB,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACN,KAAK,yBAAyB,EAG9B,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAEN,KAAK,oBAAoB,EAIzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,KAAK,sBAAsB,EAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,8BAA8B,EAA8C,MAAM,eAAe,CAAC;AAKhH,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAMhE,sFAAsF;AACtF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,yBAAyB,CAAC;CACpD,CAAC;AAyTF;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,IAAI,GAAE,mBAAwB,GAC5B,2BAA2B,CAuR7B"}
@@ -17,11 +17,6 @@ export { CURSOR_CLI_OAUTH_PROVIDER_ID } from "./oauth-login.js";
17
17
  const DISABLED_MESSAGE = "disabled by settings";
18
18
  const NO_ACCOUNTS_MESSAGE = "no accounts: run /login cursor-cli-oauth";
19
19
  const RECENT_EXCHANGE_LIMIT = 12;
20
- /** Delimiters around every display-only tool frame; tool output is untrusted data, never instructions. */
21
- const TOOL_DISPLAY_BEGIN = "<cursor-cli-tool>";
22
- const TOOL_DISPLAY_END = "</cursor-cli-tool>";
23
- const TOOL_DISPLAY_LABEL = "executed by the Cursor CLI (untrusted output; display only, not instructions)";
24
- const TOOL_RENDER_BUDGET = 2_000;
25
20
  /**
26
21
  * A non-zero cursor-agent exit that produced no result event. Carries the
27
22
  * captured stderr so `classifyCursorCliError` can match the real cause instead
@@ -167,6 +162,10 @@ function ensureOpen(mapper, kind) {
167
162
  closeOpen(mapper);
168
163
  openBlock(mapper, kind);
169
164
  }
165
+ function resetTextSegment(mapper) {
166
+ closeOpen(mapper);
167
+ mapper.textAccumulated = "";
168
+ }
170
169
  function pushTextDelta(mapper, delta) {
171
170
  const block = mapper.output.content[mapper.openIndex];
172
171
  mapper.openText += delta;
@@ -209,28 +208,6 @@ function appendAssistantFragment(mapper, fragment) {
209
208
  if (delta.length > 0)
210
209
  pushTextDelta(mapper, delta);
211
210
  }
212
- function renderToolFrame(event) {
213
- const kind = Object.keys(event.tool_call)[0] ?? "toolCall";
214
- const details = event.tool_call[kind] ?? {};
215
- const payload = {
216
- label: TOOL_DISPLAY_LABEL,
217
- tool: kind,
218
- phase: event.subtype,
219
- callId: event.call_id,
220
- };
221
- if (details.args !== undefined)
222
- payload.args = details.args;
223
- if (details.result !== undefined)
224
- payload.result = details.result;
225
- let body = JSON.stringify(payload) ?? "{}";
226
- if (body.length > TOOL_RENDER_BUDGET)
227
- body = `${body.slice(0, TOOL_RENDER_BUDGET)}...[truncated]`;
228
- return `${TOOL_DISPLAY_BEGIN}${body}${TOOL_DISPLAY_END}\n`;
229
- }
230
- function appendToolFrame(mapper, event) {
231
- ensureOpen(mapper, "tool");
232
- pushTextDelta(mapper, renderToolFrame(event));
233
- }
234
211
  function appendNotice(mapper, message) {
235
212
  ensureOpen(mapper, "text");
236
213
  pushTextDelta(mapper, `${message}\n`);
@@ -559,7 +536,10 @@ export function streamCursorCliOauth(model, context, options, deps = {}) {
559
536
  appendAssistantFragment(mapper, block.text);
560
537
  break;
561
538
  case "tool_call":
562
- appendToolFrame(mapper, event);
539
+ // Preserve the text-segment boundary and cumulative snapshot reset,
540
+ // but do not expose provider protocol frames as assistant text or map
541
+ // them to host tool calls that Senpi could execute a second time.
542
+ resetTextSegment(mapper);
563
543
  break;
564
544
  case "result":
565
545
  if (event.subtype === "success" && !event.is_error) {
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype CredentialStore,\n\tcalculateCost,\n\tcreateAssistantMessageDiagnostic,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { AuthStorage } from \"../../../auth-storage.ts\";\nimport { estimateTokens } from \"../../../compaction/compaction.ts\";\nimport { type CursorCliAccountSlot, type CursorCliOauthCredential, emptyCredential, listAccounts } from \"./accounts.ts\";\nimport { DEFAULT_CURSOR_AFFINITY_KEY } from \"./affinity.ts\";\nimport {\n\ttype CursorAgentExecutableDeps,\n\tdefaultCursorAgentExecutableDeps,\n\tresolveCursorAgentExecutable,\n} from \"./executable.ts\";\nimport { type CursorCliAttemptOptions, type CursorCliFailoverNotice, runCursorCliFailover } from \"./failover.ts\";\nimport {\n\tapplyCursorCliDenyConfig,\n\tCursorCliExecutionRefusalError,\n\tcreateCursorCliGuardrailSession,\n\tresolveCursorCliExecutionPolicy,\n} from \"./guardrails.ts\";\nimport { runInCursorAccountHome } from \"./home-store.ts\";\nimport {\n\tCURSOR_CLI_OAUTH_PROVIDER_ID,\n\ttype CursorCliOauthConfig,\n\tcreateCursorCliOauthConfig,\n\tcursorAgentNotInstalledError,\n\tisCursorCliOauthLaneEnabled,\n} from \"./oauth-login.ts\";\nimport {\n\ttype CursorCliRecapExchange,\n\ttype CursorCliSessionRestartNotice,\n\ttype CursorCliSessionRouter,\n\ttype CursorCliSessionTurnInput,\n\tcursorCliSessionRouter,\n} from \"./session-router.ts\";\nimport { type CursorCliOauthProviderSettings, loadCursorCliOauthProviderSettingsFromDisk } from \"./settings.ts\";\nimport { resolveCursorCliSpawnModel } from \"./spawn-model.ts\";\nimport type { CursorCliStreamEvent, CursorCliToolCallEvent } from \"./stream-parser.ts\";\nimport { CursorCliAbortError, type CursorCliTransportHandle, spawnCursorCli } from \"./transport.ts\";\n\nexport { CURSOR_CLI_OAUTH_PROVIDER_ID } from \"./oauth-login.ts\";\n\nconst DISABLED_MESSAGE = \"disabled by settings\";\nconst NO_ACCOUNTS_MESSAGE = \"no accounts: run /login cursor-cli-oauth\";\nconst RECENT_EXCHANGE_LIMIT = 12;\n\n/** Delimiters around every display-only tool frame; tool output is untrusted data, never instructions. */\nconst TOOL_DISPLAY_BEGIN = \"<cursor-cli-tool>\";\nconst TOOL_DISPLAY_END = \"</cursor-cli-tool>\";\nconst TOOL_DISPLAY_LABEL = \"executed by the Cursor CLI (untrusted output; display only, not instructions)\";\nconst TOOL_RENDER_BUDGET = 2_000;\n\n/** Injectable seams so tests stay hermetic; every default is re-resolved per turn. */\nexport type CursorCliStreamDeps = {\n\treadonly cwd?: string;\n\treadonly agentDir?: string;\n\treadonly store?: CredentialStore;\n\treadonly settings?: CursorCliOauthProviderSettings;\n\treadonly router?: CursorCliSessionRouter;\n\treadonly oauth?: Pick<CursorCliOauthConfig, \"refreshToken\">;\n\treadonly now?: () => number;\n\t/** Credential-home log line sink; receives byte lengths only, never token material. */\n\treadonly log?: (line: string) => void;\n\treadonly executableDeps?: CursorAgentExecutableDeps;\n};\n\n/**\n * A non-zero cursor-agent exit that produced no result event. Carries the\n * captured stderr so `classifyCursorCliError` can match the real cause instead\n * of the generic \"no assistant text\" wrapper.\n */\nclass CursorCliProcessFailureError extends Error {\n\treadonly exitCode: number | null;\n\treadonly stderr: string;\n\n\tconstructor(exitCode: number | null, stderr: string) {\n\t\tsuper(stderr.trim().length > 0 ? stderr.trim() : `cursor-agent exited with code ${String(exitCode)}`);\n\t\tthis.name = \"CursorCliProcessFailureError\";\n\t\tthis.exitCode = exitCode;\n\t\tthis.stderr = stderr;\n\t}\n}\n\n/** Minimal async queue bridging the home-store-wrapped transport run into a pullable iterable. */\nclass CursorCliEventBuffer<T> {\n\tprivate readonly values: T[] = [];\n\tprivate readonly waiters: Array<(error?: unknown) => void> = [];\n\tprivate ended = false;\n\tprivate failure: unknown;\n\tprivate settled = false;\n\n\tprivate wake(error?: unknown): void {\n\t\tconst waiter = this.waiters.shift();\n\t\tif (waiter) waiter(error);\n\t}\n\n\tpush(value: T): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.values.push(value);\n\t\tthis.wake();\n\t}\n\n\tclose(): void {\n\t\tif (this.settled) return;\n\t\tthis.settled = true;\n\t\tthis.ended = true;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter();\n\t}\n\n\tfail(error: unknown): void {\n\t\tif (this.settled) return;\n\t\tthis.settled = true;\n\t\tthis.failure = error;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter(error);\n\t}\n\n\tasync *events(): AsyncGenerator<T, void, unknown> {\n\t\twhile (true) {\n\t\t\tconst value = this.values.shift();\n\t\t\tif (value !== undefined) {\n\t\t\t\tyield value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.failure !== undefined) throw this.failure;\n\t\t\tif (this.ended) return;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tthis.waiters.push((error?: unknown) => {\n\t\t\t\t\tif (error !== undefined) reject(error);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n}\n\ntype OpenBlockKind = \"text\" | \"thinking\" | \"tool\";\n\ntype StreamMapper = {\n\treadonly stream: AssistantMessageEventStream;\n\treadonly output: AssistantMessage;\n\tstarted: boolean;\n\topenKind: OpenBlockKind | undefined;\n\topenIndex: number;\n\topenText: string;\n\t/** Assistant text seen so far in the open text block, for cumulative-snapshot detection. */\n\ttextAccumulated: string;\n};\n\nfunction emptyCursorCliOutput(model: Model<Api>): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction ensureStarted(mapper: StreamMapper): void {\n\tif (mapper.started) return;\n\tmapper.started = true;\n\tmapper.stream.push({ type: \"start\", partial: mapper.output });\n}\n\nfunction openBlock(mapper: StreamMapper, kind: OpenBlockKind): void {\n\tensureStarted(mapper);\n\tif (kind === \"thinking\") {\n\t\tmapper.output.content.push({ type: \"thinking\", thinking: \"\" });\n\t} else {\n\t\tmapper.output.content.push({ type: \"text\", text: \"\" });\n\t}\n\tmapper.openKind = kind;\n\tmapper.openIndex = mapper.output.content.length - 1;\n\tmapper.openText = \"\";\n\tmapper.textAccumulated = \"\";\n\tmapper.stream.push({\n\t\ttype: kind === \"thinking\" ? \"thinking_start\" : \"text_start\",\n\t\tcontentIndex: mapper.openIndex,\n\t\tpartial: mapper.output,\n\t});\n}\n\nfunction closeOpen(mapper: StreamMapper): void {\n\tif (mapper.openKind === undefined) return;\n\tconst block = mapper.output.content[mapper.openIndex];\n\tif (mapper.openKind === \"thinking\") {\n\t\tif (block !== undefined && block.type === \"thinking\") block.thinking = mapper.openText;\n\t\tmapper.stream.push({\n\t\t\ttype: \"thinking_end\",\n\t\t\tcontentIndex: mapper.openIndex,\n\t\t\tcontent: mapper.openText,\n\t\t\tpartial: mapper.output,\n\t\t});\n\t} else {\n\t\tif (block !== undefined && block.type === \"text\") block.text = mapper.openText;\n\t\tmapper.stream.push({\n\t\t\ttype: \"text_end\",\n\t\t\tcontentIndex: mapper.openIndex,\n\t\t\tcontent: mapper.openText,\n\t\t\tpartial: mapper.output,\n\t\t});\n\t}\n\tmapper.openKind = undefined;\n}\n\nfunction ensureOpen(mapper: StreamMapper, kind: OpenBlockKind): void {\n\tif (mapper.openKind === kind) return;\n\tcloseOpen(mapper);\n\topenBlock(mapper, kind);\n}\n\nfunction pushTextDelta(mapper: StreamMapper, delta: string): void {\n\tconst block = mapper.output.content[mapper.openIndex];\n\tmapper.openText += delta;\n\tif (block !== undefined && block.type === \"text\") block.text = mapper.openText;\n\tmapper.stream.push({ type: \"text_delta\", contentIndex: mapper.openIndex, delta, partial: mapper.output });\n}\n\nfunction pushThinkingDelta(mapper: StreamMapper, delta: string): void {\n\tconst block = mapper.output.content[mapper.openIndex];\n\tmapper.openText += delta;\n\tif (block !== undefined && block.type === \"thinking\") block.thinking = mapper.openText;\n\tmapper.stream.push({\n\t\ttype: \"thinking_delta\",\n\t\tcontentIndex: mapper.openIndex,\n\t\tdelta,\n\t\tpartial: mapper.output,\n\t});\n}\n\n/**\n * Appends one assistant fragment as a text delta. The CLI streams partial\n * output deltas and then repeats the full message in a final frame, so a\n * fragment that already starts with the accumulated text is the cumulative\n * snapshot: replace instead of appending so the answer is never duplicated.\n */\nfunction appendAssistantFragment(mapper: StreamMapper, fragment: string): void {\n\tif (fragment.length === 0) return;\n\tensureOpen(mapper, \"text\");\n\tlet delta: string;\n\tif (\n\t\tfragment.length >= mapper.textAccumulated.length &&\n\t\t(mapper.textAccumulated.length === 0 || fragment.startsWith(mapper.textAccumulated))\n\t) {\n\t\tdelta = fragment.slice(mapper.textAccumulated.length);\n\t\tmapper.textAccumulated = fragment;\n\t} else {\n\t\tdelta = fragment;\n\t\tmapper.textAccumulated += fragment;\n\t}\n\tif (delta.length > 0) pushTextDelta(mapper, delta);\n}\n\nfunction renderToolFrame(event: CursorCliToolCallEvent): string {\n\tconst kind = Object.keys(event.tool_call)[0] ?? \"toolCall\";\n\tconst details = event.tool_call[kind as `${string}ToolCall`] ?? {};\n\tconst payload: Record<string, unknown> = {\n\t\tlabel: TOOL_DISPLAY_LABEL,\n\t\ttool: kind,\n\t\tphase: event.subtype,\n\t\tcallId: event.call_id,\n\t};\n\tif (details.args !== undefined) payload.args = details.args;\n\tif (details.result !== undefined) payload.result = details.result;\n\tlet body = JSON.stringify(payload) ?? \"{}\";\n\tif (body.length > TOOL_RENDER_BUDGET) body = `${body.slice(0, TOOL_RENDER_BUDGET)}...[truncated]`;\n\treturn `${TOOL_DISPLAY_BEGIN}${body}${TOOL_DISPLAY_END}\\n`;\n}\n\nfunction appendToolFrame(mapper: StreamMapper, event: CursorCliToolCallEvent): void {\n\tensureOpen(mapper, \"tool\");\n\tpushTextDelta(mapper, renderToolFrame(event));\n}\n\nfunction appendNotice(mapper: StreamMapper, message: string): void {\n\tensureOpen(mapper, \"text\");\n\tpushTextDelta(mapper, `${message}\\n`);\n}\n\n/**\n * Records the result event: senpi's own token estimate of the payload it sent,\n * the CLI's output tokens, and the CLI's input/cache numbers quarantined in a\n * telemetry diagnostic. estimateContextTokens treats the last assistant usage\n * as the authoritative context base, so CLI-side context numbers must never\n * reach `usage` or senpi would demand a compaction only the CLI could perform.\n */\nfunction applyResultEvent(\n\tmapper: StreamMapper,\n\tmodel: Model<Api>,\n\tsentPromptTokens: number,\n\tusage: {\n\t\tinputTokens: number;\n\t\toutputTokens: number;\n\t\tcacheReadTokens: number;\n\t\tcacheWriteTokens: number;\n\t},\n\trequestId: string,\n\tdurationMs: number,\n): void {\n\tconst output = mapper.output;\n\toutput.usage.input = sentPromptTokens;\n\toutput.usage.output = usage.outputTokens;\n\toutput.usage.cacheRead = 0;\n\toutput.usage.cacheWrite = 0;\n\toutput.usage.totalTokens = 0;\n\toutput.usage.cost = calculateCost(model, output.usage);\n\toutput.stopReason = \"stop\";\n\toutput.diagnostics = [\n\t\t...(output.diagnostics ?? []),\n\t\tcreateAssistantMessageDiagnostic(\n\t\t\t\"cursor_cli_oauth_cli_usage\",\n\t\t\t\"cursor-agent reported usage (telemetry only; never used for senpi context accounting)\",\n\t\t\t{\n\t\t\t\tinputTokens: usage.inputTokens,\n\t\t\t\toutputTokens: usage.outputTokens,\n\t\t\t\tcacheReadTokens: usage.cacheReadTokens,\n\t\t\t\tcacheWriteTokens: usage.cacheWriteTokens,\n\t\t\t\trequestId,\n\t\t\t\tdurationMs,\n\t\t\t},\n\t\t),\n\t];\n}\n\nfunction blockText(blocks: readonly unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const block of blocks) {\n\t\tif (typeof block !== \"object\" || block === null) continue;\n\t\tconst candidate = block as { type?: unknown; text?: unknown };\n\t\tif (candidate.type === \"text\" && typeof candidate.text === \"string\" && candidate.text.length > 0) {\n\t\t\tparts.push(candidate.text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\");\n}\n\nfunction lastUserPrompt(context: Context): string {\n\tfor (let index = context.messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = context.messages[index];\n\t\tif (message === undefined || message.role !== \"user\") continue;\n\t\treturn typeof message.content === \"string\" ? message.content : blockText(message.content);\n\t}\n\tthrow new Error(\"cursor-cli-oauth needs a user message to prompt the Cursor CLI\");\n}\n\nfunction recapExchanges(context: Context): CursorCliRecapExchange[] {\n\tconst exchanges: CursorCliRecapExchange[] = [];\n\tfor (const message of context.messages) {\n\t\tif (message.role === \"user\") {\n\t\t\tconst text = typeof message.content === \"string\" ? message.content : blockText(message.content);\n\t\t\tif (text.length > 0) exchanges.push({ role: \"user\", text });\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tconst text = blockText(message.content);\n\t\t\tif (text.length > 0) exchanges.push({ role: \"assistant\", text });\n\t\t}\n\t}\n\treturn exchanges.slice(-RECENT_EXCHANGE_LIMIT);\n}\n\nfunction isFailoverNotice(event: unknown): event is CursorCliFailoverNotice {\n\treturn (event as { type?: unknown }).type === \"cursor_account_changed\";\n}\n\nfunction isRestartNotice(event: unknown): event is CursorCliSessionRestartNotice {\n\treturn (event as { type?: unknown }).type === \"cursor_chat_restarted\";\n}\n\nfunction turnErrorMessage(error: unknown): string {\n\t// Failover wraps every surfaced failure and the router hands classification\n\t// inputs around as { thrown } records; the innermost cause is what the user needs.\n\tlet detail = error;\n\tfor (let depth = 0; depth < 3 && typeof detail === \"object\" && detail !== null; depth += 1) {\n\t\tconst wrapper = detail as { original?: unknown; thrown?: unknown };\n\t\tif (wrapper.original !== undefined) detail = wrapper.original;\n\t\telse if (wrapper.thrown !== undefined) detail = wrapper.thrown;\n\t\telse break;\n\t}\n\tif (detail instanceof Error) return detail.message;\n\tif (typeof detail === \"string\") return detail;\n\tconst message = (detail as { message?: unknown } | null)?.message;\n\treturn typeof message === \"string\" && message.length > 0 ? message : \"Cursor CLI turn failed\";\n}\n\n/**\n * Streams one Cursor CLI print-mode turn onto senpi's assistant event stream.\n * The CLI owns tool execution; senpi owns the context and reports only its own\n * token estimates, so no CLI-side number ever feeds compaction accounting.\n */\nexport function streamCursorCliOauth(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n\tdeps: CursorCliStreamDeps = {},\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\tvoid (async () => {\n\t\tconst mapper: StreamMapper = {\n\t\t\tstream,\n\t\t\toutput: emptyCursorCliOutput(model),\n\t\t\tstarted: false,\n\t\t\topenKind: undefined,\n\t\t\topenIndex: -1,\n\t\t\topenText: \"\",\n\t\t\ttextAccumulated: \"\",\n\t\t};\n\t\tconst now = deps.now ?? Date.now;\n\t\tconst cwdDirectory = deps.cwd ?? process.cwd();\n\t\tconst agentDir = deps.agentDir ?? getAgentDir();\n\t\tconst store = deps.store ?? AuthStorage.create();\n\t\tconst router = deps.router ?? cursorCliSessionRouter;\n\t\tconst signal = options?.signal;\n\t\tlet wasAborted = signal?.aborted === true;\n\t\tlet sentPromptTokens = 0;\n\t\tlet runningHandle: CursorCliTransportHandle | undefined;\n\t\tlet handleRunning = false;\n\t\tconst onAbort = (): void => {\n\t\t\twasAborted = true;\n\t\t};\n\t\tif (!wasAborted) signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\t// Fresh per turn: settings, credentials, and executable resolution are\n\t\t\t// never cached across turns, so back-to-back turns observe changes.\n\t\t\tconst settings = deps.settings ?? loadCursorCliOauthProviderSettingsFromDisk(cwdDirectory);\n\t\t\t// An explicit `enabled: false` is the kill switch; the flagless ambient\n\t\t\t// case is refused below, once the stored slots are known, so the turn path\n\t\t\t// and `assessConfiguration` share one opt-in rule.\n\t\t\tif (settings.explicitlyDisabled) throw new Error(DISABLED_MESSAGE);\n\t\t\tconst executableDeps: CursorAgentExecutableDeps = {\n\t\t\t\t...defaultCursorAgentExecutableDeps(),\n\t\t\t\tsettings: { executablePath: settings.executablePath },\n\t\t\t};\n\t\t\t// The executable gates the TURN before any guardrail or auth work: the\n\t\t\t// oauth check keeps a credential-backed lane selectable so turns reach\n\t\t\t// this point, and `cursor-agent not installed` + the install guidance\n\t\t\t// must originate here - before a spawn could report it without the marker.\n\t\t\ttry {\n\t\t\t\tresolveCursorAgentExecutable(deps.executableDeps ?? executableDeps);\n\t\t\t} catch (error) {\n\t\t\t\tthrow cursorAgentNotInstalledError(error);\n\t\t\t}\n\t\t\t// Guardrails decide before any spawn: an unacknowledged force attempt is\n\t\t\t// the turn's error outcome, and only the policy's force/plan/sandbox\n\t\t\t// verdict reaches the argv. Warnings surface as turn notices.\n\t\t\tconst guardrailSession = createCursorCliGuardrailSession();\n\t\t\tconst policy = resolveCursorCliExecutionPolicy(\n\t\t\t\t{\n\t\t\t\t\tforceExecution: settings.forceExecution,\n\t\t\t\t\tnoApprovalAcknowledgedAt: settings.noApprovalAcknowledgedAt,\n\t\t\t\t\texecutionMode: settings.executionMode,\n\t\t\t\t\tsandboxMode: settings.sandboxMode,\n\t\t\t\t},\n\t\t\t\tguardrailSession,\n\t\t\t\tsettings.denyCommands ?? [],\n\t\t\t);\n\t\t\tif (policy.status === \"refused\") throw new CursorCliExecutionRefusalError(policy.refusal);\n\t\t\tfor (const warning of policy.warnings) appendNotice(mapper, warning.message);\n\t\t\tconst stored = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\tconst storedAccounts = stored?.type === \"oauth\" ? listAccounts(stored as CursorCliOauthCredential) : [];\n\t\t\tif (!isCursorCliOauthLaneEnabled(settings, storedAccounts.length)) throw new Error(DISABLED_MESSAGE);\n\t\t\tif (storedAccounts.length === 0) throw new Error(NO_ACCOUNTS_MESSAGE);\n\n\t\t\tconst prompt = lastUserPrompt(context);\n\t\t\tconst senpiSessionId = options?.affinitySessionId ?? options?.sessionId ?? DEFAULT_CURSOR_AFFINITY_KEY;\n\t\t\tconst spawnModel = resolveCursorCliSpawnModel(model as Model<\"cursor-agent\">, options?.thinkingSelection);\n\t\t\tconst turnInput: CursorCliSessionTurnInput = {\n\t\t\t\tprompt,\n\t\t\t\tmodel: spawnModel,\n\t\t\t\trecentExchanges: recapExchanges(context),\n\t\t\t};\n\n\t\t\tconst spawnAndStream = (\n\t\t\t\tattempt: { prompt: string; resumeChatId: string | undefined },\n\t\t\t\tslot: CursorCliAccountSlot,\n\t\t\t): AsyncIterable<CursorCliStreamEvent> => {\n\t\t\t\tsentPromptTokens = estimateTokens({\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: attempt.prompt,\n\t\t\t\t\ttimestamp: now(),\n\t\t\t\t} satisfies AgentMessage);\n\t\t\t\tconst buffer = new CursorCliEventBuffer<CursorCliStreamEvent>();\n\t\t\t\tvoid (async () => {\n\t\t\t\t\tlet sawResult = false;\n\t\t\t\t\t// Malformed events are held until the exit outcome is known: a\n\t\t\t\t\t// non-zero exit without a result means the captured stderr is the\n\t\t\t\t\t// real cause, and the parser's trailing incomplete_stream event\n\t\t\t\t\t// would otherwise mask it.\n\t\t\t\t\tconst heldMalformed: CursorCliStreamEvent[] = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait runInCursorAccountHome(\n\t\t\t\t\t\t\tagentDir,\n\t\t\t\t\t\t\tslot,\n\t\t\t\t\t\t\tasync ({ home }) => {\n\t\t\t\t\t\t\t\t// The CLI rewrites cli-config.json during every invocation, so the\n\t\t\t\t\t\t\t\t// deny list must ride the same per-spawn cadence as the home-store\n\t\t\t\t\t\t\t\t// auth.json preparation directly above this spawn.\n\t\t\t\t\t\t\t\tapplyCursorCliDenyConfig(home, policy.denyCommands);\n\t\t\t\t\t\t\t\tconst handle = spawnCursorCli({\n\t\t\t\t\t\t\t\t\tprompt: attempt.prompt,\n\t\t\t\t\t\t\t\t\tmodel: spawnModel,\n\t\t\t\t\t\t\t\t\tresumeChatId: attempt.resumeChatId,\n\t\t\t\t\t\t\t\t\tforce: policy.force,\n\t\t\t\t\t\t\t\t\texecutionMode: policy.executionMode,\n\t\t\t\t\t\t\t\t\tsandboxMode: policy.sandboxMode,\n\t\t\t\t\t\t\t\t\taccountHome: home,\n\t\t\t\t\t\t\t\t\tcwd: cwdDirectory,\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\texecutableDeps: deps.executableDeps ?? executableDeps,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\trunningHandle = handle;\n\t\t\t\t\t\t\t\thandleRunning = true;\n\t\t\t\t\t\t\t\tif (wasAborted) handle.abort();\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tfor await (const event of handle.events) {\n\t\t\t\t\t\t\t\t\t\tif (event instanceof CursorCliAbortError) {\n\t\t\t\t\t\t\t\t\t\t\tbuffer.fail(event);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (event.type === \"result\") sawResult = true;\n\t\t\t\t\t\t\t\t\t\tif (event.type === \"malformed_stream\") {\n\t\t\t\t\t\t\t\t\t\t\theldMalformed.push(event);\n\t\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbuffer.push(event);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await handle.completed;\n\t\t\t\t\t\t\t\t\tif (outcome.type === \"completed\" && outcome.exitCode !== 0 && !sawResult) {\n\t\t\t\t\t\t\t\t\t\tbuffer.fail(new CursorCliProcessFailureError(outcome.exitCode, outcome.stderr));\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfor (const event of heldMalformed) buffer.push(event);\n\t\t\t\t\t\t\t\t\tbuffer.close();\n\t\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\t\thandleRunning = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdeps.log,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffer.close();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tbuffer.fail(error);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t\treturn buffer.events();\n\t\t\t};\n\n\t\t\tconst turn = runCursorCliFailover<CursorCliStreamEvent | CursorCliSessionRestartNotice>({\n\t\t\t\tstore,\n\t\t\t\tproviderId: CURSOR_CLI_OAUTH_PROVIDER_ID,\n\t\t\t\taffinity: {\n\t\t\t\t\tsessionId: senpiSessionId,\n\t\t\t\t\tpinnedAccount: settings.pinnedAccount,\n\t\t\t\t\tnow: now(),\n\t\t\t\t},\n\t\t\t\tnow: () => now(),\n\t\t\t\trunAttempt: async (selected, _options: CursorCliAttemptOptions) => {\n\t\t\t\t\tlet slot = selected;\n\t\t\t\t\tconst current = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\t\t\tif (current?.type === \"oauth\") {\n\t\t\t\t\t\tconst fresh = (current as CursorCliOauthCredential).accounts?.find(\n\t\t\t\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (fresh) slot = fresh;\n\t\t\t\t\t}\n\t\t\t\t\t// An expired access token would classify as auth_error and block the\n\t\t\t\t\t// account until re-login; refresh it while the refresh token exists.\n\t\t\t\t\tif (now() >= slot.expires) {\n\t\t\t\t\t\tconst oauth =\n\t\t\t\t\t\t\tdeps.oauth ??\n\t\t\t\t\t\t\tcreateCursorCliOauthConfig({\n\t\t\t\t\t\t\t\treadCurrent: () => store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),\n\t\t\t\t\t\t\t\treadSettings: () => settings,\n\t\t\t\t\t\t\t\tresolveExecutable: (oauthSettings) =>\n\t\t\t\t\t\t\t\t\tresolveCursorAgentExecutable({\n\t\t\t\t\t\t\t\t\t\t...(deps.executableDeps ?? executableDeps),\n\t\t\t\t\t\t\t\t\t\tsettings: { executablePath: oauthSettings.executablePath },\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tconst storedCredential =\n\t\t\t\t\t\t\tcurrent?.type === \"oauth\" ? (current as CursorCliOauthCredential) : emptyCredential();\n\t\t\t\t\t\tconst refreshed = await oauth.refreshToken(storedCredential, signal ?? new AbortController().signal);\n\t\t\t\t\t\t// refreshToken re-applies the sentinel fields over the stored credential,\n\t\t\t\t\t\t// so the result keeps the persisted oauth shape.\n\t\t\t\t\t\tawait store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async () => refreshed as CursorCliOauthCredential);\n\t\t\t\t\t\tconst reread = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\t\t\t\tconst updated =\n\t\t\t\t\t\t\treread?.type === \"oauth\"\n\t\t\t\t\t\t\t\t? (reread as CursorCliOauthCredential).accounts?.find(\n\t\t\t\t\t\t\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!updated) {\n\t\t\t\t\t\t\tthrow new Error(`cursor-cli-oauth account '${slot.name}' disappeared during token refresh`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tslot = updated;\n\t\t\t\t\t}\n\t\t\t\t\t// Cross-account chats live in each account's HOME, so a fresh-chat\n\t\t\t\t\t// failover needs no flag here: the router resumes only its own account's chat.\n\t\t\t\t\treturn router.runTurn(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsenpiSessionId,\n\t\t\t\t\t\t\taccountName: slot.name,\n\t\t\t\t\t\t\trunAttempt: (attempt) => spawnAndStream(attempt, slot),\n\t\t\t\t\t\t\tresumeMode: settings.resumeMode,\n\t\t\t\t\t\t\tcontextRecapOnModelSwitch: settings.contextRecapOnModelSwitch,\n\t\t\t\t\t\t\tnow: () => now(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tturnInput,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfor await (const event of turn) {\n\t\t\t\tif (isFailoverNotice(event) || isRestartNotice(event)) {\n\t\t\t\t\tappendNotice(mapper, event.message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"system\":\n\t\t\t\t\t\t// The session router already recorded chat id and model from init.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking\":\n\t\t\t\t\t\tif (event.subtype === \"completed\") {\n\t\t\t\t\t\t\tif (mapper.openKind === \"thinking\") closeOpen(mapper);\n\t\t\t\t\t\t} else if (event.text.length > 0) {\n\t\t\t\t\t\t\tensureOpen(mapper, \"thinking\");\n\t\t\t\t\t\t\tpushThinkingDelta(mapper, event.text);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant\":\n\t\t\t\t\t\tfor (const block of event.message.content) appendAssistantFragment(mapper, block.text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tool_call\":\n\t\t\t\t\t\tappendToolFrame(mapper, event);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\tif (event.subtype === \"success\" && !event.is_error) {\n\t\t\t\t\t\t\tapplyResultEvent(\n\t\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tsentPromptTokens,\n\t\t\t\t\t\t\t\tevent.usage,\n\t\t\t\t\t\t\t\tevent.request_id,\n\t\t\t\t\t\t\t\tevent.duration_ms,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// malformed_stream events are converted to failures inside the\n\t\t\t\t\t\t// session router and never reach this loop.\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseOpen(mapper);\n\t\t\tstream.push({ type: \"done\", reason: \"stop\", message: mapper.output });\n\t\t} catch (error) {\n\t\t\tcloseOpen(mapper);\n\t\t\tconst aborted = wasAborted || signal?.aborted === true;\n\t\t\tmapper.output.stopReason = aborted ? \"aborted\" : \"error\";\n\t\t\tmapper.output.errorMessage = turnErrorMessage(error);\n\t\t\tstream.push({ type: \"error\", reason: mapper.output.stopReason, error: mapper.output });\n\t\t} finally {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (handleRunning) runningHandle?.abort();\n\t\t\tstream.end();\n\t\t}\n\t})();\n\treturn stream;\n}\n"]}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype CredentialStore,\n\tcalculateCost,\n\tcreateAssistantMessageDiagnostic,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { AuthStorage } from \"../../../auth-storage.ts\";\nimport { estimateTokens } from \"../../../compaction/compaction.ts\";\nimport { type CursorCliAccountSlot, type CursorCliOauthCredential, emptyCredential, listAccounts } from \"./accounts.ts\";\nimport { DEFAULT_CURSOR_AFFINITY_KEY } from \"./affinity.ts\";\nimport {\n\ttype CursorAgentExecutableDeps,\n\tdefaultCursorAgentExecutableDeps,\n\tresolveCursorAgentExecutable,\n} from \"./executable.ts\";\nimport { type CursorCliAttemptOptions, type CursorCliFailoverNotice, runCursorCliFailover } from \"./failover.ts\";\nimport {\n\tapplyCursorCliDenyConfig,\n\tCursorCliExecutionRefusalError,\n\tcreateCursorCliGuardrailSession,\n\tresolveCursorCliExecutionPolicy,\n} from \"./guardrails.ts\";\nimport { runInCursorAccountHome } from \"./home-store.ts\";\nimport {\n\tCURSOR_CLI_OAUTH_PROVIDER_ID,\n\ttype CursorCliOauthConfig,\n\tcreateCursorCliOauthConfig,\n\tcursorAgentNotInstalledError,\n\tisCursorCliOauthLaneEnabled,\n} from \"./oauth-login.ts\";\nimport {\n\ttype CursorCliRecapExchange,\n\ttype CursorCliSessionRestartNotice,\n\ttype CursorCliSessionRouter,\n\ttype CursorCliSessionTurnInput,\n\tcursorCliSessionRouter,\n} from \"./session-router.ts\";\nimport { type CursorCliOauthProviderSettings, loadCursorCliOauthProviderSettingsFromDisk } from \"./settings.ts\";\nimport { resolveCursorCliSpawnModel } from \"./spawn-model.ts\";\nimport type { CursorCliStreamEvent } from \"./stream-parser.ts\";\nimport { CursorCliAbortError, type CursorCliTransportHandle, spawnCursorCli } from \"./transport.ts\";\n\nexport { CURSOR_CLI_OAUTH_PROVIDER_ID } from \"./oauth-login.ts\";\n\nconst DISABLED_MESSAGE = \"disabled by settings\";\nconst NO_ACCOUNTS_MESSAGE = \"no accounts: run /login cursor-cli-oauth\";\nconst RECENT_EXCHANGE_LIMIT = 12;\n\n/** Injectable seams so tests stay hermetic; every default is re-resolved per turn. */\nexport type CursorCliStreamDeps = {\n\treadonly cwd?: string;\n\treadonly agentDir?: string;\n\treadonly store?: CredentialStore;\n\treadonly settings?: CursorCliOauthProviderSettings;\n\treadonly router?: CursorCliSessionRouter;\n\treadonly oauth?: Pick<CursorCliOauthConfig, \"refreshToken\">;\n\treadonly now?: () => number;\n\t/** Credential-home log line sink; receives byte lengths only, never token material. */\n\treadonly log?: (line: string) => void;\n\treadonly executableDeps?: CursorAgentExecutableDeps;\n};\n\n/**\n * A non-zero cursor-agent exit that produced no result event. Carries the\n * captured stderr so `classifyCursorCliError` can match the real cause instead\n * of the generic \"no assistant text\" wrapper.\n */\nclass CursorCliProcessFailureError extends Error {\n\treadonly exitCode: number | null;\n\treadonly stderr: string;\n\n\tconstructor(exitCode: number | null, stderr: string) {\n\t\tsuper(stderr.trim().length > 0 ? stderr.trim() : `cursor-agent exited with code ${String(exitCode)}`);\n\t\tthis.name = \"CursorCliProcessFailureError\";\n\t\tthis.exitCode = exitCode;\n\t\tthis.stderr = stderr;\n\t}\n}\n\n/** Minimal async queue bridging the home-store-wrapped transport run into a pullable iterable. */\nclass CursorCliEventBuffer<T> {\n\tprivate readonly values: T[] = [];\n\tprivate readonly waiters: Array<(error?: unknown) => void> = [];\n\tprivate ended = false;\n\tprivate failure: unknown;\n\tprivate settled = false;\n\n\tprivate wake(error?: unknown): void {\n\t\tconst waiter = this.waiters.shift();\n\t\tif (waiter) waiter(error);\n\t}\n\n\tpush(value: T): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.values.push(value);\n\t\tthis.wake();\n\t}\n\n\tclose(): void {\n\t\tif (this.settled) return;\n\t\tthis.settled = true;\n\t\tthis.ended = true;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter();\n\t}\n\n\tfail(error: unknown): void {\n\t\tif (this.settled) return;\n\t\tthis.settled = true;\n\t\tthis.failure = error;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter(error);\n\t}\n\n\tasync *events(): AsyncGenerator<T, void, unknown> {\n\t\twhile (true) {\n\t\t\tconst value = this.values.shift();\n\t\t\tif (value !== undefined) {\n\t\t\t\tyield value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.failure !== undefined) throw this.failure;\n\t\t\tif (this.ended) return;\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tthis.waiters.push((error?: unknown) => {\n\t\t\t\t\tif (error !== undefined) reject(error);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n}\n\ntype OpenBlockKind = \"text\" | \"thinking\" | \"tool\";\n\ntype StreamMapper = {\n\treadonly stream: AssistantMessageEventStream;\n\treadonly output: AssistantMessage;\n\tstarted: boolean;\n\topenKind: OpenBlockKind | undefined;\n\topenIndex: number;\n\topenText: string;\n\t/** Assistant text seen so far in the open text block, for cumulative-snapshot detection. */\n\ttextAccumulated: string;\n};\n\nfunction emptyCursorCliOutput(model: Model<Api>): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction ensureStarted(mapper: StreamMapper): void {\n\tif (mapper.started) return;\n\tmapper.started = true;\n\tmapper.stream.push({ type: \"start\", partial: mapper.output });\n}\n\nfunction openBlock(mapper: StreamMapper, kind: OpenBlockKind): void {\n\tensureStarted(mapper);\n\tif (kind === \"thinking\") {\n\t\tmapper.output.content.push({ type: \"thinking\", thinking: \"\" });\n\t} else {\n\t\tmapper.output.content.push({ type: \"text\", text: \"\" });\n\t}\n\tmapper.openKind = kind;\n\tmapper.openIndex = mapper.output.content.length - 1;\n\tmapper.openText = \"\";\n\tmapper.textAccumulated = \"\";\n\tmapper.stream.push({\n\t\ttype: kind === \"thinking\" ? \"thinking_start\" : \"text_start\",\n\t\tcontentIndex: mapper.openIndex,\n\t\tpartial: mapper.output,\n\t});\n}\n\nfunction closeOpen(mapper: StreamMapper): void {\n\tif (mapper.openKind === undefined) return;\n\tconst block = mapper.output.content[mapper.openIndex];\n\tif (mapper.openKind === \"thinking\") {\n\t\tif (block !== undefined && block.type === \"thinking\") block.thinking = mapper.openText;\n\t\tmapper.stream.push({\n\t\t\ttype: \"thinking_end\",\n\t\t\tcontentIndex: mapper.openIndex,\n\t\t\tcontent: mapper.openText,\n\t\t\tpartial: mapper.output,\n\t\t});\n\t} else {\n\t\tif (block !== undefined && block.type === \"text\") block.text = mapper.openText;\n\t\tmapper.stream.push({\n\t\t\ttype: \"text_end\",\n\t\t\tcontentIndex: mapper.openIndex,\n\t\t\tcontent: mapper.openText,\n\t\t\tpartial: mapper.output,\n\t\t});\n\t}\n\tmapper.openKind = undefined;\n}\n\nfunction ensureOpen(mapper: StreamMapper, kind: OpenBlockKind): void {\n\tif (mapper.openKind === kind) return;\n\tcloseOpen(mapper);\n\topenBlock(mapper, kind);\n}\n\nfunction resetTextSegment(mapper: StreamMapper): void {\n\tcloseOpen(mapper);\n\tmapper.textAccumulated = \"\";\n}\n\nfunction pushTextDelta(mapper: StreamMapper, delta: string): void {\n\tconst block = mapper.output.content[mapper.openIndex];\n\tmapper.openText += delta;\n\tif (block !== undefined && block.type === \"text\") block.text = mapper.openText;\n\tmapper.stream.push({ type: \"text_delta\", contentIndex: mapper.openIndex, delta, partial: mapper.output });\n}\n\nfunction pushThinkingDelta(mapper: StreamMapper, delta: string): void {\n\tconst block = mapper.output.content[mapper.openIndex];\n\tmapper.openText += delta;\n\tif (block !== undefined && block.type === \"thinking\") block.thinking = mapper.openText;\n\tmapper.stream.push({\n\t\ttype: \"thinking_delta\",\n\t\tcontentIndex: mapper.openIndex,\n\t\tdelta,\n\t\tpartial: mapper.output,\n\t});\n}\n\n/**\n * Appends one assistant fragment as a text delta. The CLI streams partial\n * output deltas and then repeats the full message in a final frame, so a\n * fragment that already starts with the accumulated text is the cumulative\n * snapshot: replace instead of appending so the answer is never duplicated.\n */\nfunction appendAssistantFragment(mapper: StreamMapper, fragment: string): void {\n\tif (fragment.length === 0) return;\n\tensureOpen(mapper, \"text\");\n\tlet delta: string;\n\tif (\n\t\tfragment.length >= mapper.textAccumulated.length &&\n\t\t(mapper.textAccumulated.length === 0 || fragment.startsWith(mapper.textAccumulated))\n\t) {\n\t\tdelta = fragment.slice(mapper.textAccumulated.length);\n\t\tmapper.textAccumulated = fragment;\n\t} else {\n\t\tdelta = fragment;\n\t\tmapper.textAccumulated += fragment;\n\t}\n\tif (delta.length > 0) pushTextDelta(mapper, delta);\n}\n\nfunction appendNotice(mapper: StreamMapper, message: string): void {\n\tensureOpen(mapper, \"text\");\n\tpushTextDelta(mapper, `${message}\\n`);\n}\n\n/**\n * Records the result event: senpi's own token estimate of the payload it sent,\n * the CLI's output tokens, and the CLI's input/cache numbers quarantined in a\n * telemetry diagnostic. estimateContextTokens treats the last assistant usage\n * as the authoritative context base, so CLI-side context numbers must never\n * reach `usage` or senpi would demand a compaction only the CLI could perform.\n */\nfunction applyResultEvent(\n\tmapper: StreamMapper,\n\tmodel: Model<Api>,\n\tsentPromptTokens: number,\n\tusage: {\n\t\tinputTokens: number;\n\t\toutputTokens: number;\n\t\tcacheReadTokens: number;\n\t\tcacheWriteTokens: number;\n\t},\n\trequestId: string,\n\tdurationMs: number,\n): void {\n\tconst output = mapper.output;\n\toutput.usage.input = sentPromptTokens;\n\toutput.usage.output = usage.outputTokens;\n\toutput.usage.cacheRead = 0;\n\toutput.usage.cacheWrite = 0;\n\toutput.usage.totalTokens = 0;\n\toutput.usage.cost = calculateCost(model, output.usage);\n\toutput.stopReason = \"stop\";\n\toutput.diagnostics = [\n\t\t...(output.diagnostics ?? []),\n\t\tcreateAssistantMessageDiagnostic(\n\t\t\t\"cursor_cli_oauth_cli_usage\",\n\t\t\t\"cursor-agent reported usage (telemetry only; never used for senpi context accounting)\",\n\t\t\t{\n\t\t\t\tinputTokens: usage.inputTokens,\n\t\t\t\toutputTokens: usage.outputTokens,\n\t\t\t\tcacheReadTokens: usage.cacheReadTokens,\n\t\t\t\tcacheWriteTokens: usage.cacheWriteTokens,\n\t\t\t\trequestId,\n\t\t\t\tdurationMs,\n\t\t\t},\n\t\t),\n\t];\n}\n\nfunction blockText(blocks: readonly unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const block of blocks) {\n\t\tif (typeof block !== \"object\" || block === null) continue;\n\t\tconst candidate = block as { type?: unknown; text?: unknown };\n\t\tif (candidate.type === \"text\" && typeof candidate.text === \"string\" && candidate.text.length > 0) {\n\t\t\tparts.push(candidate.text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\");\n}\n\nfunction lastUserPrompt(context: Context): string {\n\tfor (let index = context.messages.length - 1; index >= 0; index -= 1) {\n\t\tconst message = context.messages[index];\n\t\tif (message === undefined || message.role !== \"user\") continue;\n\t\treturn typeof message.content === \"string\" ? message.content : blockText(message.content);\n\t}\n\tthrow new Error(\"cursor-cli-oauth needs a user message to prompt the Cursor CLI\");\n}\n\nfunction recapExchanges(context: Context): CursorCliRecapExchange[] {\n\tconst exchanges: CursorCliRecapExchange[] = [];\n\tfor (const message of context.messages) {\n\t\tif (message.role === \"user\") {\n\t\t\tconst text = typeof message.content === \"string\" ? message.content : blockText(message.content);\n\t\t\tif (text.length > 0) exchanges.push({ role: \"user\", text });\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tconst text = blockText(message.content);\n\t\t\tif (text.length > 0) exchanges.push({ role: \"assistant\", text });\n\t\t}\n\t}\n\treturn exchanges.slice(-RECENT_EXCHANGE_LIMIT);\n}\n\nfunction isFailoverNotice(event: unknown): event is CursorCliFailoverNotice {\n\treturn (event as { type?: unknown }).type === \"cursor_account_changed\";\n}\n\nfunction isRestartNotice(event: unknown): event is CursorCliSessionRestartNotice {\n\treturn (event as { type?: unknown }).type === \"cursor_chat_restarted\";\n}\n\nfunction turnErrorMessage(error: unknown): string {\n\t// Failover wraps every surfaced failure and the router hands classification\n\t// inputs around as { thrown } records; the innermost cause is what the user needs.\n\tlet detail = error;\n\tfor (let depth = 0; depth < 3 && typeof detail === \"object\" && detail !== null; depth += 1) {\n\t\tconst wrapper = detail as { original?: unknown; thrown?: unknown };\n\t\tif (wrapper.original !== undefined) detail = wrapper.original;\n\t\telse if (wrapper.thrown !== undefined) detail = wrapper.thrown;\n\t\telse break;\n\t}\n\tif (detail instanceof Error) return detail.message;\n\tif (typeof detail === \"string\") return detail;\n\tconst message = (detail as { message?: unknown } | null)?.message;\n\treturn typeof message === \"string\" && message.length > 0 ? message : \"Cursor CLI turn failed\";\n}\n\n/**\n * Streams one Cursor CLI print-mode turn onto senpi's assistant event stream.\n * The CLI owns tool execution; senpi owns the context and reports only its own\n * token estimates, so no CLI-side number ever feeds compaction accounting.\n */\nexport function streamCursorCliOauth(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n\tdeps: CursorCliStreamDeps = {},\n): AssistantMessageEventStream {\n\tconst stream = createAssistantMessageEventStream();\n\tvoid (async () => {\n\t\tconst mapper: StreamMapper = {\n\t\t\tstream,\n\t\t\toutput: emptyCursorCliOutput(model),\n\t\t\tstarted: false,\n\t\t\topenKind: undefined,\n\t\t\topenIndex: -1,\n\t\t\topenText: \"\",\n\t\t\ttextAccumulated: \"\",\n\t\t};\n\t\tconst now = deps.now ?? Date.now;\n\t\tconst cwdDirectory = deps.cwd ?? process.cwd();\n\t\tconst agentDir = deps.agentDir ?? getAgentDir();\n\t\tconst store = deps.store ?? AuthStorage.create();\n\t\tconst router = deps.router ?? cursorCliSessionRouter;\n\t\tconst signal = options?.signal;\n\t\tlet wasAborted = signal?.aborted === true;\n\t\tlet sentPromptTokens = 0;\n\t\tlet runningHandle: CursorCliTransportHandle | undefined;\n\t\tlet handleRunning = false;\n\t\tconst onAbort = (): void => {\n\t\t\twasAborted = true;\n\t\t};\n\t\tif (!wasAborted) signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\ttry {\n\t\t\t// Fresh per turn: settings, credentials, and executable resolution are\n\t\t\t// never cached across turns, so back-to-back turns observe changes.\n\t\t\tconst settings = deps.settings ?? loadCursorCliOauthProviderSettingsFromDisk(cwdDirectory);\n\t\t\t// An explicit `enabled: false` is the kill switch; the flagless ambient\n\t\t\t// case is refused below, once the stored slots are known, so the turn path\n\t\t\t// and `assessConfiguration` share one opt-in rule.\n\t\t\tif (settings.explicitlyDisabled) throw new Error(DISABLED_MESSAGE);\n\t\t\tconst executableDeps: CursorAgentExecutableDeps = {\n\t\t\t\t...defaultCursorAgentExecutableDeps(),\n\t\t\t\tsettings: { executablePath: settings.executablePath },\n\t\t\t};\n\t\t\t// The executable gates the TURN before any guardrail or auth work: the\n\t\t\t// oauth check keeps a credential-backed lane selectable so turns reach\n\t\t\t// this point, and `cursor-agent not installed` + the install guidance\n\t\t\t// must originate here - before a spawn could report it without the marker.\n\t\t\ttry {\n\t\t\t\tresolveCursorAgentExecutable(deps.executableDeps ?? executableDeps);\n\t\t\t} catch (error) {\n\t\t\t\tthrow cursorAgentNotInstalledError(error);\n\t\t\t}\n\t\t\t// Guardrails decide before any spawn: an unacknowledged force attempt is\n\t\t\t// the turn's error outcome, and only the policy's force/plan/sandbox\n\t\t\t// verdict reaches the argv. Warnings surface as turn notices.\n\t\t\tconst guardrailSession = createCursorCliGuardrailSession();\n\t\t\tconst policy = resolveCursorCliExecutionPolicy(\n\t\t\t\t{\n\t\t\t\t\tforceExecution: settings.forceExecution,\n\t\t\t\t\tnoApprovalAcknowledgedAt: settings.noApprovalAcknowledgedAt,\n\t\t\t\t\texecutionMode: settings.executionMode,\n\t\t\t\t\tsandboxMode: settings.sandboxMode,\n\t\t\t\t},\n\t\t\t\tguardrailSession,\n\t\t\t\tsettings.denyCommands ?? [],\n\t\t\t);\n\t\t\tif (policy.status === \"refused\") throw new CursorCliExecutionRefusalError(policy.refusal);\n\t\t\tfor (const warning of policy.warnings) appendNotice(mapper, warning.message);\n\t\t\tconst stored = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\tconst storedAccounts = stored?.type === \"oauth\" ? listAccounts(stored as CursorCliOauthCredential) : [];\n\t\t\tif (!isCursorCliOauthLaneEnabled(settings, storedAccounts.length)) throw new Error(DISABLED_MESSAGE);\n\t\t\tif (storedAccounts.length === 0) throw new Error(NO_ACCOUNTS_MESSAGE);\n\n\t\t\tconst prompt = lastUserPrompt(context);\n\t\t\tconst senpiSessionId = options?.affinitySessionId ?? options?.sessionId ?? DEFAULT_CURSOR_AFFINITY_KEY;\n\t\t\tconst spawnModel = resolveCursorCliSpawnModel(model as Model<\"cursor-agent\">, options?.thinkingSelection);\n\t\t\tconst turnInput: CursorCliSessionTurnInput = {\n\t\t\t\tprompt,\n\t\t\t\tmodel: spawnModel,\n\t\t\t\trecentExchanges: recapExchanges(context),\n\t\t\t};\n\n\t\t\tconst spawnAndStream = (\n\t\t\t\tattempt: { prompt: string; resumeChatId: string | undefined },\n\t\t\t\tslot: CursorCliAccountSlot,\n\t\t\t): AsyncIterable<CursorCliStreamEvent> => {\n\t\t\t\tsentPromptTokens = estimateTokens({\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: attempt.prompt,\n\t\t\t\t\ttimestamp: now(),\n\t\t\t\t} satisfies AgentMessage);\n\t\t\t\tconst buffer = new CursorCliEventBuffer<CursorCliStreamEvent>();\n\t\t\t\tvoid (async () => {\n\t\t\t\t\tlet sawResult = false;\n\t\t\t\t\t// Malformed events are held until the exit outcome is known: a\n\t\t\t\t\t// non-zero exit without a result means the captured stderr is the\n\t\t\t\t\t// real cause, and the parser's trailing incomplete_stream event\n\t\t\t\t\t// would otherwise mask it.\n\t\t\t\t\tconst heldMalformed: CursorCliStreamEvent[] = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait runInCursorAccountHome(\n\t\t\t\t\t\t\tagentDir,\n\t\t\t\t\t\t\tslot,\n\t\t\t\t\t\t\tasync ({ home }) => {\n\t\t\t\t\t\t\t\t// The CLI rewrites cli-config.json during every invocation, so the\n\t\t\t\t\t\t\t\t// deny list must ride the same per-spawn cadence as the home-store\n\t\t\t\t\t\t\t\t// auth.json preparation directly above this spawn.\n\t\t\t\t\t\t\t\tapplyCursorCliDenyConfig(home, policy.denyCommands);\n\t\t\t\t\t\t\t\tconst handle = spawnCursorCli({\n\t\t\t\t\t\t\t\t\tprompt: attempt.prompt,\n\t\t\t\t\t\t\t\t\tmodel: spawnModel,\n\t\t\t\t\t\t\t\t\tresumeChatId: attempt.resumeChatId,\n\t\t\t\t\t\t\t\t\tforce: policy.force,\n\t\t\t\t\t\t\t\t\texecutionMode: policy.executionMode,\n\t\t\t\t\t\t\t\t\tsandboxMode: policy.sandboxMode,\n\t\t\t\t\t\t\t\t\taccountHome: home,\n\t\t\t\t\t\t\t\t\tcwd: cwdDirectory,\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\texecutableDeps: deps.executableDeps ?? executableDeps,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\trunningHandle = handle;\n\t\t\t\t\t\t\t\thandleRunning = true;\n\t\t\t\t\t\t\t\tif (wasAborted) handle.abort();\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tfor await (const event of handle.events) {\n\t\t\t\t\t\t\t\t\t\tif (event instanceof CursorCliAbortError) {\n\t\t\t\t\t\t\t\t\t\t\tbuffer.fail(event);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (event.type === \"result\") sawResult = true;\n\t\t\t\t\t\t\t\t\t\tif (event.type === \"malformed_stream\") {\n\t\t\t\t\t\t\t\t\t\t\theldMalformed.push(event);\n\t\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbuffer.push(event);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await handle.completed;\n\t\t\t\t\t\t\t\t\tif (outcome.type === \"completed\" && outcome.exitCode !== 0 && !sawResult) {\n\t\t\t\t\t\t\t\t\t\tbuffer.fail(new CursorCliProcessFailureError(outcome.exitCode, outcome.stderr));\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfor (const event of heldMalformed) buffer.push(event);\n\t\t\t\t\t\t\t\t\tbuffer.close();\n\t\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\t\thandleRunning = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdeps.log,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffer.close();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tbuffer.fail(error);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t\treturn buffer.events();\n\t\t\t};\n\n\t\t\tconst turn = runCursorCliFailover<CursorCliStreamEvent | CursorCliSessionRestartNotice>({\n\t\t\t\tstore,\n\t\t\t\tproviderId: CURSOR_CLI_OAUTH_PROVIDER_ID,\n\t\t\t\taffinity: {\n\t\t\t\t\tsessionId: senpiSessionId,\n\t\t\t\t\tpinnedAccount: settings.pinnedAccount,\n\t\t\t\t\tnow: now(),\n\t\t\t\t},\n\t\t\t\tnow: () => now(),\n\t\t\t\trunAttempt: async (selected, _options: CursorCliAttemptOptions) => {\n\t\t\t\t\tlet slot = selected;\n\t\t\t\t\tconst current = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\t\t\tif (current?.type === \"oauth\") {\n\t\t\t\t\t\tconst fresh = (current as CursorCliOauthCredential).accounts?.find(\n\t\t\t\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (fresh) slot = fresh;\n\t\t\t\t\t}\n\t\t\t\t\t// An expired access token would classify as auth_error and block the\n\t\t\t\t\t// account until re-login; refresh it while the refresh token exists.\n\t\t\t\t\tif (now() >= slot.expires) {\n\t\t\t\t\t\tconst oauth =\n\t\t\t\t\t\t\tdeps.oauth ??\n\t\t\t\t\t\t\tcreateCursorCliOauthConfig({\n\t\t\t\t\t\t\t\treadCurrent: () => store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),\n\t\t\t\t\t\t\t\treadSettings: () => settings,\n\t\t\t\t\t\t\t\tresolveExecutable: (oauthSettings) =>\n\t\t\t\t\t\t\t\t\tresolveCursorAgentExecutable({\n\t\t\t\t\t\t\t\t\t\t...(deps.executableDeps ?? executableDeps),\n\t\t\t\t\t\t\t\t\t\tsettings: { executablePath: oauthSettings.executablePath },\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tconst storedCredential =\n\t\t\t\t\t\t\tcurrent?.type === \"oauth\" ? (current as CursorCliOauthCredential) : emptyCredential();\n\t\t\t\t\t\tconst refreshed = await oauth.refreshToken(storedCredential, signal ?? new AbortController().signal);\n\t\t\t\t\t\t// refreshToken re-applies the sentinel fields over the stored credential,\n\t\t\t\t\t\t// so the result keeps the persisted oauth shape.\n\t\t\t\t\t\tawait store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async () => refreshed as CursorCliOauthCredential);\n\t\t\t\t\t\tconst reread = await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\t\t\t\t\tconst updated =\n\t\t\t\t\t\t\treread?.type === \"oauth\"\n\t\t\t\t\t\t\t\t? (reread as CursorCliOauthCredential).accounts?.find(\n\t\t\t\t\t\t\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!updated) {\n\t\t\t\t\t\t\tthrow new Error(`cursor-cli-oauth account '${slot.name}' disappeared during token refresh`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tslot = updated;\n\t\t\t\t\t}\n\t\t\t\t\t// Cross-account chats live in each account's HOME, so a fresh-chat\n\t\t\t\t\t// failover needs no flag here: the router resumes only its own account's chat.\n\t\t\t\t\treturn router.runTurn(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsenpiSessionId,\n\t\t\t\t\t\t\taccountName: slot.name,\n\t\t\t\t\t\t\trunAttempt: (attempt) => spawnAndStream(attempt, slot),\n\t\t\t\t\t\t\tresumeMode: settings.resumeMode,\n\t\t\t\t\t\t\tcontextRecapOnModelSwitch: settings.contextRecapOnModelSwitch,\n\t\t\t\t\t\t\tnow: () => now(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tturnInput,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfor await (const event of turn) {\n\t\t\t\tif (isFailoverNotice(event) || isRestartNotice(event)) {\n\t\t\t\t\tappendNotice(mapper, event.message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"system\":\n\t\t\t\t\t\t// The session router already recorded chat id and model from init.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking\":\n\t\t\t\t\t\tif (event.subtype === \"completed\") {\n\t\t\t\t\t\t\tif (mapper.openKind === \"thinking\") closeOpen(mapper);\n\t\t\t\t\t\t} else if (event.text.length > 0) {\n\t\t\t\t\t\t\tensureOpen(mapper, \"thinking\");\n\t\t\t\t\t\t\tpushThinkingDelta(mapper, event.text);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant\":\n\t\t\t\t\t\tfor (const block of event.message.content) appendAssistantFragment(mapper, block.text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tool_call\":\n\t\t\t\t\t\t// Preserve the text-segment boundary and cumulative snapshot reset,\n\t\t\t\t\t\t// but do not expose provider protocol frames as assistant text or map\n\t\t\t\t\t\t// them to host tool calls that Senpi could execute a second time.\n\t\t\t\t\t\tresetTextSegment(mapper);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\tif (event.subtype === \"success\" && !event.is_error) {\n\t\t\t\t\t\t\tapplyResultEvent(\n\t\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tsentPromptTokens,\n\t\t\t\t\t\t\t\tevent.usage,\n\t\t\t\t\t\t\t\tevent.request_id,\n\t\t\t\t\t\t\t\tevent.duration_ms,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// malformed_stream events are converted to failures inside the\n\t\t\t\t\t\t// session router and never reach this loop.\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcloseOpen(mapper);\n\t\t\tstream.push({ type: \"done\", reason: \"stop\", message: mapper.output });\n\t\t} catch (error) {\n\t\t\tcloseOpen(mapper);\n\t\t\tconst aborted = wasAborted || signal?.aborted === true;\n\t\t\tmapper.output.stopReason = aborted ? \"aborted\" : \"error\";\n\t\t\tmapper.output.errorMessage = turnErrorMessage(error);\n\t\t\tstream.push({ type: \"error\", reason: mapper.output.stopReason, error: mapper.output });\n\t\t} finally {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (handleRunning) runningHandle?.abort();\n\t\t\tstream.end();\n\t\t}\n\t})();\n\treturn stream;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAgCrE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoX5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAgCrE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8X5D"}
@@ -246,6 +246,13 @@ export default function goalExtension(pi) {
246
246
  if (!isResumeOfStoppedGoal(ctx, sessionStartReason, goal)) {
247
247
  return false;
248
248
  }
249
+ // RPC switch_session cannot service a nested interactive UI request until the
250
+ // switch response completes. Keep the goal stopped and let the user resume it
251
+ // explicitly after the new session finishes binding.
252
+ if (ctx.mode === "rpc") {
253
+ ctx.ui.notify(`Goal remains ${goal.status} after session resume. Resume it explicitly after the session finishes loading.`, "info");
254
+ return true;
255
+ }
249
256
  const choice = await ctx.ui.select(`Resume ${goal.status} goal?\nGoal: ${goal.objective}`, [
250
257
  RESUME_GOAL_CHOICE,
251
258
  LEAVE_GOAL_STOPPED_CHOICE,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { GOAL_CONTINUATION_MESSAGE_TYPE } from \"../../../messages.ts\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { continueGoalAfterAgentEnd } from \"./agent-end-continuation.ts\";\nimport { GOAL_CACHE_WARMUP_ENTRY_TYPE } from \"./cache-warm.ts\";\nimport { renderGoalCacheWarmupEntry } from \"./cache-warm-renderer.ts\";\nimport { registerGoalCommand } from \"./command-registration.ts\";\nimport { GOAL_CONTINUATION_CAP } from \"./continuation.ts\";\nimport { GoalDirectInputLifecycle } from \"./direct-input-lifecycle.ts\";\nimport { GoalElapsedTicker } from \"./elapsed-ticker.ts\";\nimport { formatGoalForTool, goalStatusLabel } from \"./format.ts\";\nimport { isResumeOfStoppedGoal, queueGoalContinuation } from \"./lifecycle-helpers.ts\";\nimport { GOAL_CONTINUATION_SCHEDULED_EVENT, MonitorAwareGoalContinuation } from \"./monitor-continuation.ts\";\nimport { migrateLegacyGoalFile } from \"./persistence.ts\";\nimport { reengageGoalAfterReload } from \"./reload-reengagement.ts\";\nimport { isStaleExtensionContextError } from \"./stale-context.ts\";\nimport { accountGoalUsage, readGoal, updateGoal } from \"./store.ts\";\nimport { GOAL_STORE_CHANGED_EVENT, isGoalStoreChangedEvent } from \"./store-changed-event.ts\";\nimport { goalStoreRef as buildGoalStoreRef } from \"./store-ref.ts\";\nimport { staleGoalTodoReminder, todoResultAddsOpenTasks } from \"./todo-gate.ts\";\nimport { registerGoalTools } from \"./tool-registration.ts\";\nimport { TurnUsageTracker } from \"./turn-usage.ts\";\nimport type { Goal, GoalAccountingMode, GoalStoreRef } from \"./types.ts\";\nimport { updateGoalUi } from \"./ui.ts\";\nimport { GOAL_WAIT_STATUS_KEY, GoalWaitTicker } from \"./wait-ticker.ts\";\n\nconst RESUME_GOAL_CHOICE = \"Resume goal\";\nconst LEAVE_GOAL_STOPPED_CHOICE = \"Leave stopped\";\n\ntype AgentGoalAccounting = {\n\tgoalId: string;\n\tmeasuredFromMilliseconds: number;\n};\n\nexport default function goalExtension(pi: ExtensionAPI): void {\n\tlet agentTurnInProgress = false;\n\tlet staleGoalReminderSentThisTurn = false;\n\tlet agentGoalAccounting: AgentGoalAccounting | null = null;\n\tlet blockedThisTurnGoalId: string | null = null;\n\tlet completedThisTurnGoalId: string | null = null;\n\tlet continuationPending = false;\n\tlet activeContext: ExtensionContext | undefined;\n\tconst turnUsage = new TurnUsageTracker();\n\t// No stale-ctx swallow here: GoalWaitTicker retires itself on a stale render\n\t// (a ticker that keeps ticking against a retired ctx freezes the footer\n\t// countdown forever); non-stale render errors still propagate.\n\tconst goalWaitTicker = new GoalWaitTicker({\n\t\trender: (renderCtx, status) => renderCtx.ui.setStatus(GOAL_WAIT_STATUS_KEY, status),\n\t});\n\tconst monitorContinuation = new MonitorAwareGoalContinuation(\n\t\tpi,\n\t\t() => continuationPending,\n\t\t() => {\n\t\t\tcontinuationPending = true;\n\t\t},\n\t\tgoalWaitTicker,\n\t);\n\tconst directInputLifecycle = new GoalDirectInputLifecycle({\n\t\tmonitor: monitorContinuation,\n\t\tgoalStoreRef,\n\t\tbeginAgentGoalAccounting,\n\t\trefreshGoalUi: refreshGoalUiBestEffort,\n\t\tresumeAfterSuppressedLoad: (resumeCtx, goal) => queueGoalContinuationForCurrentSession(pi, resumeCtx, goal),\n\t});\n\n\tconst goalTicker = new GoalElapsedTicker({\n\t\trender: (renderCtx, renderGoal, live) => updateGoalUi(renderCtx, renderGoal, live),\n\t});\n\n\tpi.registerEntryRenderer(GOAL_CACHE_WARMUP_ENTRY_TYPE, renderGoalCacheWarmupEntry);\n\tregisterGoalTools(pi, {\n\t\tgoalStoreRef: (ctx) => buildGoalStoreRef(ctx.sessionManager, ctx.cwd),\n\t\taccountCurrentAgentTurn,\n\t\tbeginAgentGoalAccounting: (goal) => {\n\t\t\tmonitorContinuation.noteContinuationStarted();\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t},\n\t\tmarkGoalBlockedThisTurn,\n\t\tmarkGoalCompletedThisTurn,\n\t\trefreshGoalUi,\n\t});\n\tregisterGoalCommand(pi, {\n\t\tgoalStoreRef: (ctx) => buildGoalStoreRef(ctx.sessionManager, ctx.cwd),\n\t\taccountCurrentAgentTurn,\n\t\tbeginAgentGoalAccounting,\n\t\tstopAgentGoalAccounting,\n\t\tclearAgentGoalAccounting,\n\t\tqueueGoalContinuation: (extensionApi, commandCtx, goal) => {\n\t\t\tvoid queueGoalContinuationForCurrentSession(extensionApi, commandCtx, goal);\n\t\t},\n\t\trefreshGoalUi,\n\t});\n\n\tconst unsubscribeGoalStoreChanged =\n\t\tpi.events?.on(GOAL_STORE_CHANGED_EVENT, async (data) => {\n\t\t\tif (!isGoalStoreChangedEvent(data)) return;\n\t\t\tconst ctx = data.ctx ?? activeContext;\n\t\t\tif (\n\t\t\t\tctx === undefined ||\n\t\t\t\tctx.sessionManager.getSessionId() !== data.threadId ||\n\t\t\t\t!ctx.isIdle() ||\n\t\t\t\tctx.hasPendingMessages()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\t\tif (goal?.status !== \"active\") return;\n\t\t\tmonitorContinuation.syncGoal(goal);\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t\trefreshGoalUiBestEffort(ctx, goal);\n\t\t\tpi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT, {\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs: 0,\n\t\t\t\tactiveMonitorCount: 0,\n\t\t\t\twakeSources: {},\n\t\t\t\treason: GOAL_STORE_CHANGED_EVENT,\n\t\t\t});\n\t\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, goal);\n\t\t}) ?? (() => {});\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tactiveContext = ctx;\n\t\tmonitorContinuation.start(ctx);\n\t\tdirectInputLifecycle.reset();\n\t\tconst ref = goalStoreRef(ctx);\n\t\tawait migrateLegacyGoalFile(ref);\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\trefreshGoalUi(ctx, goal);\n\t\tif (await maybePromptResumeStoppedGoal(pi, ctx, event.reason, goal)) {\n\t\t\treturn;\n\t\t}\n\t\tif (goal && event.reason === \"reload\") {\n\t\t\t// A reload retires the extension generation and every armed continuation\n\t\t\t// timer with it. Re-engage through the reload path: stopped goals stay\n\t\t\t// stopped, active goals resume the wait the reload tore down.\n\t\t\tawait reengageGoalAfterReload({\n\t\t\t\tctx,\n\t\t\t\tgoal,\n\t\t\t\tmonitor: monitorContinuation,\n\t\t\t\tcountTrailingContinuations: () => countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch()),\n\t\t\t\tqueueContinuation: () => queueGoalContinuationForCurrentSession(pi, ctx, goal),\n\t\t\t});\n\t\t} else if (goal) {\n\t\t\t// Migration-lite admission: a resumed session carrying a trailing flood of\n\t\t\t// historical continuations must not reignite on load. Skip the auto-queue,\n\t\t\t// leave the goal active (no status rewrite), and tell the user how to resume.\n\t\t\tconst trailingContinuations = countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch());\n\t\t\tif (trailingContinuations >= GOAL_CONTINUATION_CAP) {\n\t\t\t\t// The load-time flood suppression parks the goal without rewriting its\n\t\t\t\t// status, so the only resume signal left is the user's next message.\n\t\t\t\t// Arm the one-shot latch the direct-input lifecycle fires when that\n\t\t\t\t// message is accepted; without it the promise in the notice is a lie\n\t\t\t\t// and the resumed session sits idle until the goal is recreated.\n\t\t\t\tdirectInputLifecycle.armSuppressedLoadResume();\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, goal);\n\t\t\t}\n\t\t}\n\t});\n\n\tpi.on(\"input\", async (event, ctx) => {\n\t\tawait directInputLifecycle.onInput(event, ctx);\n\t});\n\n\tpi.on(\"input_disposition\", async (event, ctx) => {\n\t\tawait directInputLifecycle.onDisposition(event, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async () => {\n\t\tstaleGoalReminderSentThisTurn = false;\n\t});\n\n\t// When the model starts tracking new open todo work while the thread has no\n\t// goal (or only a stale, already-complete one), append a system reminder to\n\t// the todo result so the model registers the goal when the work warrants it.\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (event.toolName !== \"todo\" || event.isError || staleGoalReminderSentThisTurn) return undefined;\n\t\tif (!todoResultAddsOpenTasks(event.details)) return undefined;\n\t\tconst reminder = staleGoalTodoReminder(await readGoal(goalStoreRef(ctx)));\n\t\tif (reminder === undefined) return undefined;\n\t\tstaleGoalReminderSentThisTurn = true;\n\t\treturn { content: [...event.content, { type: \"text\" as const, text: reminder }] };\n\t});\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tconst continuationStarted = continuationPending;\n\t\tcontinuationPending = false;\n\t\tif (continuationStarted) monitorContinuation.noteContinuationStarted();\n\t\tagentTurnInProgress = true;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t\tturnUsage.reset();\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tagentGoalAccounting = null;\n\t\t}\n\t});\n\n\tpi.on(\"message_end\", async (event) => {\n\t\tturnUsage.noteMessageEnd(event.message);\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\tconst mode: GoalAccountingMode =\n\t\t\tblockedThisTurnGoalId !== null\n\t\t\t\t? \"activeOrBlocked\"\n\t\t\t\t: completedThisTurnGoalId === null\n\t\t\t\t\t? \"active\"\n\t\t\t\t\t: \"activeOrComplete\";\n\t\tlet goal = await accountCurrentAgentTurn(ctx, mode, event.messages);\n\t\tagentTurnInProgress = false;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t\tif (event.aborted === true && event.abortSource === \"user\" && goal?.status === \"active\") {\n\t\t\tgoal = await updateGoal(\n\t\t\t\tgoalStoreRef(ctx),\n\t\t\t\t{ status: \"blocked\", reason: \"user interrupted the turn\" },\n\t\t\t\t\"model\",\n\t\t\t);\n\t\t}\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\trefreshGoalUiBestEffort(ctx, goal);\n\t\tconst continuationGoal = await continueGoalAfterAgentEnd(monitorContinuation, { ctx, event, goal });\n\t\tif (continuationGoal !== goal) {\n\t\t\tgoal = continuationGoal;\n\t\t\tsyncContinuationGoal(ctx, goal);\n\t\t}\n\t});\n\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tconst goal = await monitorContinuation.afterAgentSettled();\n\t\tif (goal !== undefined) syncContinuationGoal(ctx, goal);\n\t});\n\n\tpi.on(\"session_abort\", async (_event, ctx) => {\n\t\tcontinuationPending = false;\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status !== \"active\") return;\n\t\tconst accounted = await accountCurrentAgentTurn(ctx, \"active\");\n\t\tif (accounted?.status === \"active\") {\n\t\t\tconst blocked = await updateGoal(\n\t\t\t\tgoalStoreRef(ctx),\n\t\t\t\t{ status: \"blocked\", reason: \"user interrupted the turn\" },\n\t\t\t\t\"model\",\n\t\t\t);\n\t\t\tclearAgentGoalAccounting();\n\t\t\trefreshGoalUiBestEffort(ctx, blocked);\n\t\t}\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tactiveContext = undefined;\n\t\tunsubscribeGoalStoreChanged();\n\t\tif (agentGoalAccounting !== null) {\n\t\t\tawait accountCurrentAgentTurn(ctx, \"active\");\n\t\t}\n\t\tclearAgentGoalAccounting();\n\t\tgoalTicker.stop();\n\t\tmonitorContinuation.dispose();\n\t});\n\n\tasync function maybePromptResumeStoppedGoal(\n\t\tpi: ExtensionAPI,\n\t\tctx: ExtensionContext,\n\t\tsessionStartReason: string,\n\t\tgoal: Goal | null,\n\t): Promise<boolean> {\n\t\tif (!isResumeOfStoppedGoal(ctx, sessionStartReason, goal)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst choice = await ctx.ui.select(`Resume ${goal.status} goal?\\nGoal: ${goal.objective}`, [\n\t\t\tRESUME_GOAL_CHOICE,\n\t\t\tLEAVE_GOAL_STOPPED_CHOICE,\n\t\t]);\n\t\tif (choice !== RESUME_GOAL_CHOICE) return true;\n\n\t\tconst resumed = await updateGoal(goalStoreRef(ctx), { status: \"active\" }, \"user\");\n\t\tbeginAgentGoalAccounting(resumed);\n\t\trefreshGoalUi(ctx, resumed);\n\t\tctx.ui.notify(`Goal ${goalStatusLabel(resumed.status)}\\n${formatGoalForTool(resumed)}`, \"info\");\n\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, resumed);\n\t\treturn true;\n\t}\n\n\tasync function queueGoalContinuationForCurrentSession(\n\t\textensionApi: ExtensionAPI,\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t): Promise<void> {\n\t\tconst continuedGoal = await queueGoalContinuation(extensionApi, ctx, goal, {\n\t\t\tcontinuationPending,\n\t\t\tmarkContinuationPending: () => {\n\t\t\t\tcontinuationPending = true;\n\t\t\t},\n\t\t});\n\t\tif (continuedGoal === null) {\n\t\t\tclearAgentGoalAccounting();\n\t\t\trefreshGoalUiBestEffort(ctx, null);\n\t\t\treturn;\n\t\t}\n\t\tif (continuedGoal.status === goal.status) return;\n\t\tif (continuedGoal.status === \"active\") beginAgentGoalAccounting(continuedGoal);\n\t\telse clearAgentGoalAccounting();\n\t\trefreshGoalUiBestEffort(ctx, continuedGoal);\n\t}\n\n\tfunction beginAgentGoalAccounting(goal: Goal): void {\n\t\tif (goal.status !== \"active\") return;\n\t\tif (agentGoalAccounting?.goalId === goal.id) return;\n\t\tturnUsage.discardPending();\n\t\tagentGoalAccounting = { goalId: goal.id, measuredFromMilliseconds: Date.now() };\n\t}\n\n\tfunction markGoalBlockedThisTurn(goal: Goal): void {\n\t\tif (agentTurnInProgress) blockedThisTurnGoalId = goal.id;\n\t}\n\n\tfunction markGoalCompletedThisTurn(goal: Goal): void {\n\t\tif (!agentTurnInProgress) return;\n\t\tcompletedThisTurnGoalId = goal.id;\n\t\tagentGoalAccounting = { goalId: goal.id, measuredFromMilliseconds: Date.now() };\n\t}\n\n\tfunction stopAgentGoalAccounting(goalId: string): void {\n\t\tif (agentGoalAccounting?.goalId === goalId) {\n\t\t\tagentGoalAccounting = null;\n\t\t}\n\t\tif (blockedThisTurnGoalId === goalId) {\n\t\t\tblockedThisTurnGoalId = null;\n\t\t}\n\t\tif (completedThisTurnGoalId === goalId) {\n\t\t\tcompletedThisTurnGoalId = null;\n\t\t}\n\t}\n\n\tfunction clearAgentGoalAccounting(): void {\n\t\tagentGoalAccounting = null;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t}\n\n\tfunction syncContinuationGoal(ctx: ExtensionContext, goal: Goal | null): void {\n\t\tif (goal?.status === \"active\") beginAgentGoalAccounting(goal);\n\t\telse clearAgentGoalAccounting();\n\t\trefreshGoalUiBestEffort(ctx, goal);\n\t}\n\n\tfunction refreshGoalUi(ctx: ExtensionContext, goal: Goal | null): void {\n\t\tmonitorContinuation.syncGoal(goal);\n\t\tconst accounting = agentGoalAccounting;\n\t\tif (ctx.hasUI && goal?.status === \"active\" && accounting?.goalId === goal.id) {\n\t\t\tgoalTicker.sync(ctx, goal, accounting.measuredFromMilliseconds);\n\t\t\treturn;\n\t\t}\n\t\tgoalTicker.stop();\n\t\tupdateGoalUi(ctx, goal);\n\t}\n\n\tfunction refreshGoalUiBestEffort(ctx: ExtensionContext, goal: Goal | null): void {\n\t\ttry {\n\t\t\trefreshGoalUi(ctx, goal);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync function accountCurrentAgentTurn(\n\t\tctx: ExtensionContext,\n\t\tmode: GoalAccountingMode,\n\t\tagentRunMessages?: unknown[],\n\t): Promise<Goal | null> {\n\t\tconst accounting = agentGoalAccounting;\n\t\tconst ref = goalStoreRef(ctx);\n\t\tif (accounting === null) return readGoal(ref);\n\n\t\tconst usage =\n\t\t\tagentRunMessages === undefined ? turnUsage.takePending() : turnUsage.takeRemaining(agentRunMessages);\n\t\tconst now = Date.now();\n\t\tconst elapsedSeconds = Math.max(0, Math.round((now - accounting.measuredFromMilliseconds) / 1000));\n\t\tconst goal = await accountGoalUsage(ref, usage, elapsedSeconds, mode, accounting.goalId);\n\t\tif (goal?.id === accounting.goalId) {\n\t\t\tagentGoalAccounting = { goalId: accounting.goalId, measuredFromMilliseconds: now };\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\treturn goal;\n\t}\n}\n\n/**\n * Counts goal-continuation entries queued since the most recent real user message\n * in the current branch (mirrors the todo-gate / todo-bridge backward branch read).\n * A real user message is the only reset: the assistant turns in between are exactly\n * the unattended loop this admission guard exists to stop.\n */\nfunction countTrailingGoalContinuationEntries(entries: readonly SessionEntry[]): number {\n\tlet count = 0;\n\tfor (let index = entries.length - 1; index >= 0; index--) {\n\t\tconst entry = entries[index];\n\t\tif (entry?.type === \"message\" && entry.message.role === \"user\") break;\n\t\tif (entry?.type === \"custom_message\" && entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE) count += 1;\n\t}\n\treturn count;\n}\n\nfunction goalStoreRef(ctx: ExtensionContext): GoalStoreRef {\n\treturn buildGoalStoreRef(ctx.sessionManager, ctx.cwd);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { GOAL_CONTINUATION_MESSAGE_TYPE } from \"../../../messages.ts\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { continueGoalAfterAgentEnd } from \"./agent-end-continuation.ts\";\nimport { GOAL_CACHE_WARMUP_ENTRY_TYPE } from \"./cache-warm.ts\";\nimport { renderGoalCacheWarmupEntry } from \"./cache-warm-renderer.ts\";\nimport { registerGoalCommand } from \"./command-registration.ts\";\nimport { GOAL_CONTINUATION_CAP } from \"./continuation.ts\";\nimport { GoalDirectInputLifecycle } from \"./direct-input-lifecycle.ts\";\nimport { GoalElapsedTicker } from \"./elapsed-ticker.ts\";\nimport { formatGoalForTool, goalStatusLabel } from \"./format.ts\";\nimport { isResumeOfStoppedGoal, queueGoalContinuation } from \"./lifecycle-helpers.ts\";\nimport { GOAL_CONTINUATION_SCHEDULED_EVENT, MonitorAwareGoalContinuation } from \"./monitor-continuation.ts\";\nimport { migrateLegacyGoalFile } from \"./persistence.ts\";\nimport { reengageGoalAfterReload } from \"./reload-reengagement.ts\";\nimport { isStaleExtensionContextError } from \"./stale-context.ts\";\nimport { accountGoalUsage, readGoal, updateGoal } from \"./store.ts\";\nimport { GOAL_STORE_CHANGED_EVENT, isGoalStoreChangedEvent } from \"./store-changed-event.ts\";\nimport { goalStoreRef as buildGoalStoreRef } from \"./store-ref.ts\";\nimport { staleGoalTodoReminder, todoResultAddsOpenTasks } from \"./todo-gate.ts\";\nimport { registerGoalTools } from \"./tool-registration.ts\";\nimport { TurnUsageTracker } from \"./turn-usage.ts\";\nimport type { Goal, GoalAccountingMode, GoalStoreRef } from \"./types.ts\";\nimport { updateGoalUi } from \"./ui.ts\";\nimport { GOAL_WAIT_STATUS_KEY, GoalWaitTicker } from \"./wait-ticker.ts\";\n\nconst RESUME_GOAL_CHOICE = \"Resume goal\";\nconst LEAVE_GOAL_STOPPED_CHOICE = \"Leave stopped\";\n\ntype AgentGoalAccounting = {\n\tgoalId: string;\n\tmeasuredFromMilliseconds: number;\n};\n\nexport default function goalExtension(pi: ExtensionAPI): void {\n\tlet agentTurnInProgress = false;\n\tlet staleGoalReminderSentThisTurn = false;\n\tlet agentGoalAccounting: AgentGoalAccounting | null = null;\n\tlet blockedThisTurnGoalId: string | null = null;\n\tlet completedThisTurnGoalId: string | null = null;\n\tlet continuationPending = false;\n\tlet activeContext: ExtensionContext | undefined;\n\tconst turnUsage = new TurnUsageTracker();\n\t// No stale-ctx swallow here: GoalWaitTicker retires itself on a stale render\n\t// (a ticker that keeps ticking against a retired ctx freezes the footer\n\t// countdown forever); non-stale render errors still propagate.\n\tconst goalWaitTicker = new GoalWaitTicker({\n\t\trender: (renderCtx, status) => renderCtx.ui.setStatus(GOAL_WAIT_STATUS_KEY, status),\n\t});\n\tconst monitorContinuation = new MonitorAwareGoalContinuation(\n\t\tpi,\n\t\t() => continuationPending,\n\t\t() => {\n\t\t\tcontinuationPending = true;\n\t\t},\n\t\tgoalWaitTicker,\n\t);\n\tconst directInputLifecycle = new GoalDirectInputLifecycle({\n\t\tmonitor: monitorContinuation,\n\t\tgoalStoreRef,\n\t\tbeginAgentGoalAccounting,\n\t\trefreshGoalUi: refreshGoalUiBestEffort,\n\t\tresumeAfterSuppressedLoad: (resumeCtx, goal) => queueGoalContinuationForCurrentSession(pi, resumeCtx, goal),\n\t});\n\n\tconst goalTicker = new GoalElapsedTicker({\n\t\trender: (renderCtx, renderGoal, live) => updateGoalUi(renderCtx, renderGoal, live),\n\t});\n\n\tpi.registerEntryRenderer(GOAL_CACHE_WARMUP_ENTRY_TYPE, renderGoalCacheWarmupEntry);\n\tregisterGoalTools(pi, {\n\t\tgoalStoreRef: (ctx) => buildGoalStoreRef(ctx.sessionManager, ctx.cwd),\n\t\taccountCurrentAgentTurn,\n\t\tbeginAgentGoalAccounting: (goal) => {\n\t\t\tmonitorContinuation.noteContinuationStarted();\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t},\n\t\tmarkGoalBlockedThisTurn,\n\t\tmarkGoalCompletedThisTurn,\n\t\trefreshGoalUi,\n\t});\n\tregisterGoalCommand(pi, {\n\t\tgoalStoreRef: (ctx) => buildGoalStoreRef(ctx.sessionManager, ctx.cwd),\n\t\taccountCurrentAgentTurn,\n\t\tbeginAgentGoalAccounting,\n\t\tstopAgentGoalAccounting,\n\t\tclearAgentGoalAccounting,\n\t\tqueueGoalContinuation: (extensionApi, commandCtx, goal) => {\n\t\t\tvoid queueGoalContinuationForCurrentSession(extensionApi, commandCtx, goal);\n\t\t},\n\t\trefreshGoalUi,\n\t});\n\n\tconst unsubscribeGoalStoreChanged =\n\t\tpi.events?.on(GOAL_STORE_CHANGED_EVENT, async (data) => {\n\t\t\tif (!isGoalStoreChangedEvent(data)) return;\n\t\t\tconst ctx = data.ctx ?? activeContext;\n\t\t\tif (\n\t\t\t\tctx === undefined ||\n\t\t\t\tctx.sessionManager.getSessionId() !== data.threadId ||\n\t\t\t\t!ctx.isIdle() ||\n\t\t\t\tctx.hasPendingMessages()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\t\tif (goal?.status !== \"active\") return;\n\t\t\tmonitorContinuation.syncGoal(goal);\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t\trefreshGoalUiBestEffort(ctx, goal);\n\t\t\tpi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT, {\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs: 0,\n\t\t\t\tactiveMonitorCount: 0,\n\t\t\t\twakeSources: {},\n\t\t\t\treason: GOAL_STORE_CHANGED_EVENT,\n\t\t\t});\n\t\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, goal);\n\t\t}) ?? (() => {});\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tactiveContext = ctx;\n\t\tmonitorContinuation.start(ctx);\n\t\tdirectInputLifecycle.reset();\n\t\tconst ref = goalStoreRef(ctx);\n\t\tawait migrateLegacyGoalFile(ref);\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\trefreshGoalUi(ctx, goal);\n\t\tif (await maybePromptResumeStoppedGoal(pi, ctx, event.reason, goal)) {\n\t\t\treturn;\n\t\t}\n\t\tif (goal && event.reason === \"reload\") {\n\t\t\t// A reload retires the extension generation and every armed continuation\n\t\t\t// timer with it. Re-engage through the reload path: stopped goals stay\n\t\t\t// stopped, active goals resume the wait the reload tore down.\n\t\t\tawait reengageGoalAfterReload({\n\t\t\t\tctx,\n\t\t\t\tgoal,\n\t\t\t\tmonitor: monitorContinuation,\n\t\t\t\tcountTrailingContinuations: () => countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch()),\n\t\t\t\tqueueContinuation: () => queueGoalContinuationForCurrentSession(pi, ctx, goal),\n\t\t\t});\n\t\t} else if (goal) {\n\t\t\t// Migration-lite admission: a resumed session carrying a trailing flood of\n\t\t\t// historical continuations must not reignite on load. Skip the auto-queue,\n\t\t\t// leave the goal active (no status rewrite), and tell the user how to resume.\n\t\t\tconst trailingContinuations = countTrailingGoalContinuationEntries(ctx.sessionManager.getBranch());\n\t\t\tif (trailingContinuations >= GOAL_CONTINUATION_CAP) {\n\t\t\t\t// The load-time flood suppression parks the goal without rewriting its\n\t\t\t\t// status, so the only resume signal left is the user's next message.\n\t\t\t\t// Arm the one-shot latch the direct-input lifecycle fires when that\n\t\t\t\t// message is accepted; without it the promise in the notice is a lie\n\t\t\t\t// and the resumed session sits idle until the goal is recreated.\n\t\t\t\tdirectInputLifecycle.armSuppressedLoadResume();\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, goal);\n\t\t\t}\n\t\t}\n\t});\n\n\tpi.on(\"input\", async (event, ctx) => {\n\t\tawait directInputLifecycle.onInput(event, ctx);\n\t});\n\n\tpi.on(\"input_disposition\", async (event, ctx) => {\n\t\tawait directInputLifecycle.onDisposition(event, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async () => {\n\t\tstaleGoalReminderSentThisTurn = false;\n\t});\n\n\t// When the model starts tracking new open todo work while the thread has no\n\t// goal (or only a stale, already-complete one), append a system reminder to\n\t// the todo result so the model registers the goal when the work warrants it.\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (event.toolName !== \"todo\" || event.isError || staleGoalReminderSentThisTurn) return undefined;\n\t\tif (!todoResultAddsOpenTasks(event.details)) return undefined;\n\t\tconst reminder = staleGoalTodoReminder(await readGoal(goalStoreRef(ctx)));\n\t\tif (reminder === undefined) return undefined;\n\t\tstaleGoalReminderSentThisTurn = true;\n\t\treturn { content: [...event.content, { type: \"text\" as const, text: reminder }] };\n\t});\n\n\tpi.on(\"agent_start\", async (_event, ctx) => {\n\t\tconst continuationStarted = continuationPending;\n\t\tcontinuationPending = false;\n\t\tif (continuationStarted) monitorContinuation.noteContinuationStarted();\n\t\tagentTurnInProgress = true;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t\tturnUsage.reset();\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tagentGoalAccounting = null;\n\t\t}\n\t});\n\n\tpi.on(\"message_end\", async (event) => {\n\t\tturnUsage.noteMessageEnd(event.message);\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\tconst mode: GoalAccountingMode =\n\t\t\tblockedThisTurnGoalId !== null\n\t\t\t\t? \"activeOrBlocked\"\n\t\t\t\t: completedThisTurnGoalId === null\n\t\t\t\t\t? \"active\"\n\t\t\t\t\t: \"activeOrComplete\";\n\t\tlet goal = await accountCurrentAgentTurn(ctx, mode, event.messages);\n\t\tagentTurnInProgress = false;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t\tif (event.aborted === true && event.abortSource === \"user\" && goal?.status === \"active\") {\n\t\t\tgoal = await updateGoal(\n\t\t\t\tgoalStoreRef(ctx),\n\t\t\t\t{ status: \"blocked\", reason: \"user interrupted the turn\" },\n\t\t\t\t\"model\",\n\t\t\t);\n\t\t}\n\t\tif (goal?.status === \"active\") {\n\t\t\tbeginAgentGoalAccounting(goal);\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\trefreshGoalUiBestEffort(ctx, goal);\n\t\tconst continuationGoal = await continueGoalAfterAgentEnd(monitorContinuation, { ctx, event, goal });\n\t\tif (continuationGoal !== goal) {\n\t\t\tgoal = continuationGoal;\n\t\t\tsyncContinuationGoal(ctx, goal);\n\t\t}\n\t});\n\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tconst goal = await monitorContinuation.afterAgentSettled();\n\t\tif (goal !== undefined) syncContinuationGoal(ctx, goal);\n\t});\n\n\tpi.on(\"session_abort\", async (_event, ctx) => {\n\t\tcontinuationPending = false;\n\t\tconst goal = await readGoal(goalStoreRef(ctx));\n\t\tif (goal?.status !== \"active\") return;\n\t\tconst accounted = await accountCurrentAgentTurn(ctx, \"active\");\n\t\tif (accounted?.status === \"active\") {\n\t\t\tconst blocked = await updateGoal(\n\t\t\t\tgoalStoreRef(ctx),\n\t\t\t\t{ status: \"blocked\", reason: \"user interrupted the turn\" },\n\t\t\t\t\"model\",\n\t\t\t);\n\t\t\tclearAgentGoalAccounting();\n\t\t\trefreshGoalUiBestEffort(ctx, blocked);\n\t\t}\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tactiveContext = undefined;\n\t\tunsubscribeGoalStoreChanged();\n\t\tif (agentGoalAccounting !== null) {\n\t\t\tawait accountCurrentAgentTurn(ctx, \"active\");\n\t\t}\n\t\tclearAgentGoalAccounting();\n\t\tgoalTicker.stop();\n\t\tmonitorContinuation.dispose();\n\t});\n\n\tasync function maybePromptResumeStoppedGoal(\n\t\tpi: ExtensionAPI,\n\t\tctx: ExtensionContext,\n\t\tsessionStartReason: string,\n\t\tgoal: Goal | null,\n\t): Promise<boolean> {\n\t\tif (!isResumeOfStoppedGoal(ctx, sessionStartReason, goal)) {\n\t\t\treturn false;\n\t\t}\n\t\t// RPC switch_session cannot service a nested interactive UI request until the\n\t\t// switch response completes. Keep the goal stopped and let the user resume it\n\t\t// explicitly after the new session finishes binding.\n\t\tif (ctx.mode === \"rpc\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal remains ${goal.status} after session resume. Resume it explicitly after the session finishes loading.`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst choice = await ctx.ui.select(`Resume ${goal.status} goal?\\nGoal: ${goal.objective}`, [\n\t\t\tRESUME_GOAL_CHOICE,\n\t\t\tLEAVE_GOAL_STOPPED_CHOICE,\n\t\t]);\n\t\tif (choice !== RESUME_GOAL_CHOICE) return true;\n\n\t\tconst resumed = await updateGoal(goalStoreRef(ctx), { status: \"active\" }, \"user\");\n\t\tbeginAgentGoalAccounting(resumed);\n\t\trefreshGoalUi(ctx, resumed);\n\t\tctx.ui.notify(`Goal ${goalStatusLabel(resumed.status)}\\n${formatGoalForTool(resumed)}`, \"info\");\n\t\tawait queueGoalContinuationForCurrentSession(pi, ctx, resumed);\n\t\treturn true;\n\t}\n\n\tasync function queueGoalContinuationForCurrentSession(\n\t\textensionApi: ExtensionAPI,\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t): Promise<void> {\n\t\tconst continuedGoal = await queueGoalContinuation(extensionApi, ctx, goal, {\n\t\t\tcontinuationPending,\n\t\t\tmarkContinuationPending: () => {\n\t\t\t\tcontinuationPending = true;\n\t\t\t},\n\t\t});\n\t\tif (continuedGoal === null) {\n\t\t\tclearAgentGoalAccounting();\n\t\t\trefreshGoalUiBestEffort(ctx, null);\n\t\t\treturn;\n\t\t}\n\t\tif (continuedGoal.status === goal.status) return;\n\t\tif (continuedGoal.status === \"active\") beginAgentGoalAccounting(continuedGoal);\n\t\telse clearAgentGoalAccounting();\n\t\trefreshGoalUiBestEffort(ctx, continuedGoal);\n\t}\n\n\tfunction beginAgentGoalAccounting(goal: Goal): void {\n\t\tif (goal.status !== \"active\") return;\n\t\tif (agentGoalAccounting?.goalId === goal.id) return;\n\t\tturnUsage.discardPending();\n\t\tagentGoalAccounting = { goalId: goal.id, measuredFromMilliseconds: Date.now() };\n\t}\n\n\tfunction markGoalBlockedThisTurn(goal: Goal): void {\n\t\tif (agentTurnInProgress) blockedThisTurnGoalId = goal.id;\n\t}\n\n\tfunction markGoalCompletedThisTurn(goal: Goal): void {\n\t\tif (!agentTurnInProgress) return;\n\t\tcompletedThisTurnGoalId = goal.id;\n\t\tagentGoalAccounting = { goalId: goal.id, measuredFromMilliseconds: Date.now() };\n\t}\n\n\tfunction stopAgentGoalAccounting(goalId: string): void {\n\t\tif (agentGoalAccounting?.goalId === goalId) {\n\t\t\tagentGoalAccounting = null;\n\t\t}\n\t\tif (blockedThisTurnGoalId === goalId) {\n\t\t\tblockedThisTurnGoalId = null;\n\t\t}\n\t\tif (completedThisTurnGoalId === goalId) {\n\t\t\tcompletedThisTurnGoalId = null;\n\t\t}\n\t}\n\n\tfunction clearAgentGoalAccounting(): void {\n\t\tagentGoalAccounting = null;\n\t\tblockedThisTurnGoalId = null;\n\t\tcompletedThisTurnGoalId = null;\n\t}\n\n\tfunction syncContinuationGoal(ctx: ExtensionContext, goal: Goal | null): void {\n\t\tif (goal?.status === \"active\") beginAgentGoalAccounting(goal);\n\t\telse clearAgentGoalAccounting();\n\t\trefreshGoalUiBestEffort(ctx, goal);\n\t}\n\n\tfunction refreshGoalUi(ctx: ExtensionContext, goal: Goal | null): void {\n\t\tmonitorContinuation.syncGoal(goal);\n\t\tconst accounting = agentGoalAccounting;\n\t\tif (ctx.hasUI && goal?.status === \"active\" && accounting?.goalId === goal.id) {\n\t\t\tgoalTicker.sync(ctx, goal, accounting.measuredFromMilliseconds);\n\t\t\treturn;\n\t\t}\n\t\tgoalTicker.stop();\n\t\tupdateGoalUi(ctx, goal);\n\t}\n\n\tfunction refreshGoalUiBestEffort(ctx: ExtensionContext, goal: Goal | null): void {\n\t\ttry {\n\t\t\trefreshGoalUi(ctx, goal);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync function accountCurrentAgentTurn(\n\t\tctx: ExtensionContext,\n\t\tmode: GoalAccountingMode,\n\t\tagentRunMessages?: unknown[],\n\t): Promise<Goal | null> {\n\t\tconst accounting = agentGoalAccounting;\n\t\tconst ref = goalStoreRef(ctx);\n\t\tif (accounting === null) return readGoal(ref);\n\n\t\tconst usage =\n\t\t\tagentRunMessages === undefined ? turnUsage.takePending() : turnUsage.takeRemaining(agentRunMessages);\n\t\tconst now = Date.now();\n\t\tconst elapsedSeconds = Math.max(0, Math.round((now - accounting.measuredFromMilliseconds) / 1000));\n\t\tconst goal = await accountGoalUsage(ref, usage, elapsedSeconds, mode, accounting.goalId);\n\t\tif (goal?.id === accounting.goalId) {\n\t\t\tagentGoalAccounting = { goalId: accounting.goalId, measuredFromMilliseconds: now };\n\t\t} else {\n\t\t\tclearAgentGoalAccounting();\n\t\t}\n\t\treturn goal;\n\t}\n}\n\n/**\n * Counts goal-continuation entries queued since the most recent real user message\n * in the current branch (mirrors the todo-gate / todo-bridge backward branch read).\n * A real user message is the only reset: the assistant turns in between are exactly\n * the unattended loop this admission guard exists to stop.\n */\nfunction countTrailingGoalContinuationEntries(entries: readonly SessionEntry[]): number {\n\tlet count = 0;\n\tfor (let index = entries.length - 1; index >= 0; index--) {\n\t\tconst entry = entries[index];\n\t\tif (entry?.type === \"message\" && entry.message.role === \"user\") break;\n\t\tif (entry?.type === \"custom_message\" && entry.customType === GOAL_CONTINUATION_MESSAGE_TYPE) count += 1;\n\t}\n\treturn count;\n}\n\nfunction goalStoreRef(ctx: ExtensionContext): GoalStoreRef {\n\treturn buildGoalStoreRef(ctx.sessionManager, ctx.cwd);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"external-dir.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/external-dir.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcpD;AAWD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAatE;AAgFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC3E"}
1
+ {"version":3,"file":"external-dir.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/external-dir.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcpD;AAmBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAatE;AAgFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC3E"}