@agent-native/core 0.14.8 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +30 -9
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts.map +1 -1
  6. package/dist/agent/engine/registry.js +14 -4
  7. package/dist/agent/engine/registry.js.map +1 -1
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +71 -4
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/agent/types.d.ts +9 -0
  12. package/dist/agent/types.d.ts.map +1 -1
  13. package/dist/agent/types.js.map +1 -1
  14. package/dist/appearance/actions/change-appearance.d.ts +3 -0
  15. package/dist/appearance/actions/change-appearance.d.ts.map +1 -0
  16. package/dist/appearance/actions/change-appearance.js +29 -0
  17. package/dist/appearance/actions/change-appearance.js.map +1 -0
  18. package/dist/chat-threads/store.d.ts +53 -2
  19. package/dist/chat-threads/store.d.ts.map +1 -1
  20. package/dist/chat-threads/store.js +172 -12
  21. package/dist/chat-threads/store.js.map +1 -1
  22. package/dist/cli/create.d.ts.map +1 -1
  23. package/dist/cli/create.js +114 -37
  24. package/dist/cli/create.js.map +1 -1
  25. package/dist/cli/index.js +30 -4
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/workspace-dev.d.ts +25 -1
  28. package/dist/cli/workspace-dev.d.ts.map +1 -1
  29. package/dist/cli/workspace-dev.js +275 -49
  30. package/dist/cli/workspace-dev.js.map +1 -1
  31. package/dist/client/AgentPanel.d.ts +23 -4
  32. package/dist/client/AgentPanel.d.ts.map +1 -1
  33. package/dist/client/AgentPanel.js +276 -53
  34. package/dist/client/AgentPanel.js.map +1 -1
  35. package/dist/client/AppearancePicker.d.ts +11 -0
  36. package/dist/client/AppearancePicker.d.ts.map +1 -0
  37. package/dist/client/AppearancePicker.js +16 -0
  38. package/dist/client/AppearancePicker.js.map +1 -0
  39. package/dist/client/AssistantChat.d.ts +35 -0
  40. package/dist/client/AssistantChat.d.ts.map +1 -1
  41. package/dist/client/AssistantChat.js +315 -32
  42. package/dist/client/AssistantChat.js.map +1 -1
  43. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  44. package/dist/client/ConnectBuilderCard.js +5 -2
  45. package/dist/client/ConnectBuilderCard.js.map +1 -1
  46. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  47. package/dist/client/ErrorBoundary.js +8 -10
  48. package/dist/client/ErrorBoundary.js.map +1 -1
  49. package/dist/client/FeedbackButton.d.ts.map +1 -1
  50. package/dist/client/FeedbackButton.js +1 -1
  51. package/dist/client/FeedbackButton.js.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.d.ts +13 -1
  53. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  54. package/dist/client/MultiTabAssistantChat.js +217 -38
  55. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  56. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  57. package/dist/client/NewWorkspaceAppFlow.js +37 -14
  58. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  59. package/dist/client/agent-chat-adapter.d.ts +5 -0
  60. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  61. package/dist/client/agent-chat-adapter.js +4 -0
  62. package/dist/client/agent-chat-adapter.js.map +1 -1
  63. package/dist/client/agent-sidebar-state.d.ts +12 -0
  64. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  65. package/dist/client/agent-sidebar-state.js +8 -0
  66. package/dist/client/agent-sidebar-state.js.map +1 -1
  67. package/dist/client/analytics.d.ts.map +1 -1
  68. package/dist/client/analytics.js +175 -3
  69. package/dist/client/analytics.js.map +1 -1
  70. package/dist/client/appearance.d.ts +40 -0
  71. package/dist/client/appearance.d.ts.map +1 -0
  72. package/dist/client/appearance.js +114 -0
  73. package/dist/client/appearance.js.map +1 -0
  74. package/dist/client/builder-frame.d.ts +1 -0
  75. package/dist/client/builder-frame.d.ts.map +1 -1
  76. package/dist/client/builder-frame.js +19 -9
  77. package/dist/client/builder-frame.js.map +1 -1
  78. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  79. package/dist/client/components/CodeRequiredDialog.js +10 -2
  80. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  81. package/dist/client/components/ui/dropdown-menu.js +2 -2
  82. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  83. package/dist/client/components/ui/hover-card.js +1 -1
  84. package/dist/client/components/ui/hover-card.js.map +1 -1
  85. package/dist/client/components/ui/popover.js +1 -1
  86. package/dist/client/components/ui/popover.js.map +1 -1
  87. package/dist/client/composer/PromptComposer.d.ts +7 -0
  88. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  89. package/dist/client/composer/PromptComposer.js +63 -32
  90. package/dist/client/composer/PromptComposer.js.map +1 -1
  91. package/dist/client/composer/TiptapComposer.d.ts +5 -0
  92. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  93. package/dist/client/composer/TiptapComposer.js +36 -6
  94. package/dist/client/composer/TiptapComposer.js.map +1 -1
  95. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  96. package/dist/client/composer/useVoiceDictation.js +13 -1
  97. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  98. package/dist/client/dev-mode.d.ts +14 -0
  99. package/dist/client/dev-mode.d.ts.map +1 -0
  100. package/dist/client/dev-mode.js +14 -0
  101. package/dist/client/dev-mode.js.map +1 -0
  102. package/dist/client/error-format.d.ts +3 -2
  103. package/dist/client/error-format.d.ts.map +1 -1
  104. package/dist/client/error-format.js +9 -2
  105. package/dist/client/error-format.js.map +1 -1
  106. package/dist/client/extensions/EmbeddedTool.d.ts +20 -0
  107. package/dist/client/extensions/EmbeddedTool.d.ts.map +1 -0
  108. package/dist/client/extensions/EmbeddedTool.js +199 -0
  109. package/dist/client/extensions/EmbeddedTool.js.map +1 -0
  110. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  111. package/dist/client/extensions/ExtensionViewer.js +24 -2
  112. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  113. package/dist/client/extensions/ToolEditor.d.ts +5 -0
  114. package/dist/client/extensions/ToolEditor.d.ts.map +1 -0
  115. package/dist/client/extensions/ToolEditor.js +129 -0
  116. package/dist/client/extensions/ToolEditor.js.map +1 -0
  117. package/dist/client/extensions/ToolViewer.d.ts +5 -0
  118. package/dist/client/extensions/ToolViewer.d.ts.map +1 -0
  119. package/dist/client/extensions/ToolViewer.js +400 -0
  120. package/dist/client/extensions/ToolViewer.js.map +1 -0
  121. package/dist/client/extensions/ToolViewerPage.d.ts +2 -0
  122. package/dist/client/extensions/ToolViewerPage.d.ts.map +1 -0
  123. package/dist/client/extensions/ToolViewerPage.js +24 -0
  124. package/dist/client/extensions/ToolViewerPage.js.map +1 -0
  125. package/dist/client/extensions/ToolsListPage.d.ts +2 -0
  126. package/dist/client/extensions/ToolsListPage.d.ts.map +1 -0
  127. package/dist/client/extensions/ToolsListPage.js +67 -0
  128. package/dist/client/extensions/ToolsListPage.js.map +1 -0
  129. package/dist/client/extensions/ToolsSidebarSection.d.ts +2 -0
  130. package/dist/client/extensions/ToolsSidebarSection.d.ts.map +1 -0
  131. package/dist/client/extensions/ToolsSidebarSection.js +236 -0
  132. package/dist/client/extensions/ToolsSidebarSection.js.map +1 -0
  133. package/dist/client/extensions/tool-order.d.ts +7 -0
  134. package/dist/client/extensions/tool-order.d.ts.map +1 -0
  135. package/dist/client/extensions/tool-order.js +47 -0
  136. package/dist/client/extensions/tool-order.js.map +1 -0
  137. package/dist/client/index.d.ts +8 -1
  138. package/dist/client/index.d.ts.map +1 -1
  139. package/dist/client/index.js +7 -0
  140. package/dist/client/index.js.map +1 -1
  141. package/dist/client/onboarding/OnboardingPanel.js +1 -0
  142. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  143. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  144. package/dist/client/org/InvitationBanner.js +23 -2
  145. package/dist/client/org/InvitationBanner.js.map +1 -1
  146. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  147. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  148. package/dist/client/org/OrgSwitcher.js +57 -9
  149. package/dist/client/org/OrgSwitcher.js.map +1 -1
  150. package/dist/client/org/hooks.d.ts.map +1 -1
  151. package/dist/client/org/hooks.js +10 -6
  152. package/dist/client/org/hooks.js.map +1 -1
  153. package/dist/client/org/workspace-app-links.d.ts +31 -0
  154. package/dist/client/org/workspace-app-links.d.ts.map +1 -0
  155. package/dist/client/org/workspace-app-links.js +268 -0
  156. package/dist/client/org/workspace-app-links.js.map +1 -0
  157. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  158. package/dist/client/resources/ResourcesPanel.js +18 -5
  159. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  160. package/dist/client/resources/use-resources.d.ts +18 -13
  161. package/dist/client/resources/use-resources.d.ts.map +1 -1
  162. package/dist/client/resources/use-resources.js +24 -6
  163. package/dist/client/resources/use-resources.js.map +1 -1
  164. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  165. package/dist/client/settings/BackgroundAgentSection.js +9 -1
  166. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  167. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  168. package/dist/client/settings/BrowserSection.js +16 -1
  169. package/dist/client/settings/BrowserSection.js.map +1 -1
  170. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  171. package/dist/client/settings/SettingsPanel.js +4 -1
  172. package/dist/client/settings/SettingsPanel.js.map +1 -1
  173. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  174. package/dist/client/settings/VoiceTranscriptionSection.js +5 -5
  175. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  176. package/dist/client/settings/useBuilderStatus.d.ts +8 -0
  177. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  178. package/dist/client/settings/useBuilderStatus.js +50 -13
  179. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  180. package/dist/client/settings/useBuilderStatus.spec.d.ts +2 -0
  181. package/dist/client/settings/useBuilderStatus.spec.d.ts.map +1 -0
  182. package/dist/client/settings/useBuilderStatus.spec.js +64 -0
  183. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -0
  184. package/dist/client/sharing/ShareButton.d.ts +5 -0
  185. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  186. package/dist/client/sharing/ShareButton.js +60 -6
  187. package/dist/client/sharing/ShareButton.js.map +1 -1
  188. package/dist/client/theme.js +1 -1
  189. package/dist/client/theme.js.map +1 -1
  190. package/dist/client/tools/EmbeddedTool.d.ts +20 -0
  191. package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
  192. package/dist/client/tools/EmbeddedTool.js +199 -0
  193. package/dist/client/tools/EmbeddedTool.js.map +1 -0
  194. package/dist/client/tools/ExtensionSlot.d.ts +27 -0
  195. package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
  196. package/dist/client/tools/ExtensionSlot.js +96 -0
  197. package/dist/client/tools/ExtensionSlot.js.map +1 -0
  198. package/dist/client/tools/ToolEditor.d.ts +5 -0
  199. package/dist/client/tools/ToolEditor.d.ts.map +1 -0
  200. package/dist/client/tools/ToolEditor.js +129 -0
  201. package/dist/client/tools/ToolEditor.js.map +1 -0
  202. package/dist/client/tools/ToolViewer.d.ts +5 -0
  203. package/dist/client/tools/ToolViewer.d.ts.map +1 -0
  204. package/dist/client/tools/ToolViewer.js +400 -0
  205. package/dist/client/tools/ToolViewer.js.map +1 -0
  206. package/dist/client/tools/ToolViewerPage.d.ts +2 -0
  207. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
  208. package/dist/client/tools/ToolViewerPage.js +24 -0
  209. package/dist/client/tools/ToolViewerPage.js.map +1 -0
  210. package/dist/client/tools/ToolsListPage.d.ts +2 -0
  211. package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
  212. package/dist/client/tools/ToolsListPage.js +67 -0
  213. package/dist/client/tools/ToolsListPage.js.map +1 -0
  214. package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
  215. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
  216. package/dist/client/tools/ToolsSidebarSection.js +236 -0
  217. package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
  218. package/dist/client/tools/iframe-bridge.d.ts +38 -0
  219. package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
  220. package/dist/client/tools/iframe-bridge.js +207 -0
  221. package/dist/client/tools/iframe-bridge.js.map +1 -0
  222. package/dist/client/tools/index.d.ts +8 -0
  223. package/dist/client/tools/index.d.ts.map +1 -0
  224. package/dist/client/tools/index.js +8 -0
  225. package/dist/client/tools/index.js.map +1 -0
  226. package/dist/client/tools/tool-order.d.ts +7 -0
  227. package/dist/client/tools/tool-order.d.ts.map +1 -0
  228. package/dist/client/tools/tool-order.js +47 -0
  229. package/dist/client/tools/tool-order.js.map +1 -0
  230. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  231. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -3
  232. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
  233. package/dist/client/use-change-version.d.ts +46 -0
  234. package/dist/client/use-change-version.d.ts.map +1 -0
  235. package/dist/client/use-change-version.js +135 -0
  236. package/dist/client/use-change-version.js.map +1 -0
  237. package/dist/client/use-chat-threads.d.ts +16 -2
  238. package/dist/client/use-chat-threads.d.ts.map +1 -1
  239. package/dist/client/use-chat-threads.js +87 -12
  240. package/dist/client/use-chat-threads.js.map +1 -1
  241. package/dist/client/use-chat-threads.spec.d.ts +2 -0
  242. package/dist/client/use-chat-threads.spec.d.ts.map +1 -0
  243. package/dist/client/use-chat-threads.spec.js +85 -0
  244. package/dist/client/use-chat-threads.spec.js.map +1 -0
  245. package/dist/client/use-db-sync.d.ts +5 -2
  246. package/dist/client/use-db-sync.d.ts.map +1 -1
  247. package/dist/client/use-db-sync.js +41 -16
  248. package/dist/client/use-db-sync.js.map +1 -1
  249. package/dist/client/use-pinch-zoom.d.ts +35 -0
  250. package/dist/client/use-pinch-zoom.d.ts.map +1 -0
  251. package/dist/client/use-pinch-zoom.js +105 -0
  252. package/dist/client/use-pinch-zoom.js.map +1 -0
  253. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  254. package/dist/deploy/workspace-deploy.js +99 -5
  255. package/dist/deploy/workspace-deploy.js.map +1 -1
  256. package/dist/extensions/actions.d.ts.map +1 -1
  257. package/dist/extensions/actions.js +3 -0
  258. package/dist/extensions/actions.js.map +1 -1
  259. package/dist/extensions/store.d.ts +5 -0
  260. package/dist/extensions/store.d.ts.map +1 -1
  261. package/dist/extensions/store.js +16 -1
  262. package/dist/extensions/store.js.map +1 -1
  263. package/dist/file-upload/actions/upload-image.d.ts +3 -0
  264. package/dist/file-upload/actions/upload-image.d.ts.map +1 -0
  265. package/dist/file-upload/actions/upload-image.js +145 -0
  266. package/dist/file-upload/actions/upload-image.js.map +1 -0
  267. package/dist/file-upload/builder.d.ts.map +1 -1
  268. package/dist/file-upload/builder.js +31 -11
  269. package/dist/file-upload/builder.js.map +1 -1
  270. package/dist/file-upload/index.d.ts +1 -0
  271. package/dist/file-upload/index.d.ts.map +1 -1
  272. package/dist/file-upload/index.js +1 -0
  273. package/dist/file-upload/index.js.map +1 -1
  274. package/dist/file-upload/pre-upload-attachments.d.ts +39 -0
  275. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -0
  276. package/dist/file-upload/pre-upload-attachments.js +110 -0
  277. package/dist/file-upload/pre-upload-attachments.js.map +1 -0
  278. package/dist/file-upload/registry.d.ts.map +1 -1
  279. package/dist/file-upload/registry.js +8 -7
  280. package/dist/file-upload/registry.js.map +1 -1
  281. package/dist/onboarding/default-steps.js +1 -1
  282. package/dist/onboarding/default-steps.js.map +1 -1
  283. package/dist/org/context.d.ts +15 -1
  284. package/dist/org/context.d.ts.map +1 -1
  285. package/dist/org/context.js +25 -0
  286. package/dist/org/context.js.map +1 -1
  287. package/dist/org/handlers.d.ts +2 -2
  288. package/dist/org/handlers.d.ts.map +1 -1
  289. package/dist/org/handlers.js +3 -17
  290. package/dist/org/handlers.js.map +1 -1
  291. package/dist/org/index.d.ts +1 -1
  292. package/dist/org/index.d.ts.map +1 -1
  293. package/dist/org/index.js +1 -1
  294. package/dist/org/index.js.map +1 -1
  295. package/dist/resources/handlers.d.ts +6 -0
  296. package/dist/resources/handlers.d.ts.map +1 -1
  297. package/dist/resources/handlers.js +30 -6
  298. package/dist/resources/handlers.js.map +1 -1
  299. package/dist/resources/script-helpers.d.ts +11 -2
  300. package/dist/resources/script-helpers.d.ts.map +1 -1
  301. package/dist/resources/script-helpers.js +20 -3
  302. package/dist/resources/script-helpers.js.map +1 -1
  303. package/dist/resources/store.d.ts +28 -3
  304. package/dist/resources/store.d.ts.map +1 -1
  305. package/dist/resources/store.js +170 -20
  306. package/dist/resources/store.js.map +1 -1
  307. package/dist/scripts/resources/list.d.ts +1 -1
  308. package/dist/scripts/resources/list.d.ts.map +1 -1
  309. package/dist/scripts/resources/list.js +16 -4
  310. package/dist/scripts/resources/list.js.map +1 -1
  311. package/dist/scripts/resources/write.d.ts +1 -1
  312. package/dist/scripts/resources/write.d.ts.map +1 -1
  313. package/dist/scripts/resources/write.js +47 -3
  314. package/dist/scripts/resources/write.js.map +1 -1
  315. package/dist/server/action-discovery.d.ts.map +1 -1
  316. package/dist/server/action-discovery.js +8 -3
  317. package/dist/server/action-discovery.js.map +1 -1
  318. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  319. package/dist/server/agent-chat-plugin.js +214 -25
  320. package/dist/server/agent-chat-plugin.js.map +1 -1
  321. package/dist/server/agent-discovery.d.ts +35 -0
  322. package/dist/server/agent-discovery.d.ts.map +1 -1
  323. package/dist/server/agent-discovery.js +139 -8
  324. package/dist/server/agent-discovery.js.map +1 -1
  325. package/dist/server/app-url.d.ts +12 -6
  326. package/dist/server/app-url.d.ts.map +1 -1
  327. package/dist/server/app-url.js +58 -11
  328. package/dist/server/app-url.js.map +1 -1
  329. package/dist/server/auth.d.ts +22 -0
  330. package/dist/server/auth.d.ts.map +1 -1
  331. package/dist/server/auth.js +316 -65
  332. package/dist/server/auth.js.map +1 -1
  333. package/dist/server/better-auth-instance.d.ts +0 -4
  334. package/dist/server/better-auth-instance.d.ts.map +1 -1
  335. package/dist/server/better-auth-instance.js +0 -3
  336. package/dist/server/better-auth-instance.js.map +1 -1
  337. package/dist/server/builder-browser.d.ts.map +1 -1
  338. package/dist/server/builder-browser.js +23 -0
  339. package/dist/server/builder-browser.js.map +1 -1
  340. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  341. package/dist/server/core-routes-plugin.js +29 -14
  342. package/dist/server/core-routes-plugin.js.map +1 -1
  343. package/dist/server/credential-provider.d.ts +14 -0
  344. package/dist/server/credential-provider.d.ts.map +1 -1
  345. package/dist/server/credential-provider.js +88 -11
  346. package/dist/server/credential-provider.js.map +1 -1
  347. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  348. package/dist/server/google-auth-plugin.js +65 -17
  349. package/dist/server/google-auth-plugin.js.map +1 -1
  350. package/dist/server/google-oauth.d.ts.map +1 -1
  351. package/dist/server/google-oauth.js +47 -17
  352. package/dist/server/google-oauth.js.map +1 -1
  353. package/dist/server/index.d.ts +1 -1
  354. package/dist/server/index.d.ts.map +1 -1
  355. package/dist/server/index.js +1 -1
  356. package/dist/server/index.js.map +1 -1
  357. package/dist/server/local-migration.d.ts +41 -0
  358. package/dist/server/local-migration.d.ts.map +1 -0
  359. package/dist/server/local-migration.js +235 -0
  360. package/dist/server/local-migration.js.map +1 -0
  361. package/dist/server/oauth-public-origin.d.ts.map +1 -1
  362. package/dist/server/oauth-public-origin.js +19 -1
  363. package/dist/server/oauth-public-origin.js.map +1 -1
  364. package/dist/server/onboarding-html.d.ts.map +1 -1
  365. package/dist/server/onboarding-html.js +74 -19
  366. package/dist/server/onboarding-html.js.map +1 -1
  367. package/dist/server/poll.d.ts.map +1 -1
  368. package/dist/server/poll.js +20 -5
  369. package/dist/server/poll.js.map +1 -1
  370. package/dist/server/request-context.d.ts +8 -0
  371. package/dist/server/request-context.d.ts.map +1 -1
  372. package/dist/server/request-context.js.map +1 -1
  373. package/dist/shared/index.d.ts +2 -0
  374. package/dist/shared/index.d.ts.map +1 -1
  375. package/dist/shared/index.js +2 -0
  376. package/dist/shared/index.js.map +1 -1
  377. package/dist/shared/llm-connection.d.ts +10 -0
  378. package/dist/shared/llm-connection.d.ts.map +1 -0
  379. package/dist/shared/llm-connection.js +29 -0
  380. package/dist/shared/llm-connection.js.map +1 -0
  381. package/dist/shared/workspace-app-audience.d.ts +25 -0
  382. package/dist/shared/workspace-app-audience.d.ts.map +1 -0
  383. package/dist/shared/workspace-app-audience.js +126 -0
  384. package/dist/shared/workspace-app-audience.js.map +1 -0
  385. package/dist/shared/workspace-app-id.d.ts +1 -1
  386. package/dist/shared/workspace-app-id.d.ts.map +1 -1
  387. package/dist/shared/workspace-app-id.js +1 -0
  388. package/dist/shared/workspace-app-id.js.map +1 -1
  389. package/dist/sharing/access.d.ts.map +1 -1
  390. package/dist/sharing/access.js +46 -5
  391. package/dist/sharing/access.js.map +1 -1
  392. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  393. package/dist/sharing/actions/list-resource-shares.js +8 -1
  394. package/dist/sharing/actions/list-resource-shares.js.map +1 -1
  395. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  396. package/dist/sharing/actions/set-resource-visibility.js +12 -3
  397. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  398. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  399. package/dist/sharing/actions/share-resource.js +50 -1
  400. package/dist/sharing/actions/share-resource.js.map +1 -1
  401. package/dist/sharing/registry.d.ts +26 -0
  402. package/dist/sharing/registry.d.ts.map +1 -1
  403. package/dist/sharing/registry.js.map +1 -1
  404. package/dist/styles/agent-native.css +91 -0
  405. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  406. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  407. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  408. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  409. package/dist/templates/default/AGENTS.md +22 -19
  410. package/dist/templates/default/actions/navigate.ts +3 -0
  411. package/dist/templates/default/app/hooks/use-navigation-state.ts +29 -5
  412. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  413. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  414. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  415. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  416. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  417. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  418. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  419. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  420. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  421. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  422. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  423. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  424. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  425. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  426. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  427. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  428. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  429. package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  430. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  431. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  432. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  433. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  434. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  435. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  436. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  437. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  438. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  439. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  440. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  441. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  442. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  443. package/dist/templates/workspace-core/AGENTS.md +16 -1
  444. package/dist/templates/workspace-root/AGENTS.md +35 -0
  445. package/dist/templates/workspace-root/README.md +7 -0
  446. package/dist/tools/actions.d.ts +3 -0
  447. package/dist/tools/actions.d.ts.map +1 -0
  448. package/dist/tools/actions.js +272 -0
  449. package/dist/tools/actions.js.map +1 -0
  450. package/dist/tools/fetch-tool.d.ts +23 -0
  451. package/dist/tools/fetch-tool.d.ts.map +1 -0
  452. package/dist/tools/fetch-tool.js +178 -0
  453. package/dist/tools/fetch-tool.js.map +1 -0
  454. package/dist/tools/html-shell.d.ts +45 -0
  455. package/dist/tools/html-shell.d.ts.map +1 -0
  456. package/dist/tools/html-shell.js +514 -0
  457. package/dist/tools/html-shell.js.map +1 -0
  458. package/dist/tools/proxy-security.d.ts +12 -0
  459. package/dist/tools/proxy-security.d.ts.map +1 -0
  460. package/dist/tools/proxy-security.js +158 -0
  461. package/dist/tools/proxy-security.js.map +1 -0
  462. package/dist/tools/routes.d.ts +2 -0
  463. package/dist/tools/routes.d.ts.map +1 -0
  464. package/dist/tools/routes.js +627 -0
  465. package/dist/tools/routes.js.map +1 -0
  466. package/dist/tools/schema.d.ts +664 -0
  467. package/dist/tools/schema.d.ts.map +1 -0
  468. package/dist/tools/schema.js +146 -0
  469. package/dist/tools/schema.js.map +1 -0
  470. package/dist/tools/slots/routes.d.ts +15 -0
  471. package/dist/tools/slots/routes.d.ts.map +1 -0
  472. package/dist/tools/slots/routes.js +94 -0
  473. package/dist/tools/slots/routes.js.map +1 -0
  474. package/dist/tools/slots/schema.d.ts +303 -0
  475. package/dist/tools/slots/schema.d.ts.map +1 -0
  476. package/dist/tools/slots/schema.js +76 -0
  477. package/dist/tools/slots/schema.js.map +1 -0
  478. package/dist/tools/slots/store.d.ts +66 -0
  479. package/dist/tools/slots/store.d.ts.map +1 -0
  480. package/dist/tools/slots/store.js +227 -0
  481. package/dist/tools/slots/store.js.map +1 -0
  482. package/dist/tools/store.d.ts +40 -0
  483. package/dist/tools/store.d.ts.map +1 -0
  484. package/dist/tools/store.js +193 -0
  485. package/dist/tools/store.js.map +1 -0
  486. package/dist/tools/theme.d.ts +2 -0
  487. package/dist/tools/theme.d.ts.map +1 -0
  488. package/dist/tools/theme.js +67 -0
  489. package/dist/tools/theme.js.map +1 -0
  490. package/dist/tools/url-safety.d.ts +24 -0
  491. package/dist/tools/url-safety.d.ts.map +1 -0
  492. package/dist/tools/url-safety.js +224 -0
  493. package/dist/tools/url-safety.js.map +1 -0
  494. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  495. package/dist/vite/action-types-plugin.js +4 -0
  496. package/dist/vite/action-types-plugin.js.map +1 -1
  497. package/docs/content/authentication.md +36 -0
  498. package/docs/content/creating-templates.md +15 -0
  499. package/docs/content/dispatch.md +3 -3
  500. package/docs/content/multi-app-workspace.md +5 -0
  501. package/docs/content/tracking.md +12 -0
  502. package/docs/content/workspace-management.md +39 -4
  503. package/package.json +15 -12
  504. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  505. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  506. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  507. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  508. package/src/templates/default/AGENTS.md +22 -19
  509. package/src/templates/default/actions/navigate.ts +3 -0
  510. package/src/templates/default/app/hooks/use-navigation-state.ts +29 -5
  511. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  512. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  513. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  514. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  515. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  516. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  517. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  518. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  519. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  520. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  521. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  522. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  523. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  524. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  525. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  526. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  527. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  528. package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  529. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  531. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  532. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  533. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  534. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  535. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  536. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  537. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  538. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  539. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  540. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  541. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  542. package/src/templates/workspace-core/AGENTS.md +16 -1
  543. package/src/templates/workspace-root/AGENTS.md +35 -0
  544. package/src/templates/workspace-root/README.md +7 -0
@@ -7,11 +7,14 @@ import path from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import * as Sentry from "@sentry/node";
9
9
  import { extractOAuthStateAppId } from "../shared/oauth-state.js";
10
+ import { DEFAULT_WORKSPACE_APP_AUDIENCE, workspaceAppAudienceFromPackageJson, workspaceAppRouteAccessFromPackageJson, } from "../shared/workspace-app-audience.js";
10
11
  const DEFAULT_GATEWAY_HOST = "127.0.0.1";
11
12
  const DEFAULT_GATEWAY_PORT = 8080;
12
13
  const DEFAULT_APP_PORT_START = 8100;
13
14
  const PROXY_READY_RETRY_DELAY_MS = 250;
14
15
  const APP_RESTART_MAX_DELAY_MS = 10_000;
16
+ const APP_OUTPUT_TAIL_BYTES = 8_000;
17
+ const POLLING_WATCH_INTERVAL_MS = "1000";
15
18
  function normalizeOrigin(value) {
16
19
  if (!value)
17
20
  return undefined;
@@ -37,6 +40,72 @@ export function shouldEagerStartWorkspaceApps(args = [], env = process.env) {
37
40
  env.WORKSPACE_EAGER === "1" ||
38
41
  env.WORKSPACE_EAGER === "true");
39
42
  }
43
+ function readBooleanEnv(value) {
44
+ if (value === undefined)
45
+ return undefined;
46
+ const normalized = value.trim().toLowerCase();
47
+ if (["1", "true", "yes", "on"].includes(normalized))
48
+ return true;
49
+ if (["0", "false", "no", "off"].includes(normalized))
50
+ return false;
51
+ return undefined;
52
+ }
53
+ /**
54
+ * Three-way classification of the polling-watcher decision so callers can
55
+ * tell apart "the user explicitly turned this off" (where we want to override
56
+ * any inherited chokidar/TSC env vars from the parent shell) from "we just
57
+ * didn't auto-detect a Builder/Codespaces/Gitpod container" (where the user's
58
+ * own watcher vars should pass through untouched).
59
+ */
60
+ export function pollingFileWatcherMode(env = process.env, root = process.cwd()) {
61
+ const explicit = readBooleanEnv(env.AGENT_NATIVE_DEV_USE_POLLING) ??
62
+ readBooleanEnv(env.WORKSPACE_USE_POLLING_WATCHER);
63
+ if (explicit === true)
64
+ return "enable";
65
+ if (explicit === false)
66
+ return "disable-explicit";
67
+ const chokidarExplicit = readBooleanEnv(env.CHOKIDAR_USEPOLLING);
68
+ if (chokidarExplicit === true)
69
+ return "enable";
70
+ if (chokidarExplicit === false)
71
+ return "disable-explicit";
72
+ const autoEnable = Boolean(env.BUILDER_IO_DEV_SERVER ||
73
+ env.BUILDER_PROJECT_ID ||
74
+ env.BUILDER_WORKSPACE_ID ||
75
+ env.CODESPACES ||
76
+ env.GITPOD_WORKSPACE_ID ||
77
+ env.REMOTE_CONTAINERS ||
78
+ env.DEVCONTAINER ||
79
+ root.startsWith("/root/app/"));
80
+ return autoEnable ? "enable" : "disable-default";
81
+ }
82
+ export function shouldUsePollingFileWatcher(env = process.env, root = process.cwd()) {
83
+ return pollingFileWatcherMode(env, root) === "enable";
84
+ }
85
+ function devWatcherEnv(env, mode) {
86
+ if (mode === "enable") {
87
+ return {
88
+ ...env,
89
+ CHOKIDAR_USEPOLLING: "1",
90
+ CHOKIDAR_INTERVAL: env.CHOKIDAR_INTERVAL ?? POLLING_WATCH_INTERVAL_MS,
91
+ TSC_WATCHFILE: env.TSC_WATCHFILE ?? "DynamicPriorityPolling",
92
+ TSC_WATCHDIRECTORY: env.TSC_WATCHDIRECTORY ?? "DynamicPriorityPolling",
93
+ };
94
+ }
95
+ if (mode === "disable-explicit") {
96
+ // The user explicitly turned polling off (AGENT_NATIVE_DEV_USE_POLLING=0
97
+ // / WORKSPACE_USE_POLLING_WATCHER=0 / CHOKIDAR_USEPOLLING=0). Strip the
98
+ // watcher vars from the child env so an inherited parent-shell
99
+ // CHOKIDAR_USEPOLLING=1 (or stale TSC_WATCH* override) can't silently
100
+ // re-enable polling against the user's explicit wish.
101
+ const { CHOKIDAR_USEPOLLING: _polling, CHOKIDAR_INTERVAL: _interval, TSC_WATCHFILE: _watchFile, TSC_WATCHDIRECTORY: _watchDir, ...rest } = env;
102
+ return rest;
103
+ }
104
+ // mode === "disable-default": no explicit signal either way. Pass the env
105
+ // through unchanged so legitimate user overrides like
106
+ // TSC_WATCHFILE=UseFsEventsWithFallbackDynamicPolling survive.
107
+ return env;
108
+ }
40
109
  export function initialWorkspaceAppIds(apps, defaultApp, eager, startDefault = true) {
41
110
  if (eager)
42
111
  return apps.map((app) => app.id);
@@ -80,9 +149,15 @@ function discoverApps(appsDir, appPortStart) {
80
149
  const pkg = readJson(path.join(dir, "package.json"));
81
150
  if (!pkg)
82
151
  return null;
152
+ const routeAccess = workspaceAppRouteAccessFromPackageJson(pkg);
83
153
  return {
84
154
  id: entry.name,
85
155
  name: pkg.displayName || pkg.name || entry.name,
156
+ description: typeof pkg.description === "string" ? pkg.description : "",
157
+ audience: workspaceAppAudienceFromPackageJson(pkg) ??
158
+ DEFAULT_WORKSPACE_APP_AUDIENCE,
159
+ publicPaths: routeAccess.publicPaths ?? [],
160
+ protectedPaths: routeAccess.protectedPaths ?? [],
86
161
  dir,
87
162
  port: appPortStart,
88
163
  };
@@ -101,14 +176,33 @@ function compareApps(a, b) {
101
176
  function isChildDevServerUrlLine(line) {
102
177
  return /^\s*->\s+(?:Local|Network):\s+https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):\d+(?:\/\S*)?\s*$/i.test(line.replace(/\u279c/g, "->"));
103
178
  }
104
- function pipeAppOutput(prefix, chunk, write) {
179
+ function formatAppOutput(chunk) {
105
180
  const lines = String(chunk)
106
181
  .split(/\r?\n/)
107
182
  .filter(Boolean)
108
183
  .filter((line) => !isChildDevServerUrlLine(line));
109
- if (lines.length === 0)
184
+ return lines.length === 0 ? "" : lines.join("\n") + "\n";
185
+ }
186
+ function appendAppOutputTail(app, output) {
187
+ if (!output)
110
188
  return;
111
- write(lines.map((line) => `${prefix} ${line}`).join("\n") + "\n");
189
+ const next = `${app.outputTail ?? ""}${output}`;
190
+ app.outputTail =
191
+ next.length > APP_OUTPUT_TAIL_BYTES
192
+ ? next.slice(-APP_OUTPUT_TAIL_BYTES)
193
+ : next;
194
+ }
195
+ function pipeAppOutput(prefix, chunk, write) {
196
+ const output = formatAppOutput(chunk);
197
+ if (!output)
198
+ return "";
199
+ const prefixed = output
200
+ .trimEnd()
201
+ .split(/\n/)
202
+ .map((line) => `${prefix} ${line}`)
203
+ .join("\n");
204
+ write(`${prefixed}\n`);
205
+ return output;
112
206
  }
113
207
  function firstPathSegment(url) {
114
208
  if (!url)
@@ -125,6 +219,10 @@ function firstPathSegment(url) {
125
219
  function appRestartDelay(attempts) {
126
220
  return Math.min(1_000 * 2 ** Math.max(0, attempts - 1), APP_RESTART_MAX_DELAY_MS);
127
221
  }
222
+ function formatProxyReadyTimeout(timeoutMs) {
223
+ const seconds = timeoutMs / 1_000;
224
+ return Number.isInteger(seconds) ? `${seconds}s` : `${timeoutMs}ms`;
225
+ }
128
226
  function probePort(port, timeoutMs = 1_000) {
129
227
  return new Promise((resolve) => {
130
228
  const socket = new net.Socket();
@@ -160,34 +258,51 @@ function wantsHtml(req) {
160
258
  }
161
259
  function renderStartingApp(app) {
162
260
  const escapedName = escapeHtml(app.name || app.id);
163
- const message = app.installing
164
- ? "The workspace gateway is installing this app's dependencies before starting it."
165
- : "The workspace gateway is waking this app's dev server.";
261
+ const failure = app.lastFailure;
262
+ const retryDelayMs = failure
263
+ ? Math.max(1_000, failure.nextRetryAt - Date.now() + 250)
264
+ : 900;
265
+ const refreshSeconds = failure
266
+ ? Math.max(1, Math.ceil(retryDelayMs / 1_000))
267
+ : 1;
268
+ const refreshScriptDelay = failure ? retryDelayMs : 900;
269
+ const title = failure
270
+ ? `${failure.installing ? "Install failed" : "App failed to start"}: ${escapedName}`
271
+ : `Starting ${escapedName}`;
272
+ const message = failure
273
+ ? `The workspace gateway will retry in ${Math.max(1, Math.ceil((failure.nextRetryAt - Date.now()) / 1_000))}s. Fix the error below or stop the server with Ctrl+C.`
274
+ : app.installing
275
+ ? "The workspace gateway is installing this app's dependencies before starting it."
276
+ : "The workspace gateway is waking this app's dev server.";
277
+ const failureOutput = failure?.output.trim();
166
278
  return `<!doctype html>
167
279
  <html>
168
280
  <head>
169
281
  <meta charset="utf-8" />
170
282
  <meta name="viewport" content="width=device-width, initial-scale=1" />
171
- <meta http-equiv="refresh" content="1" />
172
- <title>Starting ${escapedName}</title>
283
+ <meta http-equiv="refresh" content="${refreshSeconds}" />
284
+ <title>${title}</title>
173
285
  <meta name="color-scheme" content="light dark" />
174
286
  <style>
175
- :root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; }
176
- @media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; } }
287
+ :root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; --danger: #dc2626; --code-bg: #171717; --code-fg: #fafafa; }
288
+ @media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; --danger: #f87171; --code-bg: #171717; --code-fg: #f5f5f5; } }
177
289
  body { min-height: 100vh; margin: 0; display: grid; place-items: center; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--fg); }
178
- main { width: min(420px, calc(100vw - 48px)); }
290
+ main { width: min(680px, calc(100vw - 48px)); }
179
291
  .bar { height: 3px; overflow: hidden; border-radius: 999px; background: var(--bar-bg); }
180
292
  .bar::before { content: ""; display: block; height: 100%; width: 42%; border-radius: inherit; background: var(--bar-fill); animation: load 1s ease-in-out infinite; }
293
+ main.failed .bar::before { width: 100%; background: var(--danger); animation: none; }
181
294
  p { color: var(--muted); }
295
+ pre { max-height: min(46vh, 360px); overflow: auto; margin-top: 20px; padding: 14px 16px; border-radius: 8px; background: var(--code-bg); color: var(--code-fg); font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; white-space: pre-wrap; word-break: break-word; }
182
296
  @keyframes load { 0% { transform: translateX(-105%); } 100% { transform: translateX(245%); } }
183
297
  </style>
184
- <script>setTimeout(() => window.location.reload(), 900);</script>
298
+ <script>setTimeout(() => window.location.reload(), ${JSON.stringify(refreshScriptDelay)});</script>
185
299
  </head>
186
300
  <body>
187
- <main>
301
+ <main class="${failure ? "failed" : ""}">
188
302
  <div class="bar"></div>
189
- <h1>Starting ${escapedName}</h1>
303
+ <h1>${title}</h1>
190
304
  <p>${escapeHtml(message)}</p>
305
+ ${failureOutput ? `<pre>${escapeHtml(failureOutput)}</pre>` : ""}
191
306
  </main>
192
307
  </body>
193
308
  </html>`;
@@ -246,7 +361,7 @@ function hasLocalBin(dir, command) {
246
361
  fs.existsSync(path.join(binDir, `${command}.cmd`)) ||
247
362
  fs.existsSync(path.join(binDir, `${command}.ps1`)));
248
363
  }
249
- export function runWorkspaceDev(options = {}) {
364
+ export async function runWorkspaceDev(options = {}) {
250
365
  const args = options.args ?? process.argv.slice(2);
251
366
  const env = options.env ?? process.env;
252
367
  const root = options.root ?? process.cwd();
@@ -260,12 +375,50 @@ export function runWorkspaceDev(options = {}) {
260
375
  const appPortStart = Number(env.WORKSPACE_APP_PORT_START || DEFAULT_APP_PORT_START);
261
376
  const forceVite = env.WORKSPACE_VITE_FORCE === "1";
262
377
  const eager = shouldEagerStartWorkspaceApps(args, env);
378
+ const pollingMode = pollingFileWatcherMode(env, root);
379
+ const usePollingFileWatcher = pollingMode === "enable";
263
380
  const proxyReadyTimeoutMs = Number(env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000);
264
381
  let gatewayUrl = `http://${gatewayHost}:${requestedPort}`;
265
382
  const apps = discoverApps(appsDir, appPortStart);
266
383
  if (apps.length === 0) {
267
384
  throw new Error("[workspace] No apps found under ./apps");
268
385
  }
386
+ // Probe each app's proposed port to see if something else on the host
387
+ // already owns it. Vite is spawned with `--strictPort` (so the gateway can
388
+ // route /<appId> to a known port), which fails hard on EADDRINUSE — without
389
+ // this probe a single conflicting process on 8100/8101/... kills the
390
+ // workspace before the dev server prints anything useful.
391
+ function probePortAvailable(port) {
392
+ return new Promise((resolve) => {
393
+ const probe = net.createServer();
394
+ probe.once("error", () => resolve(false));
395
+ probe.once("listening", () => {
396
+ probe.close(() => resolve(true));
397
+ });
398
+ probe.listen(port, gatewayHost);
399
+ });
400
+ }
401
+ async function reserveAppPort(start, excluded) {
402
+ for (let port = start; port < start + 100; port++) {
403
+ if (excluded.has(port))
404
+ continue;
405
+ if (port === requestedPort)
406
+ continue;
407
+ if (await probePortAvailable(port))
408
+ return port;
409
+ }
410
+ throw new Error(`[workspace] No available port found between ${start} and ${start + 100}`);
411
+ }
412
+ const reservedAppPorts = new Set();
413
+ for (const app of apps) {
414
+ const original = app.port;
415
+ const port = await reserveAppPort(original, reservedAppPorts);
416
+ if (port !== original) {
417
+ stdout.write(`[workspace] Port ${original} unavailable for /${app.id}, using ${port}\n`);
418
+ }
419
+ app.port = port;
420
+ reservedAppPorts.add(port);
421
+ }
269
422
  const appById = new Map(apps.map((app) => [app.id, app]));
270
423
  const explicitDefaultApp = env.WORKSPACE_DEFAULT_APP && appById.has(env.WORKSPACE_DEFAULT_APP)
271
424
  ? env.WORKSPACE_DEFAULT_APP
@@ -276,6 +429,9 @@ export function runWorkspaceDev(options = {}) {
276
429
  let syncTimer;
277
430
  let shuttingDown = false;
278
431
  let workspaceStarted = false;
432
+ if (usePollingFileWatcher) {
433
+ stdout.write(`[workspace] Using polling file watchers (${POLLING_WATCH_INTERVAL_MS}ms) to avoid remote-container inotify limits.\n`);
434
+ }
279
435
  let readyResolve;
280
436
  const ready = new Promise((resolve) => {
281
437
  readyResolve = resolve;
@@ -284,22 +440,29 @@ export function runWorkspaceDev(options = {}) {
284
440
  return JSON.stringify(apps.map((workspaceApp) => ({
285
441
  id: workspaceApp.id,
286
442
  name: workspaceApp.name,
443
+ description: workspaceApp.description,
287
444
  path: `/${workspaceApp.id}`,
445
+ audience: workspaceApp.audience,
446
+ publicPaths: workspaceApp.publicPaths,
447
+ protectedPaths: workspaceApp.protectedPaths,
288
448
  })));
289
449
  }
290
- function syncApps() {
450
+ async function syncApps() {
291
451
  const discovered = discoverApps(appsDir, appPortStart);
292
452
  for (const app of discovered) {
293
453
  const existing = appById.get(app.id);
294
454
  if (existing) {
295
455
  existing.name = app.name;
456
+ existing.description = app.description;
457
+ existing.audience = app.audience;
458
+ existing.publicPaths = app.publicPaths;
459
+ existing.protectedPaths = app.protectedPaths;
296
460
  existing.dir = app.dir;
297
461
  continue;
298
462
  }
299
463
  const usedPorts = new Set(apps.map((existingApp) => existingApp.port));
300
- let port = appPortStart;
301
- while (usedPorts.has(port))
302
- port++;
464
+ const port = await reserveAppPort(appPortStart, usedPorts);
465
+ reservedAppPorts.add(port);
303
466
  const next = { ...app, port };
304
467
  apps.push(next);
305
468
  apps.sort(compareApps);
@@ -310,7 +473,11 @@ export function runWorkspaceDev(options = {}) {
310
473
  function scheduleSync() {
311
474
  if (syncTimer)
312
475
  clearTimeout(syncTimer);
313
- syncTimer = setTimeout(syncApps, 400);
476
+ syncTimer = setTimeout(() => {
477
+ void syncApps().catch((err) => {
478
+ stderr.write(`[workspace] App sync failed: ${err instanceof Error ? err.message : String(err)}\n`);
479
+ });
480
+ }, 400);
314
481
  }
315
482
  function appForRequest(req) {
316
483
  const params = new URL(req.url || "/", "http://workspace.local")
@@ -334,10 +501,10 @@ export function runWorkspaceDev(options = {}) {
334
501
  function startApp(app) {
335
502
  if (app.process && !app.process.killed)
336
503
  return;
337
- if (app.restartTimer) {
338
- clearTimeout(app.restartTimer);
339
- app.restartTimer = undefined;
340
- }
504
+ if (app.restartTimer)
505
+ return;
506
+ app.lastFailure = undefined;
507
+ app.outputTail = undefined;
341
508
  const basePath = `/${app.id}`;
342
509
  const shouldInstall = !app.installAttempted && !hasLocalBin(app.dir, "vite");
343
510
  const childArgs = shouldInstall
@@ -360,19 +527,26 @@ export function runWorkspaceDev(options = {}) {
360
527
  const child = spawnProcess("pnpm", childArgs, {
361
528
  cwd: root,
362
529
  stdio: ["ignore", "pipe", "pipe"],
363
- env: {
530
+ env: devWatcherEnv({
364
531
  ...env,
365
532
  APP_NAME: app.id,
366
533
  AGENT_NATIVE_WORKSPACE: "1",
367
534
  AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson(),
535
+ AGENT_NATIVE_WORKSPACE_APP_AUDIENCE: app.audience,
536
+ AGENT_NATIVE_WORKSPACE_APP_PUBLIC_PATHS: JSON.stringify(app.publicPaths),
537
+ AGENT_NATIVE_WORKSPACE_APP_PROTECTED_PATHS: JSON.stringify(app.protectedPaths),
368
538
  APP_BASE_PATH: basePath,
369
539
  VITE_AGENT_NATIVE_WORKSPACE: "1",
540
+ VITE_AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson(),
541
+ VITE_AGENT_NATIVE_WORKSPACE_APP_AUDIENCE: app.audience,
542
+ VITE_AGENT_NATIVE_WORKSPACE_APP_PUBLIC_PATHS: JSON.stringify(app.publicPaths),
543
+ VITE_AGENT_NATIVE_WORKSPACE_APP_PROTECTED_PATHS: JSON.stringify(app.protectedPaths),
370
544
  VITE_APP_BASE_PATH: basePath,
371
545
  VITE_WORKSPACE_OAUTH_ORIGIN: workspaceOAuthOrigin(env, gatewayUrl),
372
546
  VITE_WORKSPACE_GATEWAY_URL: gatewayUrl,
373
547
  PORT: String(app.port),
374
548
  WORKSPACE_GATEWAY_URL: gatewayUrl,
375
- },
549
+ }, pollingMode),
376
550
  });
377
551
  app.process = child;
378
552
  app.installing = shouldInstall;
@@ -382,18 +556,20 @@ export function runWorkspaceDev(options = {}) {
382
556
  }, 5_000);
383
557
  stableTimer.unref();
384
558
  child.stdout?.on("data", (chunk) => {
385
- pipeAppOutput(prefix, chunk, (value) => stdout.write(value));
559
+ appendAppOutputTail(app, pipeAppOutput(prefix, chunk, (value) => stdout.write(value)));
386
560
  });
387
561
  child.stderr?.on("data", (chunk) => {
388
- pipeAppOutput(prefix, chunk, (value) => stderr.write(value));
562
+ appendAppOutputTail(app, pipeAppOutput(prefix, chunk, (value) => stderr.write(value)));
389
563
  });
390
- child.on("exit", (code) => {
564
+ child.on("exit", (code, signal) => {
391
565
  clearTimeout(stableTimer);
392
566
  const wasInstalling = app.installing;
393
567
  app.process = undefined;
394
568
  app.installing = false;
395
569
  app.ready = false;
396
570
  app.readinessProbe = undefined;
571
+ if (app.restartTimer)
572
+ return;
397
573
  if (code === 0 || shuttingDown) {
398
574
  if (wasInstalling && code === 0 && !shuttingDown) {
399
575
  app.installAttempted = true;
@@ -403,15 +579,57 @@ export function runWorkspaceDev(options = {}) {
403
579
  }
404
580
  if (wasInstalling)
405
581
  app.installAttempted = false;
406
- app.restartAttempts = (app.restartAttempts ?? 0) + 1;
407
- const delay = appRestartDelay(app.restartAttempts);
408
- stderr.write(`${prefix} exited with code ${code}; retrying in ${Math.round(delay / 1000)}s\n`);
409
- app.restartTimer = setTimeout(() => {
410
- app.restartTimer = undefined;
411
- startApp(app);
412
- }, delay);
413
- app.restartTimer.unref();
582
+ scheduleAppRestart(app, {
583
+ code,
584
+ signal,
585
+ installing: wasInstalling,
586
+ output: app.outputTail ?? "",
587
+ logMessage: `exited with code ${code}`,
588
+ });
589
+ });
590
+ }
591
+ function scheduleAppRestart(app, input) {
592
+ if (shuttingDown || app.restartTimer)
593
+ return;
594
+ if (input.installing)
595
+ app.installAttempted = false;
596
+ app.restartAttempts = (app.restartAttempts ?? 0) + 1;
597
+ const delay = appRestartDelay(app.restartAttempts);
598
+ const nextRetryAt = Date.now() + delay;
599
+ app.lastFailure = {
600
+ code: input.code,
601
+ signal: input.signal,
602
+ at: Date.now(),
603
+ installing: input.installing,
604
+ output: input.output,
605
+ nextRetryAt,
606
+ };
607
+ stderr.write(`[${app.id}] ${input.logMessage}; retrying in ${Math.round(delay / 1000)}s\n`);
608
+ app.restartTimer = setTimeout(() => {
609
+ app.restartTimer = undefined;
610
+ startApp(app);
611
+ }, delay);
612
+ app.restartTimer.unref();
613
+ }
614
+ function failAppStartupTimeout(app) {
615
+ if (app.installing || app.ready || app.restartTimer)
616
+ return;
617
+ const timeout = formatProxyReadyTimeout(proxyReadyTimeoutMs);
618
+ const message = `Timed out waiting ${timeout} for /${app.id} to accept ` +
619
+ `connections on 127.0.0.1:${app.port}.`;
620
+ const output = [message, app.outputTail?.trim()]
621
+ .filter(Boolean)
622
+ .join("\n\nLast child output:\n");
623
+ app.ready = false;
624
+ app.readinessProbe = undefined;
625
+ scheduleAppRestart(app, {
626
+ code: null,
627
+ signal: null,
628
+ installing: false,
629
+ output,
630
+ logMessage: message,
414
631
  });
632
+ app.process?.kill("SIGTERM");
415
633
  }
416
634
  function forwardedProto(req) {
417
635
  return (firstHeaderValue(req.headers["x-forwarded-proto"]) ||
@@ -439,12 +657,15 @@ export function runWorkspaceDev(options = {}) {
439
657
  return false;
440
658
  }
441
659
  function ensureReadinessProbe(app) {
442
- if (app.ready || app.readinessProbe)
660
+ if (app.ready || app.readinessProbe || app.installing)
443
661
  return;
444
662
  app.readinessProbe = waitForPort(app.port, Date.now() + proxyReadyTimeoutMs)
445
663
  .then((ready) => {
446
- if (ready)
664
+ if (ready) {
447
665
  app.ready = true;
666
+ return;
667
+ }
668
+ failAppStartupTimeout(app);
448
669
  })
449
670
  .finally(() => {
450
671
  app.readinessProbe = undefined;
@@ -496,6 +717,7 @@ export function runWorkspaceDev(options = {}) {
496
717
  // Node keeps the request body paused until pipe() attaches.
497
718
  void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then((ready) => {
498
719
  if (!ready) {
720
+ failAppStartupTimeout(app);
499
721
  if (!res.headersSent) {
500
722
  res.writeHead(502, { "content-type": "text/plain" });
501
723
  res.end(`App "${app.id}" is not ready yet: connect ECONNREFUSED 127.0.0.1:${app.port}`);
@@ -513,6 +735,7 @@ export function runWorkspaceDev(options = {}) {
513
735
  startApp(app);
514
736
  void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then((ready) => {
515
737
  if (!ready) {
738
+ failAppStartupTimeout(app);
516
739
  socket.destroy();
517
740
  return;
518
741
  }
@@ -572,7 +795,9 @@ export function runWorkspaceDev(options = {}) {
572
795
  catch (err) {
573
796
  handleWatcherError(err);
574
797
  }
575
- setInterval(syncApps, 2_000).unref();
798
+ setInterval(() => {
799
+ void syncApps().catch(() => { });
800
+ }, 2_000).unref();
576
801
  }
577
802
  function openBrowser(url) {
578
803
  if (options.openBrowser === false || env.WORKSPACE_NO_OPEN === "1")
@@ -589,11 +814,11 @@ export function runWorkspaceDev(options = {}) {
589
814
  });
590
815
  child.unref();
591
816
  }
592
- const server = http.createServer((req, res) => {
817
+ const server = http.createServer(async (req, res) => {
593
818
  const parsedUrl = new URL(req.url || "/", "http://workspace.local");
594
819
  const pathname = parsedUrl.pathname;
595
820
  if (pathname === "/" || pathname === "/index.html") {
596
- syncApps();
821
+ await syncApps().catch(() => { });
597
822
  const currentDefaultApp = explicitDefaultApp && appById.has(explicitDefaultApp)
598
823
  ? explicitDefaultApp
599
824
  : appById.has("dispatch")
@@ -613,12 +838,16 @@ export function runWorkspaceDev(options = {}) {
613
838
  return;
614
839
  }
615
840
  if (pathname === "/_workspace/apps") {
616
- syncApps();
841
+ await syncApps().catch(() => { });
617
842
  res.writeHead(200, { "content-type": "application/json" });
618
843
  res.end(JSON.stringify(apps.map((app) => ({
619
844
  id: app.id,
620
845
  name: app.name,
846
+ description: app.description,
621
847
  path: `/${app.id}`,
848
+ audience: app.audience,
849
+ publicPaths: app.publicPaths,
850
+ protectedPaths: app.protectedPaths,
622
851
  port: app.port,
623
852
  running: Boolean(app.process && !app.process.killed),
624
853
  }))));
@@ -626,7 +855,7 @@ export function runWorkspaceDev(options = {}) {
626
855
  }
627
856
  let app = appForRequest(req);
628
857
  if (!app) {
629
- syncApps();
858
+ await syncApps().catch(() => { });
630
859
  app = appForRequest(req);
631
860
  }
632
861
  if (!app) {
@@ -707,12 +936,9 @@ function isDirectRun() {
707
936
  }
708
937
  }
709
938
  if (isDirectRun()) {
710
- try {
711
- runWorkspaceDev({ args: process.argv.slice(2) });
712
- }
713
- catch (err) {
939
+ runWorkspaceDev({ args: process.argv.slice(2) }).catch((err) => {
714
940
  console.error(err instanceof Error ? err.message : String(err));
715
941
  process.exit(1);
716
- }
942
+ });
717
943
  }
718
944
  //# sourceMappingURL=workspace-dev.js.map