@code-yeongyu/senpi 2026.7.31 → 2026.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/CHANGELOG.md +237 -0
  2. package/dist/core/agent-session.d.ts +49 -13
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +120 -37
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  7. package/dist/core/dynamic-prompt/build.js +4 -0
  8. package/dist/core/dynamic-prompt/build.js.map +1 -1
  9. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts +2 -2
  10. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js +25 -25
  12. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js.map +1 -1
  13. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js.map +1 -1
  15. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts +1 -1
  16. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js +2 -2
  18. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js.map +1 -1
  19. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts +9 -9
  20. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js +2 -2
  22. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js.map +1 -1
  23. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts +1 -1
  24. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js +3 -3
  26. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js.map +1 -1
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts +21 -0
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts.map +1 -0
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js +30 -0
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js.map +1 -0
  31. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.d.ts +8 -4
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -0
  33. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.js +34 -25
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -0
  35. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js.map +1 -1
  37. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js.map +1 -1
  39. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts +1 -1
  40. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js +1 -1
  42. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js.map +1 -1
  43. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js.map +1 -1
  45. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js +1 -1
  47. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +14 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -0
  50. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/guidance.js +37 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -0
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -0
  54. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/index.js +12 -10
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -0
  56. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts +3 -3
  57. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.js +2 -2
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -0
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts +18 -0
  61. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.js +70 -10
  63. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -0
  64. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.js +32 -19
  66. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -0
  67. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts +1 -0
  68. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js.map +1 -1
  70. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts +30 -0
  71. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +197 -0
  73. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -0
  74. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts +18 -0
  75. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js +33 -0
  77. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js.map +1 -0
  78. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts +3 -0
  79. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +134 -0
  81. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -0
  82. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +85 -0
  83. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +270 -0
  85. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -0
  86. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts +17 -0
  87. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -0
  88. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +217 -0
  89. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -0
  90. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts +49 -0
  91. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +204 -0
  93. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -0
  94. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts +28 -0
  95. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +107 -0
  97. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -0
  98. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts +2 -0
  99. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +10 -0
  101. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -0
  102. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js.map +1 -1
  104. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.d.ts +1 -1
  105. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.js +72 -53
  107. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -0
  108. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts +3 -0
  109. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js +25 -0
  111. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js.map +1 -0
  112. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts +1 -1
  113. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js +2 -2
  115. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js.map +1 -1
  116. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +18 -0
  119. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -0
  120. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +69 -0
  121. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -0
  122. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/index.js +28 -2
  124. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/speculative.d.ts +4 -1
  126. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/speculative.js +22 -17
  128. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  129. package/dist/core/extensions/builtin/compaction/task-intent.d.ts +2 -6
  130. package/dist/core/extensions/builtin/compaction/task-intent.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/compaction/task-intent.js +10 -9
  132. package/dist/core/extensions/builtin/compaction/task-intent.js.map +1 -1
  133. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +6 -0
  134. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/goal/continuation-recovery.js +20 -0
  136. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -0
  137. package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -4
  138. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/goal/continuation.js +2 -8
  140. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  141. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts +19 -0
  142. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -0
  143. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +48 -0
  144. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -0
  145. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/goal/index.js +17 -15
  147. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  148. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +12 -10
  150. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  151. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +5 -1
  152. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/goal/monitor-continuation.js +94 -52
  154. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  155. package/dist/core/extensions/builtin/goal/persistence.d.ts +16 -0
  156. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/goal/persistence.js +185 -11
  158. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  159. package/dist/core/extensions/builtin/goal/ui.d.ts +1 -0
  160. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/goal/ui.js +11 -2
  162. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +15 -0
  165. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +30 -3
  168. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  169. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  170. package/dist/core/extensions/builtin/index.js +5 -2
  171. package/dist/core/extensions/builtin/index.js.map +1 -1
  172. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts +31 -0
  173. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -0
  174. package/dist/core/extensions/builtin/loop-guard/detectors.js +111 -0
  175. package/dist/core/extensions/builtin/loop-guard/detectors.js.map +1 -0
  176. package/dist/core/extensions/builtin/loop-guard/index.d.ts +3 -0
  177. package/dist/core/extensions/builtin/loop-guard/index.d.ts.map +1 -0
  178. package/dist/core/extensions/builtin/loop-guard/index.js +31 -0
  179. package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -0
  180. package/dist/core/extensions/builtin/loop-guard/notice.d.ts +5 -0
  181. package/dist/core/extensions/builtin/loop-guard/notice.d.ts.map +1 -0
  182. package/dist/core/extensions/builtin/loop-guard/notice.js +42 -0
  183. package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -0
  184. package/dist/core/extensions/builtin/loop-guard/policy.d.ts +30 -0
  185. package/dist/core/extensions/builtin/loop-guard/policy.d.ts.map +1 -0
  186. package/dist/core/extensions/builtin/loop-guard/policy.js +30 -0
  187. package/dist/core/extensions/builtin/loop-guard/policy.js.map +1 -0
  188. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts +4 -0
  189. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -0
  190. package/dist/core/extensions/builtin/loop-guard/renderer.js +50 -0
  191. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -0
  192. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts +13 -0
  193. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts.map +1 -0
  194. package/dist/core/extensions/builtin/loop-guard/similarity.js +51 -0
  195. package/dist/core/extensions/builtin/loop-guard/similarity.js.map +1 -0
  196. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts +13 -0
  197. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -0
  198. package/dist/core/extensions/builtin/loop-guard/tracker.js +39 -0
  199. package/dist/core/extensions/builtin/loop-guard/tracker.js.map +1 -0
  200. package/dist/core/extensions/builtin/monitor-state-event.d.ts +10 -0
  201. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  203. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts +3 -0
  204. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts.map +1 -0
  205. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js +10 -0
  206. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js.map +1 -0
  207. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts +3 -0
  208. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts.map +1 -0
  209. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js +10 -0
  210. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js.map +1 -0
  211. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts +3 -0
  212. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts.map +1 -0
  213. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js +11 -0
  214. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js.map +1 -0
  215. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts +13 -0
  216. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts.map +1 -0
  217. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js +60 -0
  218. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js.map +1 -0
  219. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/prompt-preset/index.js +8 -4
  221. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/presets.js +42 -0
  224. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/settings.js +3 -0
  228. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  229. package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/recommended-models/index.js +2 -1
  231. package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
  232. package/dist/core/extensions/builtin/rules/index.js +4 -3
  233. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  234. package/dist/core/extensions/builtin/rules/rules/constants.d.ts +11 -0
  235. package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -1
  236. package/dist/core/extensions/builtin/rules/rules/constants.js +11 -0
  237. package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -1
  238. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/rules/rules/formatter.js +15 -1
  240. package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -1
  241. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/service-tier.js +23 -21
  243. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  244. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/terminal/extension.js +21 -7
  246. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  247. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  248. package/dist/core/extensions/builtin/terminal/monitor-notify.js +42 -5
  249. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  250. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +2 -0
  251. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  252. package/dist/core/extensions/builtin/terminal/monitor-registry.js +2 -0
  253. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  254. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts +37 -0
  255. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -0
  256. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js +61 -0
  257. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js.map +1 -0
  258. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts +9 -1
  259. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/terminal/monitor-status.js +35 -2
  261. package/dist/core/extensions/builtin/terminal/monitor-status.js.map +1 -1
  262. package/dist/core/extensions/builtin/terminal/tools/monitor.js +1 -1
  263. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  264. package/dist/core/extensions/builtin/todotools/commands.d.ts +2 -2
  265. package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/todotools/commands.js.map +1 -1
  267. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  268. package/dist/core/extensions/builtin/todotools/index.js +6 -3
  269. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  270. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  271. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  272. package/dist/core/extensions/builtin/todotools/state.js +1 -1
  273. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  274. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts +19 -0
  275. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -0
  276. package/dist/core/extensions/builtin/todotools/todo-widget-component.js +78 -0
  277. package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -0
  278. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts +13 -1
  279. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/todotools/todo-widget.js +32 -14
  281. package/dist/core/extensions/builtin/todotools/todo-widget.js.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +2 -2
  283. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/tools/todo.js +1 -1
  285. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  286. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts +1 -1
  287. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  288. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js +88 -29
  289. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  290. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/tps.js +5 -2
  292. package/dist/core/extensions/builtin/tps.js.map +1 -1
  293. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts +4 -0
  294. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts.map +1 -0
  295. package/dist/core/extensions/builtin/ttsr/builtin-rules.js +20 -0
  296. package/dist/core/extensions/builtin/ttsr/builtin-rules.js.map +1 -0
  297. package/dist/core/extensions/builtin/ttsr/commands.js +9 -1
  298. package/dist/core/extensions/builtin/ttsr/commands.js.map +1 -1
  299. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/ttsr/index.js +4 -3
  301. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  302. package/dist/core/extensions/builtin/ttsr/manager.js +1 -1
  303. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  304. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/websearch/websearch/config.js +1 -0
  306. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  307. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  308. package/dist/core/extensions/builtin/websearch/websearch/native.js +16 -5
  309. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  310. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -1
  311. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +1 -0
  312. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -1
  313. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts +4 -1
  314. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts.map +1 -1
  315. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js +44 -37
  316. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js.map +1 -1
  317. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts +3 -0
  318. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts.map +1 -0
  319. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js +12 -0
  320. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js.map +1 -0
  321. package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -1
  322. package/dist/core/extensions/builtin/websearch/websearch/providers.js +2 -0
  323. package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -1
  324. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  325. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +3 -3
  326. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  327. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  328. package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -3
  329. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  330. package/dist/core/extensions/builtin/websearch/websearch/tool.js +2 -2
  331. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  332. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -1
  333. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  334. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  335. package/dist/core/extensions/index.d.ts +1 -1
  336. package/dist/core/extensions/index.d.ts.map +1 -1
  337. package/dist/core/extensions/index.js.map +1 -1
  338. package/dist/core/extensions/loader.d.ts.map +1 -1
  339. package/dist/core/extensions/loader.js +5 -0
  340. package/dist/core/extensions/loader.js.map +1 -1
  341. package/dist/core/extensions/runner.d.ts +1 -1
  342. package/dist/core/extensions/runner.d.ts.map +1 -1
  343. package/dist/core/extensions/runner.js +3 -1
  344. package/dist/core/extensions/runner.js.map +1 -1
  345. package/dist/core/extensions/types.d.ts +22 -1
  346. package/dist/core/extensions/types.d.ts.map +1 -1
  347. package/dist/core/extensions/types.js.map +1 -1
  348. package/dist/core/model-resolver.js +2 -2
  349. package/dist/core/model-resolver.js.map +1 -1
  350. package/dist/core/thinking-levels.d.ts +5 -0
  351. package/dist/core/thinking-levels.d.ts.map +1 -1
  352. package/dist/core/thinking-levels.js +9 -39
  353. package/dist/core/thinking-levels.js.map +1 -1
  354. package/dist/index.d.ts +1 -1
  355. package/dist/index.d.ts.map +1 -1
  356. package/dist/index.js.map +1 -1
  357. package/dist/modes/app-server/server/account.d.ts +1 -1
  358. package/dist/modes/app-server/server/account.js +1 -1
  359. package/dist/modes/app-server/server/account.js.map +1 -1
  360. package/dist/modes/app-server/server/server-core.js +1 -1
  361. package/dist/modes/app-server/server/server-core.js.map +1 -1
  362. package/dist/modes/interactive/compaction-queue-transfer.d.ts +2 -0
  363. package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -1
  364. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  365. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  366. package/dist/modes/interactive/components/footer.js +9 -5
  367. package/dist/modes/interactive/components/footer.js.map +1 -1
  368. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  369. package/dist/modes/interactive/interactive-mode.js +38 -12
  370. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  371. package/dist/modes/interactive/risky-main-model-warning.d.ts +1 -1
  372. package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -1
  373. package/dist/modes/interactive/risky-main-model-warning.js +1 -1
  374. package/dist/modes/interactive/risky-main-model-warning.js.map +1 -1
  375. package/dist/modes/rpc/connection-handler.js +3 -3
  376. package/dist/modes/rpc/connection-handler.js.map +1 -1
  377. package/docs/extensions.md +10 -0
  378. package/docs/providers.md +21 -5
  379. package/docs/release-guide.md +2 -2
  380. package/docs/settings.md +1 -1
  381. package/examples/extensions/overlay-test.ts +1 -1
  382. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +33 -0
  383. package/node_modules/@code-yeongyu/senpi-codemode/README.md +6 -3
  384. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  385. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status-ticker.ts +79 -0
  386. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +36 -3
  387. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +26 -12
  388. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +146 -0
  389. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +21 -119
  390. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +157 -0
  391. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +62 -208
  392. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +98 -0
  393. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +81 -0
  394. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +24 -0
  395. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +140 -0
  396. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-notification-queue.ts +53 -0
  397. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +45 -0
  398. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +45 -0
  399. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +20 -342
  400. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  401. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -0
  402. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  403. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  404. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +10 -15
  406. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +2 -2
  408. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts +24 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js +70 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +2 -16
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -58
  416. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +2 -2
  418. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js +7 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +2 -2
  424. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +2 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +14 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/models.js +95 -19
  431. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts +3 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js +36 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  450. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  451. package/node_modules/@earendil-works/pi-tui/dist/mux.js +1 -1
  452. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  453. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +1 -0
  454. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-tui/dist/tui.js +17 -3
  456. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  458. package/package.json +6 -6
  459. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.d.ts.map +0 -1
  460. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js.map +0 -1
  461. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts +0 -6
  462. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts.map +0 -1
  463. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.js.map +0 -1
  464. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts +0 -4
  465. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts.map +0 -1
  466. package/dist/core/extensions/builtin/claude-agent-sdk/index.js.map +0 -1
  467. package/dist/core/extensions/builtin/claude-agent-sdk/oauth-login.js.map +0 -1
  468. package/dist/core/extensions/builtin/claude-agent-sdk/options.d.ts +0 -16
  469. package/dist/core/extensions/builtin/claude-agent-sdk/options.js.map +0 -1
  470. package/dist/core/extensions/builtin/claude-agent-sdk/prompt-bridge.js.map +0 -1
  471. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts +0 -15
  472. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts.map +0 -1
  473. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js +0 -41
  474. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js.map +0 -1
  475. package/dist/core/extensions/builtin/claude-agent-sdk/stream.d.ts.map +0 -1
  476. package/dist/core/extensions/builtin/claude-agent-sdk/stream.js.map +0 -1
  477. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts +0 -0
  478. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js +0 -0
  479. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts +0 -0
  480. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js +0 -0
  481. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts +0 -0
  482. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js +0 -0
  483. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts +0 -0
  484. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js +0 -0
  485. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts +0 -0
  486. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts +0 -0
  487. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js +0 -0
  488. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts +0 -0
  489. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js +0 -0
  490. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts +0 -0
  491. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAU1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,MAAM,CAAC;IAC3D;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAmBD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CAyDzF"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAU1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,MAAM,CAAC;IAC3D;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAmBD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CA6DzF"}
@@ -68,6 +68,10 @@ export function buildDynamicSystemPrompt(options) {
68
68
  selectedTools: options.selectedTools,
69
69
  dialect: options.workstationDialect ?? "default",
70
70
  }));
71
+ // The claude-sdk-oauth lane appends these dynamic lines after the stable sections so the composed
72
+ // prompt is a single string. An earlier draft split at this point for prompt-cache scoping, but a
73
+ // wire-level probe proved the installed CLI joins array elements into one system block, so the
74
+ // split was removed (the sentinel leaked to the model as literal text).
71
75
  sections.push("", `Current date: ${date}`, `Current working directory: ${promptCwd}`);
72
76
  return sections.join("\n");
73
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/build.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Skill } from \"../skills.ts\";\nimport { formatSkillsForPrompt } from \"../skills.ts\";\nimport { buildExplorationSection } from \"./exploration.ts\";\nimport { buildIdentitySection } from \"./identity.ts\";\nimport { buildIntentGate } from \"./intent-gate.ts\";\nimport { buildParallelToolsSection } from \"./parallel-tools.ts\";\nimport { buildPoliciesSection } from \"./policies.ts\";\nimport { buildStyleSection } from \"./style.ts\";\nimport { categorizeTools } from \"./tool-categorization.ts\";\nimport { buildToolSection } from \"./tool-section.ts\";\nimport type { AvailableTool } from \"./types.ts\";\nimport { buildVerificationSection } from \"./verification.ts\";\nimport { buildWorkstationSection, type WorkstationDialect } from \"./workstation.ts\";\n\n/** Context handed to a `corePrompt` override so it can reuse the dynamic pieces. */\nexport interface DynamicPromptCoreContext {\n\ttools: AvailableTool[];\n\t/** Rendered \"## Available Tools\" (+ \"## Tool Guidelines\") section. */\n\ttoolSection: string;\n}\n\nexport interface BuildDynamicSystemPromptOptions {\n\tcwd: string;\n\tselectedTools: string[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines: string[];\n\tcontextFiles: Array<{ path: string; content: string }>;\n\tskills: Skill[];\n\ttuningSection?: string;\n\t/**\n\t * Replaces the default core sections (identity through style) with a\n\t * model-specific full rewrite. Tool section, tuning, context files, skills,\n\t * date, and cwd assembly stay in this builder.\n\t */\n\tcorePrompt?: (context: DynamicPromptCoreContext) => string;\n\t/**\n\t * Wording dialect for the workstation execution-context instruction.\n\t * Presets pass their model family; the fallback prompt uses `default`\n\t * (maximum emphasis).\n\t */\n\tworkstationDialect?: WorkstationDialect;\n}\n\nfunction buildContextFilesSection(contextFiles: Array<{ path: string; content: string }>): string {\n\tif (contextFiles.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines = [\n\t\t\"## Project Context\",\n\t\t\"\",\n\t\t\"Project instruction files (below, and in [Directory Context: ...] blocks injected during reads) bind files under their directory; deeper files win on conflict; explicit user instructions override.\",\n\t\t\"\",\n\t];\n\tfor (const contextFile of contextFiles) {\n\t\tlines.push(`### ${contextFile.path}`, \"\", contextFile.content.trimEnd(), \"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function buildDynamicSystemPrompt(options: BuildDynamicSystemPromptOptions): string {\n\tconst promptCwd = options.cwd.replace(/\\\\/g, \"/\");\n\tconst tools = categorizeTools(options.selectedTools);\n\tconst date = new Date().toISOString().slice(0, 10);\n\n\tconst toolSection = buildToolSection({\n\t\ttools,\n\t\ttoolSnippets: options.toolSnippets,\n\t\tpromptGuidelines: options.promptGuidelines,\n\t});\n\n\tconst sections = options.corePrompt\n\t\t? [options.corePrompt({ tools, toolSection })]\n\t\t: [\n\t\t\t\tbuildIdentitySection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildIntentGate({ tools }),\n\t\t\t\t\"\",\n\t\t\t\tbuildParallelToolsSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildExplorationSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildVerificationSection(),\n\t\t\t\t\"\",\n\t\t\t\ttoolSection,\n\t\t\t\t\"\",\n\t\t\t\tbuildPoliciesSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildStyleSection(),\n\t\t\t];\n\n\tconst tuning = options.tuningSection?.trim();\n\tif (tuning) {\n\t\tsections.push(\"\", tuning);\n\t}\n\n\tconst contextFilesSection = buildContextFilesSection(options.contextFiles);\n\tif (contextFilesSection) {\n\t\tsections.push(\"\", contextFilesSection);\n\t}\n\n\tconst skillsSection = formatSkillsForPrompt(options.skills);\n\tif (skillsSection) {\n\t\tsections.push(skillsSection);\n\t}\n\n\tsections.push(\n\t\t\"\",\n\t\tbuildWorkstationSection({\n\t\t\tselectedTools: options.selectedTools,\n\t\t\tdialect: options.workstationDialect ?? \"default\",\n\t\t}),\n\t);\n\n\tsections.push(\"\", `Current date: ${date}`, `Current working directory: ${promptCwd}`);\n\n\treturn sections.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/build.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Skill } from \"../skills.ts\";\nimport { formatSkillsForPrompt } from \"../skills.ts\";\nimport { buildExplorationSection } from \"./exploration.ts\";\nimport { buildIdentitySection } from \"./identity.ts\";\nimport { buildIntentGate } from \"./intent-gate.ts\";\nimport { buildParallelToolsSection } from \"./parallel-tools.ts\";\nimport { buildPoliciesSection } from \"./policies.ts\";\nimport { buildStyleSection } from \"./style.ts\";\nimport { categorizeTools } from \"./tool-categorization.ts\";\nimport { buildToolSection } from \"./tool-section.ts\";\nimport type { AvailableTool } from \"./types.ts\";\nimport { buildVerificationSection } from \"./verification.ts\";\nimport { buildWorkstationSection, type WorkstationDialect } from \"./workstation.ts\";\n\n/** Context handed to a `corePrompt` override so it can reuse the dynamic pieces. */\nexport interface DynamicPromptCoreContext {\n\ttools: AvailableTool[];\n\t/** Rendered \"## Available Tools\" (+ \"## Tool Guidelines\") section. */\n\ttoolSection: string;\n}\n\nexport interface BuildDynamicSystemPromptOptions {\n\tcwd: string;\n\tselectedTools: string[];\n\ttoolSnippets: Record<string, string>;\n\tpromptGuidelines: string[];\n\tcontextFiles: Array<{ path: string; content: string }>;\n\tskills: Skill[];\n\ttuningSection?: string;\n\t/**\n\t * Replaces the default core sections (identity through style) with a\n\t * model-specific full rewrite. Tool section, tuning, context files, skills,\n\t * date, and cwd assembly stay in this builder.\n\t */\n\tcorePrompt?: (context: DynamicPromptCoreContext) => string;\n\t/**\n\t * Wording dialect for the workstation execution-context instruction.\n\t * Presets pass their model family; the fallback prompt uses `default`\n\t * (maximum emphasis).\n\t */\n\tworkstationDialect?: WorkstationDialect;\n}\n\nfunction buildContextFilesSection(contextFiles: Array<{ path: string; content: string }>): string {\n\tif (contextFiles.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines = [\n\t\t\"## Project Context\",\n\t\t\"\",\n\t\t\"Project instruction files (below, and in [Directory Context: ...] blocks injected during reads) bind files under their directory; deeper files win on conflict; explicit user instructions override.\",\n\t\t\"\",\n\t];\n\tfor (const contextFile of contextFiles) {\n\t\tlines.push(`### ${contextFile.path}`, \"\", contextFile.content.trimEnd(), \"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function buildDynamicSystemPrompt(options: BuildDynamicSystemPromptOptions): string {\n\tconst promptCwd = options.cwd.replace(/\\\\/g, \"/\");\n\tconst tools = categorizeTools(options.selectedTools);\n\tconst date = new Date().toISOString().slice(0, 10);\n\n\tconst toolSection = buildToolSection({\n\t\ttools,\n\t\ttoolSnippets: options.toolSnippets,\n\t\tpromptGuidelines: options.promptGuidelines,\n\t});\n\n\tconst sections = options.corePrompt\n\t\t? [options.corePrompt({ tools, toolSection })]\n\t\t: [\n\t\t\t\tbuildIdentitySection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildIntentGate({ tools }),\n\t\t\t\t\"\",\n\t\t\t\tbuildParallelToolsSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildExplorationSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildVerificationSection(),\n\t\t\t\t\"\",\n\t\t\t\ttoolSection,\n\t\t\t\t\"\",\n\t\t\t\tbuildPoliciesSection(),\n\t\t\t\t\"\",\n\t\t\t\tbuildStyleSection(),\n\t\t\t];\n\n\tconst tuning = options.tuningSection?.trim();\n\tif (tuning) {\n\t\tsections.push(\"\", tuning);\n\t}\n\n\tconst contextFilesSection = buildContextFilesSection(options.contextFiles);\n\tif (contextFilesSection) {\n\t\tsections.push(\"\", contextFilesSection);\n\t}\n\n\tconst skillsSection = formatSkillsForPrompt(options.skills);\n\tif (skillsSection) {\n\t\tsections.push(skillsSection);\n\t}\n\n\tsections.push(\n\t\t\"\",\n\t\tbuildWorkstationSection({\n\t\t\tselectedTools: options.selectedTools,\n\t\t\tdialect: options.workstationDialect ?? \"default\",\n\t\t}),\n\t);\n\n\t// The claude-sdk-oauth lane appends these dynamic lines after the stable sections so the composed\n\t// prompt is a single string. An earlier draft split at this point for prompt-cache scoping, but a\n\t// wire-level probe proved the installed CLI joins array elements into one system block, so the\n\t// split was removed (the sentinel leaked to the model as literal text).\n\tsections.push(\"\", `Current date: ${date}`, `Current working directory: ${promptCwd}`);\n\n\treturn sections.join(\"\\n\");\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import type { ExtensionAPI } from "../../types.ts";
2
- import { type ClaudeAgentSdkProviderSettings } from "./settings.ts";
2
+ import { type ClaudeSdkOauthProviderSettings } from "./settings.ts";
3
3
  type CommandEnvironment = (name: string) => string | undefined;
4
4
  export interface ClaudeAccountCommandDeps {
5
- loadSettings?: (cwd: string) => ClaudeAgentSdkProviderSettings;
5
+ loadSettings?: (cwd: string) => ClaudeSdkOauthProviderSettings;
6
6
  environment?: CommandEnvironment;
7
7
  }
8
8
  export declare function getSessionClaudeAccountPin(sessionId: string | undefined): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"account-command.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAK5E,OAAO,EAAE,KAAK,8BAA8B,EAA8C,MAAM,eAAe,CAAC;AAIhH,KAAK,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,wBAAwB;IACxC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,8BAA8B,CAAC;IAC/D,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAgDD,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5F;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CACtC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,qBAAqB,EAAE,MAAM,GAAG,SAAS,EACzC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACrC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,GAAE,wBAA6B,GAAG,IAAI,CA8CxG"}
1
+ {"version":3,"file":"account-command.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAK5E,OAAO,EAAE,KAAK,8BAA8B,EAA8C,MAAM,eAAe,CAAC;AAIhH,KAAK,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,wBAAwB;IACxC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,8BAA8B,CAAC;IAC/D,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAgDD,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5F;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CACtC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,qBAAqB,EAAE,MAAM,GAAG,SAAS,EACzC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACrC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,GAAE,wBAA6B,GAAG,IAAI,CA8CxG"}
@@ -1,8 +1,8 @@
1
1
  import { emitProviderAccountsChanged } from "./account-events.js";
2
- import { CLAUDE_AGENT_SDK_PROVIDER_ID, pinProviderAccount, removeProviderAccount } from "./account-management.js";
2
+ import { CLAUDE_SDK_OAUTH_PROVIDER_ID, pinProviderAccount, removeProviderAccount } from "./account-management.js";
3
3
  import { emptyCredential, listAccounts } from "./accounts.js";
4
4
  import { selectAccount } from "./affinity.js";
5
- import { loadClaudeAgentSdkProviderSettingsFromDisk } from "./settings.js";
5
+ import { loadClaudeSdkOauthProviderSettingsFromDisk } from "./settings.js";
6
6
  const cliPinsBySession = new Map();
7
7
  function asCredential(value) {
8
8
  return value?.type === "oauth" ? value : undefined;
@@ -16,29 +16,29 @@ function slotStatus(slot) {
16
16
  return "available";
17
17
  }
18
18
  function readAccounts(ctx, environment) {
19
- const credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_AGENT_SDK_PROVIDER_ID));
19
+ const credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_SDK_OAUTH_PROVIDER_ID));
20
20
  return {
21
21
  credential,
22
22
  accounts: listAccounts(credential ?? emptyCredential(), environment),
23
23
  };
24
24
  }
25
25
  function accountError(ctx, name) {
26
- ctx.ui.notify(`Claude Agent SDK account '${name}' does not exist.`, "error");
26
+ ctx.ui.notify(`Claude SDK OAuth account '${name}' does not exist.`, "error");
27
27
  }
28
28
  function parseArgs(rawArgs) {
29
29
  return rawArgs.trim().split(/\s+/).filter(Boolean);
30
30
  }
31
31
  function authEventMessage(event) {
32
32
  if (event === null || typeof event !== "object")
33
- return "Claude Agent SDK authentication update.";
33
+ return "Claude SDK OAuth authentication update.";
34
34
  const value = event;
35
35
  if (value.type === "auth_url" && typeof value.url === "string") {
36
- return `Open this URL to authorize Claude Agent SDK:\n${value.url}`;
36
+ return `Open this URL to authorize Claude SDK OAuth:\n${value.url}`;
37
37
  }
38
38
  if (value.type === "device_code" && typeof value.verificationUri === "string") {
39
- return `Open this URL to authorize Claude Agent SDK:\n${value.verificationUri}`;
39
+ return `Open this URL to authorize Claude SDK OAuth:\n${value.verificationUri}`;
40
40
  }
41
- return typeof value.message === "string" ? value.message : "Claude Agent SDK authentication update.";
41
+ return typeof value.message === "string" ? value.message : "Claude SDK OAuth authentication update.";
42
42
  }
43
43
  export function getSessionClaudeAccountPin(sessionId) {
44
44
  return sessionId === undefined ? undefined : cliPinsBySession.get(sessionId);
@@ -48,11 +48,11 @@ export function resolveClaudeAccountPin(cliPinnedAccount, settingsPinnedAccount,
48
48
  return cliPinnedAccount ?? settingsPinnedAccount ?? storedPinnedAccount;
49
49
  }
50
50
  export function registerClaudeAccountCommand(pi, deps = {}) {
51
- const loadSettings = deps.loadSettings ?? loadClaudeAgentSdkProviderSettingsFromDisk;
51
+ const loadSettings = deps.loadSettings ?? loadClaudeSdkOauthProviderSettingsFromDisk;
52
52
  const environment = deps.environment ?? ((name) => process.env[name]);
53
53
  pi.registerFlag("claude-account", {
54
54
  type: "string",
55
- description: "Pin Claude Agent SDK account for this session.",
55
+ description: "Pin Claude SDK OAuth account for this session.",
56
56
  });
57
57
  pi.on("session_start", (_event, ctx) => {
58
58
  const flag = pi.getFlag("claude-account");
@@ -66,7 +66,7 @@ export function registerClaudeAccountCommand(pi, deps = {}) {
66
66
  cliPinsBySession.delete(ctx.sessionManager.getSessionId());
67
67
  });
68
68
  pi.registerCommand("claude-account", {
69
- description: "List and manage Claude Agent SDK accounts.",
69
+ description: "List and manage Claude SDK OAuth accounts.",
70
70
  argumentHint: "[add | remove <name> | pin <name> | unpin]",
71
71
  handler: async (rawArgs, ctx) => {
72
72
  const args = parseArgs(rawArgs);
@@ -113,7 +113,7 @@ function showAccounts(ctx, settings, environment) {
113
113
  affinityError = error instanceof Error ? error.message : String(error);
114
114
  }
115
115
  }
116
- const lines = ["Claude Agent SDK accounts:"];
116
+ const lines = ["Claude SDK OAuth accounts:"];
117
117
  if (accounts.length === 0)
118
118
  lines.push(" (none)");
119
119
  for (const account of accounts) {
@@ -134,7 +134,7 @@ async function addAccount(ctx) {
134
134
  return;
135
135
  }
136
136
  try {
137
- await ctx.modelRegistry.modelRuntime.login(CLAUDE_AGENT_SDK_PROVIDER_ID, "oauth", {
137
+ await ctx.modelRegistry.modelRuntime.login(CLAUDE_SDK_OAUTH_PROVIDER_ID, "oauth", {
138
138
  signal: ctx.signal,
139
139
  prompt: async (prompt) => {
140
140
  const answer = await ctx.ui.input(prompt.message);
@@ -144,13 +144,13 @@ async function addAccount(ctx) {
144
144
  },
145
145
  notify: (event) => ctx.ui.notify(authEventMessage(event), "info"),
146
146
  });
147
- emitProviderAccountsChanged(CLAUDE_AGENT_SDK_PROVIDER_ID);
148
- ctx.ui.notify("Claude Agent SDK account added.", "info");
147
+ emitProviderAccountsChanged(CLAUDE_SDK_OAUTH_PROVIDER_ID);
148
+ ctx.ui.notify("Claude SDK OAuth account added.", "info");
149
149
  }
150
150
  catch (error) {
151
151
  const message = error instanceof Error ? error.message : String(error);
152
152
  if (message !== "Login cancelled")
153
- ctx.ui.notify(`Failed to add Claude Agent SDK account: ${message}`, "error");
153
+ ctx.ui.notify(`Failed to add Claude SDK OAuth account: ${message}`, "error");
154
154
  }
155
155
  }
156
156
  async function removeNamedAccount(ctx, name, environment) {
@@ -163,12 +163,12 @@ async function removeNamedAccount(ctx, name, environment) {
163
163
  if (!target)
164
164
  return accountError(ctx, name);
165
165
  if (target.source === "env") {
166
- ctx.ui.notify(`Claude Agent SDK account '${name}' comes from the environment and cannot be removed.`, "error");
166
+ ctx.ui.notify(`Claude SDK OAuth account '${name}' comes from the environment and cannot be removed.`, "error");
167
167
  return;
168
168
  }
169
169
  try {
170
- await removeProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, name);
171
- ctx.ui.notify(`Removed Claude Agent SDK account: ${name}.`, "info");
170
+ await removeProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, name);
171
+ ctx.ui.notify(`Removed Claude SDK OAuth account: ${name}.`, "info");
172
172
  }
173
173
  catch (error) {
174
174
  ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
@@ -183,20 +183,20 @@ async function pinNamedAccount(ctx, name, environment) {
183
183
  return accountError(ctx, name);
184
184
  }
185
185
  try {
186
- await pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, name);
187
- ctx.ui.notify(`Pinned Claude Agent SDK account: ${name}.`, "info");
186
+ await pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, name);
187
+ ctx.ui.notify(`Pinned Claude SDK OAuth account: ${name}.`, "info");
188
188
  }
189
189
  catch (error) {
190
190
  ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
191
191
  }
192
192
  }
193
193
  async function unpinAccount(ctx) {
194
- const credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_AGENT_SDK_PROVIDER_ID));
194
+ const credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_SDK_OAUTH_PROVIDER_ID));
195
195
  if (!credential?.pinned) {
196
- ctx.ui.notify("No stored Claude Agent SDK account pin is set.", "info");
196
+ ctx.ui.notify("No stored Claude SDK OAuth account pin is set.", "info");
197
197
  return;
198
198
  }
199
- await pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, null);
200
- ctx.ui.notify("Unpinned Claude Agent SDK account.", "info");
199
+ await pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, null);
200
+ ctx.ui.notify("Unpinned Claude SDK OAuth account.", "info");
201
201
  }
202
202
  //# sourceMappingURL=account-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { emitProviderAccountsChanged } from \"./account-events.ts\";\nimport { CLAUDE_AGENT_SDK_PROVIDER_ID, pinProviderAccount, removeProviderAccount } from \"./account-management.ts\";\nimport { type AccountSlot, type ClaudeAgentSdkCredential, emptyCredential, listAccounts } from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport { type ClaudeAgentSdkProviderSettings, loadClaudeAgentSdkProviderSettingsFromDisk } from \"./settings.ts\";\n\nconst cliPinsBySession = new Map<string, string>();\n\ntype CommandEnvironment = (name: string) => string | undefined;\n\nexport interface ClaudeAccountCommandDeps {\n\tloadSettings?: (cwd: string) => ClaudeAgentSdkProviderSettings;\n\tenvironment?: CommandEnvironment;\n}\n\nfunction asCredential(value: Credential | undefined): ClaudeAgentSdkCredential | undefined {\n\treturn value?.type === \"oauth\" ? (value as ClaudeAgentSdkCredential) : undefined;\n}\n\nfunction slotStatus(slot: AccountSlot): string {\n\tif (slot.blockReason === \"auth_error\") return \"blocked until re-login\";\n\tif (slot.blockedUntil !== undefined && slot.blockedUntil > Date.now()) {\n\t\treturn `blocked until ${new Date(slot.blockedUntil).toISOString()}`;\n\t}\n\treturn \"available\";\n}\n\nfunction readAccounts(\n\tctx: ExtensionCommandContext,\n\tenvironment: CommandEnvironment,\n): {\n\tcredential: ClaudeAgentSdkCredential | undefined;\n\taccounts: AccountSlot[];\n} {\n\tconst credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_AGENT_SDK_PROVIDER_ID));\n\treturn {\n\t\tcredential,\n\t\taccounts: listAccounts(credential ?? emptyCredential(), environment),\n\t};\n}\n\nfunction accountError(ctx: ExtensionCommandContext, name: string): void {\n\tctx.ui.notify(`Claude Agent SDK account '${name}' does not exist.`, \"error\");\n}\n\nfunction parseArgs(rawArgs: string): string[] {\n\treturn rawArgs.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction authEventMessage(event: unknown): string {\n\tif (event === null || typeof event !== \"object\") return \"Claude Agent SDK authentication update.\";\n\tconst value = event as Record<string, unknown>;\n\tif (value.type === \"auth_url\" && typeof value.url === \"string\") {\n\t\treturn `Open this URL to authorize Claude Agent SDK:\\n${value.url}`;\n\t}\n\tif (value.type === \"device_code\" && typeof value.verificationUri === \"string\") {\n\t\treturn `Open this URL to authorize Claude Agent SDK:\\n${value.verificationUri}`;\n\t}\n\treturn typeof value.message === \"string\" ? value.message : \"Claude Agent SDK authentication update.\";\n}\n\nexport function getSessionClaudeAccountPin(sessionId: string | undefined): string | undefined {\n\treturn sessionId === undefined ? undefined : cliPinsBySession.get(sessionId);\n}\n\n/** CLI pins are request-local overrides; settings and stored pins remain fallback choices. */\nexport function resolveClaudeAccountPin(\n\tcliPinnedAccount: string | undefined,\n\tsettingsPinnedAccount: string | undefined,\n\tstoredPinnedAccount: string | undefined,\n): string | undefined {\n\treturn cliPinnedAccount ?? settingsPinnedAccount ?? storedPinnedAccount;\n}\n\nexport function registerClaudeAccountCommand(pi: ExtensionAPI, deps: ClaudeAccountCommandDeps = {}): void {\n\tconst loadSettings = deps.loadSettings ?? loadClaudeAgentSdkProviderSettingsFromDisk;\n\tconst environment = deps.environment ?? ((name: string) => process.env[name]);\n\n\tpi.registerFlag(\"claude-account\", {\n\t\ttype: \"string\",\n\t\tdescription: \"Pin Claude Agent SDK account for this session.\",\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tconst flag = pi.getFlag(\"claude-account\");\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (typeof flag === \"string\" && flag.length > 0) cliPinsBySession.set(sessionId, flag);\n\t\telse cliPinsBySession.delete(sessionId);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tcliPinsBySession.delete(ctx.sessionManager.getSessionId());\n\t});\n\tpi.registerCommand(\"claude-account\", {\n\t\tdescription: \"List and manage Claude Agent SDK accounts.\",\n\t\targumentHint: \"[add | remove <name> | pin <name> | unpin]\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst args = parseArgs(rawArgs);\n\t\t\tconst action = args[0] ?? \"list\";\n\t\t\tif (action === \"list\") {\n\t\t\t\tshowAccounts(ctx, loadSettings(ctx.cwd), environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"add\") {\n\t\t\t\tawait addAccount(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"remove\") {\n\t\t\t\tawait removeNamedAccount(ctx, args[1], environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"pin\" && args[1] !== \"unpin\") {\n\t\t\t\tawait pinNamedAccount(ctx, args[1], environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"unpin\" || (action === \"pin\" && args[1] === \"unpin\")) {\n\t\t\t\tawait unpinAccount(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(\"Usage: /claude-account [add | remove <name> | pin <name> | unpin]\", \"error\");\n\t\t},\n\t});\n}\n\nfunction showAccounts(\n\tctx: ExtensionCommandContext,\n\tsettings: ClaudeAgentSdkProviderSettings,\n\tenvironment: CommandEnvironment,\n): void {\n\tconst { credential, accounts } = readAccounts(ctx, environment);\n\tconst cliPin = getSessionClaudeAccountPin(ctx.sessionManager.getSessionId());\n\tconst pinned = resolveClaudeAccountPin(cliPin, settings.pinnedAccount, credential?.pinned);\n\tconst pinSource = cliPin !== undefined ? \"CLI\" : settings.pinnedAccount !== undefined ? \"settings\" : \"stored\";\n\tlet affinityPick: string | undefined;\n\tlet affinityError: string | undefined;\n\tif (accounts.length > 0) {\n\t\ttry {\n\t\t\taffinityPick = selectAccount(accounts, {\n\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\tpinnedAccount: pinned,\n\t\t\t}).name;\n\t\t} catch (error) {\n\t\t\taffinityError = error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\tconst lines = [\"Claude Agent SDK accounts:\"];\n\tif (accounts.length === 0) lines.push(\" (none)\");\n\tfor (const account of accounts) {\n\t\tconst states = [account.name, account.source, slotStatus(account)];\n\t\tif (account.name === pinned) states.push(\"pinned\");\n\t\tif (account.name === affinityPick) states.push(\"affinity pick\");\n\t\tlines.push(` ${states.join(\" | \")}`);\n\t}\n\tlines.push(`Pinned account: ${pinned === undefined ? \"none\" : `${pinned} (${pinSource.toLowerCase()})`}`);\n\tlines.push(`Affinity pick: ${affinityPick ?? (affinityError ? `unavailable - ${affinityError}` : \"none\")}`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nasync function addAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/claude-account add requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait ctx.modelRegistry.modelRuntime.login(CLAUDE_AGENT_SDK_PROVIDER_ID, \"oauth\", {\n\t\t\tsignal: ctx.signal,\n\t\t\tprompt: async (prompt) => {\n\t\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\t\tif (answer === undefined) throw new Error(\"Login cancelled\");\n\t\t\t\treturn answer;\n\t\t\t},\n\t\t\tnotify: (event) => ctx.ui.notify(authEventMessage(event), \"info\"),\n\t\t});\n\t\temitProviderAccountsChanged(CLAUDE_AGENT_SDK_PROVIDER_ID);\n\t\tctx.ui.notify(\"Claude Agent SDK account added.\", \"info\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (message !== \"Login cancelled\") ctx.ui.notify(`Failed to add Claude Agent SDK account: ${message}`, \"error\");\n\t}\n}\n\nasync function removeNamedAccount(\n\tctx: ExtensionCommandContext,\n\tname: string | undefined,\n\tenvironment: CommandEnvironment,\n): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /claude-account remove <name>\", \"error\");\n\t\treturn;\n\t}\n\tconst { accounts } = readAccounts(ctx, environment);\n\tconst target = accounts.find((account) => account.name === name);\n\tif (!target) return accountError(ctx, name);\n\tif (target.source === \"env\") {\n\t\tctx.ui.notify(`Claude Agent SDK account '${name}' comes from the environment and cannot be removed.`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait removeProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, name);\n\t\tctx.ui.notify(`Removed Claude Agent SDK account: ${name}.`, \"info\");\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t}\n}\n\nasync function pinNamedAccount(\n\tctx: ExtensionCommandContext,\n\tname: string | undefined,\n\tenvironment: CommandEnvironment,\n): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /claude-account pin <name>\", \"error\");\n\t\treturn;\n\t}\n\tif (!readAccounts(ctx, environment).accounts.some((account) => account.name === name)) {\n\t\treturn accountError(ctx, name);\n\t}\n\ttry {\n\t\tawait pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, name);\n\t\tctx.ui.notify(`Pinned Claude Agent SDK account: ${name}.`, \"info\");\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t}\n}\n\nasync function unpinAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tconst credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_AGENT_SDK_PROVIDER_ID));\n\tif (!credential?.pinned) {\n\t\tctx.ui.notify(\"No stored Claude Agent SDK account pin is set.\", \"info\");\n\t\treturn;\n\t}\n\tawait pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_AGENT_SDK_PROVIDER_ID, null);\n\tctx.ui.notify(\"Unpinned Claude Agent SDK account.\", \"info\");\n}\n"]}
1
+ {"version":3,"file":"account-command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { emitProviderAccountsChanged } from \"./account-events.ts\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID, pinProviderAccount, removeProviderAccount } from \"./account-management.ts\";\nimport { type AccountSlot, type ClaudeSdkOauthCredential, emptyCredential, listAccounts } from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport { type ClaudeSdkOauthProviderSettings, loadClaudeSdkOauthProviderSettingsFromDisk } from \"./settings.ts\";\n\nconst cliPinsBySession = new Map<string, string>();\n\ntype CommandEnvironment = (name: string) => string | undefined;\n\nexport interface ClaudeAccountCommandDeps {\n\tloadSettings?: (cwd: string) => ClaudeSdkOauthProviderSettings;\n\tenvironment?: CommandEnvironment;\n}\n\nfunction asCredential(value: Credential | undefined): ClaudeSdkOauthCredential | undefined {\n\treturn value?.type === \"oauth\" ? (value as ClaudeSdkOauthCredential) : undefined;\n}\n\nfunction slotStatus(slot: AccountSlot): string {\n\tif (slot.blockReason === \"auth_error\") return \"blocked until re-login\";\n\tif (slot.blockedUntil !== undefined && slot.blockedUntil > Date.now()) {\n\t\treturn `blocked until ${new Date(slot.blockedUntil).toISOString()}`;\n\t}\n\treturn \"available\";\n}\n\nfunction readAccounts(\n\tctx: ExtensionCommandContext,\n\tenvironment: CommandEnvironment,\n): {\n\tcredential: ClaudeSdkOauthCredential | undefined;\n\taccounts: AccountSlot[];\n} {\n\tconst credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_SDK_OAUTH_PROVIDER_ID));\n\treturn {\n\t\tcredential,\n\t\taccounts: listAccounts(credential ?? emptyCredential(), environment),\n\t};\n}\n\nfunction accountError(ctx: ExtensionCommandContext, name: string): void {\n\tctx.ui.notify(`Claude SDK OAuth account '${name}' does not exist.`, \"error\");\n}\n\nfunction parseArgs(rawArgs: string): string[] {\n\treturn rawArgs.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction authEventMessage(event: unknown): string {\n\tif (event === null || typeof event !== \"object\") return \"Claude SDK OAuth authentication update.\";\n\tconst value = event as Record<string, unknown>;\n\tif (value.type === \"auth_url\" && typeof value.url === \"string\") {\n\t\treturn `Open this URL to authorize Claude SDK OAuth:\\n${value.url}`;\n\t}\n\tif (value.type === \"device_code\" && typeof value.verificationUri === \"string\") {\n\t\treturn `Open this URL to authorize Claude SDK OAuth:\\n${value.verificationUri}`;\n\t}\n\treturn typeof value.message === \"string\" ? value.message : \"Claude SDK OAuth authentication update.\";\n}\n\nexport function getSessionClaudeAccountPin(sessionId: string | undefined): string | undefined {\n\treturn sessionId === undefined ? undefined : cliPinsBySession.get(sessionId);\n}\n\n/** CLI pins are request-local overrides; settings and stored pins remain fallback choices. */\nexport function resolveClaudeAccountPin(\n\tcliPinnedAccount: string | undefined,\n\tsettingsPinnedAccount: string | undefined,\n\tstoredPinnedAccount: string | undefined,\n): string | undefined {\n\treturn cliPinnedAccount ?? settingsPinnedAccount ?? storedPinnedAccount;\n}\n\nexport function registerClaudeAccountCommand(pi: ExtensionAPI, deps: ClaudeAccountCommandDeps = {}): void {\n\tconst loadSettings = deps.loadSettings ?? loadClaudeSdkOauthProviderSettingsFromDisk;\n\tconst environment = deps.environment ?? ((name: string) => process.env[name]);\n\n\tpi.registerFlag(\"claude-account\", {\n\t\ttype: \"string\",\n\t\tdescription: \"Pin Claude SDK OAuth account for this session.\",\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tconst flag = pi.getFlag(\"claude-account\");\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (typeof flag === \"string\" && flag.length > 0) cliPinsBySession.set(sessionId, flag);\n\t\telse cliPinsBySession.delete(sessionId);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tcliPinsBySession.delete(ctx.sessionManager.getSessionId());\n\t});\n\tpi.registerCommand(\"claude-account\", {\n\t\tdescription: \"List and manage Claude SDK OAuth accounts.\",\n\t\targumentHint: \"[add | remove <name> | pin <name> | unpin]\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst args = parseArgs(rawArgs);\n\t\t\tconst action = args[0] ?? \"list\";\n\t\t\tif (action === \"list\") {\n\t\t\t\tshowAccounts(ctx, loadSettings(ctx.cwd), environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"add\") {\n\t\t\t\tawait addAccount(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"remove\") {\n\t\t\t\tawait removeNamedAccount(ctx, args[1], environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"pin\" && args[1] !== \"unpin\") {\n\t\t\t\tawait pinNamedAccount(ctx, args[1], environment);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action === \"unpin\" || (action === \"pin\" && args[1] === \"unpin\")) {\n\t\t\t\tawait unpinAccount(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(\"Usage: /claude-account [add | remove <name> | pin <name> | unpin]\", \"error\");\n\t\t},\n\t});\n}\n\nfunction showAccounts(\n\tctx: ExtensionCommandContext,\n\tsettings: ClaudeSdkOauthProviderSettings,\n\tenvironment: CommandEnvironment,\n): void {\n\tconst { credential, accounts } = readAccounts(ctx, environment);\n\tconst cliPin = getSessionClaudeAccountPin(ctx.sessionManager.getSessionId());\n\tconst pinned = resolveClaudeAccountPin(cliPin, settings.pinnedAccount, credential?.pinned);\n\tconst pinSource = cliPin !== undefined ? \"CLI\" : settings.pinnedAccount !== undefined ? \"settings\" : \"stored\";\n\tlet affinityPick: string | undefined;\n\tlet affinityError: string | undefined;\n\tif (accounts.length > 0) {\n\t\ttry {\n\t\t\taffinityPick = selectAccount(accounts, {\n\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\tpinnedAccount: pinned,\n\t\t\t}).name;\n\t\t} catch (error) {\n\t\t\taffinityError = error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\tconst lines = [\"Claude SDK OAuth accounts:\"];\n\tif (accounts.length === 0) lines.push(\" (none)\");\n\tfor (const account of accounts) {\n\t\tconst states = [account.name, account.source, slotStatus(account)];\n\t\tif (account.name === pinned) states.push(\"pinned\");\n\t\tif (account.name === affinityPick) states.push(\"affinity pick\");\n\t\tlines.push(` ${states.join(\" | \")}`);\n\t}\n\tlines.push(`Pinned account: ${pinned === undefined ? \"none\" : `${pinned} (${pinSource.toLowerCase()})`}`);\n\tlines.push(`Affinity pick: ${affinityPick ?? (affinityError ? `unavailable - ${affinityError}` : \"none\")}`);\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nasync function addAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/claude-account add requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait ctx.modelRegistry.modelRuntime.login(CLAUDE_SDK_OAUTH_PROVIDER_ID, \"oauth\", {\n\t\t\tsignal: ctx.signal,\n\t\t\tprompt: async (prompt) => {\n\t\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\t\tif (answer === undefined) throw new Error(\"Login cancelled\");\n\t\t\t\treturn answer;\n\t\t\t},\n\t\t\tnotify: (event) => ctx.ui.notify(authEventMessage(event), \"info\"),\n\t\t});\n\t\temitProviderAccountsChanged(CLAUDE_SDK_OAUTH_PROVIDER_ID);\n\t\tctx.ui.notify(\"Claude SDK OAuth account added.\", \"info\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (message !== \"Login cancelled\") ctx.ui.notify(`Failed to add Claude SDK OAuth account: ${message}`, \"error\");\n\t}\n}\n\nasync function removeNamedAccount(\n\tctx: ExtensionCommandContext,\n\tname: string | undefined,\n\tenvironment: CommandEnvironment,\n): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /claude-account remove <name>\", \"error\");\n\t\treturn;\n\t}\n\tconst { accounts } = readAccounts(ctx, environment);\n\tconst target = accounts.find((account) => account.name === name);\n\tif (!target) return accountError(ctx, name);\n\tif (target.source === \"env\") {\n\t\tctx.ui.notify(`Claude SDK OAuth account '${name}' comes from the environment and cannot be removed.`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait removeProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, name);\n\t\tctx.ui.notify(`Removed Claude SDK OAuth account: ${name}.`, \"info\");\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t}\n}\n\nasync function pinNamedAccount(\n\tctx: ExtensionCommandContext,\n\tname: string | undefined,\n\tenvironment: CommandEnvironment,\n): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /claude-account pin <name>\", \"error\");\n\t\treturn;\n\t}\n\tif (!readAccounts(ctx, environment).accounts.some((account) => account.name === name)) {\n\t\treturn accountError(ctx, name);\n\t}\n\ttry {\n\t\tawait pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, name);\n\t\tctx.ui.notify(`Pinned Claude SDK OAuth account: ${name}.`, \"info\");\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t}\n}\n\nasync function unpinAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tconst credential = asCredential(ctx.modelRegistry.authStorage.get(CLAUDE_SDK_OAUTH_PROVIDER_ID));\n\tif (!credential?.pinned) {\n\t\tctx.ui.notify(\"No stored Claude SDK OAuth account pin is set.\", \"info\");\n\t\treturn;\n\t}\n\tawait pinProviderAccount(ctx.modelRegistry.authStorage, CLAUDE_SDK_OAUTH_PROVIDER_ID, null);\n\tctx.ui.notify(\"Unpinned Claude SDK OAuth account.\", \"info\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"account-events.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,GAAG,4BAA4B,CAAC;AAE/F,KAAK,4BAA4B,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAI1E,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,4BAA4B,GAAG,MAAM,IAAI,CAGjG;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAElH"}
1
+ {"version":3,"file":"account-events.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,GAAG,4BAA4B,CAAC;AAE/F,KAAK,4BAA4B,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAI1E,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,4BAA4B,GAAG,MAAM,IAAI,CAGjG;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAElH"}
@@ -1 +1 @@
1
- {"version":3,"file":"account-events.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-events.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;AAE1D,MAAM,UAAU,8BAA8B,CAAC,QAAsC;IACpF,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAU,EAAE,MAAoB;IAC3G,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,IAAI,CAAC,KAA2B;IACxC,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC","sourcesContent":["import type { SdkErrorKind } from \"./errors.ts\";\n\nexport type ProviderAccountsChangedEvent = {\n\treadonly type: \"accounts_changed\";\n\treadonly provider: string;\n};\n\nexport type ProviderAccountFailoverEvent = {\n\treadonly type: \"failover\";\n\treadonly provider: string;\n\treadonly from: string;\n\treadonly to: string;\n\treadonly reason: SdkErrorKind;\n};\n\nexport type ProviderAccountEvent = ProviderAccountsChangedEvent | ProviderAccountFailoverEvent;\n\ntype ProviderAccountEventListener = (event: ProviderAccountEvent) => void;\n\nconst listeners = new Set<ProviderAccountEventListener>();\n\nexport function subscribeProviderAccountEvents(listener: ProviderAccountEventListener): () => void {\n\tlisteners.add(listener);\n\treturn () => listeners.delete(listener);\n}\n\nexport function emitProviderAccountsChanged(provider: string): void {\n\temit({ type: \"accounts_changed\", provider });\n}\n\nexport function emitProviderAccountFailover(provider: string, from: string, to: string, reason: SdkErrorKind): void {\n\temit({ type: \"failover\", provider, from, to, reason });\n}\n\nfunction emit(event: ProviderAccountEvent): void {\n\tfor (const listener of listeners) listener(event);\n}\n"]}
1
+ {"version":3,"file":"account-events.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-events.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;AAE1D,MAAM,UAAU,8BAA8B,CAAC,QAAsC;IACpF,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAU,EAAE,MAAoB;IAC3G,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,IAAI,CAAC,KAA2B;IACxC,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC","sourcesContent":["import type { SdkErrorKind } from \"./errors.ts\";\n\nexport type ProviderAccountsChangedEvent = {\n\treadonly type: \"accounts_changed\";\n\treadonly provider: string;\n};\n\nexport type ProviderAccountFailoverEvent = {\n\treadonly type: \"failover\";\n\treadonly provider: string;\n\treadonly from: string;\n\treadonly to: string;\n\treadonly reason: SdkErrorKind;\n};\n\nexport type ProviderAccountEvent = ProviderAccountsChangedEvent | ProviderAccountFailoverEvent;\n\ntype ProviderAccountEventListener = (event: ProviderAccountEvent) => void;\n\nconst listeners = new Set<ProviderAccountEventListener>();\n\nexport function subscribeProviderAccountEvents(listener: ProviderAccountEventListener): () => void {\n\tlisteners.add(listener);\n\treturn () => listeners.delete(listener);\n}\n\nexport function emitProviderAccountsChanged(provider: string): void {\n\temit({ type: \"accounts_changed\", provider });\n}\n\nexport function emitProviderAccountFailover(provider: string, from: string, to: string, reason: SdkErrorKind): void {\n\temit({ type: \"failover\", provider, from, to, reason });\n}\n\nfunction emit(event: ProviderAccountEvent): void {\n\tfor (const listener of listeners) listener(event);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { AuthStorage } from "../../../auth-storage.ts";
2
2
  import { type AccountSlot } from "./accounts.ts";
3
- export declare const CLAUDE_AGENT_SDK_PROVIDER_ID = "claude-agent-sdk";
3
+ export declare const CLAUDE_SDK_OAUTH_PROVIDER_ID = "claude-sdk-oauth";
4
4
  export type ProviderAccountSummary = {
5
5
  readonly name: string;
6
6
  readonly source: AccountSlot["source"];
@@ -1 +1 @@
1
- {"version":3,"file":"account-management.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-management.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EACN,KAAK,WAAW,EAMhB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,sBAAsB,EAAE,CAW1B;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/G"}
1
+ {"version":3,"file":"account-management.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-management.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EACN,KAAK,WAAW,EAMhB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,sBAAsB,EAAE,CAW1B;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/G"}
@@ -1,6 +1,6 @@
1
1
  import { emitProviderAccountsChanged } from "./account-events.js";
2
2
  import { emptyCredential, listAccounts, pinAccount, removeAccount, } from "./accounts.js";
3
- export const CLAUDE_AGENT_SDK_PROVIDER_ID = "claude-agent-sdk";
3
+ export const CLAUDE_SDK_OAUTH_PROVIDER_ID = "claude-sdk-oauth";
4
4
  export function getProviderAccounts(storage, provider, env = process.env) {
5
5
  assertManagedProvider(provider);
6
6
  const credential = credentialFrom(storage.get(provider));
@@ -46,7 +46,7 @@ export async function removeProviderAccount(storage, provider, name) {
46
46
  emitProviderAccountsChanged(provider);
47
47
  }
48
48
  function assertManagedProvider(provider) {
49
- if (provider !== CLAUDE_AGENT_SDK_PROVIDER_ID) {
49
+ if (provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) {
50
50
  throw new Error(`Provider account management is unavailable for: ${provider}`);
51
51
  }
52
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"account-management.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/account-management.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport type { AuthStorage } from \"../../../auth-storage.ts\";\nimport { emitProviderAccountsChanged } from \"./account-events.ts\";\nimport {\n\ttype AccountSlot,\n\ttype ClaudeAgentSdkCredential,\n\temptyCredential,\n\tlistAccounts,\n\tpinAccount,\n\tremoveAccount,\n} from \"./accounts.ts\";\n\nexport const CLAUDE_AGENT_SDK_PROVIDER_ID = \"claude-agent-sdk\";\n\nexport type ProviderAccountSummary = {\n\treadonly name: string;\n\treadonly source: AccountSlot[\"source\"];\n\treadonly blocked: boolean;\n\treadonly pinned: boolean;\n};\n\nexport function getProviderAccounts(\n\tstorage: AuthStorage,\n\tprovider: string,\n\tenv: NodeJS.ProcessEnv = process.env,\n): ProviderAccountSummary[] {\n\tassertManagedProvider(provider);\n\tconst credential = credentialFrom(storage.get(provider));\n\tconst now = Date.now();\n\treturn listAccounts(credential, (name) => env[name]).map((account) => ({\n\t\tname: account.name,\n\t\tsource: account.source,\n\t\tblocked:\n\t\t\taccount.blockReason === \"auth_error\" || (account.blockedUntil !== undefined && account.blockedUntil > now),\n\t\tpinned: credential.pinned === account.name,\n\t}));\n}\n\nexport async function pinProviderAccount(\n\tstorage: AuthStorage,\n\tprovider: string,\n\tname: string | null,\n\tenv: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n\tassertManagedProvider(provider);\n\tawait storage.modify(provider, async (current) => {\n\t\tconst credential = credentialFrom(current);\n\t\tif (name === null) {\n\t\t\tif (credential.pinned === undefined) return current;\n\t\t\tconst { pinned: _pinned, ...unpinned } = credential;\n\t\t\treturn unpinned;\n\t\t}\n\t\tif (!listAccounts(credential, (key) => env[key]).some((account) => account.name === name)) {\n\t\t\tthrow new Error(`Provider account not found: ${name}`);\n\t\t}\n\t\treturn pinAccount(credential, name);\n\t});\n\temitProviderAccountsChanged(provider);\n}\n\nexport async function removeProviderAccount(storage: AuthStorage, provider: string, name: string): Promise<void> {\n\tassertManagedProvider(provider);\n\tawait storage.modify(provider, async (current) => {\n\t\tconst credential = credentialFrom(current);\n\t\tconst account = (credential.accounts ?? []).find((candidate) => candidate.name === name);\n\t\tif (!account) {\n\t\t\tconst environmentAccount = listAccounts(credential, (key) => process.env[key]).find(\n\t\t\t\t(candidate) => candidate.name === name,\n\t\t\t);\n\t\t\tif (environmentAccount?.source === \"env\") {\n\t\t\t\tthrow new Error(`Environment provider account cannot be removed: ${name}`);\n\t\t\t}\n\t\t\tthrow new Error(`Provider account not found: ${name}`);\n\t\t}\n\t\treturn removeAccount(credential, name);\n\t});\n\temitProviderAccountsChanged(provider);\n}\n\nfunction assertManagedProvider(provider: string): void {\n\tif (provider !== CLAUDE_AGENT_SDK_PROVIDER_ID) {\n\t\tthrow new Error(`Provider account management is unavailable for: ${provider}`);\n\t}\n}\n\nfunction credentialFrom(credential: Credential | undefined): ClaudeAgentSdkCredential {\n\tif (credential === undefined) return emptyCredential();\n\tif (credential.type !== \"oauth\") throw new Error(\"Provider account management requires an OAuth credential\");\n\treturn credential as ClaudeAgentSdkCredential;\n}\n"]}
1
+ {"version":3,"file":"account-management.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/account-management.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport type { AuthStorage } from \"../../../auth-storage.ts\";\nimport { emitProviderAccountsChanged } from \"./account-events.ts\";\nimport {\n\ttype AccountSlot,\n\ttype ClaudeSdkOauthCredential,\n\temptyCredential,\n\tlistAccounts,\n\tpinAccount,\n\tremoveAccount,\n} from \"./accounts.ts\";\n\nexport const CLAUDE_SDK_OAUTH_PROVIDER_ID = \"claude-sdk-oauth\";\n\nexport type ProviderAccountSummary = {\n\treadonly name: string;\n\treadonly source: AccountSlot[\"source\"];\n\treadonly blocked: boolean;\n\treadonly pinned: boolean;\n};\n\nexport function getProviderAccounts(\n\tstorage: AuthStorage,\n\tprovider: string,\n\tenv: NodeJS.ProcessEnv = process.env,\n): ProviderAccountSummary[] {\n\tassertManagedProvider(provider);\n\tconst credential = credentialFrom(storage.get(provider));\n\tconst now = Date.now();\n\treturn listAccounts(credential, (name) => env[name]).map((account) => ({\n\t\tname: account.name,\n\t\tsource: account.source,\n\t\tblocked:\n\t\t\taccount.blockReason === \"auth_error\" || (account.blockedUntil !== undefined && account.blockedUntil > now),\n\t\tpinned: credential.pinned === account.name,\n\t}));\n}\n\nexport async function pinProviderAccount(\n\tstorage: AuthStorage,\n\tprovider: string,\n\tname: string | null,\n\tenv: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n\tassertManagedProvider(provider);\n\tawait storage.modify(provider, async (current) => {\n\t\tconst credential = credentialFrom(current);\n\t\tif (name === null) {\n\t\t\tif (credential.pinned === undefined) return current;\n\t\t\tconst { pinned: _pinned, ...unpinned } = credential;\n\t\t\treturn unpinned;\n\t\t}\n\t\tif (!listAccounts(credential, (key) => env[key]).some((account) => account.name === name)) {\n\t\t\tthrow new Error(`Provider account not found: ${name}`);\n\t\t}\n\t\treturn pinAccount(credential, name);\n\t});\n\temitProviderAccountsChanged(provider);\n}\n\nexport async function removeProviderAccount(storage: AuthStorage, provider: string, name: string): Promise<void> {\n\tassertManagedProvider(provider);\n\tawait storage.modify(provider, async (current) => {\n\t\tconst credential = credentialFrom(current);\n\t\tconst account = (credential.accounts ?? []).find((candidate) => candidate.name === name);\n\t\tif (!account) {\n\t\t\tconst environmentAccount = listAccounts(credential, (key) => process.env[key]).find(\n\t\t\t\t(candidate) => candidate.name === name,\n\t\t\t);\n\t\t\tif (environmentAccount?.source === \"env\") {\n\t\t\t\tthrow new Error(`Environment provider account cannot be removed: ${name}`);\n\t\t\t}\n\t\t\tthrow new Error(`Provider account not found: ${name}`);\n\t\t}\n\t\treturn removeAccount(credential, name);\n\t});\n\temitProviderAccountsChanged(provider);\n}\n\nfunction assertManagedProvider(provider: string): void {\n\tif (provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) {\n\t\tthrow new Error(`Provider account management is unavailable for: ${provider}`);\n\t}\n}\n\nfunction credentialFrom(credential: Credential | undefined): ClaudeSdkOauthCredential {\n\tif (credential === undefined) return emptyCredential();\n\tif (credential.type !== \"oauth\") throw new Error(\"Provider account management requires an OAuth credential\");\n\treturn credential as ClaudeSdkOauthCredential;\n}\n"]}
@@ -12,23 +12,23 @@ export type SlotState = Record<string, {
12
12
  blockedUntil?: number;
13
13
  blockReason?: string;
14
14
  }>;
15
- export type ClaudeAgentSdkCredential = OAuthCredential & {
15
+ export type ClaudeSdkOauthCredential = OAuthCredential & {
16
16
  accounts?: AccountSlot[];
17
17
  pinned?: string;
18
18
  slotState?: SlotState;
19
19
  };
20
20
  export declare const SENTINEL_OAUTH_FIELDS: {
21
- readonly access: "claude-agent-sdk-managed";
22
- readonly refresh: "claude-agent-sdk-managed";
21
+ readonly access: "claude-sdk-oauth-managed";
22
+ readonly refresh: "claude-sdk-oauth-managed";
23
23
  readonly expires: 4102444800000;
24
24
  };
25
- export declare function emptyCredential(): ClaudeAgentSdkCredential;
26
- export declare function listAccounts(credential: ClaudeAgentSdkCredential, env?: (name: string) => string | undefined): AccountSlot[];
25
+ export declare function emptyCredential(): ClaudeSdkOauthCredential;
26
+ export declare function listAccounts(credential: ClaudeSdkOauthCredential, env?: (name: string) => string | undefined): AccountSlot[];
27
27
  export declare function assertValidAccountName(name: string): void;
28
- export declare function addAccount(credential: ClaudeAgentSdkCredential, slot: AccountSlot): ClaudeAgentSdkCredential;
29
- export declare function removeAccount(credential: ClaudeAgentSdkCredential, name: string): ClaudeAgentSdkCredential;
30
- export declare function pinAccount(credential: ClaudeAgentSdkCredential, name: string): ClaudeAgentSdkCredential;
31
- export declare function assertSentinelInvariant(credential: ClaudeAgentSdkCredential): void;
28
+ export declare function addAccount(credential: ClaudeSdkOauthCredential, slot: AccountSlot): ClaudeSdkOauthCredential;
29
+ export declare function removeAccount(credential: ClaudeSdkOauthCredential, name: string): ClaudeSdkOauthCredential;
30
+ export declare function pinAccount(credential: ClaudeSdkOauthCredential, name: string): ClaudeSdkOauthCredential;
31
+ export declare function assertSentinelInvariant(credential: ClaudeSdkOauthCredential): void;
32
32
  export declare function envSlots(env: (name: string) => string | undefined): AccountSlot[];
33
33
  export declare function envSlotToken(env: (name: string) => string | undefined, slotName: string): string | undefined;
34
34
  export type SlotRefresher = (refreshToken: string) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExF,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG;IACxD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,qBAAqB;aACjC,MAAM,EAAE,0BAA0B;aAClC,OAAO,EAAE,0BAA0B;aACnC,OAAO,EAAE,aAAa;CACb,CAAC;AAEX,wBAAgB,eAAe,IAAI,wBAAwB,CAE1D;AAMD,wBAAgB,YAAY,CAC3B,UAAU,EAAE,wBAAwB,EACpC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxC,WAAW,EAAE,CAUf;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,WAAW,GAAG,wBAAwB,CAM5G;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAK1G;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAEvG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAQlF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAajF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK5G;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACpH,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAE/D,wBAAsB,WAAW,CAChC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,aAAa,EACxB,UAAU,GAAE,mBAAwD,GAClE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAejC"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExF,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG;IACxD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,qBAAqB;aACjC,MAAM,EAAE,0BAA0B;aAClC,OAAO,EAAE,0BAA0B;aACnC,OAAO,EAAE,aAAa;CACb,CAAC;AAEX,wBAAgB,eAAe,IAAI,wBAAwB,CAE1D;AAMD,wBAAgB,YAAY,CAC3B,UAAU,EAAE,wBAAwB,EACpC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxC,WAAW,EAAE,CAUf;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,WAAW,GAAG,wBAAwB,CAM5G;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAK1G;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAEvG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAQlF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAajF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK5G;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACpH,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAE/D,wBAAsB,WAAW,CAChC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,aAAa,EACxB,UAAU,GAAE,mBAAwD,GAClE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAejC"}
@@ -1,6 +1,6 @@
1
1
  export const SENTINEL_OAUTH_FIELDS = {
2
- access: "claude-agent-sdk-managed",
3
- refresh: "claude-agent-sdk-managed",
2
+ access: "claude-sdk-oauth-managed",
3
+ refresh: "claude-sdk-oauth-managed",
4
4
  expires: 4102444800000,
5
5
  };
6
6
  export function emptyCredential() {
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential, CredentialStore, OAuthCredential } from \"@earendil-works/pi-ai\";\n\nexport type AccountSlot = {\n\tname: string;\n\trefresh: string;\n\taccess: string;\n\texpires: number;\n\tsource: \"login\" | \"import\" | \"env\";\n\tblockedUntil?: number;\n\tblockReason?: string;\n};\n\nexport type SlotState = Record<string, { blockedUntil?: number; blockReason?: string }>;\n\nexport type ClaudeAgentSdkCredential = OAuthCredential & {\n\taccounts?: AccountSlot[];\n\tpinned?: string;\n\tslotState?: SlotState;\n};\n\nexport const SENTINEL_OAUTH_FIELDS = {\n\taccess: \"claude-agent-sdk-managed\",\n\trefresh: \"claude-agent-sdk-managed\",\n\texpires: 4102444800000,\n} as const;\n\nexport function emptyCredential(): ClaudeAgentSdkCredential {\n\treturn { type: \"oauth\", ...SENTINEL_OAUTH_FIELDS, accounts: [] };\n}\n\nfunction storedSlots(credential: ClaudeAgentSdkCredential): AccountSlot[] {\n\treturn credential.accounts ?? [];\n}\n\nexport function listAccounts(\n\tcredential: ClaudeAgentSdkCredential,\n\tenv?: (name: string) => string | undefined,\n): AccountSlot[] {\n\tconst slots = [...storedSlots(credential)];\n\tif (env) {\n\t\tconst state = credential.slotState ?? {};\n\t\tfor (const slot of envSlots(env)) {\n\t\t\tconst persisted = state[slot.name];\n\t\t\tslots.push(persisted ? { ...slot, ...persisted } : slot);\n\t\t}\n\t}\n\treturn slots;\n}\n\nconst ACCOUNT_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;\n\nexport function assertValidAccountName(name: string): void {\n\tif (!ACCOUNT_NAME_PATTERN.test(name)) {\n\t\tthrow new Error(\n\t\t\t`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`,\n\t\t);\n\t}\n}\n\nexport function addAccount(credential: ClaudeAgentSdkCredential, slot: AccountSlot): ClaudeAgentSdkCredential {\n\tassertValidAccountName(slot.name);\n\tif (storedSlots(credential).some((existing) => existing.name === slot.name)) {\n\t\tthrow new Error(`Account '${slot.name}' already exists`);\n\t}\n\treturn { ...credential, accounts: [...storedSlots(credential), slot] };\n}\n\nexport function removeAccount(credential: ClaudeAgentSdkCredential, name: string): ClaudeAgentSdkCredential {\n\tconst accounts = storedSlots(credential).filter((slot) => slot.name !== name);\n\tconst next: ClaudeAgentSdkCredential = { ...credential, accounts };\n\tif (credential.pinned === name) delete next.pinned;\n\treturn next;\n}\n\nexport function pinAccount(credential: ClaudeAgentSdkCredential, name: string): ClaudeAgentSdkCredential {\n\treturn { ...credential, pinned: name };\n}\n\nexport function assertSentinelInvariant(credential: ClaudeAgentSdkCredential): void {\n\tif (\n\t\tcredential.access !== SENTINEL_OAUTH_FIELDS.access ||\n\t\tcredential.refresh !== SENTINEL_OAUTH_FIELDS.refresh ||\n\t\tcredential.expires !== SENTINEL_OAUTH_FIELDS.expires\n\t) {\n\t\tthrow new Error(\"top-level OAuth fields must remain sentinel values\");\n\t}\n}\n\nexport function envSlots(env: (name: string) => string | undefined): AccountSlot[] {\n\tconst slots: AccountSlot[] = [];\n\tconst read = (suffix: string | undefined) =>\n\t\tenv(suffix === undefined ? \"CLAUDE_CODE_OAUTH_TOKEN\" : `CLAUDE_CODE_OAUTH_TOKEN_${suffix}`);\n\tconst names: Array<{ suffix?: string; slot: string }> = [{ slot: \"env\" }];\n\tfor (let index = 2; index <= 16; index++) names.push({ suffix: String(index), slot: `env-${index}` });\n\tfor (const { suffix, slot } of names) {\n\t\tconst token = read(suffix);\n\t\tif (token) {\n\t\t\tslots.push({ name: slot, refresh: \"\", access: \"\", expires: 0, source: \"env\" });\n\t\t}\n\t}\n\treturn slots;\n}\n\nexport function envSlotToken(env: (name: string) => string | undefined, slotName: string): string | undefined {\n\tconst match = /^env(?:-(\\d+))?$/.exec(slotName);\n\tif (!match) return undefined;\n\tconst suffix = match[1];\n\treturn env(suffix === undefined ? \"CLAUDE_CODE_OAUTH_TOKEN\" : `CLAUDE_CODE_OAUTH_TOKEN_${suffix}`);\n}\n\nexport type SlotRefresher = (refreshToken: string) => Promise<{ refresh: string; access: string; expires: number }>;\nexport type SlotExpirationCheck = (expires: number) => boolean;\n\nexport async function refreshSlot(\n\tstore: CredentialStore,\n\tproviderId: string,\n\tslotName: string,\n\trefresher: SlotRefresher,\n\tisExpiring: SlotExpirationCheck = (expires) => Date.now() >= expires,\n): Promise<Credential | undefined> {\n\treturn store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return undefined;\n\t\tconst credential = current as ClaudeAgentSdkCredential;\n\t\tconst slot = storedSlots(credential).find((candidate) => candidate.name === slotName);\n\t\tif (!slot) return current;\n\t\tif (!isExpiring(slot.expires)) return current;\n\t\tconst refreshed = await refresher(slot.refresh);\n\t\tconst accounts = storedSlots(credential).map((candidate) =>\n\t\t\tcandidate.name === slotName\n\t\t\t\t? { ...candidate, refresh: refreshed.refresh, access: refreshed.access, expires: refreshed.expires }\n\t\t\t\t: candidate,\n\t\t);\n\t\treturn { ...credential, accounts };\n\t});\n}\n"]}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential, CredentialStore, OAuthCredential } from \"@earendil-works/pi-ai\";\n\nexport type AccountSlot = {\n\tname: string;\n\trefresh: string;\n\taccess: string;\n\texpires: number;\n\tsource: \"login\" | \"import\" | \"env\";\n\tblockedUntil?: number;\n\tblockReason?: string;\n};\n\nexport type SlotState = Record<string, { blockedUntil?: number; blockReason?: string }>;\n\nexport type ClaudeSdkOauthCredential = OAuthCredential & {\n\taccounts?: AccountSlot[];\n\tpinned?: string;\n\tslotState?: SlotState;\n};\n\nexport const SENTINEL_OAUTH_FIELDS = {\n\taccess: \"claude-sdk-oauth-managed\",\n\trefresh: \"claude-sdk-oauth-managed\",\n\texpires: 4102444800000,\n} as const;\n\nexport function emptyCredential(): ClaudeSdkOauthCredential {\n\treturn { type: \"oauth\", ...SENTINEL_OAUTH_FIELDS, accounts: [] };\n}\n\nfunction storedSlots(credential: ClaudeSdkOauthCredential): AccountSlot[] {\n\treturn credential.accounts ?? [];\n}\n\nexport function listAccounts(\n\tcredential: ClaudeSdkOauthCredential,\n\tenv?: (name: string) => string | undefined,\n): AccountSlot[] {\n\tconst slots = [...storedSlots(credential)];\n\tif (env) {\n\t\tconst state = credential.slotState ?? {};\n\t\tfor (const slot of envSlots(env)) {\n\t\t\tconst persisted = state[slot.name];\n\t\t\tslots.push(persisted ? { ...slot, ...persisted } : slot);\n\t\t}\n\t}\n\treturn slots;\n}\n\nconst ACCOUNT_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;\n\nexport function assertValidAccountName(name: string): void {\n\tif (!ACCOUNT_NAME_PATTERN.test(name)) {\n\t\tthrow new Error(\n\t\t\t`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`,\n\t\t);\n\t}\n}\n\nexport function addAccount(credential: ClaudeSdkOauthCredential, slot: AccountSlot): ClaudeSdkOauthCredential {\n\tassertValidAccountName(slot.name);\n\tif (storedSlots(credential).some((existing) => existing.name === slot.name)) {\n\t\tthrow new Error(`Account '${slot.name}' already exists`);\n\t}\n\treturn { ...credential, accounts: [...storedSlots(credential), slot] };\n}\n\nexport function removeAccount(credential: ClaudeSdkOauthCredential, name: string): ClaudeSdkOauthCredential {\n\tconst accounts = storedSlots(credential).filter((slot) => slot.name !== name);\n\tconst next: ClaudeSdkOauthCredential = { ...credential, accounts };\n\tif (credential.pinned === name) delete next.pinned;\n\treturn next;\n}\n\nexport function pinAccount(credential: ClaudeSdkOauthCredential, name: string): ClaudeSdkOauthCredential {\n\treturn { ...credential, pinned: name };\n}\n\nexport function assertSentinelInvariant(credential: ClaudeSdkOauthCredential): void {\n\tif (\n\t\tcredential.access !== SENTINEL_OAUTH_FIELDS.access ||\n\t\tcredential.refresh !== SENTINEL_OAUTH_FIELDS.refresh ||\n\t\tcredential.expires !== SENTINEL_OAUTH_FIELDS.expires\n\t) {\n\t\tthrow new Error(\"top-level OAuth fields must remain sentinel values\");\n\t}\n}\n\nexport function envSlots(env: (name: string) => string | undefined): AccountSlot[] {\n\tconst slots: AccountSlot[] = [];\n\tconst read = (suffix: string | undefined) =>\n\t\tenv(suffix === undefined ? \"CLAUDE_CODE_OAUTH_TOKEN\" : `CLAUDE_CODE_OAUTH_TOKEN_${suffix}`);\n\tconst names: Array<{ suffix?: string; slot: string }> = [{ slot: \"env\" }];\n\tfor (let index = 2; index <= 16; index++) names.push({ suffix: String(index), slot: `env-${index}` });\n\tfor (const { suffix, slot } of names) {\n\t\tconst token = read(suffix);\n\t\tif (token) {\n\t\t\tslots.push({ name: slot, refresh: \"\", access: \"\", expires: 0, source: \"env\" });\n\t\t}\n\t}\n\treturn slots;\n}\n\nexport function envSlotToken(env: (name: string) => string | undefined, slotName: string): string | undefined {\n\tconst match = /^env(?:-(\\d+))?$/.exec(slotName);\n\tif (!match) return undefined;\n\tconst suffix = match[1];\n\treturn env(suffix === undefined ? \"CLAUDE_CODE_OAUTH_TOKEN\" : `CLAUDE_CODE_OAUTH_TOKEN_${suffix}`);\n}\n\nexport type SlotRefresher = (refreshToken: string) => Promise<{ refresh: string; access: string; expires: number }>;\nexport type SlotExpirationCheck = (expires: number) => boolean;\n\nexport async function refreshSlot(\n\tstore: CredentialStore,\n\tproviderId: string,\n\tslotName: string,\n\trefresher: SlotRefresher,\n\tisExpiring: SlotExpirationCheck = (expires) => Date.now() >= expires,\n): Promise<Credential | undefined> {\n\treturn store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return undefined;\n\t\tconst credential = current as ClaudeSdkOauthCredential;\n\t\tconst slot = storedSlots(credential).find((candidate) => candidate.name === slotName);\n\t\tif (!slot) return current;\n\t\tif (!isExpiring(slot.expires)) return current;\n\t\tconst refreshed = await refresher(slot.refresh);\n\t\tconst accounts = storedSlots(credential).map((candidate) =>\n\t\t\tcandidate.name === slotName\n\t\t\t\t? { ...candidate, refresh: refreshed.refresh, access: refreshed.access, expires: refreshed.expires }\n\t\t\t\t: candidate,\n\t\t);\n\t\treturn { ...credential, accounts };\n\t});\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { AccountSlot } from "./accounts.ts";
2
- export declare const DEFAULT_AFFINITY_KEY = "claude-agent-sdk-default";
2
+ export declare const DEFAULT_AFFINITY_KEY = "claude-sdk-oauth-default";
3
3
  export type AffinityOptions = {
4
4
  affinityKey?: string;
5
5
  sessionId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"affinity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/affinity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9C,YAAY,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAQ/C;CACD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,WAAW,CAAC,GAAG,MAAM,CAElG;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAK5F;AAMD,gHAAgH;AAChH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,SAAa,GAAG,WAAW,EAAE,CAQpG;AAsBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,WAAW,CAW1G"}
1
+ {"version":3,"file":"affinity.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/affinity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9C,YAAY,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAQ/C;CACD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,WAAW,CAAC,GAAG,MAAM,CAElG;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAK5F;AAMD,gHAAgH;AAChH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,SAAa,GAAG,WAAW,EAAE,CAQpG;AAsBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,WAAW,CAW1G"}
@@ -1,10 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
- export const DEFAULT_AFFINITY_KEY = "claude-agent-sdk-default";
2
+ export const DEFAULT_AFFINITY_KEY = "claude-sdk-oauth-default";
3
3
  export class AllAccountsBlockedError extends Error {
4
4
  constructor(soonestUnblockAt) {
5
5
  super(soonestUnblockAt === undefined
6
- ? "All Claude Agent SDK accounts are blocked until re-login."
7
- : `All Claude Agent SDK accounts are blocked until ${new Date(soonestUnblockAt).toISOString()}.`);
6
+ ? "All Claude SDK OAuth accounts are blocked until re-login."
7
+ : `All Claude SDK OAuth accounts are blocked until ${new Date(soonestUnblockAt).toISOString()}.`);
8
8
  this.name = "AllAccountsBlockedError";
9
9
  this.soonestUnblockAt = soonestUnblockAt;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"affinity.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/affinity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { AccountSlot } from \"./accounts.ts\";\n\nexport const DEFAULT_AFFINITY_KEY = \"claude-agent-sdk-default\";\n\nexport type AffinityOptions = {\n\taffinityKey?: string;\n\tsessionId?: string;\n\tpinnedAccount?: string;\n\tnow?: number;\n};\n\nexport class AllAccountsBlockedError extends Error {\n\treadonly soonestUnblockAt: number | undefined;\n\n\tconstructor(soonestUnblockAt: number | undefined) {\n\t\tsuper(\n\t\t\tsoonestUnblockAt === undefined\n\t\t\t\t? \"All Claude Agent SDK accounts are blocked until re-login.\"\n\t\t\t\t: `All Claude Agent SDK accounts are blocked until ${new Date(soonestUnblockAt).toISOString()}.`,\n\t\t);\n\t\tthis.name = \"AllAccountsBlockedError\";\n\t\tthis.soonestUnblockAt = soonestUnblockAt;\n\t}\n}\n\nexport function getAffinityKey(options: Pick<AffinityOptions, \"affinityKey\" | \"sessionId\">): string {\n\treturn options.affinityKey ?? options.sessionId ?? DEFAULT_AFFINITY_KEY;\n}\n\nfunction score(key: string, accountName: string): bigint {\n\treturn createHash(\"sha256\").update(`${key}\\0${accountName}`).digest().readBigUInt64BE(0);\n}\n\n/**\n * Session-stable HRW ordering preserves Claude prompt-cache locality while moving\n * only the sessions that rendezvous with a newly added or removed account.\n */\nexport function rendezvousOrder(key: string, accounts: readonly AccountSlot[]): AccountSlot[] {\n\treturn [...accounts]\n\t\t.map((account) => ({ account, score: score(key, account.name) }))\n\t\t.sort((left, right) => (right.score > left.score ? 1 : right.score < left.score ? -1 : 0))\n\t\t.map(({ account }) => account);\n}\n\nfunction isBlocked(account: AccountSlot, now: number): boolean {\n\treturn account.blockReason === \"auth_error\" || (account.blockedUntil !== undefined && account.blockedUntil > now);\n}\n\n/** Removes elapsed rate/capacity blocks but deliberately retains auth blocks until login refreshes the slot. */\nexport function clearExpiredBlocks(accounts: readonly AccountSlot[], now = Date.now()): AccountSlot[] {\n\treturn accounts.map((account) => {\n\t\tif (account.blockReason !== \"auth_error\" && account.blockedUntil !== undefined && account.blockedUntil <= now) {\n\t\t\tconst { blockedUntil: _blockedUntil, blockReason: _blockReason, ...available } = account;\n\t\t\treturn available;\n\t\t}\n\t\treturn account;\n\t});\n}\n\nfunction selectUnblocked(\n\taccounts: readonly AccountSlot[],\n\toptions: AffinityOptions,\n\tnow: number,\n): AccountSlot | undefined {\n\tconst pinned =\n\t\toptions.pinnedAccount === undefined\n\t\t\t? undefined\n\t\t\t: accounts.find((account) => account.name === options.pinnedAccount);\n\tif (pinned && !isBlocked(pinned, now)) return pinned;\n\treturn rendezvousOrder(getAffinityKey(options), accounts).find((account) => !isBlocked(account, now));\n}\n\nfunction soonestUnblockAt(accounts: readonly AccountSlot[], now: number): number | undefined {\n\tconst candidates = accounts\n\t\t.map((account) => account.blockedUntil)\n\t\t.filter((value): value is number => value !== undefined && value > now);\n\treturn candidates.length === 0 ? undefined : Math.min(...candidates);\n}\n\n/** Selects a pinned or HRW-ranked account with no provider-global selection state. */\nexport function selectAccount(accounts: readonly AccountSlot[], options: AffinityOptions = {}): AccountSlot {\n\tconst now = options.now ?? Date.now();\n\tconst selected = selectUnblocked(accounts, options, now);\n\tif (selected) return selected;\n\n\t// A stale persisted rate-limit entry must not dead-end the pool. Retry once\n\t// against the cleared view before reporting the earliest available account.\n\tconst cleared = clearExpiredBlocks(accounts, now);\n\tconst afterClear = selectUnblocked(cleared, options, now);\n\tif (afterClear) return afterClear;\n\tthrow new AllAccountsBlockedError(soonestUnblockAt(accounts, now));\n}\n"]}
1
+ {"version":3,"file":"affinity.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/affinity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { AccountSlot } from \"./accounts.ts\";\n\nexport const DEFAULT_AFFINITY_KEY = \"claude-sdk-oauth-default\";\n\nexport type AffinityOptions = {\n\taffinityKey?: string;\n\tsessionId?: string;\n\tpinnedAccount?: string;\n\tnow?: number;\n};\n\nexport class AllAccountsBlockedError extends Error {\n\treadonly soonestUnblockAt: number | undefined;\n\n\tconstructor(soonestUnblockAt: number | undefined) {\n\t\tsuper(\n\t\t\tsoonestUnblockAt === undefined\n\t\t\t\t? \"All Claude SDK OAuth accounts are blocked until re-login.\"\n\t\t\t\t: `All Claude SDK OAuth accounts are blocked until ${new Date(soonestUnblockAt).toISOString()}.`,\n\t\t);\n\t\tthis.name = \"AllAccountsBlockedError\";\n\t\tthis.soonestUnblockAt = soonestUnblockAt;\n\t}\n}\n\nexport function getAffinityKey(options: Pick<AffinityOptions, \"affinityKey\" | \"sessionId\">): string {\n\treturn options.affinityKey ?? options.sessionId ?? DEFAULT_AFFINITY_KEY;\n}\n\nfunction score(key: string, accountName: string): bigint {\n\treturn createHash(\"sha256\").update(`${key}\\0${accountName}`).digest().readBigUInt64BE(0);\n}\n\n/**\n * Session-stable HRW ordering preserves Claude prompt-cache locality while moving\n * only the sessions that rendezvous with a newly added or removed account.\n */\nexport function rendezvousOrder(key: string, accounts: readonly AccountSlot[]): AccountSlot[] {\n\treturn [...accounts]\n\t\t.map((account) => ({ account, score: score(key, account.name) }))\n\t\t.sort((left, right) => (right.score > left.score ? 1 : right.score < left.score ? -1 : 0))\n\t\t.map(({ account }) => account);\n}\n\nfunction isBlocked(account: AccountSlot, now: number): boolean {\n\treturn account.blockReason === \"auth_error\" || (account.blockedUntil !== undefined && account.blockedUntil > now);\n}\n\n/** Removes elapsed rate/capacity blocks but deliberately retains auth blocks until login refreshes the slot. */\nexport function clearExpiredBlocks(accounts: readonly AccountSlot[], now = Date.now()): AccountSlot[] {\n\treturn accounts.map((account) => {\n\t\tif (account.blockReason !== \"auth_error\" && account.blockedUntil !== undefined && account.blockedUntil <= now) {\n\t\t\tconst { blockedUntil: _blockedUntil, blockReason: _blockReason, ...available } = account;\n\t\t\treturn available;\n\t\t}\n\t\treturn account;\n\t});\n}\n\nfunction selectUnblocked(\n\taccounts: readonly AccountSlot[],\n\toptions: AffinityOptions,\n\tnow: number,\n): AccountSlot | undefined {\n\tconst pinned =\n\t\toptions.pinnedAccount === undefined\n\t\t\t? undefined\n\t\t\t: accounts.find((account) => account.name === options.pinnedAccount);\n\tif (pinned && !isBlocked(pinned, now)) return pinned;\n\treturn rendezvousOrder(getAffinityKey(options), accounts).find((account) => !isBlocked(account, now));\n}\n\nfunction soonestUnblockAt(accounts: readonly AccountSlot[], now: number): number | undefined {\n\tconst candidates = accounts\n\t\t.map((account) => account.blockedUntil)\n\t\t.filter((value): value is number => value !== undefined && value > now);\n\treturn candidates.length === 0 ? undefined : Math.min(...candidates);\n}\n\n/** Selects a pinned or HRW-ranked account with no provider-global selection state. */\nexport function selectAccount(accounts: readonly AccountSlot[], options: AffinityOptions = {}): AccountSlot {\n\tconst now = options.now ?? Date.now();\n\tconst selected = selectUnblocked(accounts, options, now);\n\tif (selected) return selected;\n\n\t// A stale persisted rate-limit entry must not dead-end the pool. Retry once\n\t// against the cleared view before reporting the earliest available account.\n\tconst cleared = clearExpiredBlocks(accounts, now);\n\tconst afterClear = selectUnblocked(cleared, options, now);\n\tif (afterClear) return afterClear;\n\tthrow new AllAccountsBlockedError(soonestUnblockAt(accounts, now));\n}\n"]}