@agent-native/core 0.59.1 → 0.61.0

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 (201) hide show
  1. package/dist/a2a/index.d.ts +2 -0
  2. package/dist/a2a/index.d.ts.map +1 -1
  3. package/dist/a2a/index.js +1 -0
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/a2a/invoke.d.ts +63 -0
  6. package/dist/a2a/invoke.d.ts.map +1 -0
  7. package/dist/a2a/invoke.js +157 -0
  8. package/dist/a2a/invoke.js.map +1 -0
  9. package/dist/agent/run-store.d.ts +15 -0
  10. package/dist/agent/run-store.d.ts.map +1 -1
  11. package/dist/agent/run-store.js +28 -0
  12. package/dist/agent/run-store.js.map +1 -1
  13. package/dist/chat-threads/store.d.ts +21 -0
  14. package/dist/chat-threads/store.d.ts.map +1 -1
  15. package/dist/chat-threads/store.js +128 -0
  16. package/dist/chat-threads/store.js.map +1 -1
  17. package/dist/cli/agent.d.ts +23 -0
  18. package/dist/cli/agent.d.ts.map +1 -0
  19. package/dist/cli/agent.js +300 -0
  20. package/dist/cli/agent.js.map +1 -0
  21. package/dist/cli/agents.d.ts +14 -0
  22. package/dist/cli/agents.d.ts.map +1 -0
  23. package/dist/cli/agents.js +95 -0
  24. package/dist/cli/agents.js.map +1 -0
  25. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  26. package/dist/cli/code-agent-executor.js +264 -2
  27. package/dist/cli/code-agent-executor.js.map +1 -1
  28. package/dist/cli/create.d.ts +3 -2
  29. package/dist/cli/create.d.ts.map +1 -1
  30. package/dist/cli/create.js +154 -83
  31. package/dist/cli/create.js.map +1 -1
  32. package/dist/cli/index.js +50 -2
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/invoke.d.ts +26 -0
  35. package/dist/cli/invoke.d.ts.map +1 -0
  36. package/dist/cli/invoke.js +227 -0
  37. package/dist/cli/invoke.js.map +1 -0
  38. package/dist/cli/templates-meta.d.ts +1 -1
  39. package/dist/cli/templates-meta.d.ts.map +1 -1
  40. package/dist/cli/templates-meta.js +9 -8
  41. package/dist/cli/templates-meta.js.map +1 -1
  42. package/dist/cli/workspacify.d.ts +1 -1
  43. package/dist/cli/workspacify.d.ts.map +1 -1
  44. package/dist/cli/workspacify.js +6 -6
  45. package/dist/cli/workspacify.js.map +1 -1
  46. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  47. package/dist/client/NewWorkspaceAppFlow.js +5 -4
  48. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  49. package/dist/client/blocks/library/diagram.d.ts.map +1 -1
  50. package/dist/client/blocks/library/diagram.js +23 -17
  51. package/dist/client/blocks/library/diagram.js.map +1 -1
  52. package/dist/client/blocks/types.d.ts +2 -0
  53. package/dist/client/blocks/types.d.ts.map +1 -1
  54. package/dist/client/blocks/types.js.map +1 -1
  55. package/dist/client/chat/index.d.ts +1 -1
  56. package/dist/client/chat/index.d.ts.map +1 -1
  57. package/dist/client/chat/index.js.map +1 -1
  58. package/dist/client/index.d.ts +1 -1
  59. package/dist/client/index.d.ts.map +1 -1
  60. package/dist/client/index.js.map +1 -1
  61. package/dist/client/settings/useBuilderStatus.d.ts +10 -0
  62. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  63. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  64. package/dist/client/use-chat-threads.d.ts +13 -0
  65. package/dist/client/use-chat-threads.d.ts.map +1 -1
  66. package/dist/client/use-chat-threads.js +41 -0
  67. package/dist/client/use-chat-threads.js.map +1 -1
  68. package/dist/integrations/plugin.d.ts.map +1 -1
  69. package/dist/integrations/plugin.js +2 -2
  70. package/dist/integrations/plugin.js.map +1 -1
  71. package/dist/onboarding/default-steps.d.ts.map +1 -1
  72. package/dist/onboarding/default-steps.js +102 -0
  73. package/dist/onboarding/default-steps.js.map +1 -1
  74. package/dist/provider-api/actions/github-repo-files.d.ts +84 -0
  75. package/dist/provider-api/actions/github-repo-files.d.ts.map +1 -0
  76. package/dist/provider-api/actions/github-repo-files.js +213 -0
  77. package/dist/provider-api/actions/github-repo-files.js.map +1 -0
  78. package/dist/provider-api/github-repo.d.ts +11 -0
  79. package/dist/provider-api/github-repo.d.ts.map +1 -0
  80. package/dist/provider-api/github-repo.js +553 -0
  81. package/dist/provider-api/github-repo.js.map +1 -0
  82. package/dist/provider-api/index.d.ts +184 -11
  83. package/dist/provider-api/index.d.ts.map +1 -1
  84. package/dist/provider-api/index.js +519 -0
  85. package/dist/provider-api/index.js.map +1 -1
  86. package/dist/scripts/docs/search.d.ts.map +1 -1
  87. package/dist/scripts/docs/search.js +38 -13
  88. package/dist/scripts/docs/search.js.map +1 -1
  89. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  90. package/dist/secrets/register-framework-secrets.js +11 -0
  91. package/dist/secrets/register-framework-secrets.js.map +1 -1
  92. package/dist/server/agent-chat-plugin.d.ts +32 -0
  93. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  94. package/dist/server/agent-chat-plugin.js +297 -2
  95. package/dist/server/agent-chat-plugin.js.map +1 -1
  96. package/dist/server/auth-marketing.d.ts.map +1 -1
  97. package/dist/server/auth-marketing.js +17 -7
  98. package/dist/server/auth-marketing.js.map +1 -1
  99. package/dist/server/auth.d.ts.map +1 -1
  100. package/dist/server/auth.js +6 -0
  101. package/dist/server/auth.js.map +1 -1
  102. package/dist/server/builder-browser.d.ts +11 -0
  103. package/dist/server/builder-browser.d.ts.map +1 -1
  104. package/dist/server/builder-browser.js.map +1 -1
  105. package/dist/server/builder-space.d.ts +47 -0
  106. package/dist/server/builder-space.d.ts.map +1 -0
  107. package/dist/server/builder-space.js +142 -0
  108. package/dist/server/builder-space.js.map +1 -0
  109. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  110. package/dist/server/core-routes-plugin.js +39 -98
  111. package/dist/server/core-routes-plugin.js.map +1 -1
  112. package/dist/server/credential-provider.d.ts.map +1 -1
  113. package/dist/server/credential-provider.js +29 -6
  114. package/dist/server/credential-provider.js.map +1 -1
  115. package/dist/styles/blocks.css +30 -8
  116. package/dist/styles/rich-markdown-editor.css +10 -4
  117. package/dist/templates/{starter-shell-sync.spec.ts → chat-shell-sync.spec.ts} +21 -21
  118. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -5
  119. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +63 -0
  120. package/dist/templates/default/AGENTS.md +22 -1
  121. package/dist/templates/default/actions/hello.ts +1 -1
  122. package/dist/templates/default/actions/navigate.ts +1 -1
  123. package/dist/templates/default/actions/view-screen.ts +1 -1
  124. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +63 -0
  125. package/dist/templates/headless/.env.example +4 -0
  126. package/dist/templates/headless/.prettierrc +5 -0
  127. package/dist/templates/headless/AGENTS.md +58 -0
  128. package/dist/templates/headless/DEVELOPING.md +22 -0
  129. package/dist/templates/headless/_gitignore +36 -0
  130. package/dist/templates/headless/actions/hello.ts +14 -0
  131. package/dist/templates/headless/actions/run.ts +3 -0
  132. package/dist/templates/headless/package.json +22 -0
  133. package/dist/templates/headless/tsconfig.json +7 -0
  134. package/dist/templates/ui-primitives-sync.spec.ts +2 -2
  135. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -5
  136. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +63 -0
  137. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +93 -0
  138. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +1 -1
  139. package/dist/templates/workspace-core/AGENTS.md +20 -3
  140. package/dist/templates/workspace-core/src/server/index.ts +1 -1
  141. package/dist/templates/workspace-root/AGENTS.md +25 -5
  142. package/dist/templates/workspace-root/README.md +7 -7
  143. package/dist/triggers/dispatcher.d.ts +2 -3
  144. package/dist/triggers/dispatcher.d.ts.map +1 -1
  145. package/dist/triggers/dispatcher.js +2 -3
  146. package/dist/triggers/dispatcher.js.map +1 -1
  147. package/dist/triggers/routes.d.ts +38 -0
  148. package/dist/triggers/routes.d.ts.map +1 -0
  149. package/dist/triggers/routes.js +202 -0
  150. package/dist/triggers/routes.js.map +1 -0
  151. package/docs/AGENTS.md +57 -0
  152. package/docs/SKILL.md +40 -0
  153. package/docs/content/a2a-protocol.md +1 -1
  154. package/docs/content/actions.md +48 -8
  155. package/docs/content/agent-surfaces.md +76 -14
  156. package/docs/content/cli-adapters.md +1 -1
  157. package/docs/content/cloneable-saas.md +5 -4
  158. package/docs/content/code-agents-ui.md +1 -1
  159. package/docs/content/components.md +1 -1
  160. package/docs/content/context-awareness.md +1 -1
  161. package/docs/content/creating-templates.md +9 -7
  162. package/docs/content/drop-in-agent.md +1 -1
  163. package/docs/content/faq.md +6 -4
  164. package/docs/content/getting-started.md +63 -73
  165. package/docs/content/key-concepts.md +24 -24
  166. package/docs/content/native-chat-ui.md +4 -4
  167. package/docs/content/pure-agent-apps.md +34 -10
  168. package/docs/content/security.md +1 -1
  169. package/docs/content/server.md +1 -1
  170. package/docs/content/template-chat.md +85 -0
  171. package/docs/content/template-dispatch.md +1 -1
  172. package/docs/content/tracking.md +1 -1
  173. package/docs/content/what-is-agent-native.md +7 -6
  174. package/package.json +10 -1
  175. package/src/templates/{starter-shell-sync.spec.ts → chat-shell-sync.spec.ts} +21 -21
  176. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -5
  177. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +63 -0
  178. package/src/templates/default/AGENTS.md +22 -1
  179. package/src/templates/default/actions/hello.ts +1 -1
  180. package/src/templates/default/actions/navigate.ts +1 -1
  181. package/src/templates/default/actions/view-screen.ts +1 -1
  182. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +63 -0
  183. package/src/templates/headless/.env.example +4 -0
  184. package/src/templates/headless/.prettierrc +5 -0
  185. package/src/templates/headless/AGENTS.md +58 -0
  186. package/src/templates/headless/DEVELOPING.md +22 -0
  187. package/src/templates/headless/_gitignore +36 -0
  188. package/src/templates/headless/actions/hello.ts +14 -0
  189. package/src/templates/headless/actions/run.ts +3 -0
  190. package/src/templates/headless/package.json +22 -0
  191. package/src/templates/headless/tsconfig.json +7 -0
  192. package/src/templates/ui-primitives-sync.spec.ts +2 -2
  193. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -5
  194. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +63 -0
  195. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +93 -0
  196. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +1 -1
  197. package/src/templates/workspace-core/AGENTS.md +20 -3
  198. package/src/templates/workspace-core/src/server/index.ts +1 -1
  199. package/src/templates/workspace-root/AGENTS.md +25 -5
  200. package/src/templates/workspace-root/README.md +7 -7
  201. package/docs/content/template-starter.md +0 -78
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-space.js","sourceRoot":"","sources":["../../src/server/builder-space.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resolve the human-readable Builder *space* a private key is scoped to.\n *\n * There is no public-key path to a space's display name; it comes from the\n * Builder Admin GraphQL API (`https://builder.io/api/v2/admin`) authenticated\n * with the private `bpk-…` key we already hold at user scope. A `bpk-` key is\n * space-scoped, so today this resolves the single connected space — but the\n * function returns a *list* so the multi-space drill-down can grow additively\n * (multiple credentials → multiple spaces) without a restructure.\n *\n * The exact `settings` field holding the display name is undocumented, so the\n * parser is deliberately defensive: it requests the whole `settings` JSON blob\n * and pulls the first plausible name/id field. Callers fall back to the generic\n * `orgName` when this returns nothing.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface BuilderSpaceSummary {\n id: string;\n name: string;\n}\n\ninterface BuilderAdminGraphQlResponse {\n data?: { settings?: unknown } | null;\n errors?: Array<{ message?: string }> | null;\n}\n\ninterface SpaceCacheEntry {\n expiresAt: number;\n spaces: BuilderSpaceSummary[];\n}\n\n// The admin API is polled indirectly via the Builder status route, which the\n// client refetches often. Cache per key so a poll storm hits Builder once.\n// A resolved name is cached for a while; an empty/failed lookup is cached only\n// briefly so a transient Builder hiccup recovers without hammering the API.\nconst SPACE_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SPACE_NEGATIVE_TTL_MS = 60 * 1000;\nconst SPACE_CACHE_MAX_ENTRIES = 100;\n// Hard cap on the admin call — the status route must never block on Builder.\nconst ADMIN_FETCH_TIMEOUT_MS = 4000;\nconst spaceCache = new Map<string, SpaceCacheEntry>();\n\n// `query { settings }` selects the whole JSONObject scalar, so we don't have to\n// know the sub-field names up front — we parse the returned blob below.\nconst BUILDER_SPACE_SETTINGS_QUERY =\n \"query AgentNativeSpaceSettings { settings }\";\n\nconst SPACE_NAME_FIELDS = [\n \"name\",\n \"displayName\",\n \"siteName\",\n \"spaceName\",\n \"title\",\n \"organizationName\",\n] as const;\n\nconst SPACE_ID_FIELDS = [\"id\", \"spaceId\", \"publicKey\"] as const;\n\nfunction builderAdminApiHost() {\n return (\n process.env.BUILDER_ADMIN_API_HOST ?? \"https://builder.io/api/v2/admin\"\n ).replace(/\\/+$/, \"\");\n}\n\nfunction cacheKey(privateKey: string) {\n return createHash(\"sha256\").update(privateKey).digest(\"hex\");\n}\n\nfunction setCachedSpaces(key: string, entry: SpaceCacheEntry) {\n if (!spaceCache.has(key) && spaceCache.size >= SPACE_CACHE_MAX_ENTRIES) {\n const [oldest] = spaceCache.keys();\n if (oldest) spaceCache.delete(oldest);\n }\n spaceCache.set(key, entry);\n}\n\nfunction firstString(\n record: Record<string, unknown>,\n fields: readonly string[],\n): string | null {\n for (const field of fields) {\n const value = record[field];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return null;\n}\n\nexport function parseSpacesFromSettings(\n json: BuilderAdminGraphQlResponse,\n): BuilderSpaceSummary[] {\n const settings = json?.data?.settings;\n if (!settings || typeof settings !== \"object\") return [];\n const record = settings as Record<string, unknown>;\n const name = firstString(record, SPACE_NAME_FIELDS);\n if (!name) return [];\n const id = firstString(record, SPACE_ID_FIELDS) ?? name;\n return [{ id, name }];\n}\n\n/**\n * Synchronously read the cached space list for a key, or null if there's no\n * fresh entry. The status route uses this to stay non-blocking — it returns\n * whatever is cached now and kicks `listBuilderSpaces` in the background to\n * populate the cache for the next poll.\n */\nexport function getCachedBuilderSpaces(\n privateKey: string,\n): BuilderSpaceSummary[] | null {\n if (!privateKey) return null;\n const cached = spaceCache.get(cacheKey(privateKey));\n if (cached && Date.now() < cached.expiresAt) return cached.spaces;\n return null;\n}\n\n/**\n * List the Builder spaces reachable with this private key. Best-effort: returns\n * `[]` on any network/auth/parse failure (caller should fall back to orgName).\n */\nexport async function listBuilderSpaces(\n privateKey: string,\n options?: { fetchImpl?: typeof fetch; signal?: AbortSignal },\n): Promise<BuilderSpaceSummary[]> {\n if (!privateKey) return [];\n\n const key = cacheKey(privateKey);\n const cached = spaceCache.get(key);\n if (cached && Date.now() < cached.expiresAt) {\n return cached.spaces;\n }\n\n const fetchImpl = options?.fetchImpl ?? fetch;\n // Cap the admin call ourselves so a stalled Builder can't hang the status\n // route. If the caller passed its own signal, respect it instead.\n const timeoutController = options?.signal ? null : new AbortController();\n const timeout = timeoutController\n ? setTimeout(() => timeoutController.abort(), ADMIN_FETCH_TIMEOUT_MS)\n : null;\n let spaces: BuilderSpaceSummary[] = [];\n try {\n const response = await fetchImpl(builderAdminApiHost(), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${privateKey}`,\n },\n body: JSON.stringify({ query: BUILDER_SPACE_SETTINGS_QUERY }),\n signal: options?.signal ?? timeoutController?.signal,\n });\n if (response.ok) {\n const json = (await response.json()) as BuilderAdminGraphQlResponse;\n spaces = parseSpacesFromSettings(json);\n }\n } catch {\n // Network / timeout / admin API unavailable — fall through to the empty\n // list; the caller falls back to orgName.\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n\n // Cache a resolved name for the full TTL; cache an empty/failed lookup only\n // briefly so a transient Builder hiccup recovers without per-poll hammering.\n setCachedSpaces(key, {\n expiresAt:\n Date.now() +\n (spaces.length > 0 ? SPACE_CACHE_TTL_MS : SPACE_NEGATIVE_TTL_MS),\n spaces,\n });\n return spaces;\n}\n\n/** Test/maintenance hook — drop cached space lookups. */\nexport function clearBuilderSpaceCache() {\n spaceCache.clear();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAuBlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA+CvD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA4DzD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AACvD,eAAO,MAAM,sBAAsB,0BAAqC,CAAC;AACzE,eAAO,MAAM,6BAA6B,+BAA0C,CAAC;AAErF,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQrE;AAmBD,eAAO,MAAM,kBAAkB,QAAwC,CAAC;AA0HxE,KAAK,6BAA6B,GAAG,CACnC,KAAK,EAAE,OAAO,KACX,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,6BAA6B,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACjE,EACN,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAsD9B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CASf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;wCACoC;IACpC,eAAe,CAAC,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChF,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,6BAA6B,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CA0iFhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
1
+ {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAuBlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA+CvD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA6DzD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AACvD,eAAO,MAAM,sBAAsB,0BAAqC,CAAC;AACzE,eAAO,MAAM,6BAA6B,+BAA0C,CAAC;AAErF,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQrE;AAmBD,eAAO,MAAM,kBAAkB,QAAwC,CAAC;AA0HxE,KAAK,6BAA6B,GAAG,CACnC,KAAK,EAAE,OAAO,KACX,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAsB,oCAAoC,CACxD,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,6BAA6B,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACjE,EACN,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAsD9B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CASf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;wCACoC;IACpC,eAAe,CAAC,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChF,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,6BAA6B,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CA89EhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
@@ -34,6 +34,7 @@ import { validateTrackPayload } from "../tracking/route.js";
34
34
  import { registerBuiltinNotificationChannels } from "../notifications/channels.js";
35
35
  import { createNotificationsHandler } from "../notifications/routes.js";
36
36
  import { createProgressHandler } from "../progress/routes.js";
37
+ import { createAutomationsHandler } from "../triggers/routes.js";
37
38
  import { createGoogleRealtimeSessionHandler } from "./google-realtime-session.js";
38
39
  import { createTranscribeVoiceHandler } from "./transcribe-voice.js";
39
40
  import { runWithRequestContext } from "./request-context.js";
@@ -445,6 +446,21 @@ export function createCoreRoutesPlugin(options = {}) {
445
446
  // See `csrf.ts` for the threat model and allowlist.
446
447
  const { createCsrfMiddleware } = await import("./csrf.js");
447
448
  getH3App(nitroApp).use(createCsrfMiddleware(P));
449
+ // Agent discovery primitive — shared by headless CLI/A2A surfaces and
450
+ // UI shells that need to show connected peer apps without depending on
451
+ // the chat route namespace.
452
+ getH3App(nitroApp).use(`${P}/agents`, defineEventHandler(async (event) => {
453
+ const method = getMethod(event);
454
+ if (method !== "GET") {
455
+ setResponseStatus(event, 405);
456
+ return { error: "Method not allowed" };
457
+ }
458
+ const query = getRequestURL(event).searchParams;
459
+ const selfAppId = query.get("selfAppId") ?? undefined;
460
+ const { discoverAgents } = await import("./agent-discovery.js");
461
+ const agents = await discoverAgents(selfAppId);
462
+ return { agents };
463
+ }));
448
464
  // Demo-mode status — read by the client fetch interceptor and the
449
465
  // Demo mode settings toggle. `forced` reflects the DEMO_MODE env (a
450
466
  // hosted demo deployment); `enabled` ORs that with the per-user
@@ -643,6 +659,26 @@ export function createCoreRoutesPlugin(options = {}) {
643
659
  });
644
660
  }
645
661
  if (creds.privateKey && creds.publicKey) {
662
+ // Best-effort: surface the real space name(s) from Builder's
663
+ // Admin API. Stay NON-BLOCKING — return whatever is cached now
664
+ // and refresh in the background for the next poll. Falls back
665
+ // to orgName until the cache warms.
666
+ let spaces;
667
+ try {
668
+ const { getCachedBuilderSpaces, listBuilderSpaces } = await import("./builder-space.js");
669
+ const privateKey = creds.privateKey;
670
+ const cachedSpaces = getCachedBuilderSpaces(privateKey);
671
+ if (cachedSpaces && cachedSpaces.length > 0) {
672
+ spaces = cachedSpaces;
673
+ }
674
+ if (!cachedSpaces) {
675
+ // Warm the cache without blocking this response.
676
+ void listBuilderSpaces(privateKey).catch(() => { });
677
+ }
678
+ }
679
+ catch {
680
+ // Admin API helper unavailable — leave spaces undefined.
681
+ }
646
682
  return withConnectToken({
647
683
  ...requestStatus,
648
684
  configured: true,
@@ -650,6 +686,7 @@ export function createCoreRoutesPlugin(options = {}) {
650
686
  publicKeyConfigured: !!creds.publicKey,
651
687
  userId: creds.userId || envStatus.userId,
652
688
  orgName: creds.orgName || envStatus.orgName,
689
+ spaces,
653
690
  orgKind: creds.orgKind || envStatus.orgKind,
654
691
  subscription: creds.subscription || envStatus.subscription || undefined,
655
692
  subscriptionLevel: creds.subscriptionLevel ||
@@ -1982,105 +2019,9 @@ export function createCoreRoutesPlugin(options = {}) {
1982
2019
  getH3App(nitroApp).use(`${P}/runs`, createProgressHandler());
1983
2020
  // ─── Automations API ──────────────────────────────────────────────
1984
2021
  // GET /_agent-native/automations — list all automations (parsed triggers)
2022
+ // PATCH /_agent-native/automations — enable/disable a jobs/*.md automation
1985
2023
  // POST /_agent-native/automations/fire-test — emit test.event.fired
1986
- getH3App(nitroApp).use(`${P}/automations`, defineEventHandler(async (event) => {
1987
- const method = getMethod(event);
1988
- const pathname = (event.path || event.url?.pathname || "")
1989
- .split("?")[0]
1990
- .replace(/^\/+/, "")
1991
- .replace(/\/+$/, "");
1992
- // Auth check applies to every method. Without this, any anonymous
1993
- // caller could `POST /fire-test` to emit unowned events that fan
1994
- // out across every tenant's matching trigger (the dispatcher
1995
- // short-circuits its owner check when `eventMeta.owner` is
1996
- // undefined). See audit 12 / fire-test finding.
1997
- const session = await getSession(event).catch(() => null);
1998
- if (!session?.email) {
1999
- setResponseStatus(event, 401);
2000
- return { error: "Unauthenticated" };
2001
- }
2002
- if ((pathname === "fire-test" || pathname.endsWith("/fire-test")) &&
2003
- method === "POST") {
2004
- try {
2005
- const { emit } = await import("../event-bus/index.js");
2006
- const body = (await readBody(event).catch(() => ({})));
2007
- // Scope the test event to the current user so only their
2008
- // automations fire, not those owned by other tenants.
2009
- emit("test.event.fired", { data: body.data ?? {} }, {
2010
- owner: session.email,
2011
- });
2012
- return { ok: true };
2013
- }
2014
- catch (err) {
2015
- setResponseStatus(event, 500);
2016
- return { error: err?.message ?? "Failed to emit test event" };
2017
- }
2018
- }
2019
- if (method !== "GET") {
2020
- setResponseStatus(event, 405);
2021
- return { error: "Method not allowed" };
2022
- }
2023
- try {
2024
- const owner = session.email;
2025
- const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
2026
- const allResources = await resourceListAllOwners("jobs/");
2027
- const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
2028
- const FRONT_RE = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
2029
- const automations = resources
2030
- .filter((r) => r.path.endsWith(".md") && !r.path.endsWith(".keep"))
2031
- .map((r) => {
2032
- const match = r.content.match(FRONT_RE);
2033
- if (!match)
2034
- return {
2035
- id: r.id,
2036
- name: r.path.replace(/^jobs\//, "").replace(/\.md$/, ""),
2037
- path: r.path,
2038
- owner: r.owner,
2039
- triggerType: "schedule",
2040
- enabled: false,
2041
- mode: "agentic",
2042
- body: r.content,
2043
- };
2044
- const yaml = match[1];
2045
- const body = match[2].trim();
2046
- const meta = {};
2047
- for (const line of yaml.split("\n")) {
2048
- const ci = line.indexOf(":");
2049
- if (ci === -1)
2050
- continue;
2051
- const k = line.slice(0, ci).trim();
2052
- let v = line.slice(ci + 1).trim();
2053
- if ((v.startsWith('"') && v.endsWith('"')) ||
2054
- (v.startsWith("'") && v.endsWith("'")))
2055
- v = v.slice(1, -1);
2056
- meta[k] = v;
2057
- }
2058
- return {
2059
- id: r.id,
2060
- name: r.path.replace(/^jobs\//, "").replace(/\.md$/, ""),
2061
- path: r.path,
2062
- owner: r.owner,
2063
- triggerType: meta.triggerType || "schedule",
2064
- event: meta.event,
2065
- schedule: meta.schedule,
2066
- condition: meta.condition,
2067
- mode: meta.mode || "agentic",
2068
- domain: meta.domain,
2069
- enabled: meta.enabled !== "false",
2070
- lastStatus: meta.lastStatus,
2071
- lastRun: meta.lastRun,
2072
- lastError: meta.lastError,
2073
- createdBy: meta.createdBy,
2074
- body,
2075
- };
2076
- });
2077
- return automations;
2078
- }
2079
- catch (err) {
2080
- setResponseStatus(event, 500);
2081
- return { error: err?.message ?? "Failed to list automations" };
2082
- }
2083
- }));
2024
+ getH3App(nitroApp).use(`${P}/automations`, createAutomationsHandler());
2084
2025
  // ─── Application State CRUD ──────────────────────────────────────
2085
2026
  // Auto-mounted so templates don't need boilerplate route files.
2086
2027
  // ─── User-scoped settings store ────────────────────────────────────