@bastani/atomic 0.9.24 → 0.9.25-alpha.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 (416) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/builtin/intercom/index.bundle.mjs +5 -0
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/CHANGELOG.md +11 -0
  5. package/dist/builtin/mcp/index.bundle.mjs +219 -71
  6. package/dist/builtin/mcp/package.json +6 -2
  7. package/dist/builtin/subagents/package.json +3 -3
  8. package/dist/builtin/subagents/src/extension/index.bundle.mjs +1 -0
  9. package/dist/builtin/web-access/index.bundle.mjs +7 -6
  10. package/dist/builtin/web-access/package.json +2 -2
  11. package/dist/builtin/workflows/CHANGELOG.md +6 -0
  12. package/dist/builtin/workflows/package.json +2 -2
  13. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
  14. package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_6_1_sol.md +66 -0
  15. package/dist/builtin/workflows/src/extension/index.bundle.mjs +1 -0
  16. package/dist/cli/startup-ui.d.ts +3 -4
  17. package/dist/cli/startup-ui.d.ts.map +1 -1
  18. package/dist/cli/startup-ui.js +3 -4
  19. package/dist/cli/startup-ui.js.map +1 -1
  20. package/dist/config.d.ts +3 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +17 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agent-session-events.d.ts.map +1 -1
  25. package/dist/core/agent-session-events.js +5 -0
  26. package/dist/core/agent-session-events.js.map +1 -1
  27. package/dist/core/agent-session-export.d.ts.map +1 -1
  28. package/dist/core/agent-session-export.js +3 -0
  29. package/dist/core/agent-session-export.js.map +1 -1
  30. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  31. package/dist/core/agent-session-extension-bindings.js +4 -0
  32. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  33. package/dist/core/agent-session-methods.d.ts +2 -1
  34. package/dist/core/agent-session-methods.d.ts.map +1 -1
  35. package/dist/core/agent-session-methods.js.map +1 -1
  36. package/dist/core/agent-session-nested-tools.d.ts +10 -0
  37. package/dist/core/agent-session-nested-tools.d.ts.map +1 -0
  38. package/dist/core/agent-session-nested-tools.js +76 -0
  39. package/dist/core/agent-session-nested-tools.js.map +1 -0
  40. package/dist/core/agent-session-runtime-auth.js +3 -1
  41. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  42. package/dist/core/agent-session-state.d.ts +2 -0
  43. package/dist/core/agent-session-state.d.ts.map +1 -1
  44. package/dist/core/agent-session-state.js +11 -11
  45. package/dist/core/agent-session-state.js.map +1 -1
  46. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  47. package/dist/core/agent-session-tool-hooks.js +18 -3
  48. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  49. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  50. package/dist/core/agent-session-tool-registry.js +15 -3
  51. package/dist/core/agent-session-tool-registry.js.map +1 -1
  52. package/dist/core/agent-session-types.d.ts +6 -2
  53. package/dist/core/agent-session-types.d.ts.map +1 -1
  54. package/dist/core/agent-session-types.js.map +1 -1
  55. package/dist/core/compaction/utils.d.ts +1 -1
  56. package/dist/core/compaction/utils.d.ts.map +1 -1
  57. package/dist/core/compaction/utils.js +18 -18
  58. package/dist/core/compaction/utils.js.map +1 -1
  59. package/dist/core/execution-model-router.d.ts.map +1 -1
  60. package/dist/core/execution-model-router.js +24 -8
  61. package/dist/core/execution-model-router.js.map +1 -1
  62. package/dist/core/export-html/template.js +12 -0
  63. package/dist/core/extensions/agent-events.d.ts +3 -0
  64. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  65. package/dist/core/extensions/agent-events.js.map +1 -1
  66. package/dist/core/extensions/api-types.d.ts +2 -0
  67. package/dist/core/extensions/api-types.d.ts.map +1 -1
  68. package/dist/core/extensions/api-types.js.map +1 -1
  69. package/dist/core/extensions/context-types.d.ts +9 -0
  70. package/dist/core/extensions/context-types.d.ts.map +1 -1
  71. package/dist/core/extensions/context-types.js.map +1 -1
  72. package/dist/core/extensions/event-results.d.ts +3 -0
  73. package/dist/core/extensions/event-results.d.ts.map +1 -1
  74. package/dist/core/extensions/event-results.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +2 -0
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  79. package/dist/core/extensions/loader-api.js +4 -0
  80. package/dist/core/extensions/loader-api.js.map +1 -1
  81. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  82. package/dist/core/extensions/loader-core.js +3 -5
  83. package/dist/core/extensions/loader-core.js.map +1 -1
  84. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
  85. package/dist/core/extensions/loader-host-modules.js +7 -1
  86. package/dist/core/extensions/loader-host-modules.js.map +1 -1
  87. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  88. package/dist/core/extensions/loader-runtime.js +3 -0
  89. package/dist/core/extensions/loader-runtime.js.map +1 -1
  90. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  91. package/dist/core/extensions/loader-virtual-modules.js +4 -0
  92. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  93. package/dist/core/extensions/provider-types.d.ts +2 -0
  94. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  95. package/dist/core/extensions/provider-types.js.map +1 -1
  96. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  97. package/dist/core/extensions/runner-events.js +16 -1
  98. package/dist/core/extensions/runner-events.js.map +1 -1
  99. package/dist/core/extensions/runner.d.ts +5 -0
  100. package/dist/core/extensions/runner.d.ts.map +1 -1
  101. package/dist/core/extensions/runner.js +34 -0
  102. package/dist/core/extensions/runner.js.map +1 -1
  103. package/dist/core/extensions/runtime-types.d.ts +5 -0
  104. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  105. package/dist/core/extensions/runtime-types.js.map +1 -1
  106. package/dist/core/extensions/tool-events.d.ts +4 -0
  107. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  108. package/dist/core/extensions/tool-events.js.map +1 -1
  109. package/dist/core/extensions/tool-types.d.ts +34 -3
  110. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  111. package/dist/core/extensions/tool-types.js.map +1 -1
  112. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  113. package/dist/core/extensions/wrapper.js +14 -2
  114. package/dist/core/extensions/wrapper.js.map +1 -1
  115. package/dist/core/fast-model-routing-transport.d.ts.map +1 -1
  116. package/dist/core/fast-model-routing-transport.js +2 -1
  117. package/dist/core/fast-model-routing-transport.js.map +1 -1
  118. package/dist/core/fast-model-routing.d.ts +1 -2
  119. package/dist/core/fast-model-routing.d.ts.map +1 -1
  120. package/dist/core/fast-model-routing.js +13 -11
  121. package/dist/core/fast-model-routing.js.map +1 -1
  122. package/dist/core/fast-model-variants.d.ts +4 -1
  123. package/dist/core/fast-model-variants.d.ts.map +1 -1
  124. package/dist/core/fast-model-variants.js +42 -17
  125. package/dist/core/fast-model-variants.js.map +1 -1
  126. package/dist/core/model-registry.d.ts +4 -1
  127. package/dist/core/model-registry.d.ts.map +1 -1
  128. package/dist/core/model-registry.js +9 -0
  129. package/dist/core/model-registry.js.map +1 -1
  130. package/dist/core/model-resolver-defaults.js +1 -1
  131. package/dist/core/model-resolver-defaults.js.map +1 -1
  132. package/dist/core/model-routing-candidates.d.ts +4 -0
  133. package/dist/core/model-routing-candidates.d.ts.map +1 -1
  134. package/dist/core/model-routing-candidates.js +8 -3
  135. package/dist/core/model-routing-candidates.js.map +1 -1
  136. package/dist/core/model-routing-evals.d.ts.map +1 -1
  137. package/dist/core/model-routing-evals.js +4 -5
  138. package/dist/core/model-routing-evals.js.map +1 -1
  139. package/dist/core/model-runtime.d.ts +3 -2
  140. package/dist/core/model-runtime.d.ts.map +1 -1
  141. package/dist/core/model-runtime.js +19 -25
  142. package/dist/core/model-runtime.js.map +1 -1
  143. package/dist/core/nested-tool-calls.d.ts +64 -0
  144. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  145. package/dist/core/nested-tool-calls.js +132 -0
  146. package/dist/core/nested-tool-calls.js.map +1 -0
  147. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  148. package/dist/core/package-manager-resolver.js +21 -3
  149. package/dist/core/package-manager-resolver.js.map +1 -1
  150. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
  151. package/dist/core/package-manager-resource-accumulator.js +2 -0
  152. package/dist/core/package-manager-resource-accumulator.js.map +1 -1
  153. package/dist/core/package-manager-types.d.ts +2 -0
  154. package/dist/core/package-manager-types.d.ts.map +1 -1
  155. package/dist/core/package-manager-types.js.map +1 -1
  156. package/dist/core/package-manager.d.ts.map +1 -1
  157. package/dist/core/package-manager.js +1 -0
  158. package/dist/core/package-manager.js.map +1 -1
  159. package/dist/core/resource-loader-core.d.ts.map +1 -1
  160. package/dist/core/resource-loader-core.js +12 -6
  161. package/dist/core/resource-loader-core.js.map +1 -1
  162. package/dist/core/resource-loader-extensions.d.ts +1 -0
  163. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  164. package/dist/core/resource-loader-extensions.js +64 -4
  165. package/dist/core/resource-loader-extensions.js.map +1 -1
  166. package/dist/core/resource-loader-paths.d.ts.map +1 -1
  167. package/dist/core/resource-loader-paths.js +2 -1
  168. package/dist/core/resource-loader-paths.js.map +1 -1
  169. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  170. package/dist/core/resource-loader-reload.js +5 -4
  171. package/dist/core/resource-loader-reload.js.map +1 -1
  172. package/dist/core/resource-loader-source-info.d.ts.map +1 -1
  173. package/dist/core/resource-loader-source-info.js +7 -5
  174. package/dist/core/resource-loader-source-info.js.map +1 -1
  175. package/dist/core/sdk-types.d.ts +1 -1
  176. package/dist/core/sdk-types.js.map +1 -1
  177. package/dist/core/session-manager-core.d.ts +2 -0
  178. package/dist/core/session-manager-core.d.ts.map +1 -1
  179. package/dist/core/session-manager-core.js +5 -1
  180. package/dist/core/session-manager-core.js.map +1 -1
  181. package/dist/core/session-manager-entries.d.ts +1 -1
  182. package/dist/core/session-manager-entries.d.ts.map +1 -1
  183. package/dist/core/session-manager-entries.js.map +1 -1
  184. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  185. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  186. package/dist/core/settings-manager-basic-accessors.js +27 -1
  187. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  188. package/dist/core/settings-manager-core.d.ts +2 -0
  189. package/dist/core/settings-manager-core.d.ts.map +1 -1
  190. package/dist/core/settings-manager-core.js +4 -0
  191. package/dist/core/settings-manager-core.js.map +1 -1
  192. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  193. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  194. package/dist/core/settings-manager-ui-accessors.js +13 -0
  195. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  196. package/dist/core/settings-manager.d.ts +1 -1
  197. package/dist/core/settings-manager.d.ts.map +1 -1
  198. package/dist/core/settings-manager.js.map +1 -1
  199. package/dist/core/settings-merge.d.ts +1 -0
  200. package/dist/core/settings-merge.d.ts.map +1 -1
  201. package/dist/core/settings-merge.js +30 -1
  202. package/dist/core/settings-merge.js.map +1 -1
  203. package/dist/core/settings-types.d.ts +8 -1
  204. package/dist/core/settings-types.d.ts.map +1 -1
  205. package/dist/core/settings-types.js.map +1 -1
  206. package/dist/core/source-info.d.ts +3 -0
  207. package/dist/core/source-info.d.ts.map +1 -1
  208. package/dist/core/source-info.js +11 -0
  209. package/dist/core/source-info.js.map +1 -1
  210. package/dist/core/tool-loadout.d.ts +6 -0
  211. package/dist/core/tool-loadout.d.ts.map +1 -0
  212. package/dist/core/tool-loadout.js +63 -0
  213. package/dist/core/tool-loadout.js.map +1 -0
  214. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  215. package/dist/core/tools/ask-user-question/ask-user-question.js +1 -0
  216. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  217. package/dist/core/tools/bash.d.ts.map +1 -1
  218. package/dist/core/tools/bash.js +31 -11
  219. package/dist/core/tools/bash.js.map +1 -1
  220. package/dist/core/tools/output-accumulator.d.ts +4 -0
  221. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  222. package/dist/core/tools/output-accumulator.js +32 -0
  223. package/dist/core/tools/output-accumulator.js.map +1 -1
  224. package/dist/core/tools/powershell.d.ts +27 -21
  225. package/dist/core/tools/powershell.d.ts.map +1 -1
  226. package/dist/core/tools/render-utils.d.ts +4 -0
  227. package/dist/core/tools/render-utils.d.ts.map +1 -1
  228. package/dist/core/tools/render-utils.js +19 -0
  229. package/dist/core/tools/render-utils.js.map +1 -1
  230. package/dist/core/tools/tool-concurrency.d.ts +1 -1
  231. package/dist/core/tools/tool-concurrency.d.ts.map +1 -1
  232. package/dist/core/tools/tool-concurrency.js +28 -3
  233. package/dist/core/tools/tool-concurrency.js.map +1 -1
  234. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  235. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  236. package/dist/core/tools/tool-definition-wrapper.js +4 -1
  237. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  238. package/dist/core/usage-totals.d.ts +2 -0
  239. package/dist/core/usage-totals.d.ts.map +1 -1
  240. package/dist/core/usage-totals.js +23 -0
  241. package/dist/core/usage-totals.js.map +1 -1
  242. package/dist/extensions/codemode/execute.d.ts +10 -0
  243. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  244. package/dist/extensions/codemode/execute.js +313 -0
  245. package/dist/extensions/codemode/execute.js.map +1 -0
  246. package/dist/extensions/codemode/index.d.ts +11 -0
  247. package/dist/extensions/codemode/index.d.ts.map +1 -0
  248. package/dist/extensions/codemode/index.js +14 -0
  249. package/dist/extensions/codemode/index.js.map +1 -0
  250. package/dist/extensions/codemode/renderer.d.ts +4 -0
  251. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  252. package/dist/extensions/codemode/renderer.js +78 -0
  253. package/dist/extensions/codemode/renderer.js.map +1 -0
  254. package/dist/extensions/codemode/tool.d.ts +51 -0
  255. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  256. package/dist/extensions/codemode/tool.js +134 -0
  257. package/dist/extensions/codemode/tool.js.map +1 -0
  258. package/dist/extensions/codemode/worker.d.ts +2 -0
  259. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  260. package/dist/extensions/codemode/worker.js +2 -0
  261. package/dist/extensions/codemode/worker.js.map +1 -0
  262. package/dist/extensions/index.d.ts.map +1 -1
  263. package/dist/extensions/index.js +5 -1
  264. package/dist/extensions/index.js.map +1 -1
  265. package/dist/extensions/llama/provider.d.ts.map +1 -1
  266. package/dist/extensions/llama/provider.js +31 -10
  267. package/dist/extensions/llama/provider.js.map +1 -1
  268. package/dist/extensions/tool-search/index.d.ts +5 -0
  269. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  270. package/dist/extensions/tool-search/index.js +6 -0
  271. package/dist/extensions/tool-search/index.js.map +1 -0
  272. package/dist/extensions/tool-search/tool.d.ts +41 -0
  273. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  274. package/dist/extensions/tool-search/tool.js +161 -0
  275. package/dist/extensions/tool-search/tool.js.map +1 -0
  276. package/dist/index.d.ts +7 -0
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +5 -0
  279. package/dist/index.js.map +1 -1
  280. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  281. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  282. package/dist/modes/interactive/components/chat-message-renderer.js +2 -0
  283. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  284. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  285. package/dist/modes/interactive/components/config-selector-list.js +9 -1
  286. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  287. package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/config-selector-project-scope.js +4 -1
  289. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
  290. package/dist/modes/interactive/components/first-time-setup.d.ts +2 -2
  291. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/first-time-setup.js +1 -0
  293. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  294. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  295. package/dist/modes/interactive/components/footer.js +42 -7
  296. package/dist/modes/interactive/components/footer.js.map +1 -1
  297. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  299. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  300. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  301. package/dist/modes/interactive/components/settings-selector-items.js +13 -0
  302. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  303. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  304. package/dist/modes/interactive/components/settings-selector-submenus.js +3 -1
  305. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  306. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  307. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  309. package/dist/modes/interactive/components/themed-text.d.ts +8 -0
  310. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  311. package/dist/modes/interactive/components/themed-text.js +14 -0
  312. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  313. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  314. package/dist/modes/interactive/components/tool-execution.js +5 -3
  315. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  316. package/dist/modes/interactive/interactive-agent-events.js +2 -0
  317. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  318. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -1
  319. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  320. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  321. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  322. package/dist/modes/interactive/interactive-resource-rendering.js +7 -10
  323. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  324. package/dist/modes/interactive/interactive-selectors.js +5 -0
  325. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  326. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  327. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  328. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  329. package/dist/modes/interactive/interactive-startup.js +8 -3
  330. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  331. package/dist/modes/interactive/interactive-tui.d.ts +2 -1
  332. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  333. package/dist/modes/interactive/interactive-tui.js +1 -0
  334. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  335. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  336. package/dist/modes/interactive/theme/color-utils.js +3 -0
  337. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  338. package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -1
  339. package/dist/modes/interactive/theme/export-colors.js +4 -1
  340. package/dist/modes/interactive/theme/export-colors.js.map +1 -1
  341. package/dist/modes/interactive/theme/system-theme.d.ts +23 -0
  342. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  343. package/dist/modes/interactive/theme/system-theme.js +462 -0
  344. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  345. package/dist/modes/interactive/theme/terminal-colors.d.ts +10 -0
  346. package/dist/modes/interactive/theme/terminal-colors.d.ts.map +1 -0
  347. package/dist/modes/interactive/theme/terminal-colors.js +36 -0
  348. package/dist/modes/interactive/theme/terminal-colors.js.map +1 -0
  349. package/dist/modes/interactive/theme/terminal-detection.d.ts +4 -6
  350. package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -1
  351. package/dist/modes/interactive/theme/terminal-detection.js +12 -46
  352. package/dist/modes/interactive/theme/terminal-detection.js.map +1 -1
  353. package/dist/modes/interactive/theme/theme-class.d.ts +1 -0
  354. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  355. package/dist/modes/interactive/theme/theme-class.js +2 -2
  356. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  357. package/dist/modes/interactive/theme/theme-controller.d.ts +16 -8
  358. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  359. package/dist/modes/interactive/theme/theme-controller.js +106 -64
  360. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  361. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  362. package/dist/modes/interactive/theme/theme-loading.js +23 -2
  363. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  364. package/dist/modes/interactive/theme/theme-schema.js +1 -1
  365. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  366. package/dist/modes/interactive/theme/theme-schema.json +2 -2
  367. package/dist/modes/interactive/theme/theme.d.ts +2 -0
  368. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  369. package/dist/modes/interactive/theme/theme.js +2 -0
  370. package/dist/modes/interactive/theme/theme.js.map +1 -1
  371. package/dist/modes/interactive-engine/engine-session-stats.d.ts +26 -0
  372. package/dist/modes/interactive-engine/engine-session-stats.d.ts.map +1 -0
  373. package/dist/modes/interactive-engine/engine-session-stats.js +71 -0
  374. package/dist/modes/interactive-engine/engine-session-stats.js.map +1 -0
  375. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -0
  376. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  377. package/dist/modes/interactive-engine/extension-ui-bridge.js +4 -0
  378. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  379. package/dist/modes/interactive-engine/isolated-runtime.d.ts +3 -0
  380. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  381. package/dist/modes/interactive-engine/isolated-runtime.js +27 -5
  382. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  383. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  384. package/dist/modes/rpc/rpc-provider-auth.js +3 -1
  385. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  386. package/dist/package-manager-cli.d.ts.map +1 -1
  387. package/dist/package-manager-cli.js +8 -2
  388. package/dist/package-manager-cli.js.map +1 -1
  389. package/dist/utils/paths.d.ts.map +1 -1
  390. package/dist/utils/paths.js +2 -1
  391. package/dist/utils/paths.js.map +1 -1
  392. package/dist/utils/shell.d.ts +1 -3
  393. package/dist/utils/shell.d.ts.map +1 -1
  394. package/dist/utils/shell.js +3 -30
  395. package/dist/utils/shell.js.map +1 -1
  396. package/docs/extensions/api-reference.md +5 -1
  397. package/docs/extensions/authoring.md +31 -1
  398. package/docs/extensions/events.md +3 -1
  399. package/docs/extensions.md +14 -0
  400. package/docs/models/evals.md +45 -2
  401. package/docs/models/reference.md +33 -2
  402. package/docs/models.md +1 -0
  403. package/docs/packages.md +2 -0
  404. package/docs/providers.md +34 -7
  405. package/docs/reference/cli.md +4 -0
  406. package/docs/rpc/protocol.md +10 -0
  407. package/docs/sdk/reference.md +5 -1
  408. package/docs/sdk/structured-decisions.md +2 -2
  409. package/docs/session-format.md +5 -0
  410. package/docs/settings.md +19 -5
  411. package/docs/skills.md +1 -1
  412. package/docs/themes/reference.md +2 -1
  413. package/docs/themes.md +4 -2
  414. package/docs/tools.md +39 -0
  415. package/npm-shrinkwrap.json +115 -113
  416. package/package.json +12 -9
package/CHANGELOG.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.25-alpha.1] - 2026-09-29
6
+
7
+ ### Added
8
+
9
+ - Added GPT-6.1 Sol and its first-party Fast variants for OpenAI API keys and ChatGPT Codex subscriptions.
10
+ - Added **Sign in with ChatGPT** for the OpenAI provider, independently of Codex backend login.
11
+ - Added Jev decision models on Vercel AI Gateway and OpenCode Zen.
12
+ - Added configurable fullscreen mouse-wheel scrolling with terminal-aware automatic behavior or a fixed line count.
13
+ - Extension tools can declare exposure, namespaces, annotations and output schemas, and invoke permitted nested tools through the ordinary validation and permission hooks.
14
+ - Added a selectable system theme based on the terminal's palette and contrast, and OKHSL colors for custom themes.
15
+ - Added opt-in `codemode` scripts for composing permitted tools, filtering output, branch-local JSON storage, and classifier calls, plus `tool_search` for activating deferred tools. Interactive and orchestration tools remain unavailable from scripts.
16
+ - Added `builtin:llama.cpp`, `builtin:codemode`, and `builtin:tool-search` extension resources for explicit loading and settings-based enable/disable controls, with diagnostics when an extension replaces codemode or tool search.
17
+ - Added Ultrafast for GPT-6 Astra as `openai/gpt-6-astra-ultrafast` and `openai-codex/gpt-6-astra-ultrafast`, priced at OpenAI's published Ultrafast rates. GPT-6 Astra is the only model with an Ultrafast choice. If the provider rejects an Ultrafast choice you selected, the request fails.
18
+
19
+ ### Changed
20
+
21
+ - `defaultTools` now accepts `+name` and `-name` modifiers. Project modifier-only lists adjust the global selection instead of replacing it.
22
+ - Automatic model routing now includes GPT-6.1 Sol results from Artificial Analysis, FrontierCode, and OpenAI's published external benchmarks, preserving measured efforts and independent reporters. Metadata-backed Fast variants use base-model evidence without inventing separate Fast scores; independently registered Fast IDs require their own evidence.
23
+ - Completed `bash` commands now return bounded structured output for programmatic callers, including nonzero exits, without increasing model-facing output limits.
24
+ - Codex's automatic provider default is now GPT-6.1 Sol. Explicit saved model selections remain unchanged.
25
+ - Reduced transcript/footer and shell-preview rendering work in long sessions.
26
+ - Tool previews without custom renderers now show their arguments in collapsed and expanded views.
27
+ - `-fast` and `-ultrafast` choices for OpenAI and Codex models now follow the tiers each model advertises in Codex's catalog and on OpenAI's pricing page. Models without Fast, such as `gpt-5.3-codex-spark`, `openai/gpt-5-nano`, `openai/gpt-5-pro`, and `openai/o1`, no longer list a `-fast` choice. A tier the model doesn't advertise is left out of the request, which runs at standard processing.
28
+ - OpenAI and Codex Fast usage is priced at each model's published Fast rates instead of a flat 2x, for example 1.7x for GPT-4o. A Fast request that OpenAI serves at Standard is priced at Standard.
29
+
30
+ ### Fixed
31
+
32
+ - Theme-colored notices now refresh after theme changes and late terminal color replies.
33
+ - llama.cpp unloaded autoload presets now retain their cached effective context size instead of falling back to the model's training limit.
34
+ - Native extension providers with stored credentials become available immediately after registration without exposing unrelated unauthenticated models.
35
+ - Cancelled tools no longer start queued native or nested sequential calls after cancellation.
36
+ - The interactive footer's context percentage, token, cost and cache-hit (`CH`) segments update after every message again, instead of only when a run ends. A new session no longer shows `0.0%` with no token or cost segments for its whole first run, and steered or long runs keep the footer current. The footer totals now include cache-warming requests, which `/session` already counts, and RPC `get_session_stats` responses report the newest reply's usage as `latestAssistantUsage` ([#3328](https://github.com/bastani-inc/atomic/issues/3328); [#3364](https://github.com/bastani-inc/atomic/pull/3364) by [@dairefagan](https://github.com/dairefagan)).
37
+
5
38
  ## [0.9.24] - 2026-09-29
6
39
 
7
40
  ### Added
@@ -2577,6 +2577,7 @@ function registerContactSupervisorTool(pi, deps) {
2577
2577
  if (childOrchestratorMetadata !== null) {
2578
2578
  pi.registerTool({
2579
2579
  name: "contact_supervisor",
2580
+ exposure: "model-only",
2580
2581
  label: "Contact Supervisor",
2581
2582
  description: "Subagent-only tool for contacting the supervisor agent that delegated this task. In a live foreground child, need_decision and interview_request end the child and return a fresh-subagent handoff to the supervisor; fallback Intercom delivery waits for a reply when no foreground owner claims the request. One blocking supervisor request is allowed per child and may coexist with ordinary intercom asks. progress_update is fire-and-forget. Do not use for routine completion handoffs.",
2582
2583
  promptSnippet: "Subagent-only: yield decisions or structured interviews to the supervisor for a fresh-child follow-up, or send meaningful plan-changing progress updates.",
@@ -3301,6 +3302,7 @@ function registerIntercomTool(pi, deps) {
3301
3302
  const activeReplyTracker = () => typeof deps.replyTracker === "function" ? deps.replyTracker() : deps.replyTracker;
3302
3303
  pi.registerTool({
3303
3304
  name: "intercom",
3305
+ exposure: "model-only",
3304
3306
  label: "Intercom",
3305
3307
  description: `Send a message to another local agent session running on this machine.
3306
3308
  Use this to communicate findings, request help, or coordinate work with other sessions.
@@ -7883,6 +7885,7 @@ function intercom(pi, options = {}) {
7883
7885
  typedContactSupervisorRegistered = true;
7884
7886
  pi.registerTool({
7885
7887
  name: "contact_supervisor",
7888
+ exposure: "model-only",
7886
7889
  label: "Contact Supervisor",
7887
7890
  description: "Subagent-only tool for contacting the supervisor agent that delegated this task.",
7888
7891
  promptSnippet: "Subagent-only: contact the supervisor for decisions, interviews, or meaningful updates.",
@@ -8120,6 +8123,7 @@ function intercom(pi, options = {}) {
8120
8123
  });
8121
8124
  pi.registerTool({
8122
8125
  name: "intercom",
8126
+ exposure: "model-only",
8123
8127
  label: "Intercom",
8124
8128
  description: `Send a message to another local agent session running on this machine.
8125
8129
  Use this to communicate findings, request help, or coordinate work with other sessions.
@@ -8169,6 +8173,7 @@ Usage:
8169
8173
  if (hasSubagentIntercomEnv()) {
8170
8174
  pi.registerTool({
8171
8175
  name: "contact_supervisor",
8176
+ exposure: "model-only",
8172
8177
  label: "Contact Supervisor",
8173
8178
  description: "Subagent-only tool for contacting the supervisor agent that delegated this task. Use need_decision when blocked, uncertain, needing approval, or facing a product/API/scope decision before continuing; this waits for the supervisor's reply. Use interview_request when multiple structured questions need supervisor answers; this also waits for a reply. Use progress_update only for meaningful progress or unexpected discoveries that change the plan; this does not wait for a reply. Do not use for routine completion handoffs.",
8174
8179
  promptSnippet: "Subagent-only: contact the supervisor for decisions, structured interviews, or meaningful plan-changing updates. Do not use for routine completion handoffs.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.24",
3
+ "version": "0.9.25-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@bastani/atomic": "*",
47
- "@earendil-works/pi-tui": "^0.87.1",
47
+ "@earendil-works/pi-tui": "^0.99.1",
48
48
  "typebox": "*"
49
49
  },
50
50
  "peerDependenciesMeta": {
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.25-alpha.1] - 2026-09-29
11
+
12
+ ### Changed
13
+
14
+ - MCP tool previews now show arguments in collapsed and expanded views while redacting sensitive argument fields.
15
+
16
+ ### Fixed
17
+
18
+ - Concurrent Atomic processes now coordinate rotating OAuth refresh tokens, reusing the refreshed credential rather than independently rotating the same token.
19
+ - Stalled OAuth refresh requests now time out after 15 seconds, including response-body reads, so connection shutdown can finish and release the refresh lock.
20
+
10
21
  ## [0.9.24] - 2026-09-29
11
22
 
12
23
  ### Added
@@ -13473,13 +13473,14 @@ var require_fast_uri = __commonJS(function(exports, module) {
13473
13473
  if (!malformedIPLiteral) {
13474
13474
  malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
13475
13475
  }
13476
- if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
13477
- if (uri.indexOf("%") !== -1) {
13478
- if (parsed.host !== undefined && !malformedIPLiteral) {
13479
- const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
13480
- parsed.host = reescapeHostDelimiters(host, isIP);
13481
- }
13476
+ if (uri.indexOf("%") !== -1 && parsed.host !== undefined && !malformedIPLiteral) {
13477
+ let host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
13478
+ if (!isIP) {
13479
+ host = normalizePercentEncoding(host.toLowerCase());
13482
13480
  }
13481
+ parsed.host = reescapeHostDelimiters(host, isIP);
13482
+ }
13483
+ if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
13483
13484
  if (parsed.path) {
13484
13485
  parsed.path = normalizePathEncoding(parsed.path);
13485
13486
  }
@@ -19860,6 +19861,7 @@ var init_npx_resolver = __esm(() => {
19860
19861
  // dist/builtin/mcp/mcp-auth.ts
19861
19862
  import { mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync5, rmSync } from "fs";
19862
19863
  import { join as join5 } from "path";
19864
+ import lockfile from "proper-lockfile";
19863
19865
  function getOwnedOAuthTransients() {
19864
19866
  const owner = getMcpOwner();
19865
19867
  if (!owner)
@@ -19898,6 +19900,14 @@ function ensureServerDir(serverName) {
19898
19900
  mkdirSync4(dir, { recursive: true, mode: 448 });
19899
19901
  }
19900
19902
  }
19903
+ async function acquireTokenRefreshLock(serverName) {
19904
+ ensureServerDir(serverName);
19905
+ return lockfile.lock(getServerDir(serverName), {
19906
+ realpath: false,
19907
+ retries: { retries: 120, minTimeout: 100, maxTimeout: 1000 },
19908
+ stale: 60000
19909
+ });
19910
+ }
19901
19911
  function readAuthEntry(serverName) {
19902
19912
  try {
19903
19913
  const filePath = getTokensFilePath(serverName);
@@ -20058,6 +20068,58 @@ var init_mcp_auth = __esm(() => {
20058
20068
  });
20059
20069
 
20060
20070
  // dist/builtin/mcp/mcp-oauth-provider.ts
20071
+ async function fetchRefreshResponse(url, init) {
20072
+ const controller = new AbortController;
20073
+ const signal = init.signal ? AbortSignal.any([init.signal, controller.signal]) : controller.signal;
20074
+ const timer = setTimeout(() => controller.abort(new DOMException("MCP token refresh timed out", "TimeoutError")), REFRESH_REQUEST_TIMEOUT_MS);
20075
+ let reader;
20076
+ let onAbort;
20077
+ const aborted = new Promise((_resolve, reject) => {
20078
+ onAbort = () => {
20079
+ reader?.cancel(signal.reason).catch(() => {});
20080
+ reject(signal.reason);
20081
+ };
20082
+ signal.addEventListener("abort", onAbort, { once: true });
20083
+ if (signal.aborted)
20084
+ onAbort();
20085
+ });
20086
+ const request = (async () => {
20087
+ signal.throwIfAborted();
20088
+ const response = await fetch(url, { ...init, signal });
20089
+ if (signal.aborted) {
20090
+ response.body?.cancel(signal.reason).catch(() => {});
20091
+ signal.throwIfAborted();
20092
+ }
20093
+ reader = response.body?.getReader();
20094
+ const decoder = new TextDecoder;
20095
+ let text = "";
20096
+ if (reader) {
20097
+ try {
20098
+ for (;; ) {
20099
+ const chunk = await reader.read();
20100
+ signal.throwIfAborted();
20101
+ if (chunk.done)
20102
+ break;
20103
+ text += decoder.decode(chunk.value, { stream: true });
20104
+ }
20105
+ text += decoder.decode();
20106
+ } finally {
20107
+ reader.releaseLock();
20108
+ }
20109
+ }
20110
+ return new Response(response.body ? text : null, {
20111
+ status: response.status,
20112
+ statusText: response.statusText,
20113
+ headers: response.headers
20114
+ });
20115
+ })();
20116
+ try {
20117
+ return await Promise.race([request, aborted]);
20118
+ } finally {
20119
+ clearTimeout(timer);
20120
+ signal.removeEventListener("abort", onAbort);
20121
+ }
20122
+ }
20061
20123
  function getConfiguredOAuthCallbackPort() {
20062
20124
  return configuredOAuthCallbackPort;
20063
20125
  }
@@ -20074,6 +20136,66 @@ class McpOAuthProvider {
20074
20136
  config;
20075
20137
  callbacks;
20076
20138
  transients = getOwnedOAuthTransients();
20139
+ refreshRelease;
20140
+ refreshes = new Set;
20141
+ fetch = async (url, init) => {
20142
+ if (!(init?.body instanceof URLSearchParams) || init.body.get("grant_type") !== "refresh_token") {
20143
+ return fetch(url, init);
20144
+ }
20145
+ let finish;
20146
+ const pending = new Promise((resolve) => {
20147
+ finish = resolve;
20148
+ });
20149
+ this.refreshes.add(pending);
20150
+ const release = await acquireTokenRefreshLock(this.serverName).catch((error) => {
20151
+ this.refreshes.delete(pending);
20152
+ finish();
20153
+ throw error;
20154
+ });
20155
+ this.refreshRelease = async () => {
20156
+ this.refreshRelease = undefined;
20157
+ try {
20158
+ await release();
20159
+ } finally {
20160
+ this.refreshes.delete(pending);
20161
+ finish();
20162
+ }
20163
+ };
20164
+ try {
20165
+ init.signal?.throwIfAborted();
20166
+ const current = getAuthForUrl(this.serverName, this.serverUrl)?.tokens;
20167
+ if (!current?.refreshToken)
20168
+ throw new UnauthorizedError("MCP refresh credentials are no longer available");
20169
+ if (current.refreshToken !== init.body.get("refresh_token") && (!current.expiresAt || current.expiresAt > Date.now() / 1000)) {
20170
+ return Response.json({
20171
+ access_token: current.accessToken,
20172
+ refresh_token: current.refreshToken,
20173
+ token_type: "Bearer",
20174
+ ...current.expiresAt ? { expires_in: Math.max(0, current.expiresAt - Date.now() / 1000) } : {},
20175
+ ...current.scope ? { scope: current.scope } : {}
20176
+ });
20177
+ }
20178
+ const body = new URLSearchParams(init.body);
20179
+ body.set("refresh_token", current.refreshToken);
20180
+ const response = await fetchRefreshResponse(url, { ...init, body });
20181
+ if (!response.ok) {
20182
+ await this.refreshRelease();
20183
+ return response;
20184
+ }
20185
+ const parsed = OAuthTokensSchema.safeParse(await response.clone().json());
20186
+ if (!parsed.success) {
20187
+ await this.refreshRelease();
20188
+ return response;
20189
+ }
20190
+ return Response.json({ refresh_token: current.refreshToken, ...parsed.data });
20191
+ } catch (error) {
20192
+ await this.refreshRelease?.();
20193
+ throw error;
20194
+ }
20195
+ };
20196
+ async waitForRefresh() {
20197
+ await Promise.all(this.refreshes);
20198
+ }
20077
20199
  transientEntry() {
20078
20200
  if (!this.transients)
20079
20201
  return getAuthForUrl(this.serverName, this.serverUrl);
@@ -20165,14 +20287,19 @@ class McpOAuthProvider {
20165
20287
  };
20166
20288
  }
20167
20289
  async saveTokens(tokens) {
20168
- this.ensureActive();
20169
- const storedTokens = {
20170
- accessToken: tokens.access_token,
20171
- refreshToken: tokens.refresh_token,
20172
- expiresAt: tokens.expires_in ? Date.now() / 1000 + tokens.expires_in : undefined,
20173
- scope: tokens.scope
20174
- };
20175
- updateTokens(this.serverName, storedTokens, this.serverUrl);
20290
+ try {
20291
+ if (!this.refreshRelease)
20292
+ this.ensureActive();
20293
+ const storedTokens = {
20294
+ accessToken: tokens.access_token,
20295
+ refreshToken: tokens.refresh_token,
20296
+ expiresAt: tokens.expires_in ? Date.now() / 1000 + tokens.expires_in : undefined,
20297
+ scope: tokens.scope
20298
+ };
20299
+ updateTokens(this.serverName, storedTokens, this.serverUrl);
20300
+ } finally {
20301
+ await this.refreshRelease?.();
20302
+ }
20176
20303
  }
20177
20304
  async redirectToAuthorization(authorizationUrl) {
20178
20305
  this.ensureActive();
@@ -20255,9 +20382,10 @@ class McpOAuthProvider {
20255
20382
  return params;
20256
20383
  }
20257
20384
  }
20258
- var DEFAULT_OAUTH_CALLBACK_PORT = 19876, OAUTH_CALLBACK_PATH = "/callback", configuredOAuthCallbackPort, oauthCallbackPort;
20385
+ var DEFAULT_OAUTH_CALLBACK_PORT = 19876, OAUTH_CALLBACK_PATH = "/callback", REFRESH_REQUEST_TIMEOUT_MS = 15000, configuredOAuthCallbackPort, oauthCallbackPort;
20259
20386
  var init_mcp_oauth_provider = __esm(() => {
20260
20387
  init_auth2();
20388
+ init_auth();
20261
20389
  init_mcp_auth();
20262
20390
  configuredOAuthCallbackPort = DEFAULT_OAUTH_CALLBACK_PORT;
20263
20391
  if (process.env.MCP_OAUTH_CALLBACK_PORT) {
@@ -20954,6 +21082,7 @@ var init_open = __esm(() => {
20954
21082
 
20955
21083
  // dist/builtin/mcp/mcp-callback-server.ts
20956
21084
  import { createServer } from "http";
21085
+ import { oauthErrorHtml, oauthSuccessHtml } from "@bastani/pi-ai/utils/oauth-page";
20957
21086
  function handleRequest(req, res) {
20958
21087
  const url = new URL(req.url || "/", `http://${req.headers.host}`);
20959
21088
  if (url.pathname !== OAUTH_CALLBACK_PATH) {
@@ -21123,48 +21252,12 @@ function stopCallbackServer(error = new Error("OAuth callback server stopped"))
21123
21252
  setOAuthCallbackPort(getConfiguredOAuthCallbackPort());
21124
21253
  });
21125
21254
  }
21126
- var HTML_SUCCESS = `<!DOCTYPE html>
21127
- <html>
21128
- <head>
21129
- <title>Pi - Authorization Successful</title>
21130
- <style>
21131
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
21132
- .container { text-align: center; padding: 2rem; }
21133
- h1 { color: #4ade80; margin-bottom: 1rem; }
21134
- p { color: #aaa; }
21135
- </style>
21136
- </head>
21137
- <body>
21138
- <div class="container">
21139
- <h1>Authorization Successful</h1>
21140
- <p>You can close this window and return to Pi.</p>
21141
- </div>
21142
- <script>setTimeout(() => window.close(), 2000);</script>
21143
- </body>
21144
- </html>`, renderCallbackErrorHtml = () => `<!DOCTYPE html>
21145
- <html>
21146
- <head>
21147
- <title>Pi - Authorization Failed</title>
21148
- <style>
21149
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
21150
- .container { text-align: center; padding: 2rem; }
21151
- h1 { color: #f87171; margin-bottom: 1rem; }
21152
- p { color: #aaa; }
21153
- .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }
21154
- </style>
21155
- </head>
21156
- <body>
21157
- <div class="container">
21158
- <h1>Authorization Failed</h1>
21159
- <p>An error occurred during authorization.</p>
21160
- <div class="error">Return to Atomic and try again.</div>
21161
- </div>
21162
- </body>
21163
- </html>`, server, serverTransition, pendingAuths, standaloneOwner, serverOwners, callbackOwner = () => getMcpOwner() ?? standaloneOwner, CALLBACK_TIMEOUT_MS, MAX_PORT_SCAN_ATTEMPTS = 25;
21255
+ var HTML_SUCCESS, renderCallbackErrorHtml = () => oauthErrorHtml("Return to Atomic and try again."), server, serverTransition, pendingAuths, standaloneOwner, serverOwners, callbackOwner = () => getMcpOwner() ?? standaloneOwner, CALLBACK_TIMEOUT_MS, MAX_PORT_SCAN_ATTEMPTS = 25;
21164
21256
  var init_mcp_callback_server = __esm(() => {
21165
21257
  init_mcp_oauth_provider();
21166
21258
  init_logger();
21167
21259
  init_diagnostics();
21260
+ HTML_SUCCESS = oauthSuccessHtml("You can close this window and return to Atomic.");
21168
21261
  serverTransition = Promise.resolve();
21169
21262
  pendingAuths = new Map;
21170
21263
  standaloneOwner = {};
@@ -21371,7 +21464,7 @@ async function startAuthAttempt(serverName, serverUrl, definition, owner) {
21371
21464
  };
21372
21465
  if (config.grantType === "client_credentials") {
21373
21466
  const authProvider = new McpOAuthProvider(serverName, serverUrl, config, providerCallbacks);
21374
- const result = await auth(authProvider, { serverUrl }).catch((error) => {
21467
+ const result = await auth(authProvider, { serverUrl, fetchFn: authProvider.fetch }).catch((error) => {
21375
21468
  throw sanitizeRemoteError(error, serverUrl);
21376
21469
  });
21377
21470
  assertActive(owner);
@@ -21393,7 +21486,7 @@ async function startAuthAttempt(serverName, serverUrl, definition, owner) {
21393
21486
  assertActive: () => assertActive(owner)
21394
21487
  });
21395
21488
  try {
21396
- const result = await auth(authProvider, { serverUrl }).catch((error) => {
21489
+ const result = await auth(authProvider, { serverUrl, fetchFn: authProvider.fetch }).catch((error) => {
21397
21490
  throw sanitizeRemoteError(error, serverUrl);
21398
21491
  });
21399
21492
  assertActive(owner);
@@ -21406,7 +21499,7 @@ async function startAuthAttempt(serverName, serverUrl, definition, owner) {
21406
21499
  const pendingTransport = {
21407
21500
  serverName,
21408
21501
  serverUrl,
21409
- transport: new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider }),
21502
+ transport: new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider, fetch: authProvider.fetch }),
21410
21503
  oauthState
21411
21504
  };
21412
21505
  pendingTransports.set(serverName, pendingTransport);
@@ -21908,22 +22001,33 @@ class McpServerManager {
21908
22001
  onRedirect: async (_authUrl) => {}
21909
22002
  });
21910
22003
  }
21911
- const streamableTransport = protectRemoteTransport(new StreamableHTTPClientTransport(url, {
22004
+ const protect = (transport) => {
22005
+ if (authProvider) {
22006
+ const close = transport.close.bind(transport);
22007
+ transport.close = async () => {
22008
+ await authProvider.waitForRefresh();
22009
+ await close();
22010
+ };
22011
+ }
22012
+ return protectRemoteTransport(transport, resolvedUrl);
22013
+ };
22014
+ const streamableTransport = protect(new StreamableHTTPClientTransport(url, {
21912
22015
  requestInit,
21913
- authProvider
21914
- }), resolvedUrl);
22016
+ authProvider,
22017
+ fetch: authProvider?.fetch
22018
+ }));
21915
22019
  try {
21916
22020
  const testClient = new Client({ name: "pi-mcp-probe", version: "2.1.2" });
21917
22021
  await testClient.connect(streamableTransport);
21918
22022
  await testClient.close().catch(() => {});
21919
22023
  await streamableTransport.close().catch(() => {});
21920
- return protectRemoteTransport(new StreamableHTTPClientTransport(url, { requestInit, authProvider }), resolvedUrl);
22024
+ return protect(new StreamableHTTPClientTransport(url, { requestInit, authProvider, fetch: authProvider?.fetch }));
21921
22025
  } catch (error) {
21922
22026
  await streamableTransport.close().catch(() => {});
21923
22027
  if (error instanceof UnauthorizedError) {
21924
22028
  throw error;
21925
22029
  }
21926
- return protectRemoteTransport(new SSEClientTransport(url, { requestInit, authProvider }), resolvedUrl);
22030
+ return protect(new SSEClientTransport(url, { requestInit, authProvider, fetch: authProvider?.fetch }));
21927
22031
  }
21928
22032
  }
21929
22033
  async fetchAllTools(client) {
@@ -25625,7 +25729,7 @@ function stateChangedResult() {
25625
25729
  function createDirectToolExecutor(ensureInitialized, isActiveStateOwner, spec, options = {}) {
25626
25730
  const startUiSession = options.startUiSession ?? maybeStartUiSession;
25627
25731
  const startAutoAuth = options.startAutoAuth ?? attemptDirectAutoAuth;
25628
- return async function execute(_toolCallId, params, signal) {
25732
+ const execute = async function execute(_toolCallId, params, signal) {
25629
25733
  signal?.throwIfAborted();
25630
25734
  let state;
25631
25735
  try {
@@ -25761,6 +25865,7 @@ Expected parameters:
25761
25865
  ${formatSchema(spec.inputSchema)}`;
25762
25866
  return {
25763
25867
  content: [{ type: "text", text: `Error: ${errorText}` }],
25868
+ structuredContent: result,
25764
25869
  details: { error: "tool_error", server: spec.serverName }
25765
25870
  };
25766
25871
  }
@@ -25772,11 +25877,13 @@ ${formatSchema(spec.inputSchema)}`;
25772
25877
  content: [{ type: "text", text: `${resultText}
25773
25878
 
25774
25879
  ${uiMessage}` }],
25880
+ structuredContent: result,
25775
25881
  details: { server: spec.serverName, tool: spec.originalName, uiOpen: true }
25776
25882
  };
25777
25883
  }
25778
25884
  return {
25779
25885
  content: content.length > 0 ? content : [{ type: "text", text: "(empty result)" }],
25886
+ structuredContent: result,
25780
25887
  details: { server: spec.serverName, tool: spec.originalName }
25781
25888
  };
25782
25889
  } catch (error) {
@@ -25806,6 +25913,18 @@ ${formatSchema(spec.inputSchema)}`;
25806
25913
  }
25807
25914
  }
25808
25915
  };
25916
+ return async (...args) => {
25917
+ const result = await execute(...args);
25918
+ if (spec.resourceUri || result.structuredContent !== undefined)
25919
+ return result;
25920
+ return {
25921
+ ...result,
25922
+ structuredContent: {
25923
+ content: result.content.map((block) => block.type === "text" ? { type: "text", text: block.text } : { type: "image", data: block.data, mimeType: block.mimeType }),
25924
+ isError: !!result.details.error
25925
+ }
25926
+ };
25927
+ };
25809
25928
  }
25810
25929
  var init_direct_tool_executor = __esm(() => {
25811
25930
  init_init();
@@ -27086,7 +27205,7 @@ function blockToLines(block) {
27086
27205
  }
27087
27206
  return [`[image: ${block.mimeType}]`];
27088
27207
  }
27089
- function formatMcpToolResultLines(result, expanded, maxCollapsedLines = 3) {
27208
+ function formatMcpToolResultLines(result, expanded, maxCollapsedLines = 5) {
27090
27209
  const allLines = result.content.flatMap(blockToLines);
27091
27210
  const lines = allLines.length > 0 ? allLines : ["(empty result)"];
27092
27211
  if (expanded || lines.length <= maxCollapsedLines) {
@@ -27114,6 +27233,7 @@ ${theme.fg("muted", `(${expandKey} Expand)`)}` : "";
27114
27233
  // dist/builtin/mcp/tool-call-renderer.ts
27115
27234
  init_tool_metadata();
27116
27235
  init_types2();
27236
+ import { formatToolCallWithArgs } from "@bastani/atomic";
27117
27237
  import { stripTerminalSequences, Text as Text2 } from "@earendil-works/pi-tui";
27118
27238
  function textArg(value) {
27119
27239
  return typeof value === "string" && value.length > 0 ? value : undefined;
@@ -27129,14 +27249,31 @@ function inferServer(tool, source) {
27129
27249
  });
27130
27250
  return candidates.length === 1 ? candidates[0] : undefined;
27131
27251
  }
27132
- function header(theme, server, operation) {
27252
+ function redactArguments(value) {
27253
+ if (Array.isArray(value))
27254
+ return value.map(redactArguments);
27255
+ if (value !== null && typeof value === "object")
27256
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, /token|secret|password|authorization|api.?key/i.test(key) ? "[redacted]" : redactArguments(entry)]));
27257
+ return value;
27258
+ }
27259
+ function header(theme, server, operation, args, expanded = false) {
27133
27260
  const clean = (value) => stripTerminalSequences(value).replace(/[\r\n\t]/g, " ");
27261
+ if (server && args && Object.keys(args).length > 0)
27262
+ return new Text2(formatToolCallWithArgs(`MCP${server ? ` ${clean(server)}` : ""} · ${clean(operation)}`, redactArguments(args), { fg: (name, text) => theme.fg(name, text), bold: (text) => theme.bold?.(text) ?? text }, expanded), 0, 0);
27134
27263
  return new Text2(theme.fg("toolTitle", `MCP${server ? ` ${clean(server)}` : ""}`) + theme.fg("muted", ` · ${clean(operation)}`), 0, 0);
27135
27264
  }
27136
- function renderMcpDirectToolCall(server, tool, theme) {
27137
- return header(theme, server, tool);
27265
+ function renderMcpDirectToolCall(server, tool, theme, args, expanded = false) {
27266
+ return header(theme, server, tool, args, expanded);
27138
27267
  }
27139
- function renderMcpToolCall(args, theme, source = {}) {
27268
+ function renderMcpToolCall(args, theme, source = {}, expanded = false) {
27269
+ let callArgs = args.args;
27270
+ if (typeof callArgs === "string") {
27271
+ try {
27272
+ callArgs = JSON.parse(callArgs);
27273
+ } catch {
27274
+ callArgs = { args: callArgs };
27275
+ }
27276
+ }
27140
27277
  const action = textArg(args?.action);
27141
27278
  const tool = textArg(args?.tool);
27142
27279
  const connect = textArg(args?.connect);
@@ -27144,8 +27281,11 @@ function renderMcpToolCall(args, theme, source = {}) {
27144
27281
  const server = textArg(args?.server);
27145
27282
  if (action === "ui-messages")
27146
27283
  return header(theme, undefined, action);
27147
- if (tool)
27148
- return header(theme, server ?? inferServer(tool, source), tool);
27284
+ if (tool) {
27285
+ const target = server ?? inferServer(tool, source);
27286
+ const knownTarget = target !== undefined && (Object.hasOwn(source.config?.mcpServers ?? {}, target) || source.toolMetadata?.has(target));
27287
+ return header(theme, target, tool, knownTarget && typeof callArgs === "object" && callArgs !== null && !Array.isArray(callArgs) ? callArgs : undefined, expanded);
27288
+ }
27149
27289
  if (connect)
27150
27290
  return header(theme, connect, "connect");
27151
27291
  if (describe)
@@ -27225,8 +27365,16 @@ function mcpAdapter(pi) {
27225
27365
  description: spec.description || "(no description)",
27226
27366
  promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
27227
27367
  parameters: Type.Unsafe(spec.inputSchema || { type: "object", properties: {} }),
27368
+ exposure: "direct",
27369
+ namespace: { name: `mcp:${spec.serverName}` },
27370
+ ...!spec.resourceUri ? { outputSchema: Type.Object({
27371
+ content: Type.Array(Type.Object({ type: Type.String() }, { additionalProperties: true })),
27372
+ isError: Type.Optional(Type.Boolean()),
27373
+ structuredContent: Type.Optional(Type.Object({}, { additionalProperties: true })),
27374
+ _meta: Type.Optional(Type.Object({}, { additionalProperties: true }))
27375
+ }, { additionalProperties: true }) } : {},
27228
27376
  execute: createDirectToolExecutor(() => ensureMcpInitialized(), (candidate) => isOwnedState(candidate), spec),
27229
- renderCall: (_args, theme) => renderMcpDirectToolCall(spec.serverName, spec.originalName, theme),
27377
+ renderCall: (args, theme, context) => renderMcpDirectToolCall(spec.serverName, spec.originalName, theme, args, context.expanded),
27230
27378
  renderResult: renderMcpToolResult
27231
27379
  });
27232
27380
  }
@@ -27555,7 +27703,7 @@ function mcpAdapter(pi) {
27555
27703
  server: Type.Optional(Type.String({ description: "Filter to specific server (also disambiguates tool calls)" })),
27556
27704
  action: Type.Optional(Type.String({ description: "Action: 'ui-messages' to retrieve prompts/intents from UI sessions" }))
27557
27705
  }),
27558
- renderCall: (args, theme) => renderMcpToolCall(args, theme, { config: state?.config ?? renderConfig, toolMetadata: state?.toolMetadata }),
27706
+ renderCall: (args, theme, context) => renderMcpToolCall(args, theme, { config: state?.config ?? renderConfig, toolMetadata: state?.toolMetadata }, context.expanded),
27559
27707
  renderResult: renderMcpToolResult,
27560
27708
  async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
27561
27709
  signal?.throwIfAborted();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.24",
3
+ "version": "0.9.25-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -33,7 +33,7 @@
33
33
  "peerDependencies": {
34
34
  "@bastani/atomic": "*",
35
35
  "@bastani/pi-ai": "*",
36
- "@earendil-works/pi-tui": "^0.87.1",
36
+ "@earendil-works/pi-tui": "^0.99.1",
37
37
  "zod": "^3.25.0 || ^4.0.0",
38
38
  "typebox": "*"
39
39
  },
@@ -52,6 +52,10 @@
52
52
  "@modelcontextprotocol/ext-apps": "^1.7.5",
53
53
  "@modelcontextprotocol/sdk": "^1.30.0",
54
54
  "open": "^11.0.1",
55
+ "proper-lockfile": "4.1.2",
55
56
  "zod": "^3.25.0 || ^4.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@types/proper-lockfile": "4.1.4"
56
60
  }
57
61
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.24",
3
+ "version": "0.9.25-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with parallel execution. Fork of: https://github.com/nicobailon/pi-subagents",
6
6
  "contributors": [
@@ -35,8 +35,8 @@
35
35
  "peerDependencies": {
36
36
  "@bastani/atomic": "*",
37
37
  "@bastani/pi-ai": "*",
38
- "@earendil-works/pi-agent-core": "^0.87.1",
39
- "@earendil-works/pi-tui": "^0.87.1",
38
+ "@earendil-works/pi-agent-core": "^0.99.1",
39
+ "@earendil-works/pi-tui": "^0.99.1",
40
40
  "typebox": "*"
41
41
  },
42
42
  "peerDependenciesMeta": {
@@ -18260,6 +18260,7 @@ function registerSubagentExtension(pi) {
18260
18260
  });
18261
18261
  const tool = {
18262
18262
  name: "subagent",
18263
+ exposure: "model-only",
18263
18264
  label: "Subagent",
18264
18265
  description: SUBAGENT_TOOL_DESCRIPTION,
18265
18266
  parameters: SubagentParams,