@jami-studio/core 0.92.34 → 0.92.36

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.
@@ -25,6 +25,13 @@ export interface DiscoveredRoute {
25
25
  }
26
26
  /**
27
27
  * Discover all API routes in a project's server/routes/ directory.
28
+ *
29
+ * Scans the `/api` and `/_agent-native` subtrees plus TOP-LEVEL route files
30
+ * (e.g. analytics `track.post.ts` → `POST /track`, an ingest endpoint that
31
+ * deliberately lives outside `/api`). Top-level catch-alls (`[...page].get.ts`
32
+ * — the SSR page fallback every template ships) are excluded: on serverless
33
+ * workers pages are served by the static app shell, and mounting the
34
+ * catch-all would shadow it.
28
35
  */
29
36
  export declare function discoverApiRoutes(cwd: string): Promise<DiscoveredRoute[]>;
30
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"route-discovery.d.ts","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CA2BP;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapE;AASD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY1D,CAAC;AAWF,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB3C;AAyKD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB7E"}
1
+ {"version":3,"file":"route-discovery.d.ts","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CA2BP;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAuC5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapE;AASD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY1D,CAAC;AAWF,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB3C;AAyKD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB7E"}
@@ -67,13 +67,42 @@ export async function discoverFiles(dir, prefix = "") {
67
67
  }
68
68
  /**
69
69
  * Discover all API routes in a project's server/routes/ directory.
70
+ *
71
+ * Scans the `/api` and `/_agent-native` subtrees plus TOP-LEVEL route files
72
+ * (e.g. analytics `track.post.ts` → `POST /track`, an ingest endpoint that
73
+ * deliberately lives outside `/api`). Top-level catch-alls (`[...page].get.ts`
74
+ * — the SSR page fallback every template ships) are excluded: on serverless
75
+ * workers pages are served by the static app shell, and mounting the
76
+ * catch-all would shadow it.
70
77
  */
71
78
  export async function discoverApiRoutes(cwd) {
79
+ const fs = await getFs();
80
+ const routesDir = path.join(cwd, "server/routes");
72
81
  const apiDir = path.join(cwd, "server/routes/api");
73
82
  const agentNativeDir = path.join(cwd, "server/routes/_agent-native");
83
+ const topLevelFiles = [];
84
+ try {
85
+ if (fs.existsSync(routesDir)) {
86
+ for (const entry of fs.readdirSync(routesDir, { withFileTypes: true })) {
87
+ if (entry.isDirectory())
88
+ continue;
89
+ if (!entry.name.endsWith(".ts") && !entry.name.endsWith(".js")) {
90
+ continue;
91
+ }
92
+ // Skip page catch-alls — the static shell owns page serving.
93
+ if (entry.name.startsWith("[..."))
94
+ continue;
95
+ topLevelFiles.push(entry.name);
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ // Edge runtime — no filesystem.
101
+ }
74
102
  const routeFiles = [
75
103
  ...(await discoverFiles(apiDir, "api")),
76
104
  ...(await discoverFiles(agentNativeDir, "_agent-native")),
105
+ ...topLevelFiles,
77
106
  ];
78
107
  const routes = [];
79
108
  for (const relFile of routeFiles) {
@@ -1 +1 @@
1
- {"version":3,"file":"route-discovery.js","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\n\r\n// Lazy fs — loaded via dynamic import() on first use.\r\n// Avoids require() which bundlers convert to createRequire() that crashes on CF Workers.\r\nlet _fs: typeof import(\"fs\") | undefined;\r\nasync function getFs(): Promise<typeof import(\"fs\")> {\r\n if (!_fs) {\r\n _fs = await import(\"node:fs\");\r\n }\r\n return _fs;\r\n}\r\n\r\n/**\r\n * Map a Nitro-style route file path to { method, route }.\r\n *\r\n * Examples:\r\n * api/emails/index.get.ts → GET /api/emails\r\n * api/emails/[id].get.ts → GET /api/emails/:id\r\n * api/emails/[id]/star.patch.ts→ PATCH /api/emails/:id/star\r\n * api/events.get.ts → GET /api/events\r\n */\r\nexport function parseRouteFile(relPath: string): {\r\n method: string;\r\n route: string;\r\n} | null {\r\n // Strip .ts/.js extension\r\n const withoutExt = relPath.replace(/\\.[tj]s$/, \"\");\r\n\r\n // Extract HTTP method from the last segment (e.g. \"status.get\" → method=\"get\")\r\n const dotIdx = withoutExt.lastIndexOf(\".\");\r\n if (dotIdx === -1) return null;\r\n\r\n const method = withoutExt.slice(dotIdx + 1).toLowerCase();\r\n const validMethods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"];\r\n if (!validMethods.includes(method)) return null;\r\n\r\n let routePath = withoutExt.slice(0, dotIdx);\r\n\r\n // Replace [param] with :param\r\n routePath = routePath.replace(/\\[([^\\]]+)\\]/g, \":$1\");\r\n\r\n // Replace [...catchall] with ** (H3 catch-all syntax, value in params._)\r\n routePath = routePath.replace(/:\\.\\.\\.([^/]+)/g, \"**\");\r\n\r\n // Remove trailing /index\r\n routePath = routePath.replace(/\\/index$/, \"\");\r\n\r\n // Ensure leading slash\r\n if (!routePath.startsWith(\"/\")) routePath = \"/\" + routePath;\r\n\r\n return { method, route: routePath };\r\n}\r\n\r\n/**\r\n * Recursively discover all .ts files under a directory.\r\n */\r\nexport async function discoverFiles(\r\n dir: string,\r\n prefix = \"\",\r\n): Promise<string[]> {\r\n try {\r\n const fs = await getFs();\r\n if (!fs.existsSync(dir)) return [];\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n const files: string[] = [];\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n files.push(...(await discoverFiles(path.join(dir, entry.name), rel)));\r\n } else if (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\")) {\r\n files.push(rel);\r\n }\r\n }\r\n return files;\r\n } catch {\r\n return []; // Edge runtime — no filesystem\r\n }\r\n}\r\n\r\nexport interface DiscoveredRoute {\r\n method: string;\r\n route: string;\r\n /** Relative path from server/routes/ */\r\n filePath: string;\r\n /** Absolute path on disk */\r\n absPath: string;\r\n}\r\n\r\n/**\r\n * Discover all API routes in a project's server/routes/ directory.\r\n */\r\nexport async function discoverApiRoutes(\r\n cwd: string,\r\n): Promise<DiscoveredRoute[]> {\r\n const apiDir = path.join(cwd, \"server/routes/api\");\r\n const agentNativeDir = path.join(cwd, \"server/routes/_agent-native\");\r\n const routeFiles = [\r\n ...(await discoverFiles(apiDir, \"api\")),\r\n ...(await discoverFiles(agentNativeDir, \"_agent-native\")),\r\n ];\r\n const routes: DiscoveredRoute[] = [];\r\n\r\n for (const relFile of routeFiles) {\r\n const parsed = parseRouteFile(relFile);\r\n if (!parsed) continue;\r\n routes.push({\r\n ...parsed,\r\n filePath: relFile,\r\n absPath: path.join(cwd, \"server/routes\", relFile),\r\n });\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n/**\r\n * Discover all server plugins in a project's server/plugins/ directory.\r\n */\r\nexport async function discoverPlugins(cwd: string): Promise<string[]> {\r\n try {\r\n const fs = await getFs();\r\n const pluginsDir = path.join(cwd, \"server/plugins\");\r\n if (!fs.existsSync(pluginsDir)) return [];\r\n return fs\r\n .readdirSync(pluginsDir)\r\n .filter(isRuntimeSourceFile)\r\n .sort()\r\n .map((f) => path.join(pluginsDir, f));\r\n } catch {\r\n return []; // Edge runtime — no filesystem\r\n }\r\n}\r\n\r\nfunction isRuntimeSourceFile(filename: string): boolean {\r\n if (!/\\.(ts|js)$/.test(filename)) return false;\r\n if (/\\.d\\.ts$/.test(filename)) return false;\r\n if (/\\.(test|spec)\\.(ts|js)$/.test(filename)) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Default plugins that auto-mount when not provided by the template.\r\n * Key = filename stem, value = export name from @agent-native/core/server/edge.\r\n */\r\nexport const DEFAULT_PLUGIN_REGISTRY: Record<string, string> = {\r\n \"agent-chat\": \"defaultAgentChatPlugin\",\r\n auth: \"defaultAuthPlugin\",\r\n \"context-xray\": \"defaultContextXrayPlugin\",\r\n \"core-routes\": \"defaultCoreRoutesPlugin\",\r\n integrations: \"defaultIntegrationsPlugin\",\r\n \"observational-memory\": \"defaultObservationalMemoryPlugin\",\r\n onboarding: \"defaultOnboardingPlugin\",\r\n org: \"defaultOrgPlugin\",\r\n resources: \"defaultResourcesPlugin\",\r\n sentry: \"defaultSentryPlugin\",\r\n terminal: \"defaultTerminalPlugin\",\r\n};\r\n\r\n/** Files to skip during action discovery (mirrors action-discovery.ts). */\r\nconst SKIP_ACTION_FILES = new Set([\r\n \"helpers\",\r\n \"run\",\r\n \"db-connect\",\r\n \"db-status\",\r\n \"registry\",\r\n]);\r\n\r\nexport interface DiscoveredAction {\r\n /** Action name (filename without extension) */\r\n name: string;\r\n /** Absolute path to the action file */\r\n absPath: string;\r\n /** HTTP method (from defineAction's http config, default POST) */\r\n method: string;\r\n /**\r\n * Custom route segment from defineAction's `http.path`. When unset the\r\n * route falls back to `name`, mirroring the runtime mount\r\n * (`action-routes.ts`: `path = http?.path ?? name`).\r\n */\r\n path?: string;\r\n}\r\n\r\n/** HTTP methods an action may expose via `http.method`. */\r\nconst VALID_ACTION_METHODS = new Set([\r\n \"get\",\r\n \"post\",\r\n \"put\",\r\n \"patch\",\r\n \"delete\",\r\n \"options\",\r\n \"head\",\r\n]);\r\n\r\n/**\r\n * Statically extract the `http` config from a defineAction source file.\r\n *\r\n * Deploy discovery cannot import the action module — edge bundlers rewrite\r\n * require()/import in ways that crash (see getFs note above), and action\r\n * files often pull in Node-only deps — so we parse the source text instead.\r\n * The parse is scoped to the `http: { ... }` object literal so unrelated\r\n * `method:`/`path:` keys elsewhere in the file (e.g. a\r\n * `fetch(url, { method: \"GET\" })` in the action body) cannot flip the\r\n * route's method. A naive `content.includes('method: \"GET\"')` did exactly\r\n * that, and it also missed PUT/PATCH/DELETE and dropped `http.path`.\r\n *\r\n * The http config may contain nested object literals before `method` or\r\n * `path`, so extract the object body with a small balanced-brace scan rather\r\n * than a non-greedy regex that stops at the first closing brace.\r\n *\r\n * Returns `false` when the action opts out of HTTP (`http: false`); otherwise\r\n * `{ method, path? }` with method lowercased and defaulting to \"post\".\r\n */\r\nexport function parseActionHttpConfig(\r\n content: string,\r\n): false | { method: string; path?: string } {\r\n let method = \"post\";\r\n let path: string | undefined;\r\n\r\n const httpConfig = extractActionHttpConfig(content);\r\n if (httpConfig === false) return false;\r\n\r\n if (typeof httpConfig === \"string\") {\r\n const body = httpConfig;\r\n const methodMatch = body.match(/\\bmethod\\s*:\\s*['\"]([A-Za-z]+)['\"]/);\r\n if (methodMatch) {\r\n const m = methodMatch[1].toLowerCase();\r\n if (VALID_ACTION_METHODS.has(m)) method = m;\r\n }\r\n const pathMatch = body.match(/\\bpath\\s*:\\s*['\"]([^'\"]+)['\"]/);\r\n if (pathMatch) path = pathMatch[1];\r\n }\r\n\r\n return { method, path };\r\n}\r\n\r\nfunction extractActionHttpConfig(content: string): false | string | undefined {\r\n for (let i = 0; i < content.length; ) {\r\n const skipped = skipNonCode(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n if (\r\n content.startsWith(\"http\", i) &&\r\n !isIdentifierChar(content[i - 1]) &&\r\n !isIdentifierChar(content[i + 4])\r\n ) {\r\n let valueStart = skipWhitespaceAndComments(content, i + 4);\r\n if (content[valueStart] !== \":\") {\r\n i += 4;\r\n continue;\r\n }\r\n\r\n valueStart = skipWhitespaceAndComments(content, valueStart + 1);\r\n if (\r\n content.startsWith(\"false\", valueStart) &&\r\n !isIdentifierChar(content[valueStart + 5])\r\n ) {\r\n return false;\r\n }\r\n\r\n if (content[valueStart] === \"{\") {\r\n return extractBalancedObjectBody(content, valueStart);\r\n }\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction extractBalancedObjectBody(\r\n content: string,\r\n openBraceIndex: number,\r\n): string | undefined {\r\n let depth = 0;\r\n for (let i = openBraceIndex; i < content.length; ) {\r\n const skipped = skipNonCode(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n const ch = content[i];\r\n if (ch === \"{\") {\r\n depth += 1;\r\n } else if (ch === \"}\") {\r\n depth -= 1;\r\n if (depth === 0) return content.slice(openBraceIndex + 1, i);\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction skipWhitespaceAndComments(content: string, start: number): number {\r\n let i = start;\r\n while (i < content.length) {\r\n if (/\\s/.test(content[i])) {\r\n i += 1;\r\n continue;\r\n }\r\n\r\n const skipped = skipComment(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n break;\r\n }\r\n return i;\r\n}\r\n\r\nfunction skipNonCode(content: string, start: number): number {\r\n return skipComment(content, skipString(content, start));\r\n}\r\n\r\nfunction skipComment(content: string, start: number): number {\r\n if (content[start] === \"/\" && content[start + 1] === \"/\") {\r\n const newline = content.indexOf(\"\\n\", start + 2);\r\n return newline === -1 ? content.length : newline + 1;\r\n }\r\n\r\n if (content[start] === \"/\" && content[start + 1] === \"*\") {\r\n const close = content.indexOf(\"*/\", start + 2);\r\n return close === -1 ? content.length : close + 2;\r\n }\r\n\r\n return start;\r\n}\r\n\r\nfunction skipString(content: string, start: number): number {\r\n const quote = content[start];\r\n if (quote !== \"'\" && quote !== '\"' && quote !== \"`\") return start;\r\n\r\n for (let i = start + 1; i < content.length; i += 1) {\r\n if (content[i] === \"\\\\\") {\r\n i += 1;\r\n continue;\r\n }\r\n if (content[i] === quote) return i + 1;\r\n }\r\n\r\n return content.length;\r\n}\r\n\r\nfunction isIdentifierChar(ch: string | undefined): boolean {\r\n return ch !== undefined && /[A-Za-z0-9_$]/.test(ch);\r\n}\r\n\r\n/**\r\n * Scan a single actions directory for defineAction-backed files. Shared\r\n * between the template-actions path and the workspace-core actions layer.\r\n */\r\nasync function scanActionsDir(actionsDir: string): Promise<DiscoveredAction[]> {\r\n const fs = await getFs();\r\n if (!fs.existsSync(actionsDir)) return [];\r\n\r\n const files = fs.readdirSync(actionsDir).filter((f) => {\r\n if (!isRuntimeSourceFile(f)) return false;\r\n const name = f.replace(/\\.(ts|js)$/, \"\");\r\n if (name.startsWith(\"_\")) return false;\r\n if (SKIP_ACTION_FILES.has(name)) return false;\r\n return true;\r\n });\r\n\r\n const out: DiscoveredAction[] = [];\r\n for (const file of files) {\r\n const name = file.replace(/\\.(ts|js)$/, \"\");\r\n const absPath = path.join(actionsDir, file);\r\n\r\n // Only mount actions that use defineAction. CLI-style scripts\r\n // (export default async function()) often use Node-only APIs\r\n // (fs, path) that can't run on edge runtimes — they're meant\r\n // to be invoked via `pnpm action <name>`, not as HTTP endpoints.\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(absPath, \"utf-8\");\r\n } catch {\r\n continue;\r\n }\r\n if (!content.includes(\"defineAction\")) continue;\r\n\r\n const http = parseActionHttpConfig(content);\r\n if (http === false) continue; // agent-only\r\n\r\n out.push({\r\n name,\r\n absPath,\r\n method: http.method,\r\n ...(http.path ? { path: http.path } : {}),\r\n });\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * Discover action files in the actions/ directory.\r\n *\r\n * When a workspace core is present in the ancestor chain, its actions/\r\n * directory is also scanned and its actions are merged in after the\r\n * template's — with template actions winning on name collision.\r\n *\r\n * These become `/_agent-native/actions/:name` HTTP endpoints.\r\n */\r\nexport async function discoverActionFiles(\r\n cwd: string,\r\n): Promise<DiscoveredAction[]> {\r\n const templateActions = await scanActionsDir(path.join(cwd, \"actions\"));\r\n const byName = new Map<string, DiscoveredAction>();\r\n for (const a of templateActions) byName.set(a.name, a);\r\n\r\n // Merge workspace-core actions (template wins on collision).\r\n try {\r\n const { getWorkspaceCoreExports } = await import(\"./workspace-core.js\");\r\n const ws = await getWorkspaceCoreExports(cwd);\r\n if (ws && ws.actionsDir) {\r\n const wsActions = await scanActionsDir(ws.actionsDir);\r\n for (const a of wsActions) {\r\n if (!byName.has(a.name)) byName.set(a.name, a);\r\n }\r\n }\r\n } catch {\r\n // Edge runtime / no fs — skip workspace-core merge.\r\n }\r\n\r\n return Array.from(byName.values());\r\n}\r\n\r\n/**\r\n * Returns the stems of default plugins that are missing from the project.\r\n */\r\nexport async function getMissingDefaultPlugins(cwd: string): Promise<string[]> {\r\n let existingStems: Set<string>;\r\n try {\r\n const fs = await getFs();\r\n const pluginsDir = path.join(cwd, \"server/plugins\");\r\n existingStems = new Set(\r\n fs.existsSync(pluginsDir)\r\n ? fs\r\n .readdirSync(pluginsDir)\r\n .filter(isRuntimeSourceFile)\r\n .map((f) => path.basename(f, path.extname(f)))\r\n : [],\r\n );\r\n } catch {\r\n existingStems = new Set(); // Edge runtime — all defaults will be auto-mounted\r\n }\r\n return Object.keys(DEFAULT_PLUGIN_REGISTRY).filter(\r\n (stem) => !existingStems.has(stem),\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"route-discovery.js","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\n\r\n// Lazy fs — loaded via dynamic import() on first use.\r\n// Avoids require() which bundlers convert to createRequire() that crashes on CF Workers.\r\nlet _fs: typeof import(\"fs\") | undefined;\r\nasync function getFs(): Promise<typeof import(\"fs\")> {\r\n if (!_fs) {\r\n _fs = await import(\"node:fs\");\r\n }\r\n return _fs;\r\n}\r\n\r\n/**\r\n * Map a Nitro-style route file path to { method, route }.\r\n *\r\n * Examples:\r\n * api/emails/index.get.ts → GET /api/emails\r\n * api/emails/[id].get.ts → GET /api/emails/:id\r\n * api/emails/[id]/star.patch.ts→ PATCH /api/emails/:id/star\r\n * api/events.get.ts → GET /api/events\r\n */\r\nexport function parseRouteFile(relPath: string): {\r\n method: string;\r\n route: string;\r\n} | null {\r\n // Strip .ts/.js extension\r\n const withoutExt = relPath.replace(/\\.[tj]s$/, \"\");\r\n\r\n // Extract HTTP method from the last segment (e.g. \"status.get\" → method=\"get\")\r\n const dotIdx = withoutExt.lastIndexOf(\".\");\r\n if (dotIdx === -1) return null;\r\n\r\n const method = withoutExt.slice(dotIdx + 1).toLowerCase();\r\n const validMethods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"];\r\n if (!validMethods.includes(method)) return null;\r\n\r\n let routePath = withoutExt.slice(0, dotIdx);\r\n\r\n // Replace [param] with :param\r\n routePath = routePath.replace(/\\[([^\\]]+)\\]/g, \":$1\");\r\n\r\n // Replace [...catchall] with ** (H3 catch-all syntax, value in params._)\r\n routePath = routePath.replace(/:\\.\\.\\.([^/]+)/g, \"**\");\r\n\r\n // Remove trailing /index\r\n routePath = routePath.replace(/\\/index$/, \"\");\r\n\r\n // Ensure leading slash\r\n if (!routePath.startsWith(\"/\")) routePath = \"/\" + routePath;\r\n\r\n return { method, route: routePath };\r\n}\r\n\r\n/**\r\n * Recursively discover all .ts files under a directory.\r\n */\r\nexport async function discoverFiles(\r\n dir: string,\r\n prefix = \"\",\r\n): Promise<string[]> {\r\n try {\r\n const fs = await getFs();\r\n if (!fs.existsSync(dir)) return [];\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n const files: string[] = [];\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n files.push(...(await discoverFiles(path.join(dir, entry.name), rel)));\r\n } else if (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\")) {\r\n files.push(rel);\r\n }\r\n }\r\n return files;\r\n } catch {\r\n return []; // Edge runtime — no filesystem\r\n }\r\n}\r\n\r\nexport interface DiscoveredRoute {\r\n method: string;\r\n route: string;\r\n /** Relative path from server/routes/ */\r\n filePath: string;\r\n /** Absolute path on disk */\r\n absPath: string;\r\n}\r\n\r\n/**\r\n * Discover all API routes in a project's server/routes/ directory.\r\n *\r\n * Scans the `/api` and `/_agent-native` subtrees plus TOP-LEVEL route files\r\n * (e.g. analytics `track.post.ts` → `POST /track`, an ingest endpoint that\r\n * deliberately lives outside `/api`). Top-level catch-alls (`[...page].get.ts`\r\n * — the SSR page fallback every template ships) are excluded: on serverless\r\n * workers pages are served by the static app shell, and mounting the\r\n * catch-all would shadow it.\r\n */\r\nexport async function discoverApiRoutes(\r\n cwd: string,\r\n): Promise<DiscoveredRoute[]> {\r\n const fs = await getFs();\r\n const routesDir = path.join(cwd, \"server/routes\");\r\n const apiDir = path.join(cwd, \"server/routes/api\");\r\n const agentNativeDir = path.join(cwd, \"server/routes/_agent-native\");\r\n const topLevelFiles: string[] = [];\r\n try {\r\n if (fs.existsSync(routesDir)) {\r\n for (const entry of fs.readdirSync(routesDir, { withFileTypes: true })) {\r\n if (entry.isDirectory()) continue;\r\n if (!entry.name.endsWith(\".ts\") && !entry.name.endsWith(\".js\")) {\r\n continue;\r\n }\r\n // Skip page catch-alls — the static shell owns page serving.\r\n if (entry.name.startsWith(\"[...\")) continue;\r\n topLevelFiles.push(entry.name);\r\n }\r\n }\r\n } catch {\r\n // Edge runtime — no filesystem.\r\n }\r\n const routeFiles = [\r\n ...(await discoverFiles(apiDir, \"api\")),\r\n ...(await discoverFiles(agentNativeDir, \"_agent-native\")),\r\n ...topLevelFiles,\r\n ];\r\n const routes: DiscoveredRoute[] = [];\r\n\r\n for (const relFile of routeFiles) {\r\n const parsed = parseRouteFile(relFile);\r\n if (!parsed) continue;\r\n routes.push({\r\n ...parsed,\r\n filePath: relFile,\r\n absPath: path.join(cwd, \"server/routes\", relFile),\r\n });\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n/**\r\n * Discover all server plugins in a project's server/plugins/ directory.\r\n */\r\nexport async function discoverPlugins(cwd: string): Promise<string[]> {\r\n try {\r\n const fs = await getFs();\r\n const pluginsDir = path.join(cwd, \"server/plugins\");\r\n if (!fs.existsSync(pluginsDir)) return [];\r\n return fs\r\n .readdirSync(pluginsDir)\r\n .filter(isRuntimeSourceFile)\r\n .sort()\r\n .map((f) => path.join(pluginsDir, f));\r\n } catch {\r\n return []; // Edge runtime — no filesystem\r\n }\r\n}\r\n\r\nfunction isRuntimeSourceFile(filename: string): boolean {\r\n if (!/\\.(ts|js)$/.test(filename)) return false;\r\n if (/\\.d\\.ts$/.test(filename)) return false;\r\n if (/\\.(test|spec)\\.(ts|js)$/.test(filename)) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Default plugins that auto-mount when not provided by the template.\r\n * Key = filename stem, value = export name from @agent-native/core/server/edge.\r\n */\r\nexport const DEFAULT_PLUGIN_REGISTRY: Record<string, string> = {\r\n \"agent-chat\": \"defaultAgentChatPlugin\",\r\n auth: \"defaultAuthPlugin\",\r\n \"context-xray\": \"defaultContextXrayPlugin\",\r\n \"core-routes\": \"defaultCoreRoutesPlugin\",\r\n integrations: \"defaultIntegrationsPlugin\",\r\n \"observational-memory\": \"defaultObservationalMemoryPlugin\",\r\n onboarding: \"defaultOnboardingPlugin\",\r\n org: \"defaultOrgPlugin\",\r\n resources: \"defaultResourcesPlugin\",\r\n sentry: \"defaultSentryPlugin\",\r\n terminal: \"defaultTerminalPlugin\",\r\n};\r\n\r\n/** Files to skip during action discovery (mirrors action-discovery.ts). */\r\nconst SKIP_ACTION_FILES = new Set([\r\n \"helpers\",\r\n \"run\",\r\n \"db-connect\",\r\n \"db-status\",\r\n \"registry\",\r\n]);\r\n\r\nexport interface DiscoveredAction {\r\n /** Action name (filename without extension) */\r\n name: string;\r\n /** Absolute path to the action file */\r\n absPath: string;\r\n /** HTTP method (from defineAction's http config, default POST) */\r\n method: string;\r\n /**\r\n * Custom route segment from defineAction's `http.path`. When unset the\r\n * route falls back to `name`, mirroring the runtime mount\r\n * (`action-routes.ts`: `path = http?.path ?? name`).\r\n */\r\n path?: string;\r\n}\r\n\r\n/** HTTP methods an action may expose via `http.method`. */\r\nconst VALID_ACTION_METHODS = new Set([\r\n \"get\",\r\n \"post\",\r\n \"put\",\r\n \"patch\",\r\n \"delete\",\r\n \"options\",\r\n \"head\",\r\n]);\r\n\r\n/**\r\n * Statically extract the `http` config from a defineAction source file.\r\n *\r\n * Deploy discovery cannot import the action module — edge bundlers rewrite\r\n * require()/import in ways that crash (see getFs note above), and action\r\n * files often pull in Node-only deps — so we parse the source text instead.\r\n * The parse is scoped to the `http: { ... }` object literal so unrelated\r\n * `method:`/`path:` keys elsewhere in the file (e.g. a\r\n * `fetch(url, { method: \"GET\" })` in the action body) cannot flip the\r\n * route's method. A naive `content.includes('method: \"GET\"')` did exactly\r\n * that, and it also missed PUT/PATCH/DELETE and dropped `http.path`.\r\n *\r\n * The http config may contain nested object literals before `method` or\r\n * `path`, so extract the object body with a small balanced-brace scan rather\r\n * than a non-greedy regex that stops at the first closing brace.\r\n *\r\n * Returns `false` when the action opts out of HTTP (`http: false`); otherwise\r\n * `{ method, path? }` with method lowercased and defaulting to \"post\".\r\n */\r\nexport function parseActionHttpConfig(\r\n content: string,\r\n): false | { method: string; path?: string } {\r\n let method = \"post\";\r\n let path: string | undefined;\r\n\r\n const httpConfig = extractActionHttpConfig(content);\r\n if (httpConfig === false) return false;\r\n\r\n if (typeof httpConfig === \"string\") {\r\n const body = httpConfig;\r\n const methodMatch = body.match(/\\bmethod\\s*:\\s*['\"]([A-Za-z]+)['\"]/);\r\n if (methodMatch) {\r\n const m = methodMatch[1].toLowerCase();\r\n if (VALID_ACTION_METHODS.has(m)) method = m;\r\n }\r\n const pathMatch = body.match(/\\bpath\\s*:\\s*['\"]([^'\"]+)['\"]/);\r\n if (pathMatch) path = pathMatch[1];\r\n }\r\n\r\n return { method, path };\r\n}\r\n\r\nfunction extractActionHttpConfig(content: string): false | string | undefined {\r\n for (let i = 0; i < content.length; ) {\r\n const skipped = skipNonCode(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n if (\r\n content.startsWith(\"http\", i) &&\r\n !isIdentifierChar(content[i - 1]) &&\r\n !isIdentifierChar(content[i + 4])\r\n ) {\r\n let valueStart = skipWhitespaceAndComments(content, i + 4);\r\n if (content[valueStart] !== \":\") {\r\n i += 4;\r\n continue;\r\n }\r\n\r\n valueStart = skipWhitespaceAndComments(content, valueStart + 1);\r\n if (\r\n content.startsWith(\"false\", valueStart) &&\r\n !isIdentifierChar(content[valueStart + 5])\r\n ) {\r\n return false;\r\n }\r\n\r\n if (content[valueStart] === \"{\") {\r\n return extractBalancedObjectBody(content, valueStart);\r\n }\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction extractBalancedObjectBody(\r\n content: string,\r\n openBraceIndex: number,\r\n): string | undefined {\r\n let depth = 0;\r\n for (let i = openBraceIndex; i < content.length; ) {\r\n const skipped = skipNonCode(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n const ch = content[i];\r\n if (ch === \"{\") {\r\n depth += 1;\r\n } else if (ch === \"}\") {\r\n depth -= 1;\r\n if (depth === 0) return content.slice(openBraceIndex + 1, i);\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction skipWhitespaceAndComments(content: string, start: number): number {\r\n let i = start;\r\n while (i < content.length) {\r\n if (/\\s/.test(content[i])) {\r\n i += 1;\r\n continue;\r\n }\r\n\r\n const skipped = skipComment(content, i);\r\n if (skipped !== i) {\r\n i = skipped;\r\n continue;\r\n }\r\n\r\n break;\r\n }\r\n return i;\r\n}\r\n\r\nfunction skipNonCode(content: string, start: number): number {\r\n return skipComment(content, skipString(content, start));\r\n}\r\n\r\nfunction skipComment(content: string, start: number): number {\r\n if (content[start] === \"/\" && content[start + 1] === \"/\") {\r\n const newline = content.indexOf(\"\\n\", start + 2);\r\n return newline === -1 ? content.length : newline + 1;\r\n }\r\n\r\n if (content[start] === \"/\" && content[start + 1] === \"*\") {\r\n const close = content.indexOf(\"*/\", start + 2);\r\n return close === -1 ? content.length : close + 2;\r\n }\r\n\r\n return start;\r\n}\r\n\r\nfunction skipString(content: string, start: number): number {\r\n const quote = content[start];\r\n if (quote !== \"'\" && quote !== '\"' && quote !== \"`\") return start;\r\n\r\n for (let i = start + 1; i < content.length; i += 1) {\r\n if (content[i] === \"\\\\\") {\r\n i += 1;\r\n continue;\r\n }\r\n if (content[i] === quote) return i + 1;\r\n }\r\n\r\n return content.length;\r\n}\r\n\r\nfunction isIdentifierChar(ch: string | undefined): boolean {\r\n return ch !== undefined && /[A-Za-z0-9_$]/.test(ch);\r\n}\r\n\r\n/**\r\n * Scan a single actions directory for defineAction-backed files. Shared\r\n * between the template-actions path and the workspace-core actions layer.\r\n */\r\nasync function scanActionsDir(actionsDir: string): Promise<DiscoveredAction[]> {\r\n const fs = await getFs();\r\n if (!fs.existsSync(actionsDir)) return [];\r\n\r\n const files = fs.readdirSync(actionsDir).filter((f) => {\r\n if (!isRuntimeSourceFile(f)) return false;\r\n const name = f.replace(/\\.(ts|js)$/, \"\");\r\n if (name.startsWith(\"_\")) return false;\r\n if (SKIP_ACTION_FILES.has(name)) return false;\r\n return true;\r\n });\r\n\r\n const out: DiscoveredAction[] = [];\r\n for (const file of files) {\r\n const name = file.replace(/\\.(ts|js)$/, \"\");\r\n const absPath = path.join(actionsDir, file);\r\n\r\n // Only mount actions that use defineAction. CLI-style scripts\r\n // (export default async function()) often use Node-only APIs\r\n // (fs, path) that can't run on edge runtimes — they're meant\r\n // to be invoked via `pnpm action <name>`, not as HTTP endpoints.\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(absPath, \"utf-8\");\r\n } catch {\r\n continue;\r\n }\r\n if (!content.includes(\"defineAction\")) continue;\r\n\r\n const http = parseActionHttpConfig(content);\r\n if (http === false) continue; // agent-only\r\n\r\n out.push({\r\n name,\r\n absPath,\r\n method: http.method,\r\n ...(http.path ? { path: http.path } : {}),\r\n });\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * Discover action files in the actions/ directory.\r\n *\r\n * When a workspace core is present in the ancestor chain, its actions/\r\n * directory is also scanned and its actions are merged in after the\r\n * template's — with template actions winning on name collision.\r\n *\r\n * These become `/_agent-native/actions/:name` HTTP endpoints.\r\n */\r\nexport async function discoverActionFiles(\r\n cwd: string,\r\n): Promise<DiscoveredAction[]> {\r\n const templateActions = await scanActionsDir(path.join(cwd, \"actions\"));\r\n const byName = new Map<string, DiscoveredAction>();\r\n for (const a of templateActions) byName.set(a.name, a);\r\n\r\n // Merge workspace-core actions (template wins on collision).\r\n try {\r\n const { getWorkspaceCoreExports } = await import(\"./workspace-core.js\");\r\n const ws = await getWorkspaceCoreExports(cwd);\r\n if (ws && ws.actionsDir) {\r\n const wsActions = await scanActionsDir(ws.actionsDir);\r\n for (const a of wsActions) {\r\n if (!byName.has(a.name)) byName.set(a.name, a);\r\n }\r\n }\r\n } catch {\r\n // Edge runtime / no fs — skip workspace-core merge.\r\n }\r\n\r\n return Array.from(byName.values());\r\n}\r\n\r\n/**\r\n * Returns the stems of default plugins that are missing from the project.\r\n */\r\nexport async function getMissingDefaultPlugins(cwd: string): Promise<string[]> {\r\n let existingStems: Set<string>;\r\n try {\r\n const fs = await getFs();\r\n const pluginsDir = path.join(cwd, \"server/plugins\");\r\n existingStems = new Set(\r\n fs.existsSync(pluginsDir)\r\n ? fs\r\n .readdirSync(pluginsDir)\r\n .filter(isRuntimeSourceFile)\r\n .map((f) => path.basename(f, path.extname(f)))\r\n : [],\r\n );\r\n } catch {\r\n existingStems = new Set(); // Edge runtime — all defaults will be auto-mounted\r\n }\r\n return Object.keys(DEFAULT_PLUGIN_REGISTRY).filter(\r\n (stem) => !existingStems.has(stem),\r\n );\r\n}\r\n"]}
@@ -41,28 +41,28 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
41
41
  thumbsUpRate: number;
42
42
  avgEvalScore: number;
43
43
  } | {
44
- error?: undefined;
45
- ok?: undefined;
46
44
  summary: import("./types.js").TraceSummary;
47
45
  spans: import("./types.js").TraceSpan[];
48
46
  id?: undefined;
49
- } | {
50
47
  error?: undefined;
51
48
  ok?: undefined;
49
+ } | {
52
50
  summary?: undefined;
53
51
  spans?: undefined;
54
52
  id: string;
55
- } | {
53
+ error?: undefined;
56
54
  ok?: undefined;
55
+ } | {
57
56
  summary?: undefined;
58
57
  spans?: undefined;
59
58
  id?: undefined;
60
59
  error: any;
60
+ ok?: undefined;
61
61
  } | {
62
- error?: undefined;
63
62
  summary?: undefined;
64
63
  spans?: undefined;
65
64
  id?: undefined;
66
65
  ok: boolean;
66
+ error?: undefined;
67
67
  }>>;
68
68
  //# sourceMappingURL=routes.d.ts.map
@@ -15,7 +15,7 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- error?: undefined;
19
18
  ok: boolean;
19
+ error?: undefined;
20
20
  }>>;
21
21
  //# sourceMappingURL=routes.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jami-studio/core",
3
- "version": "0.92.34",
3
+ "version": "0.92.36",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/studio-jami/jami-studio#readme",
6
6
  "bugs": {