@bastani/atomic 0.9.17-alpha.1 → 0.9.18-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 (311) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +8 -0
  3. package/dist/builtin/intercom/index.bundle.mjs +349 -57517
  4. package/dist/builtin/intercom/package.json +1 -1
  5. package/dist/builtin/mcp/index.bundle.mjs +28948 -58339
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/mcp/xdg-open +1267 -0
  8. package/dist/builtin/subagents/package.json +1 -1
  9. package/dist/builtin/subagents/src/extension/index.bundle.mjs +7929 -78021
  10. package/dist/builtin/web-access/index.bundle.mjs +70791 -57707
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/builtin/adversarial-verification.js +0 -1
  13. package/dist/builtin/workflows/builtin/{chunk-3y1hmzw6.js → chunk-6v0yv8tj.js} +1 -1
  14. package/dist/builtin/workflows/builtin/{chunk-w9c7rkrk.js → chunk-brerg33r.js} +5 -7
  15. package/dist/builtin/workflows/builtin/{chunk-bz1c9732.js → chunk-ngffz3y8.js} +1 -1
  16. package/dist/builtin/workflows/builtin/{chunk-6rbajjf5.js → chunk-szz1ajz9.js} +1 -3
  17. package/dist/builtin/workflows/builtin/classify-and-act.js +0 -1
  18. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +0 -1
  19. package/dist/builtin/workflows/builtin/generate-and-filter.js +0 -1
  20. package/dist/builtin/workflows/builtin/goal.js +2 -5
  21. package/dist/builtin/workflows/builtin/index.js +4 -7
  22. package/dist/builtin/workflows/builtin/loop-until-done.js +0 -1
  23. package/dist/builtin/workflows/builtin/open-claude-design.js +1 -4
  24. package/dist/builtin/workflows/builtin/ralph.js +2 -5
  25. package/dist/builtin/workflows/builtin/steering-context.js +0 -1
  26. package/dist/builtin/workflows/builtin/tournament.js +0 -1
  27. package/dist/builtin/workflows/package.json +1 -1
  28. package/dist/builtin/workflows/src/extension/index.bundle.mjs +39989 -81500
  29. package/dist/builtin/workflows/src/index.js +1253 -58524
  30. package/dist/bun/cli.js.map +1 -1
  31. package/dist/bun/split-loader.js +2 -0
  32. package/dist/bun/split-loader.js.map +1 -1
  33. package/dist/cli/args.js.map +1 -1
  34. package/dist/cli/auth-command.js.map +1 -1
  35. package/dist/cli/session-picker.js.map +1 -1
  36. package/dist/cli/startup-ui.js.map +1 -1
  37. package/dist/cli.js +5 -2
  38. package/dist/cli.js.map +1 -1
  39. package/dist/core/agent-session-extension-bindings.d.ts +19 -2
  40. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  41. package/dist/core/agent-session-extension-bindings.js +253 -74
  42. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  43. package/dist/core/agent-session-methods.d.ts +8 -3
  44. package/dist/core/agent-session-methods.d.ts.map +1 -1
  45. package/dist/core/agent-session-methods.js.map +1 -1
  46. package/dist/core/agent-session-prompt.d.ts +2 -7
  47. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  48. package/dist/core/agent-session-prompt.js +1 -35
  49. package/dist/core/agent-session-prompt.js.map +1 -1
  50. package/dist/core/agent-session-services.d.ts.map +1 -1
  51. package/dist/core/agent-session-services.js +2 -0
  52. package/dist/core/agent-session-services.js.map +1 -1
  53. package/dist/core/agent-session-types.d.ts +2 -0
  54. package/dist/core/agent-session-types.d.ts.map +1 -1
  55. package/dist/core/agent-session-types.js.map +1 -1
  56. package/dist/core/agent-session.d.ts +1 -0
  57. package/dist/core/agent-session.d.ts.map +1 -1
  58. package/dist/core/agent-session.js +2 -0
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/auth-guidance.js.map +1 -1
  61. package/dist/core/auth-storage-backends.js.map +1 -1
  62. package/dist/core/auth-storage.js.map +1 -1
  63. package/dist/core/bash-executor.js.map +1 -1
  64. package/dist/core/builtin-packages.d.ts +8 -0
  65. package/dist/core/builtin-packages.d.ts.map +1 -1
  66. package/dist/core/builtin-packages.js +11 -5
  67. package/dist/core/builtin-packages.js.map +1 -1
  68. package/dist/core/event-bus.d.ts +11 -0
  69. package/dist/core/event-bus.d.ts.map +1 -1
  70. package/dist/core/event-bus.js +96 -0
  71. package/dist/core/event-bus.js.map +1 -1
  72. package/dist/core/experimental.js.map +1 -1
  73. package/dist/core/export-html/index.js.map +1 -1
  74. package/dist/core/extensions/builtin-extension-entry-labels.d.ts +6 -0
  75. package/dist/core/extensions/builtin-extension-entry-labels.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin-extension-entry-labels.js +22 -0
  77. package/dist/core/extensions/builtin-extension-entry-labels.js.map +1 -0
  78. package/dist/core/extensions/host-module-bridge.d.ts +22 -0
  79. package/dist/core/extensions/host-module-bridge.d.ts.map +1 -0
  80. package/dist/core/extensions/host-module-bridge.js +39 -0
  81. package/dist/core/extensions/host-module-bridge.js.map +1 -0
  82. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  83. package/dist/core/extensions/loader-api.js +2 -2
  84. package/dist/core/extensions/loader-api.js.map +1 -1
  85. package/dist/core/extensions/loader-core.js.map +1 -1
  86. package/dist/core/extensions/loader-discovery.js.map +1 -1
  87. package/dist/core/extensions/loader-host-modules.d.ts +10 -0
  88. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -0
  89. package/dist/core/extensions/loader-host-modules.js +88 -0
  90. package/dist/core/extensions/loader-host-modules.js.map +1 -0
  91. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  92. package/dist/core/extensions/loader-runtime.js +1 -0
  93. package/dist/core/extensions/loader-runtime.js.map +1 -1
  94. package/dist/core/extensions/loader-virtual-modules.d.ts +5 -2
  95. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  96. package/dist/core/extensions/loader-virtual-modules.js +51 -71
  97. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  98. package/dist/core/extensions/loader.d.ts +1 -1
  99. package/dist/core/extensions/loader.js.map +1 -1
  100. package/dist/core/extensions/native-builtin-entries.d.ts +6 -0
  101. package/dist/core/extensions/native-builtin-entries.d.ts.map +1 -0
  102. package/dist/core/extensions/native-builtin-entries.js +23 -0
  103. package/dist/core/extensions/native-builtin-entries.js.map +1 -0
  104. package/dist/core/extensions/runtime-types.d.ts +2 -0
  105. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  106. package/dist/core/extensions/runtime-types.js.map +1 -1
  107. package/dist/core/keybindings.js.map +1 -1
  108. package/dist/core/lifecycle-timings.d.ts +21 -0
  109. package/dist/core/lifecycle-timings.d.ts.map +1 -0
  110. package/dist/core/lifecycle-timings.js +57 -0
  111. package/dist/core/lifecycle-timings.js.map +1 -0
  112. package/dist/core/mandatory-resource-loader.d.ts.map +1 -1
  113. package/dist/core/mandatory-resource-loader.js +43 -0
  114. package/dist/core/mandatory-resource-loader.js.map +1 -1
  115. package/dist/core/model-runtime.d.ts +8 -0
  116. package/dist/core/model-runtime.d.ts.map +1 -1
  117. package/dist/core/model-runtime.js +82 -0
  118. package/dist/core/model-runtime.js.map +1 -1
  119. package/dist/core/models-store.js.map +1 -1
  120. package/dist/core/package-manager-auto-resources.js.map +1 -1
  121. package/dist/core/package-manager-env.js.map +1 -1
  122. package/dist/core/package-manager-git.js.map +1 -1
  123. package/dist/core/package-manager-manifest.js.map +1 -1
  124. package/dist/core/package-manager-npm.js.map +1 -1
  125. package/dist/core/package-manager-paths.js.map +1 -1
  126. package/dist/core/package-manager-resolver.js.map +1 -1
  127. package/dist/core/project-trust.js.map +1 -1
  128. package/dist/core/prompt-templates-async.js.map +1 -1
  129. package/dist/core/prompt-templates.js.map +1 -1
  130. package/dist/core/provider-attribution.js.map +1 -1
  131. package/dist/core/remote-catalog-provider.js.map +1 -1
  132. package/dist/core/resource-loader-assets.js.map +1 -1
  133. package/dist/core/resource-loader-context-files.js.map +1 -1
  134. package/dist/core/resource-loader-core.d.ts +5 -1
  135. package/dist/core/resource-loader-core.d.ts.map +1 -1
  136. package/dist/core/resource-loader-core.js +90 -1
  137. package/dist/core/resource-loader-core.js.map +1 -1
  138. package/dist/core/resource-loader-discovery.js.map +1 -1
  139. package/dist/core/resource-loader-paths.js.map +1 -1
  140. package/dist/core/resource-loader-source-info.js.map +1 -1
  141. package/dist/core/resource-loader-types.d.ts +16 -0
  142. package/dist/core/resource-loader-types.d.ts.map +1 -1
  143. package/dist/core/resource-loader-types.js.map +1 -1
  144. package/dist/core/sdk.d.ts.map +1 -1
  145. package/dist/core/sdk.js +4 -1
  146. package/dist/core/sdk.js.map +1 -1
  147. package/dist/core/session-manager-core.js.map +1 -1
  148. package/dist/core/session-manager-list.js.map +1 -1
  149. package/dist/core/session-manager-paths.js.map +1 -1
  150. package/dist/core/settings-manager-core.d.ts +6 -0
  151. package/dist/core/settings-manager-core.d.ts.map +1 -1
  152. package/dist/core/settings-manager-core.js +24 -0
  153. package/dist/core/settings-manager-core.js.map +1 -1
  154. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  155. package/dist/core/settings-storage.js.map +1 -1
  156. package/dist/core/skills-async.js.map +1 -1
  157. package/dist/core/skills.js.map +1 -1
  158. package/dist/core/slash-commands.d.ts.map +1 -1
  159. package/dist/core/slash-commands.js +0 -6
  160. package/dist/core/slash-commands.js.map +1 -1
  161. package/dist/core/system-prompt.js.map +1 -1
  162. package/dist/core/telemetry.js.map +1 -1
  163. package/dist/core/timings.js.map +1 -1
  164. package/dist/core/tools/bash.js.map +1 -1
  165. package/dist/core/tools/output-accumulator.js.map +1 -1
  166. package/dist/core/tools/powershell.js.map +1 -1
  167. package/dist/core/tools/read.js.map +1 -1
  168. package/dist/core/tools/session-temp-cleanup.js.map +1 -1
  169. package/dist/core/tools/session-temp-dir.js.map +1 -1
  170. package/dist/core/tools/todos-paths.js.map +1 -1
  171. package/dist/core/trust-manager.js.map +1 -1
  172. package/dist/index.d.ts +1 -1
  173. package/dist/index.js.map +1 -1
  174. package/dist/main-deferred-startup.d.ts +16 -0
  175. package/dist/main-deferred-startup.d.ts.map +1 -1
  176. package/dist/main-deferred-startup.js +14 -0
  177. package/dist/main-deferred-startup.js.map +1 -1
  178. package/dist/main-session.js.map +1 -1
  179. package/dist/main.d.ts.map +1 -1
  180. package/dist/main.js +41 -22
  181. package/dist/main.js.map +1 -1
  182. package/dist/migrations.js.map +1 -1
  183. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  184. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  185. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
  186. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  187. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  188. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  189. package/dist/modes/interactive/components/startup-identity.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/startup-identity.js +4 -0
  191. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  192. package/dist/modes/interactive/external-editor.js.map +1 -1
  193. package/dist/modes/interactive/interactive-editor-actions.js +13 -5
  194. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  195. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  196. package/dist/modes/interactive/interactive-input-handling.js +2 -5
  197. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  198. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  199. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  200. package/dist/modes/interactive/interactive-mode-surface.d.ts +8 -8
  201. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  202. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  203. package/dist/modes/interactive/interactive-onboarding.js +1 -1
  204. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  205. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
  206. package/dist/modes/interactive/interactive-prompt-restore.js +2 -1
  207. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
  208. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  209. package/dist/modes/interactive/interactive-render-chat.js +2 -0
  210. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  211. package/dist/modes/interactive/interactive-resource-disclosure.js +21 -53
  212. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  213. package/dist/modes/interactive/interactive-resource-paths.js +29 -5
  214. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -1
  215. package/dist/modes/interactive/interactive-resource-rendering.js +66 -69
  216. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  217. package/dist/modes/interactive/interactive-startup-chat-container.d.ts.map +1 -1
  218. package/dist/modes/interactive/interactive-startup-chat-container.js +2 -0
  219. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -1
  220. package/dist/modes/interactive/interactive-startup.d.ts +2 -0
  221. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  222. package/dist/modes/interactive/interactive-startup.js +30 -10
  223. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  224. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  225. package/dist/modes/interactive/interactive-tui.js +12 -2
  226. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  227. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  228. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  229. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
  230. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +2 -0
  231. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -1
  232. package/dist/modes/interactive-engine/engine-child-liveness.js +16 -2
  233. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -1
  234. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  235. package/dist/modes/interactive-engine/engine-monitor.d.ts +5 -0
  236. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  237. package/dist/modes/interactive-engine/engine-monitor.js +24 -0
  238. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  239. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  240. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +3 -1
  241. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  242. package/dist/modes/interactive-engine/extension-ui-bridge.js +6 -0
  243. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  244. package/dist/modes/interactive-engine/isolated-runtime.d.ts +21 -2
  245. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  246. package/dist/modes/interactive-engine/isolated-runtime.js +160 -7
  247. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  248. package/dist/modes/interactive-engine/protocol.d.ts +9 -4
  249. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  250. package/dist/modes/interactive-engine/protocol.js +8 -4
  251. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  252. package/dist/modes/interactive-engine/resource-readiness-error.d.ts +6 -0
  253. package/dist/modes/interactive-engine/resource-readiness-error.d.ts.map +1 -0
  254. package/dist/modes/interactive-engine/resource-readiness-error.js +11 -0
  255. package/dist/modes/interactive-engine/resource-readiness-error.js.map +1 -0
  256. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  257. package/dist/modes/rpc/rpc-client-process.js +3 -0
  258. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  259. package/dist/modes/rpc/rpc-client.d.ts +1 -0
  260. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  261. package/dist/modes/rpc/rpc-client.js +5 -1
  262. package/dist/modes/rpc/rpc-client.js.map +1 -1
  263. package/dist/modes/rpc/rpc-command-handler.d.ts +4 -1
  264. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  265. package/dist/modes/rpc/rpc-command-handler.js +59 -18
  266. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  267. package/dist/modes/rpc/rpc-mode.d.ts +4 -13
  268. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  269. package/dist/modes/rpc/rpc-mode.js +31 -2
  270. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  271. package/dist/modes/rpc/rpc-resource-readiness.d.ts +11 -0
  272. package/dist/modes/rpc/rpc-resource-readiness.d.ts.map +1 -0
  273. package/dist/modes/rpc/rpc-resource-readiness.js +51 -0
  274. package/dist/modes/rpc/rpc-resource-readiness.js.map +1 -0
  275. package/dist/modes/rpc/rpc-session-binding.d.ts +2 -0
  276. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  277. package/dist/modes/rpc/rpc-session-binding.js +21 -0
  278. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  279. package/dist/modes/rpc/rpc-types.d.ts +7 -0
  280. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  281. package/dist/modes/rpc/rpc-types.js.map +1 -1
  282. package/dist/package-manager-cli-parser.js.map +1 -1
  283. package/dist/package-manager-cli.js.map +1 -1
  284. package/dist/rpc-entry.js.map +1 -1
  285. package/dist/self-update-plan.js.map +1 -1
  286. package/dist/utils/changelog.d.ts +1 -1
  287. package/dist/utils/changelog.js.map +1 -1
  288. package/dist/utils/module-require.js.map +1 -1
  289. package/dist/utils/pi-user-agent.js.map +1 -1
  290. package/dist/utils/shell.js.map +1 -1
  291. package/dist/utils/tools-manager.js.map +1 -1
  292. package/dist/utils/version-check.js.map +1 -1
  293. package/dist/utils/windows-self-update.js.map +1 -1
  294. package/docs/development.md +28 -1
  295. package/docs/extensions.md +5 -3
  296. package/docs/quickstart.md +1 -3
  297. package/docs/sdk.md +2 -0
  298. package/docs/usage.md +3 -1
  299. package/docs/windows.md +8 -0
  300. package/npm-shrinkwrap.json +32 -32
  301. package/package.json +4 -4
  302. package/dist/builtin/workflows/builtin/chunk-4febxsv4.js +0 -264
  303. package/dist/builtin/workflows/builtin/chunk-5wgwscd0.js +0 -4
  304. package/dist/builtin/workflows/builtin/chunk-dattsgxg.js +0 -529
  305. package/dist/builtin/workflows/builtin/chunk-gdx0avpx.js +0 -70082
  306. package/dist/builtin/workflows/builtin/chunk-qx2ptjs3.js +0 -215
  307. package/dist/builtin/workflows/builtin/chunk-x2ghn0je.js +0 -4110
  308. package/dist/core/atomic-guide-command.d.ts +0 -41
  309. package/dist/core/atomic-guide-command.d.ts.map +0 -1
  310. package/dist/core/atomic-guide-command.js +0 -311
  311. package/dist/core/atomic-guide-command.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { getInteractiveEngineResourceOverlaps } from "../interactive-engine/extension-ui-bridge.js";
1
+ import { getInteractiveEngineResourceExtensions, getInteractiveEngineResourceOverlaps, } from "../interactive-engine/extension-ui-bridge.js";
2
2
  import { InteractiveModeBase } from "./interactive-mode-base.js";
3
3
  import { Spacer, Text, theme, } from "./interactive-mode-deps.js";
4
4
  function formatList(values) {
@@ -48,6 +48,27 @@ function getExtensionIdentityPath(resourcePath) {
48
48
  segments.pop();
49
49
  return segments.join("/") || normalized;
50
50
  }
51
+ function mergeExtensions(hostExtensions, engineExtensions) {
52
+ const merged = [];
53
+ const indexByIdentity = new Map();
54
+ const hiddenIdentities = new Set();
55
+ for (const extension of [...hostExtensions, ...engineExtensions]) {
56
+ const identity = getExtensionIdentityPath(extension.path);
57
+ if (extension.hidden === true)
58
+ hiddenIdentities.add(identity);
59
+ const existingIndex = indexByIdentity.get(identity);
60
+ if (existingIndex === undefined) {
61
+ indexByIdentity.set(identity, merged.length);
62
+ merged.push({ path: extension.path, sourceInfo: extension.sourceInfo });
63
+ continue;
64
+ }
65
+ const existing = merged[existingIndex];
66
+ if (existing && !existing.sourceInfo && extension.sourceInfo) {
67
+ merged[existingIndex] = { ...existing, sourceInfo: extension.sourceInfo };
68
+ }
69
+ }
70
+ return merged.filter((extension) => !hiddenIdentities.has(getExtensionIdentityPath(extension.path)));
71
+ }
51
72
  function getOverlapLabels(mode, overlaps) {
52
73
  const labels = new Set();
53
74
  const localPackageSources = new Set();
@@ -72,18 +93,19 @@ function getOverlapLabels(mode, overlaps) {
72
93
  labels.add(label);
73
94
  return [...labels];
74
95
  }
75
- const displayedOverlapFingerprints = new WeakMap();
76
- function shouldDisplayOverlapNotice(mode, overlaps) {
96
+ const displayedOverlapNotices = new WeakMap();
97
+ function getOverlapNoticeFingerprint(mode, overlaps) {
77
98
  if (overlaps.length === 0)
78
- return false;
99
+ return undefined;
79
100
  const fingerprint = overlaps
80
101
  .map((overlap) => `${overlap.resourceType}:${overlap.name}:${overlap.inherited.path}:${overlap.bundled.path}`)
81
102
  .sort()
82
103
  .join("\n");
83
- if (displayedOverlapFingerprints.get(mode) === fingerprint)
84
- return false;
85
- displayedOverlapFingerprints.set(mode, fingerprint);
86
- return true;
104
+ const displayed = displayedOverlapNotices.get(mode);
105
+ if (displayed?.fingerprint === fingerprint && displayed.container.children.includes(displayed.component)) {
106
+ return undefined;
107
+ }
108
+ return fingerprint;
87
109
  }
88
110
  InteractiveModeBase.prototype.showLoadedResources = function (options) {
89
111
  const targetContainer = options?.targetContainer ?? this.chatContainer;
@@ -92,17 +114,18 @@ InteractiveModeBase.prototype.showLoadedResources = function (options) {
92
114
  if (!showListing && !showDiagnostics) {
93
115
  return;
94
116
  }
117
+ if (targetContainer === this.resourceDisclosureContainer)
118
+ targetContainer.clear();
95
119
  const skillsResult = this.session.resourceLoader.getSkills();
96
120
  const promptsResult = this.session.resourceLoader.getPrompts();
97
121
  const themesResult = this.session.resourceLoader.getThemes();
98
- const extensions = options?.extensions ??
99
- this.session.resourceLoader
100
- .getExtensions()
101
- .extensions.filter((extension) => extension.hidden !== true)
102
- .map((extension) => ({
122
+ const hostExtensions = options?.extensions ??
123
+ this.session.resourceLoader.getExtensions().extensions.map((extension) => ({
103
124
  path: extension.path,
104
125
  sourceInfo: extension.sourceInfo,
126
+ hidden: extension.hidden,
105
127
  }));
128
+ const extensions = mergeExtensions(hostExtensions, getInteractiveEngineResourceExtensions(this.runtimeHost));
106
129
  const sourceInfos = new Map();
107
130
  for (const extension of extensions) {
108
131
  if (extension.sourceInfo) {
@@ -133,13 +156,12 @@ InteractiveModeBase.prototype.showLoadedResources = function (options) {
133
156
  ...this.session.resourceLoader.getAppendSystemPromptSources(),
134
157
  ...this.session.resourceLoader.getAgentsFiles().agentsFiles,
135
158
  ];
136
- const templates = this.session.promptTemplates;
137
159
  const customThemes = themesResult.themes.filter((t) => t.sourcePath);
138
- const expandedSections = [];
160
+ const expandedSections = {};
139
161
  if (contextFiles.length > 0) {
140
- expandedSections.push(`${theme.bold(theme.fg("muted", "CONTEXT"))}\n${contextFiles
162
+ expandedSections.context = contextFiles
141
163
  .map((contextFile) => theme.fg("dim", ` ${this.formatDisplayPath(contextFile.path)}`))
142
- .join("\n")}`);
164
+ .join("\n");
143
165
  }
144
166
  const skills = skillsResult.skills;
145
167
  if (skills.length > 0) {
@@ -147,81 +169,49 @@ InteractiveModeBase.prototype.showLoadedResources = function (options) {
147
169
  path: skill.filePath,
148
170
  sourceInfo: skill.sourceInfo,
149
171
  })));
150
- expandedSections.push(`${theme.bold(theme.fg("muted", "SKILLS"))}\n${this.formatScopeGroups(groups, {
172
+ expandedSections.skills = this.formatScopeGroups(groups, {
151
173
  formatPath: (item) => this.formatDisplayPath(item.path),
152
174
  formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
153
- })}`);
154
- }
155
- if (templates.length > 0) {
156
- const groups = this.buildScopeGroups(templates.map((template) => ({
157
- path: template.filePath,
158
- sourceInfo: template.sourceInfo,
159
- })));
160
- const templateByPath = new Map(templates.map((t) => [t.filePath, t]));
161
- expandedSections.push(`${theme.bold(theme.fg("muted", "PROMPTS"))}\n${this.formatScopeGroups(groups, {
162
- formatPath: (item) => {
163
- const template = templateByPath.get(item.path);
164
- return template ? `/${template.name}` : this.formatDisplayPath(item.path);
165
- },
166
- formatPackagePath: (item) => {
167
- const template = templateByPath.get(item.path);
168
- return template ? `/${template.name}` : this.formatDisplayPath(item.path);
169
- },
170
- })}`);
175
+ });
171
176
  }
172
177
  const prompts = promptsResult.prompts;
173
- if (prompts.length > 0) {
174
- const groups = this.buildScopeGroups(prompts.map((prompt) => ({
175
- path: prompt.filePath,
176
- sourceInfo: prompt.sourceInfo,
177
- })));
178
- const promptByPath = new Map(prompts.map((prompt) => [prompt.filePath, prompt]));
179
- expandedSections.push(`${theme.bold(theme.fg("muted", "PROMPTS"))}\n${this.formatScopeGroups(groups, {
180
- formatPath: (item) => promptByPath.get(item.path)?.name ?? this.formatDisplayPath(item.path),
181
- formatPackagePath: (item) => promptByPath.get(item.path)?.name ?? this.formatDisplayPath(item.path),
182
- })}`);
178
+ const promptEntries = prompts.map((prompt) => ({
179
+ path: prompt.filePath,
180
+ sourceInfo: prompt.sourceInfo,
181
+ label: `/${prompt.name}`,
182
+ }));
183
+ if (promptEntries.length > 0) {
184
+ const groups = this.buildScopeGroups(promptEntries);
185
+ const promptByPath = new Map(promptEntries.map((prompt) => [prompt.path, prompt.label]));
186
+ expandedSections.prompts = this.formatScopeGroups(groups, {
187
+ formatPath: (item) => promptByPath.get(item.path) ?? this.formatDisplayPath(item.path),
188
+ formatPackagePath: (item) => promptByPath.get(item.path) ?? this.formatDisplayPath(item.path),
189
+ });
183
190
  }
184
191
  if (extensions.length > 0) {
185
192
  const groups = this.buildScopeGroups(extensions);
186
- expandedSections.push(`${theme.bold(theme.fg("muted", "EXTENSIONS"))}\n${this.formatScopeGroups(groups, {
193
+ expandedSections.extensions = this.formatScopeGroups(groups, {
187
194
  formatPath: (item) => this.formatExtensionDisplayPath(item.path),
188
195
  formatPackagePath: (item) => this.formatExtensionDisplayPath(this.getShortPath(item.path, item.sourceInfo)),
189
- })}`);
196
+ });
190
197
  }
191
198
  if (customThemes.length > 0) {
192
199
  const groups = this.buildScopeGroups(customThemes.map((loadedTheme) => ({
193
200
  path: loadedTheme.sourcePath,
194
201
  sourceInfo: loadedTheme.sourceInfo,
195
202
  })));
196
- expandedSections.push(`${theme.bold(theme.fg("muted", "THEMES"))}\n${this.formatScopeGroups(groups, {
203
+ expandedSections.themes = this.formatScopeGroups(groups, {
197
204
  formatPath: (item) => this.formatDisplayPath(item.path),
198
205
  formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
199
- })}`);
200
- }
201
- const extensionDiagnostics = [];
202
- const extensionErrors = this.session.resourceLoader.getExtensions().errors;
203
- for (const error of extensionErrors) {
204
- extensionDiagnostics.push({
205
- type: "error",
206
- message: error.error,
207
- path: error.path,
208
206
  });
209
207
  }
210
- extensionDiagnostics.push(...this.session.extensionRunner.getCommandDiagnostics(), ...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner), ...this.session.extensionRunner.getShortcutDiagnostics());
211
208
  this.addResourceDisclosure({
212
209
  contextFiles,
213
210
  skills,
214
211
  prompts,
215
- templates,
216
212
  extensions,
217
213
  themes: customThemes,
218
- diagnosticsTotal: this.getResourceDiagnosticsTotal([
219
- skillsResult.diagnostics,
220
- promptsResult.diagnostics,
221
- extensionDiagnostics,
222
- themesResult.diagnostics,
223
- ]),
224
- expandedBody: this.options.verbose ? expandedSections.join("\n\n") : "",
214
+ expandedSections,
225
215
  targetContainer,
226
216
  });
227
217
  }
@@ -231,10 +221,17 @@ InteractiveModeBase.prototype.showLoadedResources = function (options) {
231
221
  ...getInteractiveEngineResourceOverlaps(this.runtimeHost),
232
222
  ];
233
223
  const overlapLabels = getOverlapLabels(this, overlaps);
234
- if (shouldDisplayOverlapNotice(this, overlaps) && overlapLabels.length > 0) {
224
+ const overlapFingerprint = getOverlapNoticeFingerprint(this, overlaps);
225
+ if (overlapFingerprint && overlapLabels.length > 0) {
235
226
  const sources = formatList(overlapLabels.map((label) => `\`${label}\``));
236
227
  const verb = overlapLabels.length === 1 ? "provides" : "provide";
237
- targetContainer.addChild(new Text(theme.fg("warning", `Extension overlap detected: ${sources} ${verb} resources already bundled with Atomic. Atomic kept its bundled versions; non-conflicting extension features remain available.`), 0, 0));
228
+ const notice = new Text(theme.fg("warning", `Extension overlap detected: ${sources} ${verb} resources already bundled with Atomic. Atomic kept its bundled versions; non-conflicting extension features remain available.`), 0, 0);
229
+ targetContainer.addChild(notice);
230
+ displayedOverlapNotices.set(this, {
231
+ component: notice,
232
+ container: targetContainer,
233
+ fingerprint: overlapFingerprint,
234
+ });
238
235
  targetContainer.addChild(new Spacer(1));
239
236
  }
240
237
  const skillDiagnostics = skillsResult.diagnostics;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-resource-rendering.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-resource-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ResourceOverlap } from \"../../core/diagnostics.ts\";\nimport { getInteractiveEngineResourceOverlaps } from \"../interactive-engine/extension-ui-bridge.ts\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Container,\n\ttype ResourceDiagnostic,\n\ttype SourceInfo,\n\tSpacer,\n\tText,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\n\nfunction formatList(values: string[]): string {\n\tif (values.length <= 1) return values[0] ?? \"\";\n\tif (values.length === 2) return `${values[0]} and ${values[1]}`;\n\treturn `${values.slice(0, -1).join(\", \")}, and ${values.at(-1)}`;\n}\n\nfunction getShortestUniqueSourceLabels(sources: string[], reservedLabels: ReadonlySet<string>): Map<string, string> {\n\tconst partsBySource = new Map(\n\t\tsources.map((source) => [source, source.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean)]),\n\t);\n\tconst depthBySource = new Map(sources.map((source) => [source, 1]));\n\twhile (true) {\n\t\tconst groups = new Map<string, string[]>();\n\t\tfor (const source of sources) {\n\t\t\tconst parts = partsBySource.get(source) ?? [source];\n\t\t\tconst depth = depthBySource.get(source) ?? 1;\n\t\t\tconst label = parts.slice(-depth).join(\"/\") || source;\n\t\t\tgroups.set(label, [...(groups.get(label) ?? []), source]);\n\t\t}\n\t\tconst duplicates = [...groups].filter(([label, group]) => group.length > 1 || reservedLabels.has(label));\n\t\tif (duplicates.length === 0) {\n\t\t\treturn new Map(\n\t\t\t\tsources.map((source) => {\n\t\t\t\t\tconst parts = partsBySource.get(source) ?? [source];\n\t\t\t\t\treturn [source, parts.slice(-(depthBySource.get(source) ?? 1)).join(\"/\") || source];\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlet expanded = false;\n\t\tfor (const [, group] of duplicates) {\n\t\t\tfor (const source of group) {\n\t\t\t\tconst maxDepth = partsBySource.get(source)?.length ?? 1;\n\t\t\t\tconst depth = depthBySource.get(source) ?? 1;\n\t\t\t\tif (depth < maxDepth) {\n\t\t\t\t\tdepthBySource.set(source, depth + 1);\n\t\t\t\t\texpanded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!expanded) return new Map(sources.map((source) => [source, source]));\n\t}\n}\n\nfunction getExtensionIdentityPath(resourcePath: string): string {\n\tconst normalized = resourcePath.replace(/\\\\/g, \"/\");\n\tconst segments = normalized.split(\"/\").filter(Boolean);\n\tif (/^index\\.[cm]?[jt]sx?$/.test(segments.at(-1) ?? \"\")) segments.pop();\n\treturn segments.join(\"/\") || normalized;\n}\n\nfunction getOverlapLabels(mode: InteractiveModeBase, overlaps: readonly ResourceOverlap[]): string[] {\n\tconst labels = new Set<string>();\n\tconst localPackageSources = new Set<string>();\n\tconst extensionSources = new Set<string>();\n\tfor (const overlap of overlaps) {\n\t\tconst sourceInfo = overlap.inherited;\n\t\tif (sourceInfo.origin !== \"package\") {\n\t\t\textensionSources.add(getExtensionIdentityPath(sourceInfo.path));\n\t\t\tcontinue;\n\t\t}\n\t\tif (!mode.isPackageSource(sourceInfo)) {\n\t\t\tlocalPackageSources.add(sourceInfo.source);\n\t\t\tcontinue;\n\t\t}\n\t\tconst label = mode.getCompactPackageSourceLabel(sourceInfo);\n\t\tif (label) labels.add(label);\n\t}\n\tfor (const label of getShortestUniqueSourceLabels([...localPackageSources], labels).values()) labels.add(label);\n\tfor (const label of getShortestUniqueSourceLabels([...extensionSources], labels).values()) labels.add(label);\n\treturn [...labels];\n}\nconst displayedOverlapFingerprints = new WeakMap<InteractiveModeBase, string>();\n\nfunction shouldDisplayOverlapNotice(mode: InteractiveModeBase, overlaps: readonly ResourceOverlap[]): boolean {\n\tif (overlaps.length === 0) return false;\n\tconst fingerprint = overlaps\n\t\t.map((overlap) => `${overlap.resourceType}:${overlap.name}:${overlap.inherited.path}:${overlap.bundled.path}`)\n\t\t.sort()\n\t\t.join(\"\\n\");\n\tif (displayedOverlapFingerprints.get(mode) === fingerprint) return false;\n\tdisplayedOverlapFingerprints.set(mode, fingerprint);\n\treturn true;\n}\n\nInteractiveModeBase.prototype.showLoadedResources = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\textensions?: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\tforce?: boolean;\n\t\tshowDiagnosticsWhenQuiet?: boolean;\n\t\ttargetContainer?: Container;\n\t},\n): void {\n\tconst targetContainer = options?.targetContainer ?? this.chatContainer;\n\tconst showListing = options?.force || this.options.verbose || !this.settingsManager.getQuietStartup();\n\tconst showDiagnostics = showListing || options?.showDiagnosticsWhenQuiet === true;\n\tif (!showListing && !showDiagnostics) {\n\t\treturn;\n\t}\n\n\tconst skillsResult = this.session.resourceLoader.getSkills();\n\tconst promptsResult = this.session.resourceLoader.getPrompts();\n\tconst themesResult = this.session.resourceLoader.getThemes();\n\tconst extensions =\n\t\toptions?.extensions ??\n\t\tthis.session.resourceLoader\n\t\t\t.getExtensions()\n\t\t\t.extensions.filter((extension) => extension.hidden !== true)\n\t\t\t.map((extension) => ({\n\t\t\t\tpath: extension.path,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t}));\n\tconst sourceInfos = new Map<string, SourceInfo>();\n\tfor (const extension of extensions) {\n\t\tif (extension.sourceInfo) {\n\t\t\tsourceInfos.set(extension.path, extension.sourceInfo);\n\t\t}\n\t}\n\tfor (const skill of skillsResult.skills) {\n\t\tif (skill.sourceInfo) {\n\t\t\tsourceInfos.set(skill.filePath, skill.sourceInfo);\n\t\t}\n\t}\n\tfor (const prompt of promptsResult.prompts) {\n\t\tif (prompt.sourceInfo) {\n\t\t\tsourceInfos.set(prompt.filePath, prompt.sourceInfo);\n\t\t}\n\t}\n\tfor (const loadedTheme of themesResult.themes) {\n\t\tif (loadedTheme.sourcePath && loadedTheme.sourceInfo) {\n\t\t\tsourceInfos.set(loadedTheme.sourcePath, loadedTheme.sourceInfo);\n\t\t}\n\t}\n\n\tif (showListing) {\n\t\t// SYSTEM.md / APPEND_SYSTEM.md shape the prompt exactly like AGENTS.md does,\n\t\t// so the startup CONTEXT listing names them too.\n\t\tconst systemPromptSource = this.session.resourceLoader.getSystemPromptSource();\n\t\tconst contextFiles = [\n\t\t\t...(systemPromptSource ? [systemPromptSource] : []),\n\t\t\t...this.session.resourceLoader.getAppendSystemPromptSources(),\n\t\t\t...this.session.resourceLoader.getAgentsFiles().agentsFiles,\n\t\t];\n\t\tconst templates = this.session.promptTemplates;\n\t\tconst customThemes = themesResult.themes.filter((t) => t.sourcePath);\n\n\t\tconst expandedSections: string[] = [];\n\t\tif (contextFiles.length > 0) {\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"CONTEXT\"))}\\n${contextFiles\n\t\t\t\t\t.map((contextFile) => theme.fg(\"dim\", ` ${this.formatDisplayPath(contextFile.path)}`))\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tconst skills = skillsResult.skills;\n\t\tif (skills.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\tskills.map((skill) => ({\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"SKILLS\"))}\\n${this.formatScopeGroups(groups, {\n\t\t\t\t\tformatPath: (item) => this.formatDisplayPath(item.path),\n\t\t\t\t\tformatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\n\t\tif (templates.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\ttemplates.map((template) => ({\n\t\t\t\t\tpath: template.filePath,\n\t\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\tconst templateByPath = new Map(templates.map((t) => [t.filePath, t]));\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"PROMPTS\"))}\\n${this.formatScopeGroups(groups, {\n\t\t\t\t\tformatPath: (item) => {\n\t\t\t\t\t\tconst template = templateByPath.get(item.path);\n\t\t\t\t\t\treturn template ? `/${template.name}` : this.formatDisplayPath(item.path);\n\t\t\t\t\t},\n\t\t\t\t\tformatPackagePath: (item) => {\n\t\t\t\t\t\tconst template = templateByPath.get(item.path);\n\t\t\t\t\t\treturn template ? `/${template.name}` : this.formatDisplayPath(item.path);\n\t\t\t\t\t},\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\n\t\tconst prompts = promptsResult.prompts;\n\t\tif (prompts.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\tprompts.map((prompt) => ({\n\t\t\t\t\tpath: prompt.filePath,\n\t\t\t\t\tsourceInfo: prompt.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\tconst promptByPath = new Map(prompts.map((prompt) => [prompt.filePath, prompt]));\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"PROMPTS\"))}\\n${this.formatScopeGroups(groups, {\n\t\t\t\t\tformatPath: (item) => promptByPath.get(item.path)?.name ?? this.formatDisplayPath(item.path),\n\t\t\t\t\tformatPackagePath: (item) => promptByPath.get(item.path)?.name ?? this.formatDisplayPath(item.path),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\n\t\tif (extensions.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(extensions);\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"EXTENSIONS\"))}\\n${this.formatScopeGroups(groups, {\n\t\t\t\t\tformatPath: (item) => this.formatExtensionDisplayPath(item.path),\n\t\t\t\t\tformatPackagePath: (item) =>\n\t\t\t\t\t\tthis.formatExtensionDisplayPath(this.getShortPath(item.path, item.sourceInfo)),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\n\t\tif (customThemes.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\tcustomThemes.map((loadedTheme) => ({\n\t\t\t\t\tpath: loadedTheme.sourcePath!,\n\t\t\t\t\tsourceInfo: loadedTheme.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\texpandedSections.push(\n\t\t\t\t`${theme.bold(theme.fg(\"muted\", \"THEMES\"))}\\n${this.formatScopeGroups(groups, {\n\t\t\t\t\tformatPath: (item) => this.formatDisplayPath(item.path),\n\t\t\t\t\tformatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\n\t\tconst extensionDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst extensionErrors = this.session.resourceLoader.getExtensions().errors;\n\t\tfor (const error of extensionErrors) {\n\t\t\textensionDiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: error.error,\n\t\t\t\tpath: error.path,\n\t\t\t});\n\t\t}\n\t\textensionDiagnostics.push(\n\t\t\t...this.session.extensionRunner.getCommandDiagnostics(),\n\t\t\t...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner),\n\t\t\t...this.session.extensionRunner.getShortcutDiagnostics(),\n\t\t);\n\n\t\tthis.addResourceDisclosure({\n\t\t\tcontextFiles,\n\t\t\tskills,\n\t\t\tprompts,\n\t\t\ttemplates,\n\t\t\textensions,\n\t\t\tthemes: customThemes,\n\t\t\tdiagnosticsTotal: this.getResourceDiagnosticsTotal([\n\t\t\t\tskillsResult.diagnostics,\n\t\t\t\tpromptsResult.diagnostics,\n\t\t\t\textensionDiagnostics,\n\t\t\t\tthemesResult.diagnostics,\n\t\t\t]),\n\t\t\texpandedBody: this.options.verbose ? expandedSections.join(\"\\n\\n\") : \"\",\n\t\t\ttargetContainer,\n\t\t});\n\t}\n\n\tif (showDiagnostics) {\n\t\tconst overlaps = [\n\t\t\t...(this.session.resourceLoader.getExtensions().overlaps ?? []),\n\t\t\t...getInteractiveEngineResourceOverlaps(this.runtimeHost),\n\t\t];\n\t\tconst overlapLabels = getOverlapLabels(this, overlaps);\n\t\tif (shouldDisplayOverlapNotice(this, overlaps) && overlapLabels.length > 0) {\n\t\t\tconst sources = formatList(overlapLabels.map((label) => `\\`${label}\\``));\n\t\t\tconst verb = overlapLabels.length === 1 ? \"provides\" : \"provide\";\n\t\t\ttargetContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t\t`Extension overlap detected: ${sources} ${verb} resources already bundled with Atomic. Atomic kept its bundled versions; non-conflicting extension features remain available.`,\n\t\t\t\t\t),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst skillDiagnostics = skillsResult.diagnostics;\n\t\tif (skillDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(skillDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Skill conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst promptDiagnostics = promptsResult.diagnostics;\n\t\tif (promptDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(promptDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Prompt conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst extensionDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst extensionErrors = this.session.resourceLoader.getExtensions().errors;\n\t\tif (extensionErrors.length > 0) {\n\t\t\tfor (const error of extensionErrors) {\n\t\t\t\textensionDiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: error.error,\n\t\t\t\t\tpath: error.path,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst commandDiagnostics = this.session.extensionRunner.getCommandDiagnostics();\n\t\textensionDiagnostics.push(...commandDiagnostics);\n\t\textensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));\n\n\t\tconst shortcutDiagnostics = this.session.extensionRunner.getShortcutDiagnostics();\n\t\textensionDiagnostics.push(...shortcutDiagnostics);\n\n\t\tif (extensionDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(extensionDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Extension issues]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst themeDiagnostics = themesResult.diagnostics;\n\t\tif (themeDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(themeDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Theme conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n};\n"]}
1
+ {"version":3,"file":"interactive-resource-rendering.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-resource-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ResourceOverlap } from \"../../core/diagnostics.ts\";\nimport {\n\tgetInteractiveEngineResourceExtensions,\n\tgetInteractiveEngineResourceOverlaps,\n} from \"../interactive-engine/extension-ui-bridge.ts\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Container,\n\ttype ResourceDiagnostic,\n\ttype SourceInfo,\n\tSpacer,\n\tText,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\n\nfunction formatList(values: string[]): string {\n\tif (values.length <= 1) return values[0] ?? \"\";\n\tif (values.length === 2) return `${values[0]} and ${values[1]}`;\n\treturn `${values.slice(0, -1).join(\", \")}, and ${values.at(-1)}`;\n}\n\nfunction getShortestUniqueSourceLabels(sources: string[], reservedLabels: ReadonlySet<string>): Map<string, string> {\n\tconst partsBySource = new Map(\n\t\tsources.map((source) => [source, source.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean)]),\n\t);\n\tconst depthBySource = new Map(sources.map((source) => [source, 1]));\n\twhile (true) {\n\t\tconst groups = new Map<string, string[]>();\n\t\tfor (const source of sources) {\n\t\t\tconst parts = partsBySource.get(source) ?? [source];\n\t\t\tconst depth = depthBySource.get(source) ?? 1;\n\t\t\tconst label = parts.slice(-depth).join(\"/\") || source;\n\t\t\tgroups.set(label, [...(groups.get(label) ?? []), source]);\n\t\t}\n\t\tconst duplicates = [...groups].filter(([label, group]) => group.length > 1 || reservedLabels.has(label));\n\t\tif (duplicates.length === 0) {\n\t\t\treturn new Map(\n\t\t\t\tsources.map((source) => {\n\t\t\t\t\tconst parts = partsBySource.get(source) ?? [source];\n\t\t\t\t\treturn [source, parts.slice(-(depthBySource.get(source) ?? 1)).join(\"/\") || source];\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tlet expanded = false;\n\t\tfor (const [, group] of duplicates) {\n\t\t\tfor (const source of group) {\n\t\t\t\tconst maxDepth = partsBySource.get(source)?.length ?? 1;\n\t\t\t\tconst depth = depthBySource.get(source) ?? 1;\n\t\t\t\tif (depth < maxDepth) {\n\t\t\t\t\tdepthBySource.set(source, depth + 1);\n\t\t\t\t\texpanded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!expanded) return new Map(sources.map((source) => [source, source]));\n\t}\n}\n\nfunction getExtensionIdentityPath(resourcePath: string): string {\n\tconst normalized = resourcePath.replace(/\\\\/g, \"/\");\n\tconst segments = normalized.split(\"/\").filter(Boolean);\n\tif (/^index\\.[cm]?[jt]sx?$/.test(segments.at(-1) ?? \"\")) segments.pop();\n\treturn segments.join(\"/\") || normalized;\n}\n\nfunction mergeExtensions(\n\thostExtensions: ReadonlyArray<{ path: string; sourceInfo?: SourceInfo; hidden?: boolean }>,\n\tengineExtensions: ReadonlyArray<{ path: string; sourceInfo?: SourceInfo; hidden?: boolean }>,\n): Array<{ path: string; sourceInfo?: SourceInfo }> {\n\tconst merged: Array<{ path: string; sourceInfo?: SourceInfo }> = [];\n\tconst indexByIdentity = new Map<string, number>();\n\tconst hiddenIdentities = new Set<string>();\n\tfor (const extension of [...hostExtensions, ...engineExtensions]) {\n\t\tconst identity = getExtensionIdentityPath(extension.path);\n\t\tif (extension.hidden === true) hiddenIdentities.add(identity);\n\t\tconst existingIndex = indexByIdentity.get(identity);\n\t\tif (existingIndex === undefined) {\n\t\t\tindexByIdentity.set(identity, merged.length);\n\t\t\tmerged.push({ path: extension.path, sourceInfo: extension.sourceInfo });\n\t\t\tcontinue;\n\t\t}\n\t\tconst existing = merged[existingIndex];\n\t\tif (existing && !existing.sourceInfo && extension.sourceInfo) {\n\t\t\tmerged[existingIndex] = { ...existing, sourceInfo: extension.sourceInfo };\n\t\t}\n\t}\n\treturn merged.filter((extension) => !hiddenIdentities.has(getExtensionIdentityPath(extension.path)));\n}\n\nfunction getOverlapLabels(mode: InteractiveModeBase, overlaps: readonly ResourceOverlap[]): string[] {\n\tconst labels = new Set<string>();\n\tconst localPackageSources = new Set<string>();\n\tconst extensionSources = new Set<string>();\n\tfor (const overlap of overlaps) {\n\t\tconst sourceInfo = overlap.inherited;\n\t\tif (sourceInfo.origin !== \"package\") {\n\t\t\textensionSources.add(getExtensionIdentityPath(sourceInfo.path));\n\t\t\tcontinue;\n\t\t}\n\t\tif (!mode.isPackageSource(sourceInfo)) {\n\t\t\tlocalPackageSources.add(sourceInfo.source);\n\t\t\tcontinue;\n\t\t}\n\t\tconst label = mode.getCompactPackageSourceLabel(sourceInfo);\n\t\tif (label) labels.add(label);\n\t}\n\tfor (const label of getShortestUniqueSourceLabels([...localPackageSources], labels).values()) labels.add(label);\n\tfor (const label of getShortestUniqueSourceLabels([...extensionSources], labels).values()) labels.add(label);\n\treturn [...labels];\n}\ninterface DisplayedOverlapNotice {\n\tcomponent: Text;\n\tcontainer: Container;\n\tfingerprint: string;\n}\n\nconst displayedOverlapNotices = new WeakMap<InteractiveModeBase, DisplayedOverlapNotice>();\n\nfunction getOverlapNoticeFingerprint(\n\tmode: InteractiveModeBase,\n\toverlaps: readonly ResourceOverlap[],\n): string | undefined {\n\tif (overlaps.length === 0) return undefined;\n\tconst fingerprint = overlaps\n\t\t.map((overlap) => `${overlap.resourceType}:${overlap.name}:${overlap.inherited.path}:${overlap.bundled.path}`)\n\t\t.sort()\n\t\t.join(\"\\n\");\n\tconst displayed = displayedOverlapNotices.get(mode);\n\tif (displayed?.fingerprint === fingerprint && displayed.container.children.includes(displayed.component)) {\n\t\treturn undefined;\n\t}\n\treturn fingerprint;\n}\n\nInteractiveModeBase.prototype.showLoadedResources = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\textensions?: Array<{ path: string; sourceInfo?: SourceInfo }>;\n\t\tforce?: boolean;\n\t\tshowDiagnosticsWhenQuiet?: boolean;\n\t\ttargetContainer?: Container;\n\t},\n): void {\n\tconst targetContainer = options?.targetContainer ?? this.chatContainer;\n\tconst showListing = options?.force || this.options.verbose || !this.settingsManager.getQuietStartup();\n\tconst showDiagnostics = showListing || options?.showDiagnosticsWhenQuiet === true;\n\tif (!showListing && !showDiagnostics) {\n\t\treturn;\n\t}\n\tif (targetContainer === this.resourceDisclosureContainer) targetContainer.clear();\n\n\tconst skillsResult = this.session.resourceLoader.getSkills();\n\tconst promptsResult = this.session.resourceLoader.getPrompts();\n\tconst themesResult = this.session.resourceLoader.getThemes();\n\tconst hostExtensions =\n\t\toptions?.extensions ??\n\t\tthis.session.resourceLoader.getExtensions().extensions.map((extension) => ({\n\t\t\tpath: extension.path,\n\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\thidden: extension.hidden,\n\t\t}));\n\tconst extensions = mergeExtensions(hostExtensions, getInteractiveEngineResourceExtensions(this.runtimeHost));\n\tconst sourceInfos = new Map<string, SourceInfo>();\n\tfor (const extension of extensions) {\n\t\tif (extension.sourceInfo) {\n\t\t\tsourceInfos.set(extension.path, extension.sourceInfo);\n\t\t}\n\t}\n\tfor (const skill of skillsResult.skills) {\n\t\tif (skill.sourceInfo) {\n\t\t\tsourceInfos.set(skill.filePath, skill.sourceInfo);\n\t\t}\n\t}\n\tfor (const prompt of promptsResult.prompts) {\n\t\tif (prompt.sourceInfo) {\n\t\t\tsourceInfos.set(prompt.filePath, prompt.sourceInfo);\n\t\t}\n\t}\n\tfor (const loadedTheme of themesResult.themes) {\n\t\tif (loadedTheme.sourcePath && loadedTheme.sourceInfo) {\n\t\t\tsourceInfos.set(loadedTheme.sourcePath, loadedTheme.sourceInfo);\n\t\t}\n\t}\n\n\tif (showListing) {\n\t\t// SYSTEM.md / APPEND_SYSTEM.md shape the prompt exactly like AGENTS.md does,\n\t\t// so the startup CONTEXT listing names them too.\n\t\tconst systemPromptSource = this.session.resourceLoader.getSystemPromptSource();\n\t\tconst contextFiles = [\n\t\t\t...(systemPromptSource ? [systemPromptSource] : []),\n\t\t\t...this.session.resourceLoader.getAppendSystemPromptSources(),\n\t\t\t...this.session.resourceLoader.getAgentsFiles().agentsFiles,\n\t\t];\n\t\tconst customThemes = themesResult.themes.filter((t) => t.sourcePath);\n\n\t\tconst expandedSections: {\n\t\t\tcontext?: string;\n\t\t\tskills?: string;\n\t\t\tprompts?: string;\n\t\t\textensions?: string;\n\t\t\tthemes?: string;\n\t\t} = {};\n\t\tif (contextFiles.length > 0) {\n\t\t\texpandedSections.context = contextFiles\n\t\t\t\t.map((contextFile) => theme.fg(\"dim\", ` ${this.formatDisplayPath(contextFile.path)}`))\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tconst skills = skillsResult.skills;\n\t\tif (skills.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\tskills.map((skill) => ({\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\texpandedSections.skills = this.formatScopeGroups(groups, {\n\t\t\t\tformatPath: (item) => this.formatDisplayPath(item.path),\n\t\t\t\tformatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),\n\t\t\t});\n\t\t}\n\n\t\tconst prompts = promptsResult.prompts;\n\t\tconst promptEntries = prompts.map((prompt) => ({\n\t\t\tpath: prompt.filePath,\n\t\t\tsourceInfo: prompt.sourceInfo,\n\t\t\tlabel: `/${prompt.name}`,\n\t\t}));\n\t\tif (promptEntries.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(promptEntries);\n\t\t\tconst promptByPath = new Map(promptEntries.map((prompt) => [prompt.path, prompt.label]));\n\t\t\texpandedSections.prompts = this.formatScopeGroups(groups, {\n\t\t\t\tformatPath: (item) => promptByPath.get(item.path) ?? this.formatDisplayPath(item.path),\n\t\t\t\tformatPackagePath: (item) => promptByPath.get(item.path) ?? this.formatDisplayPath(item.path),\n\t\t\t});\n\t\t}\n\n\t\tif (extensions.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(extensions);\n\t\t\texpandedSections.extensions = this.formatScopeGroups(groups, {\n\t\t\t\tformatPath: (item) => this.formatExtensionDisplayPath(item.path),\n\t\t\t\tformatPackagePath: (item) => this.formatExtensionDisplayPath(this.getShortPath(item.path, item.sourceInfo)),\n\t\t\t});\n\t\t}\n\n\t\tif (customThemes.length > 0) {\n\t\t\tconst groups = this.buildScopeGroups(\n\t\t\t\tcustomThemes.map((loadedTheme) => ({\n\t\t\t\t\tpath: loadedTheme.sourcePath!,\n\t\t\t\t\tsourceInfo: loadedTheme.sourceInfo,\n\t\t\t\t})),\n\t\t\t);\n\t\t\texpandedSections.themes = this.formatScopeGroups(groups, {\n\t\t\t\tformatPath: (item) => this.formatDisplayPath(item.path),\n\t\t\t\tformatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),\n\t\t\t});\n\t\t}\n\n\t\tthis.addResourceDisclosure({\n\t\t\tcontextFiles,\n\t\t\tskills,\n\t\t\tprompts,\n\t\t\textensions,\n\t\t\tthemes: customThemes,\n\t\t\texpandedSections,\n\t\t\ttargetContainer,\n\t\t});\n\t}\n\n\tif (showDiagnostics) {\n\t\tconst overlaps = [\n\t\t\t...(this.session.resourceLoader.getExtensions().overlaps ?? []),\n\t\t\t...getInteractiveEngineResourceOverlaps(this.runtimeHost),\n\t\t];\n\t\tconst overlapLabels = getOverlapLabels(this, overlaps);\n\t\tconst overlapFingerprint = getOverlapNoticeFingerprint(this, overlaps);\n\t\tif (overlapFingerprint && overlapLabels.length > 0) {\n\t\t\tconst sources = formatList(overlapLabels.map((label) => `\\`${label}\\``));\n\t\t\tconst verb = overlapLabels.length === 1 ? \"provides\" : \"provide\";\n\t\t\tconst notice = new Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"warning\",\n\t\t\t\t\t`Extension overlap detected: ${sources} ${verb} resources already bundled with Atomic. Atomic kept its bundled versions; non-conflicting extension features remain available.`,\n\t\t\t\t),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t\ttargetContainer.addChild(notice);\n\t\t\tdisplayedOverlapNotices.set(this, {\n\t\t\t\tcomponent: notice,\n\t\t\t\tcontainer: targetContainer,\n\t\t\t\tfingerprint: overlapFingerprint,\n\t\t\t});\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst skillDiagnostics = skillsResult.diagnostics;\n\t\tif (skillDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(skillDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Skill conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst promptDiagnostics = promptsResult.diagnostics;\n\t\tif (promptDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(promptDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Prompt conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst extensionDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst extensionErrors = this.session.resourceLoader.getExtensions().errors;\n\t\tif (extensionErrors.length > 0) {\n\t\t\tfor (const error of extensionErrors) {\n\t\t\t\textensionDiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: error.error,\n\t\t\t\t\tpath: error.path,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst commandDiagnostics = this.session.extensionRunner.getCommandDiagnostics();\n\t\textensionDiagnostics.push(...commandDiagnostics);\n\t\textensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));\n\n\t\tconst shortcutDiagnostics = this.session.extensionRunner.getShortcutDiagnostics();\n\t\textensionDiagnostics.push(...shortcutDiagnostics);\n\n\t\tif (extensionDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(extensionDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Extension issues]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\tconst themeDiagnostics = themesResult.diagnostics;\n\t\tif (themeDiagnostics.length > 0) {\n\t\t\tconst warningLines = this.formatDiagnostics(themeDiagnostics, sourceInfos);\n\t\t\ttargetContainer.addChild(new Text(`${theme.fg(\"warning\", \"[Theme conflicts]\")}\\n${warningLines}`, 0, 0));\n\t\t\ttargetContainer.addChild(new Spacer(1));\n\t\t}\n\t}\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-startup-chat-container.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup-chat-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,qBAAqB,CAAS;IAEtC,oBAAoB,IAAI,IAAI,CAG3B;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvC;CACD;AAED,UAAU,qBAAqB;IAC9B,aAAa,EAAE,SAAS,CAAC;IACzB,EAAE,EAAE;QAAE,aAAa,IAAI,IAAI,CAAA;KAAE,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAK1E"}
1
+ {"version":3,"file":"interactive-startup-chat-container.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup-chat-container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,qBAAqB,CAAS;IAEtC,oBAAoB,IAAI,IAAI,CAG3B;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvC;CACD;AAED,UAAU,qBAAqB;IAC9B,aAAa,EAAE,SAAS,CAAC;IACzB,EAAE,EAAE;QAAE,aAAa,IAAI,IAAI,CAAA;KAAE,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAM1E"}
@@ -1,3 +1,4 @@
1
+ import { markLifecycleTiming } from "../../core/lifecycle-timings.js";
1
2
  import { Container } from "./interactive-mode-deps.js";
2
3
  /**
3
4
  * Holds startup chat output off-screen until the resource disclosure slot has
@@ -20,6 +21,7 @@ export class StartupChatContainer extends Container {
20
21
  export function releaseStartupChatOutput(host) {
21
22
  if (host.chatContainer instanceof StartupChatContainer) {
22
23
  host.chatContainer.releaseStartupOutput();
24
+ markLifecycleTiming("chat-output-release");
23
25
  host.ui.requestRender();
24
26
  }
25
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-startup-chat-container.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup-chat-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAAnD;;QACS,0BAAqB,GAAG,KAAK,CAAC;IAUvC,CAAC;IARA,oBAAoB;QACnB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;CACD;AAOD,MAAM,UAAU,wBAAwB,CAAC,IAA2B;IACnE,IAAI,IAAI,CAAC,aAAa,YAAY,oBAAoB,EAAE,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import { Container } from \"./interactive-mode-deps.ts\";\n\n/**\n * Holds startup chat output off-screen until the resource disclosure slot has\n * been filled. Terminal scrollback cannot reorder lines that were painted\n * before an earlier container received content.\n */\nexport class StartupChatContainer extends Container {\n\tprivate startupOutputReleased = false;\n\n\treleaseStartupOutput(): void {\n\t\tthis.startupOutputReleased = true;\n\t\tthis.invalidate();\n\t}\n\n\toverride render(width: number): string[] {\n\t\treturn this.startupOutputReleased ? super.render(width) : [];\n\t}\n}\n\ninterface StartupChatOutputHost {\n\tchatContainer: Container;\n\tui: { requestRender(): void };\n}\n\nexport function releaseStartupChatOutput(host: StartupChatOutputHost): void {\n\tif (host.chatContainer instanceof StartupChatContainer) {\n\t\thost.chatContainer.releaseStartupOutput();\n\t\thost.ui.requestRender();\n\t}\n}\n"]}
1
+ {"version":3,"file":"interactive-startup-chat-container.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup-chat-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAAnD;;QACS,0BAAqB,GAAG,KAAK,CAAC;IAUvC,CAAC;IARA,oBAAoB;QACnB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;CACD;AAOD,MAAM,UAAU,wBAAwB,CAAC,IAA2B;IACnE,IAAI,IAAI,CAAC,aAAa,YAAY,oBAAoB,EAAE,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;QAC1C,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import { markLifecycleTiming } from \"../../core/lifecycle-timings.ts\";\nimport { Container } from \"./interactive-mode-deps.ts\";\n\n/**\n * Holds startup chat output off-screen until the resource disclosure slot has\n * been filled. Terminal scrollback cannot reorder lines that were painted\n * before an earlier container received content.\n */\nexport class StartupChatContainer extends Container {\n\tprivate startupOutputReleased = false;\n\n\treleaseStartupOutput(): void {\n\t\tthis.startupOutputReleased = true;\n\t\tthis.invalidate();\n\t}\n\n\toverride render(width: number): string[] {\n\t\treturn this.startupOutputReleased ? super.render(width) : [];\n\t}\n}\n\ninterface StartupChatOutputHost {\n\tchatContainer: Container;\n\tui: { requestRender(): void };\n}\n\nexport function releaseStartupChatOutput(host: StartupChatOutputHost): void {\n\tif (host.chatContainer instanceof StartupChatContainer) {\n\t\thost.chatContainer.releaseStartupOutput();\n\t\tmarkLifecycleTiming(\"chat-output-release\");\n\t\thost.ui.requestRender();\n\t}\n}\n"]}
@@ -1,2 +1,4 @@
1
+ import { InteractiveModeBase } from "./interactive-mode-base.ts";
1
2
  export declare const shouldRefreshCatalogsOnStartup: () => boolean;
3
+ export declare function attachInteractiveEngineResourceExtensionRefresh(mode: InteractiveModeBase): () => void;
2
4
  //# sourceMappingURL=interactive-startup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-startup.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup.ts"],"names":[],"mappings":"AAwDA,eAAO,MAAM,8BAA8B,QAAO,OAAkC,CAAC"}
1
+ {"version":3,"file":"interactive-startup.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,4BAA4B,CAAC;AA4CnF,eAAO,MAAM,8BAA8B,QAAO,OAAkC,CAAC;AAwGrF,wBAAgB,+CAA+C,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAUrG"}
@@ -1,7 +1,8 @@
1
1
  import { ScrollView, VStack } from "@earendil-works/pi-tui";
2
+ import { markLifecycleTiming } from "../../core/lifecycle-timings.js";
2
3
  import { isOfflineModeEnabled } from "../../core/package-manager-env.js";
3
4
  import { createChildProcessEnvironment } from "../../utils/child-process.js";
4
- import { onInteractiveEngineRemoteCommandsChanged, waitForInteractiveEngineBound, } from "../interactive-engine/extension-ui-bridge.js";
5
+ import { onInteractiveEngineRemoteCommandsChanged, onInteractiveEngineResourceExtensionsChanged, waitForInteractiveEngineBound, } from "../interactive-engine/extension-ui-bridge.js";
5
6
  import { renderAtomicAssemblyBanner, renderStartupManifesto } from "./components/atomic-banner.js";
6
7
  import { StartupIdentityComponent } from "./components/startup-identity.js";
7
8
  import { TranscriptFollowIndicator } from "./components/transcript-follow-indicator.js";
@@ -99,6 +100,18 @@ InteractiveModeBase.prototype.showManagedToolStatus = function (status) {
99
100
  this.lastStatusText = undefined;
100
101
  this.ui.requestRender();
101
102
  };
103
+ export function attachInteractiveEngineResourceExtensionRefresh(mode) {
104
+ return onInteractiveEngineResourceExtensionsChanged(mode.runtimeHost, () => {
105
+ if (mode.resourceDisclosureContainer.children.length === 0)
106
+ return;
107
+ mode.showLoadedResources({
108
+ force: true,
109
+ showDiagnosticsWhenQuiet: true,
110
+ targetContainer: mode.resourceDisclosureContainer,
111
+ });
112
+ mode.ui.requestRender();
113
+ });
114
+ }
102
115
  InteractiveModeBase.prototype.init = async function () {
103
116
  if (this.isInitialized)
104
117
  return;
@@ -153,21 +166,20 @@ InteractiveModeBase.prototype.init = async function () {
153
166
  onInteractiveEngineRemoteCommandsChanged(this.runtimeHost, () => {
154
167
  this.setupAutocompleteProvider();
155
168
  });
169
+ attachInteractiveEngineResourceExtensionRefresh(this);
156
170
  seedStartupInput(this.pendingUserInputs, this.defaultEditor, this.options.startupInputCapture?.consume(), this.startupReplayInputs, (text) => {
157
171
  this.startupDraftText = text;
158
172
  }, (text) => {
159
173
  this.startupReplayActiveInput = text;
160
174
  });
161
- // Start UI before extension/session work; fd/rg readiness and git watching move after first paint.
175
+ // Start and paint the host-owned TUI before waiting for the isolated engine.
176
+ // The editor remains local and responsive; session binding and provider work
177
+ // still stay behind the engine-bound gate below.
178
+ markLifecycleTiming("tui-start");
162
179
  this.ui.start();
163
- await waitForInteractiveEngineBound(this.runtimeHost);
164
- if (this.isShuttingDown)
165
- return;
166
- recordTimeSinceReset("time-to-first-frame");
167
180
  this.footerDataProvider.onBranchChange(() => {
168
181
  this.ui.requestRender();
169
182
  });
170
- this.isInitialized = true;
171
183
  await this.themeController.applyFromSettings();
172
184
  // Add the quiet startup identity unless silenced.
173
185
  if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
@@ -181,6 +193,16 @@ InteractiveModeBase.prototype.init = async function () {
181
193
  this.builtInHeader = new Text("", 0, 0);
182
194
  this.headerContainer.addChild(this.builtInHeader);
183
195
  }
196
+ markLifecycleTiming("header-mounted");
197
+ this.ui.requestRender();
198
+ // This legacy mark now means the first requested identity frame. The settled
199
+ // animation frame remains the external benchmark's startup-complete mark.
200
+ recordTimeSinceReset("time-to-first-frame");
201
+ await waitForInteractiveEngineBound(this.runtimeHost);
202
+ if (this.isShuttingDown)
203
+ return;
204
+ this.isInitialized = true;
205
+ // The isolated engine may have replaced the preliminary model/provider view.
184
206
  this.ui.requestRender();
185
207
  // fd/rg readiness runs after first paint so slow downloads never make
186
208
  // startup appear frozen. Progress reports land in the transcript: a console
@@ -415,9 +437,7 @@ InteractiveModeBase.prototype.formatDisplayPath = function (p) {
415
437
  return result;
416
438
  };
417
439
  InteractiveModeBase.prototype.formatExtensionDisplayPath = function (path) {
418
- let result = this.formatDisplayPath(path);
419
- result = result.replace(/\/index\.ts$/, "").replace(/\/index\.js$/, "");
420
- return result;
440
+ return this.formatDisplayPath(path).replace(/[\\/]index\.(?:ts|js)$/, "");
421
441
  };
422
442
  InteractiveModeBase.prototype.formatContextPath = function (p) {
423
443
  const cwd = path.resolve(this.sessionManager.getCwd());