@agent-native/core 0.101.12 → 0.101.14

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 (307) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/package.json +4 -2
  4. package/corpus/core/src/cli/create.ts +76 -17
  5. package/corpus/core/src/client/AgentPanel.tsx +61 -48
  6. package/corpus/core/src/client/assistant-ui-recovery.tsx +9 -3
  7. package/corpus/core/src/client/chat/message-components.tsx +26 -2
  8. package/corpus/core/src/client/chat/tool-call-display.tsx +18 -11
  9. package/corpus/core/src/mcp/server.ts +10 -1
  10. package/corpus/core/src/server/agent-chat/framework-prompts.ts +0 -3
  11. package/corpus/core/src/server/agent-chat-plugin.ts +2 -58
  12. package/corpus/core/src/server/prompts/framework-core-compact.ts +0 -1
  13. package/corpus/core/src/server/prompts/framework-core.ts +0 -30
  14. package/corpus/core/src/server/prompts/index.ts +1 -4
  15. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +0 -14
  16. package/corpus/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  17. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
  18. package/corpus/templates/clips/app/i18n/ar-SA.ts +1 -0
  19. package/corpus/templates/clips/app/i18n/de-DE.ts +1 -0
  20. package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
  21. package/corpus/templates/clips/app/i18n/es-ES.ts +1 -0
  22. package/corpus/templates/clips/app/i18n/fr-FR.ts +1 -0
  23. package/corpus/templates/clips/app/i18n/hi-IN.ts +1 -0
  24. package/corpus/templates/clips/app/i18n/ja-JP.ts +1 -0
  25. package/corpus/templates/clips/app/i18n/ko-KR.ts +1 -0
  26. package/corpus/templates/clips/app/i18n/pt-BR.ts +1 -0
  27. package/corpus/templates/clips/app/i18n/zh-CN.ts +1 -0
  28. package/corpus/templates/clips/app/i18n/zh-TW.ts +1 -0
  29. package/corpus/templates/clips/changelog/2026-07-15-public-clip-links-are-labeled-share-with-humans-for-clarity.md +6 -0
  30. package/corpus/templates/forms/actions/delete-form.ts +4 -0
  31. package/corpus/templates/forms/actions/patch-form-fields.ts +3 -0
  32. package/corpus/templates/forms/actions/restore-form.ts +3 -0
  33. package/corpus/templates/forms/actions/update-form.ts +3 -0
  34. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +2 -2
  35. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +2 -2
  36. package/corpus/templates/forms/changelog/2026-07-15-published-forms-now-reflect-field-updates-immediately-at-the.md +6 -0
  37. package/corpus/templates/forms/changelog/2026-07-15-response-rows-now-keep-every-column-aligned-to-the-top-for-c.md +6 -0
  38. package/corpus/templates/forms/server/handlers/forms.ts +1 -0
  39. package/corpus/templates/forms/server/lib/public-form-ssr.ts +47 -4
  40. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +189 -82
  41. package/corpus/templates/slides/app/pages/DeckEditor.tsx +1 -1
  42. package/dist/cli/create.d.ts +5 -2
  43. package/dist/cli/create.d.ts.map +1 -1
  44. package/dist/cli/create.js +52 -17
  45. package/dist/cli/create.js.map +1 -1
  46. package/dist/client/AgentPanel.d.ts +2 -0
  47. package/dist/client/AgentPanel.d.ts.map +1 -1
  48. package/dist/client/AgentPanel.js +24 -13
  49. package/dist/client/AgentPanel.js.map +1 -1
  50. package/dist/client/assistant-ui-recovery.d.ts +2 -0
  51. package/dist/client/assistant-ui-recovery.d.ts.map +1 -1
  52. package/dist/client/assistant-ui-recovery.js +5 -2
  53. package/dist/client/assistant-ui-recovery.js.map +1 -1
  54. package/dist/client/chat/message-components.d.ts +6 -0
  55. package/dist/client/chat/message-components.d.ts.map +1 -1
  56. package/dist/client/chat/message-components.js +15 -2
  57. package/dist/client/chat/message-components.js.map +1 -1
  58. package/dist/client/chat/tool-call-display.d.ts +4 -2
  59. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  60. package/dist/client/chat/tool-call-display.js +11 -13
  61. package/dist/client/chat/tool-call-display.js.map +1 -1
  62. package/dist/collab/awareness.d.ts +2 -2
  63. package/dist/collab/awareness.d.ts.map +1 -1
  64. package/dist/collab/struct-routes.d.ts +1 -1
  65. package/dist/mcp/server.d.ts.map +1 -1
  66. package/dist/mcp/server.js +10 -1
  67. package/dist/mcp/server.js.map +1 -1
  68. package/dist/notifications/routes.d.ts +2 -2
  69. package/dist/resources/handlers.d.ts +3 -3
  70. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  71. package/dist/server/agent-chat/framework-prompts.js +0 -3
  72. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  73. package/dist/server/agent-chat-plugin.d.ts +0 -22
  74. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  75. package/dist/server/agent-chat-plugin.js +2 -51
  76. package/dist/server/agent-chat-plugin.js.map +1 -1
  77. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  78. package/dist/server/prompts/framework-core-compact.d.ts +0 -1
  79. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  80. package/dist/server/prompts/framework-core-compact.js +0 -1
  81. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  82. package/dist/server/prompts/framework-core.d.ts +0 -9
  83. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  84. package/dist/server/prompts/framework-core.js +0 -29
  85. package/dist/server/prompts/framework-core.js.map +1 -1
  86. package/dist/server/prompts/index.d.ts +1 -1
  87. package/dist/server/prompts/index.d.ts.map +1 -1
  88. package/dist/server/prompts/index.js +1 -1
  89. package/dist/server/prompts/index.js.map +1 -1
  90. package/dist/server/transcribe-voice.d.ts +1 -1
  91. package/dist/templates/chat/.agents/skills/actions/SKILL.md +492 -0
  92. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +189 -0
  93. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +76 -0
  94. package/dist/templates/chat/.agents/skills/capture-learnings/SKILL.md +89 -0
  95. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +221 -0
  96. package/dist/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  97. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +112 -0
  98. package/dist/templates/chat/.agents/skills/real-time-sync/SKILL.md +232 -0
  99. package/dist/templates/chat/.agents/skills/security/SKILL.md +280 -0
  100. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +106 -0
  101. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +95 -0
  102. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  103. package/dist/templates/chat/.env.example +5 -0
  104. package/dist/templates/chat/.ignore +0 -0
  105. package/dist/templates/chat/.oxfmtrc.json +8 -0
  106. package/dist/templates/chat/.react-router/types/+server-build.d.ts +18 -0
  107. package/dist/templates/chat/.react-router/types/app/+types/root.ts +68 -0
  108. package/dist/templates/chat/AGENTS.md +62 -0
  109. package/dist/templates/chat/CHANGELOG.md +10 -0
  110. package/dist/templates/chat/DEVELOPING.md +185 -0
  111. package/dist/templates/chat/README.md +32 -0
  112. package/dist/templates/chat/_gitignore +43 -0
  113. package/dist/templates/chat/actions/hello.ts +13 -0
  114. package/dist/templates/chat/actions/navigate.ts +41 -0
  115. package/dist/templates/chat/actions/run.ts +2 -0
  116. package/dist/templates/chat/actions/view-screen.ts +31 -0
  117. package/dist/templates/chat/app/components/layout/Header.tsx +59 -0
  118. package/dist/templates/chat/app/components/layout/Layout.tsx +184 -0
  119. package/dist/templates/chat/app/components/layout/Sidebar.tsx +580 -0
  120. package/dist/templates/chat/app/components/ui/button.tsx +1 -0
  121. package/dist/templates/chat/app/components/ui/card.tsx +1 -0
  122. package/dist/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  123. package/dist/templates/chat/app/components/ui/input.tsx +1 -0
  124. package/dist/templates/chat/app/components/ui/label.tsx +1 -0
  125. package/dist/templates/chat/app/components/ui/sheet.tsx +1 -0
  126. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  127. package/dist/templates/chat/app/components/ui/tooltip.tsx +1 -0
  128. package/dist/templates/chat/app/entry.client.tsx +19 -0
  129. package/dist/templates/chat/app/entry.server.tsx +10 -0
  130. package/dist/templates/chat/app/global.css +93 -0
  131. package/dist/templates/chat/app/hooks/use-navigation-state.ts +111 -0
  132. package/dist/templates/chat/app/i18n/ar-SA.ts +68 -0
  133. package/dist/templates/chat/app/i18n/de-DE.ts +71 -0
  134. package/dist/templates/chat/app/i18n/en-US.ts +70 -0
  135. package/dist/templates/chat/app/i18n/es-ES.ts +71 -0
  136. package/dist/templates/chat/app/i18n/fr-FR.ts +71 -0
  137. package/dist/templates/chat/app/i18n/hi-IN.ts +69 -0
  138. package/dist/templates/chat/app/i18n/index.ts +34 -0
  139. package/dist/templates/chat/app/i18n/ja-JP.ts +70 -0
  140. package/dist/templates/chat/app/i18n/ko-KR.ts +70 -0
  141. package/dist/templates/chat/app/i18n/pt-BR.ts +71 -0
  142. package/dist/templates/chat/app/i18n/zh-CN.ts +67 -0
  143. package/dist/templates/chat/app/i18n/zh-TW.ts +67 -0
  144. package/dist/templates/chat/app/i18n-data.ts +556 -0
  145. package/dist/templates/chat/app/lib/agent-page.tsx +40 -0
  146. package/dist/templates/chat/app/lib/app-config.ts +11 -0
  147. package/dist/templates/chat/app/lib/tab-id.ts +1 -0
  148. package/dist/templates/chat/app/lib/utils.ts +1 -0
  149. package/dist/templates/chat/app/root.tsx +172 -0
  150. package/dist/templates/chat/app/routes/_index.tsx +91 -0
  151. package/dist/templates/chat/app/routes/agent.tsx +17 -0
  152. package/dist/templates/chat/app/routes/chat.$threadId.tsx +1 -0
  153. package/dist/templates/chat/app/routes/database.tsx +17 -0
  154. package/dist/templates/chat/app/routes/extensions.$id.$slug.tsx +2 -0
  155. package/dist/templates/chat/app/routes/extensions.$id.tsx +11 -0
  156. package/dist/templates/chat/app/routes/extensions._index.tsx +11 -0
  157. package/dist/templates/chat/app/routes/extensions.tsx +5 -0
  158. package/dist/templates/chat/app/routes/observability.tsx +18 -0
  159. package/dist/templates/chat/app/routes/settings.tsx +88 -0
  160. package/dist/templates/chat/app/routes/team.tsx +11 -0
  161. package/dist/templates/chat/app/routes.ts +4 -0
  162. package/dist/templates/chat/app/vite-env.d.ts +6 -0
  163. package/dist/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  164. package/dist/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  165. package/dist/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  166. package/dist/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  167. package/dist/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  168. package/dist/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  169. package/dist/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  170. package/dist/templates/chat/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  171. package/dist/templates/chat/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  172. package/dist/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  173. package/dist/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  174. package/dist/templates/chat/components.json +20 -0
  175. package/dist/templates/chat/data/.gitkeep +0 -0
  176. package/dist/templates/chat/data/sync-config.json +1 -0
  177. package/dist/templates/chat/learnings.defaults.md +5 -0
  178. package/dist/templates/chat/netlify.toml +10 -0
  179. package/dist/templates/chat/package.json +92 -0
  180. package/dist/templates/chat/public/agent-native-icon-dark.svg +10 -0
  181. package/dist/templates/chat/public/agent-native-icon-light.svg +10 -0
  182. package/dist/templates/chat/public/agent-native-logo-dark.svg +21 -0
  183. package/dist/templates/chat/public/agent-native-logo-light.svg +21 -0
  184. package/dist/templates/chat/public/favicon.svg +1 -0
  185. package/dist/templates/chat/public/icon-180.svg +1 -0
  186. package/dist/templates/chat/public/icon-192.svg +1 -0
  187. package/dist/templates/chat/public/icon-512.svg +1 -0
  188. package/dist/templates/chat/public/manifest.json +21 -0
  189. package/dist/templates/chat/react-router.config.ts +7 -0
  190. package/dist/templates/chat/server/middleware/auth.ts +15 -0
  191. package/dist/templates/chat/server/plugins/agent-chat.ts +21 -0
  192. package/dist/templates/chat/server/plugins/auth.ts +17 -0
  193. package/dist/templates/chat/server/routes/[...page].get.ts +5 -0
  194. package/dist/templates/chat/ssr-entry.ts +15 -0
  195. package/dist/templates/chat/tsconfig.json +21 -0
  196. package/dist/templates/chat/vite.config.ts +19 -0
  197. package/package.json +2 -1
  198. package/src/templates/chat/.agents/skills/actions/SKILL.md +492 -0
  199. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +189 -0
  200. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +76 -0
  201. package/src/templates/chat/.agents/skills/capture-learnings/SKILL.md +89 -0
  202. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +221 -0
  203. package/src/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  204. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +112 -0
  205. package/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +232 -0
  206. package/src/templates/chat/.agents/skills/security/SKILL.md +280 -0
  207. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +106 -0
  208. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +95 -0
  209. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  210. package/src/templates/chat/.env.example +5 -0
  211. package/src/templates/chat/.ignore +0 -0
  212. package/src/templates/chat/.oxfmtrc.json +8 -0
  213. package/src/templates/chat/.react-router/types/+server-build.d.ts +18 -0
  214. package/src/templates/chat/.react-router/types/app/+types/root.ts +68 -0
  215. package/src/templates/chat/AGENTS.md +62 -0
  216. package/src/templates/chat/CHANGELOG.md +10 -0
  217. package/src/templates/chat/DEVELOPING.md +185 -0
  218. package/src/templates/chat/README.md +32 -0
  219. package/src/templates/chat/_gitignore +43 -0
  220. package/src/templates/chat/actions/hello.spec.ts +23 -0
  221. package/src/templates/chat/actions/hello.ts +13 -0
  222. package/src/templates/chat/actions/navigate.spec.ts +68 -0
  223. package/src/templates/chat/actions/navigate.ts +41 -0
  224. package/src/templates/chat/actions/run.ts +2 -0
  225. package/src/templates/chat/actions/view-screen.spec.ts +40 -0
  226. package/src/templates/chat/actions/view-screen.ts +31 -0
  227. package/src/templates/chat/app/components/layout/Header.tsx +59 -0
  228. package/src/templates/chat/app/components/layout/Layout.tsx +184 -0
  229. package/src/templates/chat/app/components/layout/Sidebar.tsx +580 -0
  230. package/src/templates/chat/app/components/ui/button.tsx +1 -0
  231. package/src/templates/chat/app/components/ui/card.tsx +1 -0
  232. package/src/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  233. package/src/templates/chat/app/components/ui/input.tsx +1 -0
  234. package/src/templates/chat/app/components/ui/label.tsx +1 -0
  235. package/src/templates/chat/app/components/ui/sheet.tsx +1 -0
  236. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  237. package/src/templates/chat/app/components/ui/tooltip.tsx +1 -0
  238. package/src/templates/chat/app/entry.client.tsx +19 -0
  239. package/src/templates/chat/app/entry.server.tsx +10 -0
  240. package/src/templates/chat/app/global.css +93 -0
  241. package/src/templates/chat/app/hooks/use-navigation-state.ts +111 -0
  242. package/src/templates/chat/app/i18n/ar-SA.ts +68 -0
  243. package/src/templates/chat/app/i18n/de-DE.ts +71 -0
  244. package/src/templates/chat/app/i18n/en-US.ts +70 -0
  245. package/src/templates/chat/app/i18n/es-ES.ts +71 -0
  246. package/src/templates/chat/app/i18n/fr-FR.ts +71 -0
  247. package/src/templates/chat/app/i18n/hi-IN.ts +69 -0
  248. package/src/templates/chat/app/i18n/index.ts +34 -0
  249. package/src/templates/chat/app/i18n/ja-JP.ts +70 -0
  250. package/src/templates/chat/app/i18n/ko-KR.ts +70 -0
  251. package/src/templates/chat/app/i18n/pt-BR.ts +71 -0
  252. package/src/templates/chat/app/i18n/zh-CN.ts +67 -0
  253. package/src/templates/chat/app/i18n/zh-TW.ts +67 -0
  254. package/src/templates/chat/app/i18n-data.ts +556 -0
  255. package/src/templates/chat/app/lib/agent-page.spec.tsx +52 -0
  256. package/src/templates/chat/app/lib/agent-page.tsx +40 -0
  257. package/src/templates/chat/app/lib/app-config.ts +11 -0
  258. package/src/templates/chat/app/lib/tab-id.ts +1 -0
  259. package/src/templates/chat/app/lib/utils.ts +1 -0
  260. package/src/templates/chat/app/root.tsx +172 -0
  261. package/src/templates/chat/app/routes/_index.tsx +91 -0
  262. package/src/templates/chat/app/routes/agent.tsx +17 -0
  263. package/src/templates/chat/app/routes/chat.$threadId.tsx +1 -0
  264. package/src/templates/chat/app/routes/database.tsx +17 -0
  265. package/src/templates/chat/app/routes/extensions.$id.$slug.tsx +2 -0
  266. package/src/templates/chat/app/routes/extensions.$id.tsx +11 -0
  267. package/src/templates/chat/app/routes/extensions._index.tsx +11 -0
  268. package/src/templates/chat/app/routes/extensions.tsx +5 -0
  269. package/src/templates/chat/app/routes/observability.tsx +18 -0
  270. package/src/templates/chat/app/routes/settings.tsx +88 -0
  271. package/src/templates/chat/app/routes/team.tsx +11 -0
  272. package/src/templates/chat/app/routes.ts +4 -0
  273. package/src/templates/chat/app/vite-env.d.ts +6 -0
  274. package/src/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  275. package/src/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  276. package/src/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  277. package/src/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  278. package/src/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  279. package/src/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  280. package/src/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  281. package/src/templates/chat/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  282. package/src/templates/chat/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  283. package/src/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  284. package/src/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  285. package/src/templates/chat/components.json +20 -0
  286. package/src/templates/chat/data/.gitkeep +0 -0
  287. package/src/templates/chat/data/sync-config.json +1 -0
  288. package/src/templates/chat/learnings.defaults.md +5 -0
  289. package/src/templates/chat/netlify.toml +10 -0
  290. package/src/templates/chat/package.json +92 -0
  291. package/src/templates/chat/public/agent-native-icon-dark.svg +10 -0
  292. package/src/templates/chat/public/agent-native-icon-light.svg +10 -0
  293. package/src/templates/chat/public/agent-native-logo-dark.svg +21 -0
  294. package/src/templates/chat/public/agent-native-logo-light.svg +21 -0
  295. package/src/templates/chat/public/favicon.svg +1 -0
  296. package/src/templates/chat/public/icon-180.svg +1 -0
  297. package/src/templates/chat/public/icon-192.svg +1 -0
  298. package/src/templates/chat/public/icon-512.svg +1 -0
  299. package/src/templates/chat/public/manifest.json +21 -0
  300. package/src/templates/chat/react-router.config.ts +7 -0
  301. package/src/templates/chat/server/middleware/auth.ts +15 -0
  302. package/src/templates/chat/server/plugins/agent-chat.ts +21 -0
  303. package/src/templates/chat/server/plugins/auth.ts +17 -0
  304. package/src/templates/chat/server/routes/[...page].get.ts +5 -0
  305. package/src/templates/chat/ssr-entry.ts +15 -0
  306. package/src/templates/chat/tsconfig.json +21 -0
  307. package/src/templates/chat/vite.config.ts +19 -0
@@ -24,6 +24,7 @@ import {
24
24
  useRef,
25
25
  useEffect,
26
26
  type MouseEvent as ReactMouseEvent,
27
+ type ReactNode,
27
28
  } from "react";
28
29
  import { createPortal } from "react-dom";
29
30
 
@@ -475,111 +476,175 @@ function SameSlidePresenceIndicator({ users }: { users: CollabUser[] }) {
475
476
  }
476
477
 
477
478
  /** Selection outline rendered over a selected image */
478
- function ImageSelectionOutline({ rect }: { rect: DOMRect }) {
479
- const pad = 2;
479
+ function SelectionOverlayPortal({
480
+ viewportRect,
481
+ zIndex,
482
+ children,
483
+ }: {
484
+ viewportRect: DOMRect | null;
485
+ zIndex: number;
486
+ children: ReactNode;
487
+ }) {
488
+ if (!viewportRect) return null;
489
+
490
+ const viewportWidth = window.innerWidth;
491
+ const viewportHeight = window.innerHeight;
492
+ const top = Math.max(0, Math.min(viewportHeight, viewportRect.top));
493
+ const right = Math.max(
494
+ 0,
495
+ Math.min(viewportWidth, viewportWidth - viewportRect.right),
496
+ );
497
+ const bottom = Math.max(
498
+ 0,
499
+ Math.min(viewportHeight, viewportHeight - viewportRect.bottom),
500
+ );
501
+ const left = Math.max(0, Math.min(viewportWidth, viewportRect.left));
502
+
480
503
  return createPortal(
481
504
  <div
482
505
  style={{
483
506
  position: "fixed",
484
- top: rect.top - pad,
485
- left: rect.left - pad,
486
- width: rect.width + pad * 2,
487
- height: rect.height + pad * 2,
507
+ inset: 0,
508
+ overflow: "hidden",
488
509
  pointerEvents: "none",
489
- zIndex: 50,
490
- border: "2px solid #609FF8",
491
- borderRadius: 2,
510
+ zIndex,
511
+ // Selection rects use viewport coordinates, so keep the portal for
512
+ // accurate zoom/scroll tracking while clipping it to the canvas
513
+ // viewport. This prevents outlines from painting over either sidebar.
514
+ clipPath: `inset(${top}px ${right}px ${bottom}px ${left}px)`,
492
515
  }}
493
- />,
516
+ >
517
+ {children}
518
+ </div>,
494
519
  document.body,
495
520
  );
496
521
  }
497
522
 
498
- function ElementSelectionOutline({ rect }: { rect: DOMRect }) {
523
+ function ImageSelectionOutline({
524
+ rect,
525
+ viewportRect,
526
+ }: {
527
+ rect: DOMRect;
528
+ viewportRect: DOMRect | null;
529
+ }) {
530
+ const pad = 2;
531
+ return (
532
+ <SelectionOverlayPortal viewportRect={viewportRect} zIndex={50}>
533
+ <div
534
+ style={{
535
+ position: "absolute",
536
+ top: rect.top - pad,
537
+ left: rect.left - pad,
538
+ width: rect.width + pad * 2,
539
+ height: rect.height + pad * 2,
540
+ pointerEvents: "none",
541
+ border: "2px solid #609FF8",
542
+ borderRadius: 2,
543
+ }}
544
+ />
545
+ </SelectionOverlayPortal>
546
+ );
547
+ }
548
+
549
+ function ElementSelectionOutline({
550
+ rect,
551
+ viewportRect,
552
+ }: {
553
+ rect: DOMRect;
554
+ viewportRect: DOMRect | null;
555
+ }) {
499
556
  const pad = 2;
500
557
  const handle = 7;
501
558
  const handleClass =
502
559
  "absolute size-[7px] rounded-sm border border-background bg-[#609FF8] shadow-sm";
503
- return createPortal(
504
- <div
505
- style={{
506
- position: "fixed",
507
- top: rect.top - pad,
508
- left: rect.left - pad,
509
- width: rect.width + pad * 2,
510
- height: rect.height + pad * 2,
511
- pointerEvents: "none",
512
- zIndex: 51,
513
- border: "1.5px solid #609FF8",
514
- borderRadius: 3,
515
- boxShadow: "0 0 0 1px rgba(96, 159, 248, 0.2)",
516
- }}
517
- >
518
- <span
519
- className={handleClass}
520
- style={{ left: -handle / 2, top: -handle / 2 }}
521
- />
522
- <span
523
- className={handleClass}
524
- style={{ right: -handle / 2, top: -handle / 2 }}
525
- />
526
- <span
527
- className={handleClass}
528
- style={{ left: -handle / 2, bottom: -handle / 2 }}
529
- />
530
- <span
531
- className={handleClass}
532
- style={{ right: -handle / 2, bottom: -handle / 2 }}
533
- />
534
- </div>,
535
- document.body,
560
+ return (
561
+ <SelectionOverlayPortal viewportRect={viewportRect} zIndex={51}>
562
+ <div
563
+ style={{
564
+ position: "absolute",
565
+ top: rect.top - pad,
566
+ left: rect.left - pad,
567
+ width: rect.width + pad * 2,
568
+ height: rect.height + pad * 2,
569
+ pointerEvents: "none",
570
+ border: "1.5px solid #609FF8",
571
+ borderRadius: 3,
572
+ boxShadow: "0 0 0 1px rgba(96, 159, 248, 0.2)",
573
+ }}
574
+ >
575
+ <span
576
+ className={handleClass}
577
+ style={{ left: -handle / 2, top: -handle / 2 }}
578
+ />
579
+ <span
580
+ className={handleClass}
581
+ style={{ right: -handle / 2, top: -handle / 2 }}
582
+ />
583
+ <span
584
+ className={handleClass}
585
+ style={{ left: -handle / 2, bottom: -handle / 2 }}
586
+ />
587
+ <span
588
+ className={handleClass}
589
+ style={{ right: -handle / 2, bottom: -handle / 2 }}
590
+ />
591
+ </div>
592
+ </SelectionOverlayPortal>
536
593
  );
537
594
  }
538
595
 
539
596
  /** Outline rendered around a multi-select element */
540
- function MultiSelectOutline({ rect }: { rect: DOMRect }) {
597
+ function MultiSelectOutline({
598
+ rect,
599
+ viewportRect,
600
+ }: {
601
+ rect: DOMRect;
602
+ viewportRect: DOMRect | null;
603
+ }) {
541
604
  const pad = 1;
542
- return createPortal(
543
- <div
544
- style={{
545
- position: "fixed",
546
- top: rect.top - pad,
547
- left: rect.left - pad,
548
- width: rect.width + pad * 2,
549
- height: rect.height + pad * 2,
550
- pointerEvents: "none",
551
- zIndex: 49,
552
- border: "2px solid #609FF8",
553
- borderRadius: 2,
554
- boxShadow: "0 0 0 1px rgba(96, 159, 248, 0.25)",
555
- }}
556
- />,
557
- document.body,
605
+ return (
606
+ <SelectionOverlayPortal viewportRect={viewportRect} zIndex={49}>
607
+ <div
608
+ style={{
609
+ position: "absolute",
610
+ top: rect.top - pad,
611
+ left: rect.left - pad,
612
+ width: rect.width + pad * 2,
613
+ height: rect.height + pad * 2,
614
+ pointerEvents: "none",
615
+ border: "2px solid #609FF8",
616
+ borderRadius: 2,
617
+ boxShadow: "0 0 0 1px rgba(96, 159, 248, 0.25)",
618
+ }}
619
+ />
620
+ </SelectionOverlayPortal>
558
621
  );
559
622
  }
560
623
 
561
624
  /** Translucent rectangle drawn while marquee-dragging */
562
625
  function MarqueeRect({
563
626
  rect,
627
+ viewportRect,
564
628
  }: {
565
629
  rect: { x: number; y: number; w: number; h: number };
630
+ viewportRect: DOMRect | null;
566
631
  }) {
567
- return createPortal(
568
- <div
569
- style={{
570
- position: "fixed",
571
- top: rect.y,
572
- left: rect.x,
573
- width: rect.w,
574
- height: rect.h,
575
- pointerEvents: "none",
576
- zIndex: 48,
577
- background: "rgba(96, 159, 248, 0.12)",
578
- border: "1px solid #609FF8",
579
- borderRadius: 1,
580
- }}
581
- />,
582
- document.body,
632
+ return (
633
+ <SelectionOverlayPortal viewportRect={viewportRect} zIndex={48}>
634
+ <div
635
+ style={{
636
+ position: "absolute",
637
+ top: rect.y,
638
+ left: rect.x,
639
+ width: rect.w,
640
+ height: rect.h,
641
+ pointerEvents: "none",
642
+ background: "rgba(96, 159, 248, 0.12)",
643
+ border: "1px solid #609FF8",
644
+ borderRadius: 1,
645
+ }}
646
+ />
647
+ </SelectionOverlayPortal>
583
648
  );
584
649
  }
585
650
 
@@ -690,6 +755,8 @@ export default function SlideEditor({
690
755
  } | null>(null);
691
756
  const [selectedImg, setSelectedImg] = useState<HTMLImageElement | null>(null);
692
757
  const [selectionRect, setSelectionRect] = useState<DOMRect | null>(null);
758
+ const [selectionViewportRect, setSelectionViewportRect] =
759
+ useState<DOMRect | null>(null);
693
760
  const containerRef = useRef<HTMLDivElement>(null);
694
761
  const scrollContainerRef = useRef<HTMLDivElement>(null);
695
762
  // Wraps the rendered slide; used as the positioning container for the
@@ -784,6 +851,34 @@ export default function SlideEditor({
784
851
  max: MAX_CANVAS_ZOOM,
785
852
  });
786
853
 
854
+ // Selection outlines are portaled to the document so their viewport
855
+ // coordinates stay aligned with the zoomed/scrolling slide. Keep a live
856
+ // viewport rect so that portal can clip itself to the central canvas when
857
+ // either sidebar or the style inspector changes the available width.
858
+ useEffect(() => {
859
+ const scrollContainer = scrollContainerRef.current;
860
+ if (!scrollContainer) return;
861
+
862
+ const updateViewportRect = () => {
863
+ setSelectionViewportRect(scrollContainer.getBoundingClientRect());
864
+ };
865
+
866
+ updateViewportRect();
867
+ const observer =
868
+ typeof ResizeObserver === "undefined"
869
+ ? null
870
+ : new ResizeObserver(updateViewportRect);
871
+ observer?.observe(scrollContainer);
872
+ window.addEventListener("resize", updateViewportRect);
873
+ window.addEventListener("scroll", updateViewportRect, true);
874
+
875
+ return () => {
876
+ observer?.disconnect();
877
+ window.removeEventListener("resize", updateViewportRect);
878
+ window.removeEventListener("scroll", updateViewportRect, true);
879
+ };
880
+ }, []);
881
+
787
882
  useEffect(() => {
788
883
  const scrollContainer = scrollContainerRef.current;
789
884
  if (!scrollContainer) return;
@@ -1959,7 +2054,7 @@ export default function SlideEditor({
1959
2054
  </div>
1960
2055
 
1961
2056
  {selectedStyleSnapshot && !readOnly && (
1962
- <div className="hidden h-full w-[17rem] shrink-0 border-l border-border/70 bg-background/95 lg:block">
2057
+ <div className="relative z-[70] hidden h-full w-[17rem] shrink-0 border-l border-border/70 bg-background/95 lg:block">
1963
2058
  <SlideStyleInspector
1964
2059
  snapshot={selectedStyleSnapshot}
1965
2060
  designSystem={designSystem}
@@ -1981,19 +2076,31 @@ export default function SlideEditor({
1981
2076
  slideCount={slideCount}
1982
2077
  />
1983
2078
 
1984
- {selectionRect && <ImageSelectionOutline rect={selectionRect} />}
2079
+ {selectionRect && (
2080
+ <ImageSelectionOutline
2081
+ rect={selectionRect}
2082
+ viewportRect={selectionViewportRect}
2083
+ />
2084
+ )}
1985
2085
  {selectedElementRect && (
1986
- <ElementSelectionOutline rect={selectedElementRect} />
2086
+ <ElementSelectionOutline
2087
+ rect={selectedElementRect}
2088
+ viewportRect={selectionViewportRect}
2089
+ />
1987
2090
  )}
1988
2091
 
1989
2092
  {/* Multi-select outlines */}
1990
2093
  {Array.from(multiSelectionRects.entries()).map(([id, v]) => (
1991
- <MultiSelectOutline key={id} rect={v.rect} />
2094
+ <MultiSelectOutline
2095
+ key={id}
2096
+ rect={v.rect}
2097
+ viewportRect={selectionViewportRect}
2098
+ />
1992
2099
  ))}
1993
2100
 
1994
2101
  {/* Active marquee rectangle */}
1995
2102
  {marquee && (marquee.w > 1 || marquee.h > 1) && (
1996
- <MarqueeRect rect={marquee} />
2103
+ <MarqueeRect rect={marquee} viewportRect={selectionViewportRect} />
1997
2104
  )}
1998
2105
 
1999
2106
  {/* Floating "N selected" chip */}
@@ -875,7 +875,7 @@ export default function DeckEditor() {
875
875
  className="md:hidden fixed inset-0 bg-black/50 z-30"
876
876
  onClick={() => setSidebarOpen(false)}
877
877
  />
878
- <div className="absolute z-40 h-full min-h-0 md:relative">
878
+ <div className="absolute z-[70] h-full min-h-0 md:relative">
879
879
  <DndContext
880
880
  sensors={sensors}
881
881
  collisionDetection={closestCenter}
@@ -47,9 +47,11 @@ export declare function addAppToWorkspace(name?: string, opts?: CreateAppOptions
47
47
  * Scaffold a single app template into `targetDir`. Resolves:
48
48
  * - "headless" / legacy "blank" → bundled action-first template
49
49
  * - "github:user/repo" → download the whole repo
50
- * - first-party template name → download that subdir from BuilderIO/agent-native
50
+ * - first-party template name → use a bundled copy or download its subdir
51
+ * from BuilderIO/agent-native
51
52
  */
52
53
  declare function scaffoldAppTemplate(targetDir: string, template: string): Promise<void>;
54
+ declare function findLocalTemplateFrom(startDir: string, name: string): string | undefined;
53
55
  /**
54
56
  * Scaffold internal workspace packages required by the selected templates.
55
57
  * Deduplicates so each package is only copied once even if multiple
@@ -72,10 +74,11 @@ export declare function detectWorkspace(startDir: string): {
72
74
  } | null;
73
75
  export { parseWorkspaceScope };
74
76
  /** @internal — exported for E2E tests */
75
- export { scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, tarExtractArgs as _tarExtractArgs, };
77
+ export { scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, tarExtractArgs as _tarExtractArgs, };
76
78
  declare function tarExtractArgs(tarPath: string, destDir: string, options?: {
77
79
  skipAgentSymlinks?: boolean;
78
80
  }): string[];
81
+ declare function githubTarballUrl(repo: string, ref: string, kind: "branch" | "tag"): string;
79
82
  /**
80
83
  * Load the pnpm workspace catalog.
81
84
  * First tries the build-time snapshot at dist/catalog.json (works when
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { execFileSync } from "child_process";
1
+ import { execFile, execFileSync } from "child_process";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
  import { fileURLToPath, pathToFileURL } from "url";
@@ -620,7 +620,8 @@ function cleanupOnFailure(targetDir) {
620
620
  * Scaffold a single app template into `targetDir`. Resolves:
621
621
  * - "headless" / legacy "blank" → bundled action-first template
622
622
  * - "github:user/repo" → download the whole repo
623
- * - first-party template name → download that subdir from BuilderIO/agent-native
623
+ * - first-party template name → use a bundled copy or download its subdir
624
+ * from BuilderIO/agent-native
624
625
  */
625
626
  async function scaffoldAppTemplate(targetDir, template) {
626
627
  fs.mkdirSync(path.dirname(targetDir), { recursive: true });
@@ -661,15 +662,22 @@ function templateSourceName(name) {
661
662
  return name;
662
663
  }
663
664
  /**
664
- * When developing the framework itself, prefer the sibling templates/<name>
665
- * directory. Returns undefined when running as a published package.
665
+ * Prefer a nearby templates/<name> or src/templates/<name> directory. This
666
+ * covers the framework checkout, the dist/templates copy bundled into
667
+ * published CLI packages, and source templates included in package files;
668
+ * packages that do not bundle a template fall back to GitHub.
666
669
  */
667
670
  function findLocalTemplate(name) {
668
- let dir = path.resolve(__dirname);
671
+ return findLocalTemplateFrom(path.resolve(__dirname), name);
672
+ }
673
+ function findLocalTemplateFrom(startDir, name) {
674
+ let dir = path.resolve(startDir);
669
675
  for (let i = 0; i < 10; i++) {
670
- const candidate = path.join(dir, "templates", name);
671
- if (fs.existsSync(path.join(candidate, "package.json"))) {
672
- return candidate;
676
+ for (const templatesDir of ["templates", "src/templates"]) {
677
+ const candidate = path.join(dir, templatesDir, name);
678
+ if (fs.existsSync(path.join(candidate, "package.json"))) {
679
+ return candidate;
680
+ }
673
681
  }
674
682
  const parent = path.dirname(dir);
675
683
  if (parent === dir)
@@ -1084,7 +1092,7 @@ export function detectWorkspace(startDir) {
1084
1092
  }
1085
1093
  export { parseWorkspaceScope };
1086
1094
  /** @internal — exported for E2E tests */
1087
- export { scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, tarExtractArgs as _tarExtractArgs, };
1095
+ export { scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, tarExtractArgs as _tarExtractArgs, };
1088
1096
  /* ─────────────────────────────────────────────────────────────────────────
1089
1097
  * Download / copy helpers
1090
1098
  * ───────────────────────────────────────────────────────────────────────── */
@@ -1102,14 +1110,36 @@ function tarExtractArgs(tarPath, destDir, options = {}) {
1102
1110
  : [];
1103
1111
  return ["xzf", tarPath, "--strip-components=1", ...excludes, "-C", destDir];
1104
1112
  }
1105
- function downloadAndExtract(url, destDir, options = {}) {
1113
+ function execFileBuffer(command, args, options) {
1114
+ return new Promise((resolve, reject) => {
1115
+ execFile(command, args, { ...options, encoding: "buffer" }, (error, stdout, stderr) => {
1116
+ if (error) {
1117
+ const detail = stderr?.toString().trim();
1118
+ if (detail)
1119
+ error.message = `${error.message}: ${detail}`;
1120
+ reject(error);
1121
+ return;
1122
+ }
1123
+ resolve(Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout));
1124
+ });
1125
+ });
1126
+ }
1127
+ async function downloadAndExtract(url, destDir, options = {}) {
1106
1128
  fs.mkdirSync(destDir, { recursive: true });
1107
1129
  // --fail-with-body so curl exits non-zero on HTTP 4xx/5xx instead of writing
1108
1130
  // the error body (HTML/JSON) to disk where tar then fails with the opaque
1109
1131
  // "Unrecognized archive format" message.
1110
- const tarball = execFileSync("curl", ["--fail-with-body", "-sL", url], {
1111
- maxBuffer: 100 * 1024 * 1024,
1112
- });
1132
+ // Keep this asynchronous: a synchronous curl blocks the event loop, which
1133
+ // makes the create command's spinner look frozen during the GitHub fetch.
1134
+ const tarball = await execFileBuffer("curl", [
1135
+ "--fail-with-body",
1136
+ "--connect-timeout",
1137
+ "10",
1138
+ "--max-time",
1139
+ "120",
1140
+ "-sSL",
1141
+ url,
1142
+ ], { maxBuffer: 100 * 1024 * 1024 });
1113
1143
  const tarPath = path.join(destDir, ".download.tar.gz");
1114
1144
  fs.writeFileSync(tarPath, tarball);
1115
1145
  try {
@@ -1129,10 +1159,12 @@ async function downloadGitHubSubdir(repo, subdir, targetDir) {
1129
1159
  }
1130
1160
  const errors = [];
1131
1161
  for (const ref of refs) {
1132
- const tarUrl = `https://api.github.com/repos/${repo}/tarball/${encodeURIComponent(ref)}`;
1162
+ const tarUrl = githubTarballUrl(repo, ref, "tag");
1133
1163
  const tmpDir = path.join(targetDir, "..", `.agent-native-tmp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
1134
1164
  try {
1135
- downloadAndExtract(tarUrl, tmpDir, { skipAgentSymlinks: repo === REPO });
1165
+ await downloadAndExtract(tarUrl, tmpDir, {
1166
+ skipAgentSymlinks: repo === REPO,
1167
+ });
1136
1168
  const srcDir = path.join(tmpDir, subdir);
1137
1169
  if (!fs.existsSync(srcDir)) {
1138
1170
  throw new Error(`Template directory "${subdir}" not found at ref "${ref}".`);
@@ -1151,8 +1183,11 @@ async function downloadGitHubSubdir(repo, subdir, targetDir) {
1151
1183
  }
1152
1184
  async function downloadGitHubRepo(repo, targetDir) {
1153
1185
  validateRepoName(repo);
1154
- const tarUrl = `https://api.github.com/repos/${repo}/tarball/main`;
1155
- downloadAndExtract(tarUrl, targetDir);
1186
+ const tarUrl = githubTarballUrl(repo, "main", "branch");
1187
+ await downloadAndExtract(tarUrl, targetDir);
1188
+ }
1189
+ function githubTarballUrl(repo, ref, kind) {
1190
+ return `https://codeload.github.com/${repo}/tar.gz/refs/${kind === "tag" ? "tags" : "heads"}/${encodeURIComponent(ref)}`;
1156
1191
  }
1157
1192
  /* ─────────────────────────────────────────────────────────────────────────
1158
1193
  * Text / filesystem helpers