@agent-native/core 0.126.0 → 0.127.3

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 (181) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +83 -0
  3. package/corpus/core/docs/content/external-agents-catalog.mdx +14 -11
  4. package/corpus/core/docs/content/mcp-protocol.mdx +9 -4
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/a2a/index.ts +2 -0
  7. package/corpus/core/src/agent/production-agent.ts +6 -1
  8. package/corpus/core/src/agent/run-manager.ts +37 -0
  9. package/corpus/core/src/agent/run-store.ts +18 -0
  10. package/corpus/core/src/cli/template-sync.ts +96 -0
  11. package/corpus/core/src/client/MultiTabAssistantChat.tsx +75 -43
  12. package/corpus/core/src/client/agent-chat.ts +19 -1
  13. package/corpus/core/src/client/chat/tool-call-display.tsx +25 -0
  14. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +23 -0
  15. package/corpus/core/src/client/settings/AgentsSection.tsx +565 -71
  16. package/corpus/core/src/client/settings/SecretsSection.tsx +71 -36
  17. package/corpus/core/src/client/use-chat-models.ts +54 -37
  18. package/corpus/core/src/localization/default-messages.ts +11 -0
  19. package/corpus/core/src/mcp/ask-app-task-handle.ts +183 -0
  20. package/corpus/core/src/mcp/builtin-tools.ts +146 -34
  21. package/corpus/core/src/server/agent-capabilities.ts +8 -1
  22. package/corpus/core/src/server/agent-chat-plugin.ts +17 -0
  23. package/corpus/core/src/server/agent-discovery.ts +1 -1
  24. package/corpus/core/src/server/agent-peer-probe.ts +133 -0
  25. package/corpus/core/src/server/builder-design-systems.ts +1 -1
  26. package/corpus/core/src/server/core-routes-plugin.ts +67 -0
  27. package/corpus/core/src/shared/mcp-embed-headers.ts +4 -0
  28. package/corpus/core/src/templates/chat/_gitignore +2 -0
  29. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +159 -119
  30. package/corpus/templates/chat/_gitignore +2 -0
  31. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -0
  32. package/corpus/templates/design/actions/create-file.ts +15 -0
  33. package/corpus/templates/design/actions/generate-design.ts +40 -0
  34. package/corpus/templates/design/actions/present-design-variants.ts +16 -0
  35. package/corpus/templates/design/app/hooks/use-question-flow.ts +21 -1
  36. package/corpus/templates/design/app/pages/design-editor/save-failure.ts +7 -1
  37. package/corpus/templates/design/changelog/2026-07-28-generated-designs-with-malformed-html-are-now-rejected-at-sa.md +6 -0
  38. package/corpus/templates/design/changelog/2026-07-28-the-model-you-pick-when-starting-a-new-design-is-now-used-fo.md +6 -0
  39. package/corpus/templates/design/server/source-workspace.ts +1 -0
  40. package/corpus/templates/design/shared/html-integrity.ts +608 -18
  41. package/corpus/templates/dispatch/changelog/2026-07-28-pending-apps-are-hidden-by-default-and-app-ownership-details.md +6 -0
  42. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -6
  43. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +5 -1
  44. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +5 -0
  45. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +31 -8
  46. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +15 -0
  47. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +78 -8
  48. package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +179 -0
  49. package/corpus/templates/slides/app/components/presentation/present-channel.ts +15 -0
  50. package/corpus/templates/slides/app/i18n/en-US.ts +10 -1
  51. package/corpus/templates/slides/app/lib/export-google-slides-client.ts +67 -0
  52. package/corpus/templates/slides/app/lib/export-pptx-client.ts +16 -3
  53. package/corpus/templates/slides/app/pages/DeckEditor.tsx +11 -0
  54. package/corpus/templates/slides/app/pages/Presentation.tsx +11 -3
  55. package/corpus/templates/slides/changelog/2026-07-28-export-to-google-slides-now-creates-the-deck-directly-in-you.md +6 -0
  56. package/corpus/templates/slides/changelog/2026-07-28-opening-a-presentation-link-directly-no-longer-bounces-back-.md +6 -0
  57. package/corpus/templates/slides/changelog/2026-07-28-presenter-view-open-a-second-window-while-presenting-to-see-.md +6 -0
  58. package/corpus/templates/slides/server/routes/api/exports/google-slides.post.ts +90 -0
  59. package/corpus/toolkit/CHANGELOG.md +6 -0
  60. package/corpus/toolkit/package.json +1 -1
  61. package/corpus/toolkit/src/composer/TiptapComposer.tsx +143 -111
  62. package/corpus/toolkit/src/composer/runtime-adapters.tsx +2 -0
  63. package/dist/a2a/index.d.ts +2 -0
  64. package/dist/a2a/index.d.ts.map +1 -1
  65. package/dist/a2a/index.js +1 -0
  66. package/dist/a2a/index.js.map +1 -1
  67. package/dist/agent/production-agent.d.ts +2 -2
  68. package/dist/agent/production-agent.d.ts.map +1 -1
  69. package/dist/agent/production-agent.js +6 -3
  70. package/dist/agent/production-agent.js.map +1 -1
  71. package/dist/agent/run-manager.d.ts +11 -0
  72. package/dist/agent/run-manager.d.ts.map +1 -1
  73. package/dist/agent/run-manager.js +34 -1
  74. package/dist/agent/run-manager.js.map +1 -1
  75. package/dist/agent/run-store.d.ts +8 -0
  76. package/dist/agent/run-store.d.ts.map +1 -1
  77. package/dist/agent/run-store.js +16 -0
  78. package/dist/agent/run-store.js.map +1 -1
  79. package/dist/cli/template-sync.d.ts.map +1 -1
  80. package/dist/cli/template-sync.js +88 -0
  81. package/dist/cli/template-sync.js.map +1 -1
  82. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  83. package/dist/client/MultiTabAssistantChat.js +60 -31
  84. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  85. package/dist/client/agent-chat.d.ts +6 -0
  86. package/dist/client/agent-chat.d.ts.map +1 -1
  87. package/dist/client/agent-chat.js +13 -1
  88. package/dist/client/agent-chat.js.map +1 -1
  89. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  90. package/dist/client/chat/tool-call-display.js +14 -0
  91. package/dist/client/chat/tool-call-display.js.map +1 -1
  92. package/dist/client/resources/mcp-integration-catalog.d.ts +6 -0
  93. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  94. package/dist/client/resources/mcp-integration-catalog.js +16 -0
  95. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  96. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  97. package/dist/client/settings/AgentsSection.js +250 -30
  98. package/dist/client/settings/AgentsSection.js.map +1 -1
  99. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  100. package/dist/client/settings/SecretsSection.js +16 -2
  101. package/dist/client/settings/SecretsSection.js.map +1 -1
  102. package/dist/client/use-chat-models.d.ts.map +1 -1
  103. package/dist/client/use-chat-models.js +46 -27
  104. package/dist/client/use-chat-models.js.map +1 -1
  105. package/dist/collab/routes.d.ts +2 -2
  106. package/dist/collab/struct-routes.d.ts +1 -1
  107. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  108. package/dist/localization/default-messages.d.ts +9 -0
  109. package/dist/localization/default-messages.d.ts.map +1 -1
  110. package/dist/localization/default-messages.js +9 -0
  111. package/dist/localization/default-messages.js.map +1 -1
  112. package/dist/mcp/ask-app-task-handle.d.ts +25 -0
  113. package/dist/mcp/ask-app-task-handle.d.ts.map +1 -0
  114. package/dist/mcp/ask-app-task-handle.js +136 -0
  115. package/dist/mcp/ask-app-task-handle.js.map +1 -0
  116. package/dist/mcp/builtin-tools.d.ts +3 -3
  117. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  118. package/dist/mcp/builtin-tools.js +115 -38
  119. package/dist/mcp/builtin-tools.js.map +1 -1
  120. package/dist/observability/routes.d.ts +3 -3
  121. package/dist/progress/routes.d.ts +1 -1
  122. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  123. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  124. package/dist/resources/handlers.d.ts +1 -1
  125. package/dist/secrets/routes.d.ts +9 -9
  126. package/dist/server/agent-capabilities.d.ts +7 -1
  127. package/dist/server/agent-capabilities.d.ts.map +1 -1
  128. package/dist/server/agent-capabilities.js +1 -0
  129. package/dist/server/agent-capabilities.js.map +1 -1
  130. package/dist/server/agent-chat-plugin.d.ts +7 -0
  131. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  132. package/dist/server/agent-chat-plugin.js +16 -1
  133. package/dist/server/agent-chat-plugin.js.map +1 -1
  134. package/dist/server/agent-discovery.d.ts +1 -0
  135. package/dist/server/agent-discovery.d.ts.map +1 -1
  136. package/dist/server/agent-discovery.js +1 -1
  137. package/dist/server/agent-discovery.js.map +1 -1
  138. package/dist/server/agent-peer-probe.d.ts +37 -0
  139. package/dist/server/agent-peer-probe.d.ts.map +1 -0
  140. package/dist/server/agent-peer-probe.js +90 -0
  141. package/dist/server/agent-peer-probe.js.map +1 -0
  142. package/dist/server/builder-design-systems.js +1 -1
  143. package/dist/server/builder-design-systems.js.map +1 -1
  144. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  145. package/dist/server/core-routes-plugin.js +53 -0
  146. package/dist/server/core-routes-plugin.js.map +1 -1
  147. package/dist/server/realtime-token.d.ts +1 -1
  148. package/dist/server/transcribe-voice.d.ts +1 -1
  149. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  150. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  151. package/dist/shared/mcp-embed-headers.js +4 -0
  152. package/dist/shared/mcp-embed-headers.js.map +1 -1
  153. package/dist/templates/chat/_gitignore +2 -0
  154. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +159 -119
  155. package/docs/content/external-agents-catalog.mdx +14 -11
  156. package/docs/content/mcp-protocol.mdx +9 -4
  157. package/package.json +2 -2
  158. package/src/a2a/index.ts +2 -0
  159. package/src/agent/production-agent.ts +6 -1
  160. package/src/agent/run-manager.ts +37 -0
  161. package/src/agent/run-store.ts +18 -0
  162. package/src/cli/template-sync.ts +96 -0
  163. package/src/client/MultiTabAssistantChat.tsx +75 -43
  164. package/src/client/agent-chat.ts +19 -1
  165. package/src/client/chat/tool-call-display.tsx +25 -0
  166. package/src/client/resources/mcp-integration-catalog.ts +23 -0
  167. package/src/client/settings/AgentsSection.tsx +565 -71
  168. package/src/client/settings/SecretsSection.tsx +71 -36
  169. package/src/client/use-chat-models.ts +54 -37
  170. package/src/localization/default-messages.ts +11 -0
  171. package/src/mcp/ask-app-task-handle.ts +183 -0
  172. package/src/mcp/builtin-tools.ts +146 -34
  173. package/src/server/agent-capabilities.ts +8 -1
  174. package/src/server/agent-chat-plugin.ts +17 -0
  175. package/src/server/agent-discovery.ts +1 -1
  176. package/src/server/agent-peer-probe.ts +133 -0
  177. package/src/server/builder-design-systems.ts +1 -1
  178. package/src/server/core-routes-plugin.ts +67 -0
  179. package/src/shared/mcp-embed-headers.ts +4 -0
  180. package/src/templates/chat/_gitignore +2 -0
  181. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +159 -119
@@ -1 +1 @@
1
- {"version":3,"file":"template-sync.d.ts","sourceRoot":"","sources":["../../src/cli/template-sync.ts"],"names":[],"mappings":"AA0DA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAmBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAsE5B;AAMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAmB5D;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,mBAAmB,CAuErB;AA2CD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAOjE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAkCxE;AAyDD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,UAAsB,GACzB,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
1
+ {"version":3,"file":"template-sync.d.ts","sourceRoot":"","sources":["../../src/cli/template-sync.ts"],"names":[],"mappings":"AA0DA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAmBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAsE5B;AAMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAmB5D;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,mBAAmB,CAuErB;AA2CD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAOjE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAkCxE;AAyDD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,UAAsB,GACzB,OAAO,CAAC,MAAM,CAAC,CAuDjB"}
@@ -340,6 +340,17 @@ export async function runTemplate(args, io = defaultIO) {
340
340
  return command ? 0 : 1;
341
341
  }
342
342
  const rest = args.slice(1);
343
+ // `materialize` produces a fresh post-processed template tree at --out; it has
344
+ // no existing app to resolve, so it runs before target resolution.
345
+ if (command === "materialize") {
346
+ try {
347
+ return await materializeCommand(rest, io);
348
+ }
349
+ catch (err) {
350
+ io.err(err instanceof Error ? err.message : String(err));
351
+ return 1;
352
+ }
353
+ }
343
354
  const appArg = positionalArgs(rest)[0];
344
355
  const flags = {
345
356
  to: flagValue(rest, "--to"),
@@ -388,6 +399,80 @@ async function runForTarget(command, target, flags, io) {
388
399
  return 1;
389
400
  }
390
401
  }
402
+ /**
403
+ * Write the post-processed template tree to a directory — the pristine,
404
+ * template-derived output `create` would produce (no install/git/skills).
405
+ * `--to` defaults to the local template (walked up from the package); pass a ref
406
+ * to fetch from GitHub instead.
407
+ */
408
+ async function materializeCommand(rest, io) {
409
+ const outDir = flagValue(rest, "--out");
410
+ const template = flagValue(rest, "--template");
411
+ const name = flagValue(rest, "--name");
412
+ const ref = flagValue(rest, "--to") ?? null;
413
+ if (!outDir) {
414
+ io.err("template materialize requires --out <dir>.");
415
+ return 1;
416
+ }
417
+ if (!template) {
418
+ io.err("template materialize requires --template <name>.");
419
+ return 1;
420
+ }
421
+ // Stage into a unique sibling dir, then swap it in crash-safely: move the old
422
+ // tree aside, move the staged tree in, and restore the old one if that fails.
423
+ // Directory replacement isn't atomic on POSIX (you can't rename onto a non-empty
424
+ // dir), so the old tree is only ever moved — never deleted before the new one is
425
+ // in place — and a crash between the two renames leaves it recoverable under
426
+ // `backup`. Unique same-filesystem siblings keep each rename atomic and
427
+ // collision-free.
428
+ const parent = path.dirname(path.resolve(outDir));
429
+ fs.mkdirSync(parent, { recursive: true });
430
+ const tmp = fs.mkdtempSync(path.join(parent, ".template-materialize-"));
431
+ // `backup` is a unique dir too, so a concurrent process can't occupy the path;
432
+ // renaming a directory onto an existing *empty* dir is a valid replace on POSIX,
433
+ // so the `hadOld` rename below still lands cleanly on it.
434
+ const backup = fs.mkdtempSync(path.join(parent, ".template-materialize-backup-"));
435
+ let backupHoldsOriginal = false;
436
+ try {
437
+ const result = await materializeTemplate({
438
+ appName: name ?? template,
439
+ template,
440
+ ref,
441
+ shape: "standalone",
442
+ destDir: tmp,
443
+ });
444
+ const hadOld = fs.existsSync(outDir);
445
+ if (hadOld) {
446
+ fs.renameSync(outDir, backup);
447
+ backupHoldsOriginal = true;
448
+ }
449
+ try {
450
+ fs.renameSync(tmp, outDir);
451
+ backupHoldsOriginal = false;
452
+ }
453
+ catch (err) {
454
+ if (hadOld) {
455
+ fs.renameSync(backup, outDir);
456
+ backupHoldsOriginal = false;
457
+ }
458
+ throw err;
459
+ }
460
+ io.out(`Materialized "${template}" (${result.source}@${result.ref}) to ${outDir}.`);
461
+ return 0;
462
+ }
463
+ finally {
464
+ fs.rmSync(tmp, { recursive: true, force: true });
465
+ // If restoring from `backup` above itself threw, `backupHoldsOriginal` is still
466
+ // true and `backup` is the only remaining copy of the pre-existing output —
467
+ // leave it on disk instead of deleting the last copy of the user's data.
468
+ if (!backupHoldsOriginal) {
469
+ fs.rmSync(backup, { recursive: true, force: true });
470
+ }
471
+ else {
472
+ io.err(`Failed to restore ${outDir}; the previous contents were preserved at ${backup}.`);
473
+ }
474
+ }
475
+ }
391
476
  function templateName(target, flags) {
392
477
  const name = flags.template ?? target.provenance.template;
393
478
  if (!name) {
@@ -777,6 +862,9 @@ function templateUsage() {
777
862
  " baseline [app] Record a baseline for an app scaffolded before",
778
863
  " provenance existed [--ref <ref>] [--template <name>]",
779
864
  " accept [app] Advance the baseline after resolving conflicts",
865
+ " materialize --template <name> --out <dir>",
866
+ " Write the post-processed template tree to a dir",
867
+ " (no app needed) [--name <appName>] [--to <ref>]",
780
868
  "",
781
869
  "With no [app], operates on the current app, or on every app in a workspace",
782
870
  "when run from the workspace root. --to defaults to the ref matching the",
@@ -1 +1 @@
1
- {"version":3,"file":"template-sync.js","sourceRoot":"","sources":["../../src/cli/template-sync.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native template` — pull later upstream template changes into an app\n * that was generated from a first-party template.\n *\n * The model is a real 3-way merge:\n *\n * base = the pristine upstream tree the app was generated from\n * (stored as a git ref, see template-baseline.ts)\n * theirs = the same template re-materialized at a newer ref, through the\n * exact transform pipeline `create` runs\n * ours = the app's working tree\n *\n * Materialization fidelity is the whole feature: any divergence from what\n * `create` produced turns into phantom conflicts on every sync, so this file\n * reuses `create.ts`'s own transforms rather than reimplementing them.\n */\nimport { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport {\n detectWorkspace,\n _REPO,\n _TEMPLATES_DIR,\n _appTitleForScaffold,\n _copyDir,\n _downloadGitHubSubdir,\n _findLocalTemplate,\n _fixPackageJsonName,\n _fixWebManifestName,\n _getCoreDependencyVersion,\n _getCorePackageVersion,\n _getDispatchDependencyVersion,\n _getGitHubTemplateRefCandidates,\n _getToolkitDependencyVersion,\n _localTemplateSourceKind,\n _normalizeTemplateName,\n _postProcessStandalone,\n _renameGitignore,\n _replacePlaceholders,\n _rewriteNetlifyToml,\n _rewriteTrackingAppId,\n _shouldSkipScaffoldEntry,\n _templateSourceName,\n} from \"./create.js\";\nimport {\n appDirtyPaths,\n baselineDescription,\n baselineExists,\n clearBaseline,\n materializeBaseline,\n promoteBaseline,\n resolveBaselineStore,\n writeBaseline,\n} from \"./template-baseline.js\";\nimport { workspacifyApp } from \"./workspacify.js\";\n\nexport interface TemplateIO {\n out: (message: string) => void;\n err: (message: string) => void;\n}\n\nconst defaultIO: TemplateIO = {\n out: (message) => console.log(message),\n err: (message) => console.error(message),\n};\n\nconst CONFLICT_MARKER = \"<<<<<<<\";\n\n/** Never merged: user secrets, lockfiles, generated output, personal memory. */\nconst NEVER_TOUCH_NAMES = new Set([\n \".git\",\n \"learnings.md\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"bun.lockb\",\n]);\n\nexport interface TemplateProvenance {\n template?: string;\n frameworkSkills?: string;\n templateRef?: string;\n templateSource?: \"github\" | \"bundled\" | \"local-checkout\";\n coreVersion?: string;\n shape?: \"workspace\" | \"standalone\";\n}\n\nexport interface AppTarget {\n appDir: string;\n appName: string;\n shape: \"workspace\" | \"standalone\";\n workspaceRoot?: string;\n workspaceCoreName?: string;\n provenance: TemplateProvenance;\n}\n\nexport interface MaterializeOptions {\n appName: string;\n template: string;\n /** Git ref to fetch from, or null to use the bundled/local template copy. */\n ref: string | null;\n shape: \"workspace\" | \"standalone\";\n workspaceRoot?: string;\n workspaceCoreName?: string;\n destDir?: string;\n}\n\nexport interface MaterializeResult {\n dir: string;\n ref: string;\n source: \"github\" | \"bundled\" | \"local-checkout\";\n}\n\nexport interface TemplateMergeResult {\n added: string[];\n updated: string[];\n deleted: string[];\n conflicted: string[];\n manual: string[];\n keptLocal: string[];\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Materialization\n * ───────────────────────────────────────────────────────────────────────── */\n\n/**\n * Reproduce, in a temp directory, the exact bytes `create` would have written\n * for this (template, ref, app name, shape, workspace scope).\n */\nexport async function materializeTemplate(\n opts: MaterializeOptions,\n): Promise<MaterializeResult> {\n const dest =\n opts.destDir ?? fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-new-\"));\n fs.mkdirSync(dest, { recursive: true });\n\n const resolved = _normalizeTemplateName(opts.template);\n const sourceTemplate = _templateSourceName(resolved);\n const fallbackRef = _getGitHubTemplateRefCandidates()[0];\n\n let usedRef: string;\n let source: MaterializeResult[\"source\"];\n if (opts.ref === null || resolved === \"headless\") {\n const local = _findLocalTemplate(\n resolved === \"headless\" ? \"headless\" : sourceTemplate,\n );\n if (!local) {\n throw new Error(\n `No local copy of the \"${resolved}\" template is available. Pass --to <ref> to fetch it from GitHub.`,\n );\n }\n _copyDir(local, dest);\n usedRef = opts.ref ?? fallbackRef ?? \"unknown\";\n source = _localTemplateSourceKind(local);\n } else {\n usedRef = await _downloadGitHubSubdir(\n _REPO,\n `${_TEMPLATES_DIR}/${sourceTemplate}`,\n dest,\n [opts.ref],\n );\n source = \"github\";\n }\n\n const provenance = { templateRef: usedRef, templateSource: source };\n\n if (opts.shape === \"workspace\") {\n if (!opts.workspaceRoot || !opts.workspaceCoreName) {\n throw new Error(\n \"Workspace apps need a workspace root and shared package name to materialize.\",\n );\n }\n _replacePlaceholders(\n dest,\n opts.appName,\n _appTitleForScaffold(opts.appName),\n path.basename(opts.workspaceRoot),\n );\n _rewriteTrackingAppId(dest, opts.appName, opts.template);\n workspacifyApp({\n appDir: dest,\n appName: opts.appName,\n templateName: opts.template,\n workspaceRoot: opts.workspaceRoot,\n workspaceCoreName: opts.workspaceCoreName,\n coreDependencyVersion: _getCoreDependencyVersion(),\n dispatchDependencyVersion: _getDispatchDependencyVersion(),\n toolkitDependencyVersion: _getToolkitDependencyVersion(),\n });\n _fixPackageJsonName(dest, opts.appName, opts.template, {\n ...provenance,\n shape: \"workspace\",\n });\n _fixWebManifestName(dest, opts.appName, opts.template);\n _rewriteNetlifyToml(dest, opts.appName, \"workspace\");\n _renameGitignore(dest);\n } else {\n _postProcessStandalone(opts.appName, dest, opts.template, provenance);\n }\n\n return { dir: dest, ref: usedRef, source };\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Merge\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport function isMergeExcluded(rel: string): boolean {\n const segments = rel.split(\"/\");\n if (segments[0] === \"changelog\") return true;\n for (const name of segments) {\n if (!name || name === \".\" || name === \"..\") return true;\n if (NEVER_TOUCH_NAMES.has(name)) return true;\n if (name.startsWith(\".env\")) return true;\n if (_shouldSkipScaffoldEntry(name)) return true;\n }\n return false;\n}\n\nexport function listMergeableFiles(root: string): Set<string> {\n const found = new Set<string>();\n const walk = (dir: string, prefix: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (isMergeExcluded(rel)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) walk(path.join(dir, entry.name), rel);\n else if (entry.isFile()) found.add(rel);\n }\n };\n walk(root, \"\");\n return found;\n}\n\nexport function mergeTemplateTrees(\n appDir: string,\n baseDir: string,\n theirsDir: string,\n options: { dryRun?: boolean } = {},\n): TemplateMergeResult {\n const result: TemplateMergeResult = {\n added: [],\n updated: [],\n deleted: [],\n conflicted: [],\n manual: [],\n keptLocal: [],\n };\n const paths = new Set<string>([\n ...listMergeableFiles(baseDir),\n ...listMergeableFiles(theirsDir),\n ...listMergeableFiles(appDir),\n ]);\n\n for (const rel of Array.from(paths).sort()) {\n const oursPath = path.join(appDir, rel);\n if (isLocalSymlink(oursPath)) {\n result.manual.push(`${rel} (local symlink)`);\n continue;\n }\n const base = readFileOrNull(path.join(baseDir, rel));\n const theirs = readFileOrNull(path.join(theirsDir, rel));\n const ours = readFileOrNull(oursPath);\n\n if (equalBuffers(base, theirs)) continue;\n\n if (theirs === null) {\n if (ours === null) continue;\n if (equalBuffers(ours, base)) {\n if (!options.dryRun) removeFile(oursPath);\n result.deleted.push(rel);\n } else {\n result.keptLocal.push(rel);\n }\n continue;\n }\n\n if (ours === null) {\n if (base === null) {\n if (!options.dryRun) writeFile(oursPath, theirs);\n result.added.push(rel);\n } else {\n result.manual.push(`${rel} (deleted locally, changed upstream)`);\n }\n continue;\n }\n\n if (equalBuffers(ours, theirs)) continue;\n if (equalBuffers(ours, base)) {\n if (!options.dryRun) writeFile(oursPath, theirs);\n result.updated.push(rel);\n continue;\n }\n\n if (!isTextBuffer(ours) || !isTextBuffer(theirs) || !isTextBuffer(base)) {\n result.manual.push(`${rel} (binary changed on both sides)`);\n continue;\n }\n\n const merged = gitMergeFile(ours, base ?? Buffer.alloc(0), theirs);\n if (!merged) {\n result.manual.push(`${rel} (merge failed)`);\n continue;\n }\n if (!options.dryRun) writeFile(oursPath, merged.content);\n if (merged.conflicts > 0) result.conflicted.push(rel);\n else result.updated.push(rel);\n }\n\n return result;\n}\n\nfunction gitMergeFile(\n ours: Buffer,\n base: Buffer,\n theirs: Buffer,\n): { content: Buffer; conflicts: number } | null {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-merge-\"));\n try {\n const oursFile = path.join(dir, \"ours\");\n const baseFile = path.join(dir, \"base\");\n const theirsFile = path.join(dir, \"theirs\");\n fs.writeFileSync(oursFile, ours);\n fs.writeFileSync(baseFile, base);\n fs.writeFileSync(theirsFile, theirs);\n const res = spawnSync(\n \"git\",\n [\n \"merge-file\",\n \"-p\",\n \"-L\",\n \"ours\",\n \"-L\",\n \"base\",\n \"-L\",\n \"theirs\",\n oursFile,\n baseFile,\n theirsFile,\n ],\n { maxBuffer: 64 * 1024 * 1024 },\n );\n if (res.status === null || res.status < 0) return null;\n return { content: res.stdout as Buffer, conflicts: res.status };\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Target resolution\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport function readProvenance(appDir: string): TemplateProvenance {\n const pkg = readJson(path.join(appDir, \"package.json\"));\n const scaffold = (\n pkg?.[\"agent-native\"] as Record<string, unknown> | undefined\n )?.scaffold;\n if (!scaffold || typeof scaffold !== \"object\") return {};\n return scaffold as TemplateProvenance;\n}\n\nexport function resolveTargets(cwd: string, appArg?: string): AppTarget[] {\n const workspace = detectWorkspace(cwd);\n\n if (appArg) {\n const candidates = [path.resolve(cwd, appArg)];\n if (workspace)\n candidates.push(path.join(workspace.workspaceRoot, \"apps\", appArg));\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n return [toTarget(candidate)];\n }\n }\n throw new Error(`No app found for \"${appArg}\".`);\n }\n\n const appDir = findAppDir(cwd);\n if (appDir) return [toTarget(appDir)];\n\n if (workspace && path.resolve(cwd) === workspace.workspaceRoot) {\n const appsDir = path.join(workspace.workspaceRoot, \"apps\");\n if (fs.existsSync(appsDir)) {\n const targets = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(appsDir, entry.name))\n .filter((dir) => fs.existsSync(path.join(dir, \"package.json\")))\n .map((dir) => toTarget(dir));\n if (targets.length > 0) return targets;\n }\n }\n\n throw new Error(\n \"No Agent Native app found. Run from an app directory, or pass an app name from a workspace root.\",\n );\n}\n\nfunction toTarget(appDir: string): AppTarget {\n const resolved = path.resolve(appDir);\n const provenance = readProvenance(resolved);\n const workspace = detectWorkspace(resolved);\n const insideWorkspaceApps =\n !!workspace &&\n path.dirname(resolved) === path.join(workspace.workspaceRoot, \"apps\");\n const shape =\n provenance.shape ?? (insideWorkspaceApps ? \"workspace\" : \"standalone\");\n return {\n appDir: resolved,\n appName: readAppName(resolved),\n shape,\n workspaceRoot: workspace?.workspaceRoot,\n workspaceCoreName: workspace?.workspaceCoreName,\n provenance,\n };\n}\n\nfunction readAppName(appDir: string): string {\n const pkg = readJson(path.join(appDir, \"package.json\"));\n const name = typeof pkg?.name === \"string\" ? pkg.name : \"\";\n return name || path.basename(appDir);\n}\n\nfunction findAppDir(cwd: string): string | null {\n let dir = path.resolve(cwd);\n for (let i = 0; i < 20; i++) {\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (pkg) {\n const agentNative = pkg[\"agent-native\"] as\n | Record<string, unknown>\n | undefined;\n if (agentNative?.workspaceCore) return null;\n const deps = (pkg.dependencies ?? {}) as Record<string, string>;\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, string>;\n if (\n agentNative?.scaffold ||\n deps[\"@agent-native/core\"] ||\n devDeps[\"@agent-native/core\"]\n ) {\n return dir;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Commands\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport async function runTemplate(\n args: string[],\n io: TemplateIO = defaultIO,\n): Promise<number> {\n const command = args[0];\n if (\n !command ||\n command === \"help\" ||\n command === \"--help\" ||\n command === \"-h\"\n ) {\n io.out(templateUsage());\n return command ? 0 : 1;\n }\n\n const rest = args.slice(1);\n const appArg = positionalArgs(rest)[0];\n const flags = {\n to: flagValue(rest, \"--to\"),\n ref: flagValue(rest, \"--ref\"),\n template: flagValue(rest, \"--template\"),\n dryRun: rest.includes(\"--dry-run\"),\n force: rest.includes(\"--force\"),\n };\n\n let targets: AppTarget[];\n try {\n targets = resolveTargets(process.cwd(), appArg);\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n let exitCode = 0;\n for (const target of targets) {\n try {\n const code = await runForTarget(command, target, flags, io);\n if (code !== 0) exitCode = code;\n } catch (err) {\n io.err(\n `${target.appName}: ${err instanceof Error ? err.message : String(err)}`,\n );\n exitCode = 1;\n }\n }\n return exitCode;\n}\n\ninterface TemplateFlags {\n to?: string;\n ref?: string;\n template?: string;\n dryRun: boolean;\n force: boolean;\n}\n\nasync function runForTarget(\n command: string,\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n switch (command) {\n case \"status\":\n return statusCommand(target, flags, io);\n case \"diff\":\n return diffCommand(target, flags, io);\n case \"sync\":\n return syncCommand(target, flags, io);\n case \"baseline\":\n return baselineCommand(target, flags, io);\n case \"accept\":\n return acceptCommand(target, io);\n default:\n io.err(`Unknown template command \"${command}\".`);\n io.err(templateUsage());\n return 1;\n }\n}\n\nfunction templateName(target: AppTarget, flags: TemplateFlags): string {\n const name = flags.template ?? target.provenance.template;\n if (!name) {\n throw new Error(\n `${target.appName} has no recorded template. Pass --template <name> to record one.`,\n );\n }\n return name;\n}\n\nasync function statusCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const latest = _getGitHubTemplateRefCandidates()[0] ?? \"(unknown)\";\n const lines = [\n `${target.appName} (${target.shape})`,\n ` template: ${target.provenance.template ?? \"(unrecorded)\"}`,\n ` recorded ref: ${target.provenance.templateRef ?? \"(unrecorded)\"}`,\n ` recorded source:${target.provenance.templateSource ? ` ${target.provenance.templateSource}` : \" (unrecorded)\"}`,\n ` latest ref: ${flags.to ?? latest}`,\n ` baseline: ${baselineDescription(store, \"baseline\") ?? \"missing — run `agent-native template baseline`\"}`,\n ];\n const pending = baselineDescription(store, \"pending\");\n if (pending) lines.push(` pending accept: ${pending}`);\n\n const baseDir = materializeBaseline(store, \"baseline\");\n if (baseDir) {\n try {\n const local = countLocallyModified(target.appDir, baseDir);\n lines.push(` locally modified files: ${local}`);\n const targetRef = flags.to ?? target.provenance.templateRef ?? latest;\n const theirs = await materializeForTarget(target, flags, targetRef);\n try {\n const changed = countUpstreamChanged(baseDir, theirs.dir);\n lines.push(` upstream-changed files: ${changed} (at ${theirs.ref})`);\n } finally {\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n } catch (err) {\n lines.push(\n ` upstream-changed files: unavailable (${err instanceof Error ? err.message.split(\"\\n\")[0] : String(err)})`,\n );\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n }\n }\n\n io.out(lines.join(\"\\n\"));\n return 0;\n}\n\nasync function diffCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const baseDir = materializeBaseline(store, \"baseline\");\n if (!baseDir) {\n io.err(\n `${target.appName}: no baseline recorded. Run \\`agent-native template baseline ${target.appName}\\` first.`,\n );\n return 1;\n }\n const theirs = await materializeForTarget(\n target,\n flags,\n flags.to ?? _getGitHubTemplateRefCandidates()[0] ?? null,\n );\n try {\n io.out(renderTreeDiff(baseDir, theirs.dir));\n return 0;\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n}\n\nasync function syncCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const baseDir = materializeBaseline(store, \"baseline\");\n if (!baseDir) {\n io.err(\n `${target.appName}: no baseline recorded. Run \\`agent-native template baseline ${target.appName}\\` first.`,\n );\n return 1;\n }\n\n const dirty = appDirtyPaths(store);\n if (dirty.length > 0 && !flags.force && !flags.dryRun) {\n fs.rmSync(baseDir, { recursive: true, force: true });\n io.err(\n \"Sync refused because the app directory has uncommitted changes. Review this diff and preserve your edits before syncing, or pass --force.\",\n );\n for (const line of dirty.slice(0, 20)) io.err(` ${line}`);\n if (dirty.length > 20) io.err(` … ${dirty.length - 20} more`);\n return 1;\n }\n\n const theirs = await materializeForTarget(\n target,\n flags,\n flags.to ?? _getGitHubTemplateRefCandidates()[0] ?? null,\n );\n try {\n const result = mergeTemplateTrees(target.appDir, baseDir, theirs.dir, {\n dryRun: flags.dryRun,\n });\n io.out(formatMergeResult(target, theirs.ref, result, flags.dryRun));\n\n if (flags.dryRun) return 0;\n\n const meta = {\n template: templateName(target, flags),\n templateRef: theirs.ref,\n coreVersion: _getCorePackageVersion(),\n };\n if (result.conflicted.length === 0 && result.manual.length === 0) {\n const written = writeBaseline(store, theirs.dir, \"baseline\", meta);\n clearBaseline(store, \"pending\");\n io.out(`Baseline advanced to ${written.location}.`);\n reportRefspecs(written.configuredRefspecs, io);\n return 0;\n }\n\n const written = writeBaseline(store, theirs.dir, \"pending\", meta);\n reportRefspecs(written.configuredRefspecs, io);\n io.out(\"\");\n io.out(\n `Baseline not advanced — resolve the items above, then run:\\n agent-native template accept ${target.appName}`,\n );\n return 1;\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n}\n\nasync function baselineCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const name = templateName(target, flags);\n const ref =\n flags.ref ??\n target.provenance.templateRef ??\n _getGitHubTemplateRefCandidates()[0] ??\n null;\n const materialized = await materializeTemplate({\n appName: target.appName,\n template: name,\n ref: useLocalTemplate(target, ref) ? null : ref,\n shape: target.shape,\n workspaceRoot: target.workspaceRoot,\n workspaceCoreName: target.workspaceCoreName,\n });\n try {\n const written = writeBaseline(store, materialized.dir, \"baseline\", {\n template: name,\n templateRef: materialized.ref,\n coreVersion: _getCorePackageVersion(),\n });\n backfillProvenance(target, name, materialized);\n io.out(\n `${target.appName}: baseline recorded at ${written.location} (${name} @ ${materialized.ref}).`,\n );\n reportRefspecs(written.configuredRefspecs, io);\n return 0;\n } finally {\n fs.rmSync(materialized.dir, { recursive: true, force: true });\n }\n}\n\nfunction acceptCommand(target: AppTarget, io: TemplateIO): number {\n const store = resolveBaselineStore(target.appDir);\n if (!baselineExists(store, \"pending\")) {\n io.err(`${target.appName}: nothing to accept — no pending sync recorded.`);\n return 1;\n }\n const markers = findConflictMarkers(target.appDir);\n if (markers.length > 0) {\n io.err(\n `${target.appName}: accept refused because conflict markers remain. Resolve them first:`,\n );\n for (const file of markers.slice(0, 20)) io.err(` ${file}`);\n if (markers.length > 20) io.err(` … ${markers.length - 20} more`);\n return 1;\n }\n promoteBaseline(store, \"pending\", \"baseline\");\n io.out(\n `${target.appName}: baseline advanced to the last synced template tree.`,\n );\n return 0;\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Helpers\n * ───────────────────────────────────────────────────────────────────────── */\n\nfunction useLocalTemplate(target: AppTarget, ref: string | null): boolean {\n if (!ref) return true;\n const source = target.provenance.templateSource;\n if (source !== \"bundled\" && source !== \"local-checkout\") return false;\n return ref === target.provenance.templateRef;\n}\n\nasync function materializeForTarget(\n target: AppTarget,\n flags: TemplateFlags,\n ref: string | null,\n): Promise<MaterializeResult> {\n return materializeTemplate({\n appName: target.appName,\n template: templateName(target, flags),\n ref: useLocalTemplate(target, ref) ? null : ref,\n shape: target.shape,\n workspaceRoot: target.workspaceRoot,\n workspaceCoreName: target.workspaceCoreName,\n });\n}\n\nfunction backfillProvenance(\n target: AppTarget,\n template: string,\n materialized: MaterializeResult,\n): void {\n const pkgPath = path.join(target.appDir, \"package.json\");\n const pkg = readJson(pkgPath);\n if (!pkg) return;\n const agentNative =\n pkg[\"agent-native\"] && typeof pkg[\"agent-native\"] === \"object\"\n ? (pkg[\"agent-native\"] as Record<string, unknown>)\n : {};\n const scaffold =\n agentNative.scaffold && typeof agentNative.scaffold === \"object\"\n ? (agentNative.scaffold as Record<string, unknown>)\n : {};\n agentNative.scaffold = {\n ...scaffold,\n template: scaffold.template ?? template,\n templateRef: materialized.ref,\n templateSource: materialized.source,\n coreVersion: _getCorePackageVersion(),\n shape: target.shape,\n };\n pkg[\"agent-native\"] = agentNative;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction countLocallyModified(appDir: string, baseDir: string): number {\n let count = 0;\n for (const rel of listMergeableFiles(baseDir)) {\n const base = readFileOrNull(path.join(baseDir, rel));\n const ours = readFileOrNull(path.join(appDir, rel));\n if (!equalBuffers(base, ours)) count++;\n }\n return count;\n}\n\nfunction countUpstreamChanged(baseDir: string, theirsDir: string): number {\n const paths = new Set([\n ...listMergeableFiles(baseDir),\n ...listMergeableFiles(theirsDir),\n ]);\n let count = 0;\n for (const rel of paths) {\n const base = readFileOrNull(path.join(baseDir, rel));\n const theirs = readFileOrNull(path.join(theirsDir, rel));\n if (!equalBuffers(base, theirs)) count++;\n }\n return count;\n}\n\nfunction renderTreeDiff(baseDir: string, theirsDir: string): string {\n const staging = fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-diff-\"));\n try {\n const a = path.join(staging, \"a\");\n const b = path.join(staging, \"b\");\n copyMergeable(baseDir, a);\n copyMergeable(theirsDir, b);\n const res = spawnSync(\n \"git\",\n [\n \"diff\",\n \"--no-index\",\n \"--src-prefix=upstream-base/\",\n \"--dst-prefix=upstream-new/\",\n \"--\",\n \"a\",\n \"b\",\n ],\n { cwd: staging, encoding: \"utf-8\", maxBuffer: 128 * 1024 * 1024 },\n );\n const output = (res.stdout ?? \"\").toString();\n // Only the staging dir names leak into headers; content lines cannot\n // contain the prefixed form, so this rewrite is safe.\n return output.trim()\n ? output\n .replaceAll(\"upstream-base/a/\", \"upstream-base/\")\n .replaceAll(\"upstream-new/b/\", \"upstream-new/\")\n : \"No upstream changes.\";\n } finally {\n fs.rmSync(staging, { recursive: true, force: true });\n }\n}\n\nfunction copyMergeable(from: string, to: string): void {\n fs.mkdirSync(to, { recursive: true });\n for (const rel of listMergeableFiles(from)) {\n const dest = path.join(to, rel);\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.copyFileSync(path.join(from, rel), dest);\n }\n}\n\nfunction findConflictMarkers(appDir: string): string[] {\n const hits: string[] = [];\n for (const rel of listMergeableFiles(appDir)) {\n const buf = readFileOrNull(path.join(appDir, rel));\n if (!buf || !isTextBuffer(buf)) continue;\n if (buf.toString(\"utf-8\").includes(`${CONFLICT_MARKER} `)) hits.push(rel);\n }\n return hits;\n}\n\nfunction formatMergeResult(\n target: AppTarget,\n ref: string,\n result: TemplateMergeResult,\n dryRun: boolean,\n): string {\n const lines = [\n `${target.appName}: ${dryRun ? \"would sync\" : \"synced\"} template at ${ref}`,\n ` added: ${result.added.length}`,\n ` updated: ${result.updated.length}`,\n ` deleted: ${result.deleted.length}`,\n ` conflicted: ${result.conflicted.length}`,\n ];\n for (const [label, items] of [\n [\"added\", result.added],\n [\"updated\", result.updated],\n [\"deleted\", result.deleted],\n [\"conflicted\", result.conflicted],\n [\"manual\", result.manual],\n [\"kept local (deleted upstream)\", result.keptLocal],\n ] as const) {\n if (items.length === 0) continue;\n lines.push(` ${label}:`);\n for (const item of items) lines.push(` ${item}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction reportRefspecs(configured: string[], io: TemplateIO): void {\n if (configured.length === 0) return;\n io.out(\n `Configured ${configured.join(\" and \")} to carry refs/agent-native/* so the baseline survives clone and push.`,\n );\n}\n\nconst VALUE_FLAGS = new Set([\"--to\", \"--ref\", \"--template\"]);\n\n/** A flag's value must never be mistaken for the [app] positional. */\nfunction positionalArgs(args: string[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg.startsWith(\"-\")) {\n if (VALUE_FLAGS.has(arg)) i++;\n continue;\n }\n out.push(arg);\n }\n return out;\n}\n\nfunction flagValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index >= 0 && args[index + 1]) return args[index + 1];\n const inline = args.find((arg) => arg.startsWith(`${flag}=`));\n return inline?.slice(flag.length + 1);\n}\n\nfunction readJson(file: string): Record<string, any> | null {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction readFileOrNull(file: string): Buffer | null {\n try {\n const stat = fs.lstatSync(file);\n if (!stat.isFile()) return null;\n return fs.readFileSync(file);\n } catch {\n return null;\n }\n}\n\nfunction isLocalSymlink(file: string): boolean {\n try {\n return fs.lstatSync(file).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction writeFile(file: string, content: Buffer): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, content);\n}\n\nfunction removeFile(file: string): void {\n fs.rmSync(file, { force: true });\n}\n\nfunction equalBuffers(a: Buffer | null, b: Buffer | null): boolean {\n if (a === null || b === null) return a === b;\n return a.equals(b);\n}\n\nfunction isTextBuffer(buf: Buffer | null): boolean {\n if (buf === null) return true;\n const isUtf8 = (Buffer as unknown as { isUtf8?: (b: Buffer) => boolean })\n .isUtf8;\n if (isUtf8) return isUtf8(buf) && !buf.includes(0);\n return !buf.includes(0);\n}\n\nfunction templateUsage(): string {\n return [\n \"agent-native template <command> [app] [options]\",\n \"\",\n \"Pull later upstream first-party template changes into a generated app\",\n \"with a real 3-way merge against the tree it was scaffolded from.\",\n \"\",\n \"Commands:\",\n \" status [app] Recorded ref, latest ref, baseline health, change counts\",\n \" diff [app] [--to <ref>] Unified diff of what upstream changed (read-only)\",\n \" sync [app] [--to <ref>] 3-way merge upstream changes into the app\",\n \" [--dry-run] [--force]\",\n \" baseline [app] Record a baseline for an app scaffolded before\",\n \" provenance existed [--ref <ref>] [--template <name>]\",\n \" accept [app] Advance the baseline after resolving conflicts\",\n \"\",\n \"With no [app], operates on the current app, or on every app in a workspace\",\n \"when run from the workspace root. --to defaults to the ref matching the\",\n \"installed @agent-native/core, so `agent-native upgrade` then\",\n \"`agent-native template sync` is the coherent story.\",\n ].join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"template-sync.js","sourceRoot":"","sources":["../../src/cli/template-sync.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native template` — pull later upstream template changes into an app\n * that was generated from a first-party template.\n *\n * The model is a real 3-way merge:\n *\n * base = the pristine upstream tree the app was generated from\n * (stored as a git ref, see template-baseline.ts)\n * theirs = the same template re-materialized at a newer ref, through the\n * exact transform pipeline `create` runs\n * ours = the app's working tree\n *\n * Materialization fidelity is the whole feature: any divergence from what\n * `create` produced turns into phantom conflicts on every sync, so this file\n * reuses `create.ts`'s own transforms rather than reimplementing them.\n */\nimport { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport {\n detectWorkspace,\n _REPO,\n _TEMPLATES_DIR,\n _appTitleForScaffold,\n _copyDir,\n _downloadGitHubSubdir,\n _findLocalTemplate,\n _fixPackageJsonName,\n _fixWebManifestName,\n _getCoreDependencyVersion,\n _getCorePackageVersion,\n _getDispatchDependencyVersion,\n _getGitHubTemplateRefCandidates,\n _getToolkitDependencyVersion,\n _localTemplateSourceKind,\n _normalizeTemplateName,\n _postProcessStandalone,\n _renameGitignore,\n _replacePlaceholders,\n _rewriteNetlifyToml,\n _rewriteTrackingAppId,\n _shouldSkipScaffoldEntry,\n _templateSourceName,\n} from \"./create.js\";\nimport {\n appDirtyPaths,\n baselineDescription,\n baselineExists,\n clearBaseline,\n materializeBaseline,\n promoteBaseline,\n resolveBaselineStore,\n writeBaseline,\n} from \"./template-baseline.js\";\nimport { workspacifyApp } from \"./workspacify.js\";\n\nexport interface TemplateIO {\n out: (message: string) => void;\n err: (message: string) => void;\n}\n\nconst defaultIO: TemplateIO = {\n out: (message) => console.log(message),\n err: (message) => console.error(message),\n};\n\nconst CONFLICT_MARKER = \"<<<<<<<\";\n\n/** Never merged: user secrets, lockfiles, generated output, personal memory. */\nconst NEVER_TOUCH_NAMES = new Set([\n \".git\",\n \"learnings.md\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"bun.lockb\",\n]);\n\nexport interface TemplateProvenance {\n template?: string;\n frameworkSkills?: string;\n templateRef?: string;\n templateSource?: \"github\" | \"bundled\" | \"local-checkout\";\n coreVersion?: string;\n shape?: \"workspace\" | \"standalone\";\n}\n\nexport interface AppTarget {\n appDir: string;\n appName: string;\n shape: \"workspace\" | \"standalone\";\n workspaceRoot?: string;\n workspaceCoreName?: string;\n provenance: TemplateProvenance;\n}\n\nexport interface MaterializeOptions {\n appName: string;\n template: string;\n /** Git ref to fetch from, or null to use the bundled/local template copy. */\n ref: string | null;\n shape: \"workspace\" | \"standalone\";\n workspaceRoot?: string;\n workspaceCoreName?: string;\n destDir?: string;\n}\n\nexport interface MaterializeResult {\n dir: string;\n ref: string;\n source: \"github\" | \"bundled\" | \"local-checkout\";\n}\n\nexport interface TemplateMergeResult {\n added: string[];\n updated: string[];\n deleted: string[];\n conflicted: string[];\n manual: string[];\n keptLocal: string[];\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Materialization\n * ───────────────────────────────────────────────────────────────────────── */\n\n/**\n * Reproduce, in a temp directory, the exact bytes `create` would have written\n * for this (template, ref, app name, shape, workspace scope).\n */\nexport async function materializeTemplate(\n opts: MaterializeOptions,\n): Promise<MaterializeResult> {\n const dest =\n opts.destDir ?? fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-new-\"));\n fs.mkdirSync(dest, { recursive: true });\n\n const resolved = _normalizeTemplateName(opts.template);\n const sourceTemplate = _templateSourceName(resolved);\n const fallbackRef = _getGitHubTemplateRefCandidates()[0];\n\n let usedRef: string;\n let source: MaterializeResult[\"source\"];\n if (opts.ref === null || resolved === \"headless\") {\n const local = _findLocalTemplate(\n resolved === \"headless\" ? \"headless\" : sourceTemplate,\n );\n if (!local) {\n throw new Error(\n `No local copy of the \"${resolved}\" template is available. Pass --to <ref> to fetch it from GitHub.`,\n );\n }\n _copyDir(local, dest);\n usedRef = opts.ref ?? fallbackRef ?? \"unknown\";\n source = _localTemplateSourceKind(local);\n } else {\n usedRef = await _downloadGitHubSubdir(\n _REPO,\n `${_TEMPLATES_DIR}/${sourceTemplate}`,\n dest,\n [opts.ref],\n );\n source = \"github\";\n }\n\n const provenance = { templateRef: usedRef, templateSource: source };\n\n if (opts.shape === \"workspace\") {\n if (!opts.workspaceRoot || !opts.workspaceCoreName) {\n throw new Error(\n \"Workspace apps need a workspace root and shared package name to materialize.\",\n );\n }\n _replacePlaceholders(\n dest,\n opts.appName,\n _appTitleForScaffold(opts.appName),\n path.basename(opts.workspaceRoot),\n );\n _rewriteTrackingAppId(dest, opts.appName, opts.template);\n workspacifyApp({\n appDir: dest,\n appName: opts.appName,\n templateName: opts.template,\n workspaceRoot: opts.workspaceRoot,\n workspaceCoreName: opts.workspaceCoreName,\n coreDependencyVersion: _getCoreDependencyVersion(),\n dispatchDependencyVersion: _getDispatchDependencyVersion(),\n toolkitDependencyVersion: _getToolkitDependencyVersion(),\n });\n _fixPackageJsonName(dest, opts.appName, opts.template, {\n ...provenance,\n shape: \"workspace\",\n });\n _fixWebManifestName(dest, opts.appName, opts.template);\n _rewriteNetlifyToml(dest, opts.appName, \"workspace\");\n _renameGitignore(dest);\n } else {\n _postProcessStandalone(opts.appName, dest, opts.template, provenance);\n }\n\n return { dir: dest, ref: usedRef, source };\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Merge\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport function isMergeExcluded(rel: string): boolean {\n const segments = rel.split(\"/\");\n if (segments[0] === \"changelog\") return true;\n for (const name of segments) {\n if (!name || name === \".\" || name === \"..\") return true;\n if (NEVER_TOUCH_NAMES.has(name)) return true;\n if (name.startsWith(\".env\")) return true;\n if (_shouldSkipScaffoldEntry(name)) return true;\n }\n return false;\n}\n\nexport function listMergeableFiles(root: string): Set<string> {\n const found = new Set<string>();\n const walk = (dir: string, prefix: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (isMergeExcluded(rel)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) walk(path.join(dir, entry.name), rel);\n else if (entry.isFile()) found.add(rel);\n }\n };\n walk(root, \"\");\n return found;\n}\n\nexport function mergeTemplateTrees(\n appDir: string,\n baseDir: string,\n theirsDir: string,\n options: { dryRun?: boolean } = {},\n): TemplateMergeResult {\n const result: TemplateMergeResult = {\n added: [],\n updated: [],\n deleted: [],\n conflicted: [],\n manual: [],\n keptLocal: [],\n };\n const paths = new Set<string>([\n ...listMergeableFiles(baseDir),\n ...listMergeableFiles(theirsDir),\n ...listMergeableFiles(appDir),\n ]);\n\n for (const rel of Array.from(paths).sort()) {\n const oursPath = path.join(appDir, rel);\n if (isLocalSymlink(oursPath)) {\n result.manual.push(`${rel} (local symlink)`);\n continue;\n }\n const base = readFileOrNull(path.join(baseDir, rel));\n const theirs = readFileOrNull(path.join(theirsDir, rel));\n const ours = readFileOrNull(oursPath);\n\n if (equalBuffers(base, theirs)) continue;\n\n if (theirs === null) {\n if (ours === null) continue;\n if (equalBuffers(ours, base)) {\n if (!options.dryRun) removeFile(oursPath);\n result.deleted.push(rel);\n } else {\n result.keptLocal.push(rel);\n }\n continue;\n }\n\n if (ours === null) {\n if (base === null) {\n if (!options.dryRun) writeFile(oursPath, theirs);\n result.added.push(rel);\n } else {\n result.manual.push(`${rel} (deleted locally, changed upstream)`);\n }\n continue;\n }\n\n if (equalBuffers(ours, theirs)) continue;\n if (equalBuffers(ours, base)) {\n if (!options.dryRun) writeFile(oursPath, theirs);\n result.updated.push(rel);\n continue;\n }\n\n if (!isTextBuffer(ours) || !isTextBuffer(theirs) || !isTextBuffer(base)) {\n result.manual.push(`${rel} (binary changed on both sides)`);\n continue;\n }\n\n const merged = gitMergeFile(ours, base ?? Buffer.alloc(0), theirs);\n if (!merged) {\n result.manual.push(`${rel} (merge failed)`);\n continue;\n }\n if (!options.dryRun) writeFile(oursPath, merged.content);\n if (merged.conflicts > 0) result.conflicted.push(rel);\n else result.updated.push(rel);\n }\n\n return result;\n}\n\nfunction gitMergeFile(\n ours: Buffer,\n base: Buffer,\n theirs: Buffer,\n): { content: Buffer; conflicts: number } | null {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-merge-\"));\n try {\n const oursFile = path.join(dir, \"ours\");\n const baseFile = path.join(dir, \"base\");\n const theirsFile = path.join(dir, \"theirs\");\n fs.writeFileSync(oursFile, ours);\n fs.writeFileSync(baseFile, base);\n fs.writeFileSync(theirsFile, theirs);\n const res = spawnSync(\n \"git\",\n [\n \"merge-file\",\n \"-p\",\n \"-L\",\n \"ours\",\n \"-L\",\n \"base\",\n \"-L\",\n \"theirs\",\n oursFile,\n baseFile,\n theirsFile,\n ],\n { maxBuffer: 64 * 1024 * 1024 },\n );\n if (res.status === null || res.status < 0) return null;\n return { content: res.stdout as Buffer, conflicts: res.status };\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Target resolution\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport function readProvenance(appDir: string): TemplateProvenance {\n const pkg = readJson(path.join(appDir, \"package.json\"));\n const scaffold = (\n pkg?.[\"agent-native\"] as Record<string, unknown> | undefined\n )?.scaffold;\n if (!scaffold || typeof scaffold !== \"object\") return {};\n return scaffold as TemplateProvenance;\n}\n\nexport function resolveTargets(cwd: string, appArg?: string): AppTarget[] {\n const workspace = detectWorkspace(cwd);\n\n if (appArg) {\n const candidates = [path.resolve(cwd, appArg)];\n if (workspace)\n candidates.push(path.join(workspace.workspaceRoot, \"apps\", appArg));\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n return [toTarget(candidate)];\n }\n }\n throw new Error(`No app found for \"${appArg}\".`);\n }\n\n const appDir = findAppDir(cwd);\n if (appDir) return [toTarget(appDir)];\n\n if (workspace && path.resolve(cwd) === workspace.workspaceRoot) {\n const appsDir = path.join(workspace.workspaceRoot, \"apps\");\n if (fs.existsSync(appsDir)) {\n const targets = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(appsDir, entry.name))\n .filter((dir) => fs.existsSync(path.join(dir, \"package.json\")))\n .map((dir) => toTarget(dir));\n if (targets.length > 0) return targets;\n }\n }\n\n throw new Error(\n \"No Agent Native app found. Run from an app directory, or pass an app name from a workspace root.\",\n );\n}\n\nfunction toTarget(appDir: string): AppTarget {\n const resolved = path.resolve(appDir);\n const provenance = readProvenance(resolved);\n const workspace = detectWorkspace(resolved);\n const insideWorkspaceApps =\n !!workspace &&\n path.dirname(resolved) === path.join(workspace.workspaceRoot, \"apps\");\n const shape =\n provenance.shape ?? (insideWorkspaceApps ? \"workspace\" : \"standalone\");\n return {\n appDir: resolved,\n appName: readAppName(resolved),\n shape,\n workspaceRoot: workspace?.workspaceRoot,\n workspaceCoreName: workspace?.workspaceCoreName,\n provenance,\n };\n}\n\nfunction readAppName(appDir: string): string {\n const pkg = readJson(path.join(appDir, \"package.json\"));\n const name = typeof pkg?.name === \"string\" ? pkg.name : \"\";\n return name || path.basename(appDir);\n}\n\nfunction findAppDir(cwd: string): string | null {\n let dir = path.resolve(cwd);\n for (let i = 0; i < 20; i++) {\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (pkg) {\n const agentNative = pkg[\"agent-native\"] as\n | Record<string, unknown>\n | undefined;\n if (agentNative?.workspaceCore) return null;\n const deps = (pkg.dependencies ?? {}) as Record<string, string>;\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, string>;\n if (\n agentNative?.scaffold ||\n deps[\"@agent-native/core\"] ||\n devDeps[\"@agent-native/core\"]\n ) {\n return dir;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Commands\n * ───────────────────────────────────────────────────────────────────────── */\n\nexport async function runTemplate(\n args: string[],\n io: TemplateIO = defaultIO,\n): Promise<number> {\n const command = args[0];\n if (\n !command ||\n command === \"help\" ||\n command === \"--help\" ||\n command === \"-h\"\n ) {\n io.out(templateUsage());\n return command ? 0 : 1;\n }\n\n const rest = args.slice(1);\n\n // `materialize` produces a fresh post-processed template tree at --out; it has\n // no existing app to resolve, so it runs before target resolution.\n if (command === \"materialize\") {\n try {\n return await materializeCommand(rest, io);\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n return 1;\n }\n }\n\n const appArg = positionalArgs(rest)[0];\n const flags = {\n to: flagValue(rest, \"--to\"),\n ref: flagValue(rest, \"--ref\"),\n template: flagValue(rest, \"--template\"),\n dryRun: rest.includes(\"--dry-run\"),\n force: rest.includes(\"--force\"),\n };\n\n let targets: AppTarget[];\n try {\n targets = resolveTargets(process.cwd(), appArg);\n } catch (err) {\n io.err(err instanceof Error ? err.message : String(err));\n return 1;\n }\n\n let exitCode = 0;\n for (const target of targets) {\n try {\n const code = await runForTarget(command, target, flags, io);\n if (code !== 0) exitCode = code;\n } catch (err) {\n io.err(\n `${target.appName}: ${err instanceof Error ? err.message : String(err)}`,\n );\n exitCode = 1;\n }\n }\n return exitCode;\n}\n\ninterface TemplateFlags {\n to?: string;\n ref?: string;\n template?: string;\n dryRun: boolean;\n force: boolean;\n}\n\nasync function runForTarget(\n command: string,\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n switch (command) {\n case \"status\":\n return statusCommand(target, flags, io);\n case \"diff\":\n return diffCommand(target, flags, io);\n case \"sync\":\n return syncCommand(target, flags, io);\n case \"baseline\":\n return baselineCommand(target, flags, io);\n case \"accept\":\n return acceptCommand(target, io);\n default:\n io.err(`Unknown template command \"${command}\".`);\n io.err(templateUsage());\n return 1;\n }\n}\n\n/**\n * Write the post-processed template tree to a directory — the pristine,\n * template-derived output `create` would produce (no install/git/skills).\n * `--to` defaults to the local template (walked up from the package); pass a ref\n * to fetch from GitHub instead.\n */\nasync function materializeCommand(\n rest: string[],\n io: TemplateIO,\n): Promise<number> {\n const outDir = flagValue(rest, \"--out\");\n const template = flagValue(rest, \"--template\");\n const name = flagValue(rest, \"--name\");\n const ref = flagValue(rest, \"--to\") ?? null;\n if (!outDir) {\n io.err(\"template materialize requires --out <dir>.\");\n return 1;\n }\n if (!template) {\n io.err(\"template materialize requires --template <name>.\");\n return 1;\n }\n // Stage into a unique sibling dir, then swap it in crash-safely: move the old\n // tree aside, move the staged tree in, and restore the old one if that fails.\n // Directory replacement isn't atomic on POSIX (you can't rename onto a non-empty\n // dir), so the old tree is only ever moved — never deleted before the new one is\n // in place — and a crash between the two renames leaves it recoverable under\n // `backup`. Unique same-filesystem siblings keep each rename atomic and\n // collision-free.\n const parent = path.dirname(path.resolve(outDir));\n fs.mkdirSync(parent, { recursive: true });\n const tmp = fs.mkdtempSync(path.join(parent, \".template-materialize-\"));\n // `backup` is a unique dir too, so a concurrent process can't occupy the path;\n // renaming a directory onto an existing *empty* dir is a valid replace on POSIX,\n // so the `hadOld` rename below still lands cleanly on it.\n const backup = fs.mkdtempSync(\n path.join(parent, \".template-materialize-backup-\"),\n );\n let backupHoldsOriginal = false;\n try {\n const result = await materializeTemplate({\n appName: name ?? template,\n template,\n ref,\n shape: \"standalone\",\n destDir: tmp,\n });\n const hadOld = fs.existsSync(outDir);\n if (hadOld) {\n fs.renameSync(outDir, backup);\n backupHoldsOriginal = true;\n }\n try {\n fs.renameSync(tmp, outDir);\n backupHoldsOriginal = false;\n } catch (err) {\n if (hadOld) {\n fs.renameSync(backup, outDir);\n backupHoldsOriginal = false;\n }\n throw err;\n }\n io.out(\n `Materialized \"${template}\" (${result.source}@${result.ref}) to ${outDir}.`,\n );\n return 0;\n } finally {\n fs.rmSync(tmp, { recursive: true, force: true });\n // If restoring from `backup` above itself threw, `backupHoldsOriginal` is still\n // true and `backup` is the only remaining copy of the pre-existing output —\n // leave it on disk instead of deleting the last copy of the user's data.\n if (!backupHoldsOriginal) {\n fs.rmSync(backup, { recursive: true, force: true });\n } else {\n io.err(\n `Failed to restore ${outDir}; the previous contents were preserved at ${backup}.`,\n );\n }\n }\n}\n\nfunction templateName(target: AppTarget, flags: TemplateFlags): string {\n const name = flags.template ?? target.provenance.template;\n if (!name) {\n throw new Error(\n `${target.appName} has no recorded template. Pass --template <name> to record one.`,\n );\n }\n return name;\n}\n\nasync function statusCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const latest = _getGitHubTemplateRefCandidates()[0] ?? \"(unknown)\";\n const lines = [\n `${target.appName} (${target.shape})`,\n ` template: ${target.provenance.template ?? \"(unrecorded)\"}`,\n ` recorded ref: ${target.provenance.templateRef ?? \"(unrecorded)\"}`,\n ` recorded source:${target.provenance.templateSource ? ` ${target.provenance.templateSource}` : \" (unrecorded)\"}`,\n ` latest ref: ${flags.to ?? latest}`,\n ` baseline: ${baselineDescription(store, \"baseline\") ?? \"missing — run `agent-native template baseline`\"}`,\n ];\n const pending = baselineDescription(store, \"pending\");\n if (pending) lines.push(` pending accept: ${pending}`);\n\n const baseDir = materializeBaseline(store, \"baseline\");\n if (baseDir) {\n try {\n const local = countLocallyModified(target.appDir, baseDir);\n lines.push(` locally modified files: ${local}`);\n const targetRef = flags.to ?? target.provenance.templateRef ?? latest;\n const theirs = await materializeForTarget(target, flags, targetRef);\n try {\n const changed = countUpstreamChanged(baseDir, theirs.dir);\n lines.push(` upstream-changed files: ${changed} (at ${theirs.ref})`);\n } finally {\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n } catch (err) {\n lines.push(\n ` upstream-changed files: unavailable (${err instanceof Error ? err.message.split(\"\\n\")[0] : String(err)})`,\n );\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n }\n }\n\n io.out(lines.join(\"\\n\"));\n return 0;\n}\n\nasync function diffCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const baseDir = materializeBaseline(store, \"baseline\");\n if (!baseDir) {\n io.err(\n `${target.appName}: no baseline recorded. Run \\`agent-native template baseline ${target.appName}\\` first.`,\n );\n return 1;\n }\n const theirs = await materializeForTarget(\n target,\n flags,\n flags.to ?? _getGitHubTemplateRefCandidates()[0] ?? null,\n );\n try {\n io.out(renderTreeDiff(baseDir, theirs.dir));\n return 0;\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n}\n\nasync function syncCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const baseDir = materializeBaseline(store, \"baseline\");\n if (!baseDir) {\n io.err(\n `${target.appName}: no baseline recorded. Run \\`agent-native template baseline ${target.appName}\\` first.`,\n );\n return 1;\n }\n\n const dirty = appDirtyPaths(store);\n if (dirty.length > 0 && !flags.force && !flags.dryRun) {\n fs.rmSync(baseDir, { recursive: true, force: true });\n io.err(\n \"Sync refused because the app directory has uncommitted changes. Review this diff and preserve your edits before syncing, or pass --force.\",\n );\n for (const line of dirty.slice(0, 20)) io.err(` ${line}`);\n if (dirty.length > 20) io.err(` … ${dirty.length - 20} more`);\n return 1;\n }\n\n const theirs = await materializeForTarget(\n target,\n flags,\n flags.to ?? _getGitHubTemplateRefCandidates()[0] ?? null,\n );\n try {\n const result = mergeTemplateTrees(target.appDir, baseDir, theirs.dir, {\n dryRun: flags.dryRun,\n });\n io.out(formatMergeResult(target, theirs.ref, result, flags.dryRun));\n\n if (flags.dryRun) return 0;\n\n const meta = {\n template: templateName(target, flags),\n templateRef: theirs.ref,\n coreVersion: _getCorePackageVersion(),\n };\n if (result.conflicted.length === 0 && result.manual.length === 0) {\n const written = writeBaseline(store, theirs.dir, \"baseline\", meta);\n clearBaseline(store, \"pending\");\n io.out(`Baseline advanced to ${written.location}.`);\n reportRefspecs(written.configuredRefspecs, io);\n return 0;\n }\n\n const written = writeBaseline(store, theirs.dir, \"pending\", meta);\n reportRefspecs(written.configuredRefspecs, io);\n io.out(\"\");\n io.out(\n `Baseline not advanced — resolve the items above, then run:\\n agent-native template accept ${target.appName}`,\n );\n return 1;\n } finally {\n fs.rmSync(baseDir, { recursive: true, force: true });\n fs.rmSync(theirs.dir, { recursive: true, force: true });\n }\n}\n\nasync function baselineCommand(\n target: AppTarget,\n flags: TemplateFlags,\n io: TemplateIO,\n): Promise<number> {\n const store = resolveBaselineStore(target.appDir);\n const name = templateName(target, flags);\n const ref =\n flags.ref ??\n target.provenance.templateRef ??\n _getGitHubTemplateRefCandidates()[0] ??\n null;\n const materialized = await materializeTemplate({\n appName: target.appName,\n template: name,\n ref: useLocalTemplate(target, ref) ? null : ref,\n shape: target.shape,\n workspaceRoot: target.workspaceRoot,\n workspaceCoreName: target.workspaceCoreName,\n });\n try {\n const written = writeBaseline(store, materialized.dir, \"baseline\", {\n template: name,\n templateRef: materialized.ref,\n coreVersion: _getCorePackageVersion(),\n });\n backfillProvenance(target, name, materialized);\n io.out(\n `${target.appName}: baseline recorded at ${written.location} (${name} @ ${materialized.ref}).`,\n );\n reportRefspecs(written.configuredRefspecs, io);\n return 0;\n } finally {\n fs.rmSync(materialized.dir, { recursive: true, force: true });\n }\n}\n\nfunction acceptCommand(target: AppTarget, io: TemplateIO): number {\n const store = resolveBaselineStore(target.appDir);\n if (!baselineExists(store, \"pending\")) {\n io.err(`${target.appName}: nothing to accept — no pending sync recorded.`);\n return 1;\n }\n const markers = findConflictMarkers(target.appDir);\n if (markers.length > 0) {\n io.err(\n `${target.appName}: accept refused because conflict markers remain. Resolve them first:`,\n );\n for (const file of markers.slice(0, 20)) io.err(` ${file}`);\n if (markers.length > 20) io.err(` … ${markers.length - 20} more`);\n return 1;\n }\n promoteBaseline(store, \"pending\", \"baseline\");\n io.out(\n `${target.appName}: baseline advanced to the last synced template tree.`,\n );\n return 0;\n}\n\n/* ─────────────────────────────────────────────────────────────────────────\n * Helpers\n * ───────────────────────────────────────────────────────────────────────── */\n\nfunction useLocalTemplate(target: AppTarget, ref: string | null): boolean {\n if (!ref) return true;\n const source = target.provenance.templateSource;\n if (source !== \"bundled\" && source !== \"local-checkout\") return false;\n return ref === target.provenance.templateRef;\n}\n\nasync function materializeForTarget(\n target: AppTarget,\n flags: TemplateFlags,\n ref: string | null,\n): Promise<MaterializeResult> {\n return materializeTemplate({\n appName: target.appName,\n template: templateName(target, flags),\n ref: useLocalTemplate(target, ref) ? null : ref,\n shape: target.shape,\n workspaceRoot: target.workspaceRoot,\n workspaceCoreName: target.workspaceCoreName,\n });\n}\n\nfunction backfillProvenance(\n target: AppTarget,\n template: string,\n materialized: MaterializeResult,\n): void {\n const pkgPath = path.join(target.appDir, \"package.json\");\n const pkg = readJson(pkgPath);\n if (!pkg) return;\n const agentNative =\n pkg[\"agent-native\"] && typeof pkg[\"agent-native\"] === \"object\"\n ? (pkg[\"agent-native\"] as Record<string, unknown>)\n : {};\n const scaffold =\n agentNative.scaffold && typeof agentNative.scaffold === \"object\"\n ? (agentNative.scaffold as Record<string, unknown>)\n : {};\n agentNative.scaffold = {\n ...scaffold,\n template: scaffold.template ?? template,\n templateRef: materialized.ref,\n templateSource: materialized.source,\n coreVersion: _getCorePackageVersion(),\n shape: target.shape,\n };\n pkg[\"agent-native\"] = agentNative;\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction countLocallyModified(appDir: string, baseDir: string): number {\n let count = 0;\n for (const rel of listMergeableFiles(baseDir)) {\n const base = readFileOrNull(path.join(baseDir, rel));\n const ours = readFileOrNull(path.join(appDir, rel));\n if (!equalBuffers(base, ours)) count++;\n }\n return count;\n}\n\nfunction countUpstreamChanged(baseDir: string, theirsDir: string): number {\n const paths = new Set([\n ...listMergeableFiles(baseDir),\n ...listMergeableFiles(theirsDir),\n ]);\n let count = 0;\n for (const rel of paths) {\n const base = readFileOrNull(path.join(baseDir, rel));\n const theirs = readFileOrNull(path.join(theirsDir, rel));\n if (!equalBuffers(base, theirs)) count++;\n }\n return count;\n}\n\nfunction renderTreeDiff(baseDir: string, theirsDir: string): string {\n const staging = fs.mkdtempSync(path.join(os.tmpdir(), \"an-template-diff-\"));\n try {\n const a = path.join(staging, \"a\");\n const b = path.join(staging, \"b\");\n copyMergeable(baseDir, a);\n copyMergeable(theirsDir, b);\n const res = spawnSync(\n \"git\",\n [\n \"diff\",\n \"--no-index\",\n \"--src-prefix=upstream-base/\",\n \"--dst-prefix=upstream-new/\",\n \"--\",\n \"a\",\n \"b\",\n ],\n { cwd: staging, encoding: \"utf-8\", maxBuffer: 128 * 1024 * 1024 },\n );\n const output = (res.stdout ?? \"\").toString();\n // Only the staging dir names leak into headers; content lines cannot\n // contain the prefixed form, so this rewrite is safe.\n return output.trim()\n ? output\n .replaceAll(\"upstream-base/a/\", \"upstream-base/\")\n .replaceAll(\"upstream-new/b/\", \"upstream-new/\")\n : \"No upstream changes.\";\n } finally {\n fs.rmSync(staging, { recursive: true, force: true });\n }\n}\n\nfunction copyMergeable(from: string, to: string): void {\n fs.mkdirSync(to, { recursive: true });\n for (const rel of listMergeableFiles(from)) {\n const dest = path.join(to, rel);\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.copyFileSync(path.join(from, rel), dest);\n }\n}\n\nfunction findConflictMarkers(appDir: string): string[] {\n const hits: string[] = [];\n for (const rel of listMergeableFiles(appDir)) {\n const buf = readFileOrNull(path.join(appDir, rel));\n if (!buf || !isTextBuffer(buf)) continue;\n if (buf.toString(\"utf-8\").includes(`${CONFLICT_MARKER} `)) hits.push(rel);\n }\n return hits;\n}\n\nfunction formatMergeResult(\n target: AppTarget,\n ref: string,\n result: TemplateMergeResult,\n dryRun: boolean,\n): string {\n const lines = [\n `${target.appName}: ${dryRun ? \"would sync\" : \"synced\"} template at ${ref}`,\n ` added: ${result.added.length}`,\n ` updated: ${result.updated.length}`,\n ` deleted: ${result.deleted.length}`,\n ` conflicted: ${result.conflicted.length}`,\n ];\n for (const [label, items] of [\n [\"added\", result.added],\n [\"updated\", result.updated],\n [\"deleted\", result.deleted],\n [\"conflicted\", result.conflicted],\n [\"manual\", result.manual],\n [\"kept local (deleted upstream)\", result.keptLocal],\n ] as const) {\n if (items.length === 0) continue;\n lines.push(` ${label}:`);\n for (const item of items) lines.push(` ${item}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction reportRefspecs(configured: string[], io: TemplateIO): void {\n if (configured.length === 0) return;\n io.out(\n `Configured ${configured.join(\" and \")} to carry refs/agent-native/* so the baseline survives clone and push.`,\n );\n}\n\nconst VALUE_FLAGS = new Set([\"--to\", \"--ref\", \"--template\"]);\n\n/** A flag's value must never be mistaken for the [app] positional. */\nfunction positionalArgs(args: string[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg.startsWith(\"-\")) {\n if (VALUE_FLAGS.has(arg)) i++;\n continue;\n }\n out.push(arg);\n }\n return out;\n}\n\nfunction flagValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index >= 0 && args[index + 1]) return args[index + 1];\n const inline = args.find((arg) => arg.startsWith(`${flag}=`));\n return inline?.slice(flag.length + 1);\n}\n\nfunction readJson(file: string): Record<string, any> | null {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction readFileOrNull(file: string): Buffer | null {\n try {\n const stat = fs.lstatSync(file);\n if (!stat.isFile()) return null;\n return fs.readFileSync(file);\n } catch {\n return null;\n }\n}\n\nfunction isLocalSymlink(file: string): boolean {\n try {\n return fs.lstatSync(file).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction writeFile(file: string, content: Buffer): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, content);\n}\n\nfunction removeFile(file: string): void {\n fs.rmSync(file, { force: true });\n}\n\nfunction equalBuffers(a: Buffer | null, b: Buffer | null): boolean {\n if (a === null || b === null) return a === b;\n return a.equals(b);\n}\n\nfunction isTextBuffer(buf: Buffer | null): boolean {\n if (buf === null) return true;\n const isUtf8 = (Buffer as unknown as { isUtf8?: (b: Buffer) => boolean })\n .isUtf8;\n if (isUtf8) return isUtf8(buf) && !buf.includes(0);\n return !buf.includes(0);\n}\n\nfunction templateUsage(): string {\n return [\n \"agent-native template <command> [app] [options]\",\n \"\",\n \"Pull later upstream first-party template changes into a generated app\",\n \"with a real 3-way merge against the tree it was scaffolded from.\",\n \"\",\n \"Commands:\",\n \" status [app] Recorded ref, latest ref, baseline health, change counts\",\n \" diff [app] [--to <ref>] Unified diff of what upstream changed (read-only)\",\n \" sync [app] [--to <ref>] 3-way merge upstream changes into the app\",\n \" [--dry-run] [--force]\",\n \" baseline [app] Record a baseline for an app scaffolded before\",\n \" provenance existed [--ref <ref>] [--template <name>]\",\n \" accept [app] Advance the baseline after resolving conflicts\",\n \" materialize --template <name> --out <dir>\",\n \" Write the post-processed template tree to a dir\",\n \" (no app needed) [--name <appName>] [--to <ref>]\",\n \"\",\n \"With no [app], operates on the current app, or on every app in a workspace\",\n \"when run from the workspace root. --to defaults to the ref matching the\",\n \"installed @agent-native/core, so `agent-native upgrade` then\",\n \"`agent-native template sync` is the coherent story.\",\n ].join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA4BxE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AA0B5B,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AA2a/B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAsGD,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CACpE;AAyED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,wBAAwB,CAAC;IACnD,2DAA2D;IAC3D,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,mBAA0B,EAC1B,YAAY,EACZ,aAAqB,EACrB,KAAY,EACZ,GAAG,KAAK,EACT,EAAE,0BAA0B,qBAg1D5B"}
1
+ {"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA4BxE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AA0B5B,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AA6a/B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAsGD,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CACpE;AAyED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,wBAAwB,CAAC;IACnD,2DAA2D;IAC3D,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,mBAA0B,EAC1B,YAAY,EACZ,aAAqB,EACrB,KAAY,EACZ,GAAG,KAAK,EACT,EAAE,0BAA0B,qBA82D5B"}
@@ -78,19 +78,27 @@ function writeStoredModelSelection(key, selection) {
78
78
  function resolveModelSelection(selection, groups) {
79
79
  if (!selection?.model)
80
80
  return undefined;
81
- if (groups.length === 0) {
82
- return {
83
- model: selection.model,
84
- effort: resolveReasoningEffortSelection(selection.model, selection.effort),
85
- };
86
- }
87
- const preferredGroup = groups.find((group) => group.engine === selection.engine &&
88
- group.models.includes(selection.model));
89
- const fallbackGroup = groups.find((group) => group.models.includes(selection.model));
90
- if (groups.length > 0 && !preferredGroup && !fallbackGroup) {
91
- return undefined;
92
- }
93
- const engine = preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;
81
+ // Engine precedence turns on whether the catalog OFFERS the supplied engine,
82
+ // not on whether that engine advertises this model:
83
+ // offered → honor it. A gateway's advertised list is its built-in
84
+ // catalog, not what the endpoint serves, and one model id
85
+ // sits under several groups (claude-sonnet-5 under both
86
+ // anthropic and builder) — so a model-only match would
87
+ // reroute the turn to a different provider and bill it there.
88
+ // not offered → heal to a group that serves the model. A selection left
89
+ // on `builder` after disconnecting it must still run on the
90
+ // user's own key; the same model through another configured
91
+ // provider is the point of bring-your-own-key.
92
+ // `builder` is in the catalog exactly when Builder is connected, so this is a
93
+ // real availability signal rather than a guess.
94
+ const suppliedEngine = selection.engine?.trim()
95
+ ? selection.engine
96
+ : undefined;
97
+ const engine = (groups.some((group) => group.engine === suppliedEngine)
98
+ ? suppliedEngine
99
+ : undefined) ??
100
+ groups.find((group) => group.models.includes(selection.model))?.engine ??
101
+ suppliedEngine;
94
102
  if (!engine && groups.length > 0)
95
103
  return undefined;
96
104
  const effort = resolveReasoningEffortSelection(selection.model, selection.effort);
@@ -644,8 +652,12 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
644
652
  .catch(() => null),
645
653
  ])
646
654
  .then(([enginesData, envKeys, builderStatus]) => {
647
- if (!enginesData?.engines)
655
+ if (!enginesData?.engines) {
656
+ // Leaves `availableModels` empty for the session, so an override with
657
+ // no engine of its own has nothing to resolve against.
658
+ console.warn("[agent-chat] no engine list; model overrides cannot be catalog-resolved");
648
659
  return;
660
+ }
649
661
  const configuredKeys = new Set(envKeys
650
662
  .filter((k) => k.configured)
651
663
  .map((k) => k.key));
@@ -1094,7 +1106,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1094
1106
  // Dedup the live post against the cold-start replay; first one wins.
1095
1107
  if (!claimAgentChatSubmit(parsed.submitMessageId))
1096
1108
  return;
1097
- const { message, context, openSidebar, model, effort, newTab, background, submit, images, submitMessageId, } = parsed;
1109
+ const { message, context, openSidebar, model, engine, effort, newTab, background, submit, images, submitMessageId, } = parsed;
1098
1110
  const requestedTabId = parsed.tabId;
1099
1111
  const requestMode = parsed.requestMode ?? requestModeFromExecMode(props.execMode);
1100
1112
  // Make sure the sidebar is visible to show the response, unless the
@@ -1119,28 +1131,37 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1119
1131
  ...(requestMode ? { requestMode } : {}),
1120
1132
  ...(submitMessageId ? { submitMessageId } : {}),
1121
1133
  };
1134
+ // Resolved once, up front, and carried with the send until a thread
1135
+ // exists to key it by. Applying it only when `model` matched
1136
+ // `availableModels` dropped every override that arrived before the
1137
+ // engines fetch resolved — and the cold-start replay below runs at mount,
1138
+ // when that list is always still empty.
1139
+ let modelOverride;
1140
+ if (model) {
1141
+ const catalogEngine = availableModels.find((g) => g.models.includes(model))?.engine;
1142
+ const overrideEngine = engine ?? catalogEngine;
1143
+ if (!overrideEngine && availableModels.length > 0) {
1144
+ console.warn(`[agent-chat] model override "${model}" is in no engine group and carries no engine; the server will substitute its default`);
1145
+ }
1146
+ modelOverride = {
1147
+ model,
1148
+ ...(overrideEngine ? { engine: overrideEngine } : {}),
1149
+ effort: resolveReasoningEffortSelection(model, isReasoningEffort(effort) ? effort : undefined),
1150
+ };
1151
+ }
1122
1152
  const sendToTab = (threadId) => {
1123
1153
  if (isAgentChatSubmitCancelled(submitMessageId))
1124
1154
  return;
1125
- // If a model override was specified, apply it only if we recognize it
1126
- if (model) {
1127
- const matchedGroup = availableModels.find((g) => g.models.includes(model));
1128
- if (matchedGroup) {
1129
- const selectedEffort = resolveReasoningEffortSelection(model, isReasoningEffort(effort) ? effort : undefined);
1130
- threadModelRef.current.set(threadId, {
1131
- model,
1132
- engine: matchedGroup.engine,
1133
- effort: selectedEffort,
1134
- });
1135
- bumpModelSelectionVersion();
1136
- }
1155
+ if (modelOverride) {
1156
+ threadModelRef.current.set(threadId, modelOverride);
1157
+ bumpModelSelectionVersion();
1137
1158
  }
1138
1159
  const ref = chatRefs.current.get(threadId);
1139
1160
  if (ref) {
1140
1161
  deliverPendingSend(ref, send);
1141
1162
  }
1142
1163
  else {
1143
- pendingDeliveries.current.push({ threadId, send });
1164
+ pendingDeliveries.current.push({ threadId, send, modelOverride });
1144
1165
  }
1145
1166
  };
1146
1167
  if (newTab) {
@@ -1178,7 +1199,11 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1178
1199
  else {
1179
1200
  // Cold start: no thread yet. Queue for the first active thread (the
1180
1201
  // bootstrap effect creates it) rather than racing a second create.
1181
- pendingDeliveries.current.push({ threadId: null, send });
1202
+ pendingDeliveries.current.push({
1203
+ threadId: null,
1204
+ send,
1205
+ modelOverride,
1206
+ });
1182
1207
  }
1183
1208
  }
1184
1209
  };
@@ -1230,17 +1255,21 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1230
1255
  continue;
1231
1256
  const threadId = delivery.threadId ?? active ?? null;
1232
1257
  const ref = threadId ? chatRefs.current.get(threadId) : null;
1258
+ if (threadId && delivery.modelOverride) {
1259
+ threadModelRef.current.set(threadId, delivery.modelOverride);
1260
+ bumpModelSelectionVersion();
1261
+ }
1233
1262
  if (threadId && ref) {
1234
1263
  const { send } = delivery;
1235
1264
  setTimeout(() => deliverPendingSend(ref, send), 50);
1236
1265
  }
1237
1266
  else {
1238
1267
  // Not ready — keep it, pinning the resolved threadId once known.
1239
- remaining.push(threadId ? { threadId, send: delivery.send } : delivery);
1268
+ remaining.push(threadId ? { ...delivery, threadId, send: delivery.send } : delivery);
1240
1269
  }
1241
1270
  }
1242
1271
  pendingDeliveries.current = remaining;
1243
- }, [openTabIds, activeThreadId]);
1272
+ }, [openTabIds, activeThreadId, bumpModelSelectionVersion]);
1244
1273
  // Listen for chatRunning completion events
1245
1274
  useEffect(() => {
1246
1275
  const handler = (e) => {