@agent-native/core 0.20.8 → 0.20.9

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 (62) hide show
  1. package/dist/cli/connect.d.ts +13 -4
  2. package/dist/cli/connect.d.ts.map +1 -1
  3. package/dist/cli/connect.js +86 -6
  4. package/dist/cli/connect.js.map +1 -1
  5. package/dist/cli/templates-meta.d.ts.map +1 -1
  6. package/dist/cli/templates-meta.js +1 -0
  7. package/dist/cli/templates-meta.js.map +1 -1
  8. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  9. package/dist/client/agent-chat-adapter.js +25 -4
  10. package/dist/client/agent-chat-adapter.js.map +1 -1
  11. package/dist/client/composer/TiptapComposer.js +1 -1
  12. package/dist/client/composer/TiptapComposer.js.map +1 -1
  13. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  14. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  15. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  16. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  17. package/dist/client/extensions/ExtensionEditor.js +6 -3
  18. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  19. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  20. package/dist/client/extensions/ExtensionViewer.js +66 -2
  21. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  22. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  23. package/dist/client/extensions/ExtensionsListPage.js +2 -1
  24. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  25. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  26. package/dist/client/extensions/ExtensionsSidebarSection.js +5 -7
  27. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  28. package/dist/client/extensions/index.d.ts +1 -0
  29. package/dist/client/extensions/index.d.ts.map +1 -1
  30. package/dist/client/extensions/index.js +1 -0
  31. package/dist/client/extensions/index.js.map +1 -1
  32. package/dist/db/client.d.ts +19 -0
  33. package/dist/db/client.d.ts.map +1 -1
  34. package/dist/db/client.js +136 -5
  35. package/dist/db/client.js.map +1 -1
  36. package/dist/extensions/actions.d.ts.map +1 -1
  37. package/dist/extensions/actions.js +6 -2
  38. package/dist/extensions/actions.js.map +1 -1
  39. package/dist/extensions/path.d.ts +6 -0
  40. package/dist/extensions/path.d.ts.map +1 -0
  41. package/dist/extensions/path.js +38 -0
  42. package/dist/extensions/path.js.map +1 -0
  43. package/dist/mcp/connect-store.d.ts +1 -1
  44. package/dist/mcp/connect-store.d.ts.map +1 -1
  45. package/dist/mcp/connect-store.js +1 -1
  46. package/dist/mcp/connect-store.js.map +1 -1
  47. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  48. package/dist/server/agent-chat-plugin.js +8 -1
  49. package/dist/server/agent-chat-plugin.js.map +1 -1
  50. package/dist/server/auth.d.ts +2 -0
  51. package/dist/server/auth.d.ts.map +1 -1
  52. package/dist/server/auth.js +2 -2
  53. package/dist/server/auth.js.map +1 -1
  54. package/dist/server/framework-request-handler.d.ts +4 -2
  55. package/dist/server/framework-request-handler.d.ts.map +1 -1
  56. package/dist/server/framework-request-handler.js +25 -11
  57. package/dist/server/framework-request-handler.js.map +1 -1
  58. package/dist/server/index.d.ts +1 -1
  59. package/dist/server/index.d.ts.map +1 -1
  60. package/dist/server/index.js +1 -1
  61. package/dist/server/index.js.map +1 -1
  62. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Central database client abstraction.\n *\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\n * and returns a unified `DbExec` interface that all core stores use.\n *\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\n * Cloudflare Workers, edge) without failing on missing native deps.\n */\nimport path from \"path\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbExec {\n execute(\n sql: string | { sql: string; args: any[] },\n ): Promise<{ rows: any[]; rowsAffected: number }>;\n}\n\nexport interface DbExecConfig {\n url?: string;\n authToken?: string;\n d1Binding?: any;\n}\n\n// ---------------------------------------------------------------------------\n// Per-app DATABASE_URL resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the database URL for the current app.\n *\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\n * then falls back to `DATABASE_URL`. This allows multiple apps to run in the\n * same process group (e.g. `dev:all` or builder.io) with separate databases.\n *\n * Set `APP_NAME=mail` in the child process env and\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\n */\nexport function getDatabaseUrl(fallback = \"\"): string {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_URL`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_URL || fallback;\n}\n\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\nexport function getDatabaseAuthToken(): string | undefined {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_AUTH_TOKEN;\n}\n\nexport function isLocalSqliteUrl(url: string): boolean {\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\n}\n\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\n if (!url.startsWith(\"file:\")) return url;\n\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\n // working directory is read-only. Detect this and redirect local SQLite to\n // /tmp which IS writable (ephemeral per invocation, but the server stays\n // alive for the request). Shares the canonical isServerlessRuntime() check.\n const isServerless = isServerlessRuntime();\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n return \"file:///tmp/data/app.db\";\n }\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n } catch {\n // Edge runtime — no filesystem.\n }\n return url;\n}\n\nexport function sqliteFilenameFromUrl(url: string): string {\n if (url.startsWith(\"file://\")) {\n return decodeURIComponent(new URL(url).pathname);\n }\n if (url.startsWith(\"file:\")) {\n return url.slice(\"file:\".length) || \":memory:\";\n }\n return url || \"./data/app.db\";\n}\n\n// ---------------------------------------------------------------------------\n// Safe JSON column parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON-serialized column value defensively. A malformed row — from a\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\n * must not break an entire list endpoint. Callers supply a fallback for the\n * malformed path; null/undefined values also fall back.\n */\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null) return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SQLite retry helper\n// ---------------------------------------------------------------------------\n\n/**\n * Retry an async operation when it fails with SQLITE_BUSY.\n * Used during WAL initialization and migrations where a stale WAL from a\n * previous crash or HMR restart can briefly lock the database.\n */\nexport async function retrySqliteBusy<T>(\n fn: () => Promise<T>,\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\n): Promise<T> {\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e: any) {\n last = e;\n const msg = String(e?.message || e);\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\n } else {\n break;\n }\n }\n }\n if (rethrow) throw last;\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\n}\n\n/**\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\n * to a Postgres pg_catalog race.\n *\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\n * `pg_class` catalog insert. When multiple processes boot concurrently and\n * issue the same CREATE, both can pass the existence check and one fails\n * with code 23505 on `pg_type_typname_nsp_index` or similar. The table does\n * end up created by the winner, so rerunning the same `IF NOT EXISTS`\n * statement is a safe no-op.\n */\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e: any) {\n if (!isPgCatalogRace(e)) throw e;\n return await fn();\n }\n}\n\nfunction isPgCatalogRace(e: any): boolean {\n if (e?.code === \"42P07\") return true;\n if (e?.code !== \"23505\") return false;\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\n const detail = String(e?.detail ?? \"\");\n const msg = String(e?.message ?? \"\");\n return (\n constraint.startsWith(\"pg_type\") ||\n constraint.startsWith(\"pg_class\") ||\n detail.includes(\"pg_type\") ||\n detail.includes(\"pg_class\") ||\n /relation .* already exists/i.test(msg)\n );\n}\n\n/**\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\n * surface a clean \"already exists\" error instead of the raw SQL text.\n */\nexport function isUniqueViolation(e: any): boolean {\n if (e?.code === \"23505\") return true;\n const code = String(e?.code ?? \"\");\n if (\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\n ) {\n return true;\n }\n const msg = String(e?.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique constraint\") ||\n msg.includes(\"primary key constraint\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dialect detection\n// ---------------------------------------------------------------------------\n\nlet _dialect: Dialect | undefined;\n\nexport function getDialect(): Dialect {\n if (_dialect !== undefined) return _dialect;\n\n // DATABASE_URL takes priority over D1 when set.\n const url = getDatabaseUrl();\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n _dialect = \"postgres\";\n return _dialect;\n }\n if (url && !url.startsWith(\"file:\")) {\n // Remote libsql (e.g. Turso)\n _dialect = \"sqlite\";\n return _dialect;\n }\n\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _dialect = \"d1\";\n return _dialect;\n }\n\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\n // available at import time. If we cache \"sqlite\" here, D1 will never be\n // detected once the bindings are set in the fetch handler.\n return \"sqlite\";\n}\n\nexport function isPostgres(): boolean {\n return getDialect() === \"postgres\";\n}\n\nfunction dialectForConfig(config: DbExecConfig): Dialect {\n const url = config.url ?? \"\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n return \"postgres\";\n }\n if (url && !url.startsWith(\"file:\")) {\n return \"sqlite\";\n }\n if (config.d1Binding) {\n return \"d1\";\n }\n return \"sqlite\";\n}\n\n/**\n * Returns true when the database is a local-only SQLite file (or unset, which\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\n * (Turso), and D1 — any backend that could be shared across developers.\n *\n * Used to gate local@localhost mode: that mode uses a single shared virtual\n * user with no per-machine scoping, so on any shared database two developers\n * would read and write each other's settings, oauth tokens, and app state.\n */\nexport function isLocalDatabase(): boolean {\n if (getDialect() !== \"sqlite\") return false;\n const url = getDatabaseUrl();\n return url === \"\" || url.startsWith(\"file:\");\n}\n\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\nexport function intType(): string {\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion: ? -> $1, $2, $3\n// ---------------------------------------------------------------------------\n\nfunction sqliteToPostgresParams(sql: string): string {\n let i = 0;\n return sql.replace(/\\?/g, () => `$${++i}`);\n}\n\n// ---------------------------------------------------------------------------\n// Connection error retry (ECONNRESET, etc.)\n// ---------------------------------------------------------------------------\n\n/** Error codes that indicate a dead/stale connection we can safely retry. */\nconst CONNECTION_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"ENOTFOUND\",\n \"CONNECT_TIMEOUT\",\n \"CONNECTION_ENDED\",\n \"CONNECTION_DESTROYED\",\n \"CONNECTION_CLOSED\",\n]);\n\nexport function isConnectionError(err: any): boolean {\n if (!err) return false;\n const code = err.code || err.cause?.code;\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\n // Neon serverless WS driver: errors from the underlying undici WebSocket\n // closing mid-query come through as TypeError or ErrorEvent without a code.\n const name = err.name || err.cause?.name || \"\";\n if (name === \"ErrorEvent\") return true;\n const stack = String(err.stack || err.cause?.stack || \"\");\n if (\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\n stack,\n )\n ) {\n return true;\n }\n const msg = String(err.message || err.cause?.message || \"\");\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\n msg,\n );\n}\n\nexport async function retryOnConnectionError<T>(\n fn: () => Promise<T>,\n maxAttempts = 3,\n): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e) {\n last = e;\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\n }\n }\n throw last;\n}\n\n// ---------------------------------------------------------------------------\n// Serverless-aware Postgres pool options\n// ---------------------------------------------------------------------------\n\n/**\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\n * Cloudflare Pages Functions) where every concurrent request can spin up its\n * own frozen process. Connections cannot be shared across instances, so each\n * instance must keep its pool tiny — otherwise dozens of warm instances each\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\n * connections reached\".\n */\nexport function isServerlessRuntime(): boolean {\n return (\n !!process.env.NETLIFY ||\n !!process.env.VERCEL ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT ||\n !!process.env.CF_PAGES\n );\n}\n\n/**\n * postgres.js pool options tuned per runtime. A serverless instance handles\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\n * so a single slow query or open transaction can't serialize every other\n * query in the same request. Total connections stay bounded to ≈ 2×\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\n * serverless so a thawed-but-idle instance releases its connections quickly.\n * Long-lived Node servers keep the normal pool for throughput.\n */\nexport function pgPoolOptions(url: string): Record<string, unknown> {\n const serverless = isServerlessRuntime();\n return {\n onnotice: () => {},\n max: serverless ? 2 : 10,\n idle_timeout: serverless ? 20 : 240,\n max_lifetime: 60 * 30,\n connect_timeout: 10,\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\n // Only disable for Supabase URLs to avoid degrading other deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n };\n}\n\n/**\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\n * and keeps total connections bounded while still letting a second query\n * proceed when one connection is busy.\n */\nexport function neonPoolMax(): number {\n return isServerlessRuntime() ? 2 : 10;\n}\n\n// ---------------------------------------------------------------------------\n// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _sqlite: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function createDbExecInternal(\n config: DbExecConfig = {},\n trackSingletonResources = false,\n): Promise<DbExec> {\n const dialect = dialectForConfig(config);\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = config.d1Binding;\n return {\n async execute(sql) {\n if (typeof sql === \"string\") {\n const r = await d1.prepare(sql).all();\n return {\n rows: r.results || [],\n rowsAffected: r.meta?.changes ?? 0,\n };\n }\n const r = await d1\n .prepare(sql.sql)\n .bind(...sql.args)\n .all();\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\n },\n };\n }\n\n let url = config.url || \"file:./data/app.db\";\n\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\n // On Workers, connections can't be shared across requests, so we create a\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\n // different request\" error.\n if (dialect === \"postgres\") {\n const { isNeonUrl } = await import(\"./create-get-db.js\");\n\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\n // Neon's pooler is cold — every request after an idle period times out\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\n // and keeps the same `pg`-compatible query(...) interface we need here.\n if (isNeonUrl(url)) {\n const { Pool } = await import(\"@neondatabase/serverless\");\n const pool = new Pool({ connectionString: url, max: neonPoolMax() });\n // Neon's serverless Pool extends EventEmitter and emits 'error'\n // when its WebSocket connection drops (idle timeout, Lambda\n // suspend, network blip). Without a listener, Node 24 surfaces\n // these as fatal `Unhandled error` / `Connection terminated\n // unexpectedly` uncaught exceptions, even though the next query\n // would have transparently re-connected. Log and swallow.\n pool.on(\"error\", (err: unknown) => {\n console.warn(\n \"[db/neon] pool error (will reconnect on next query):\",\n err instanceof Error ? err.message : err,\n );\n });\n if (trackSingletonResources) _neonPool = pool;\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<{\n rows: unknown[];\n rowCount?: number;\n }>(() => pool.query(pgSql, args as any[]));\n return {\n rows: result.rows,\n rowsAffected: result.rowCount ?? 0,\n };\n },\n };\n }\n\n const { default: postgres } = await import(\"postgres\");\n const isWorkers =\n \"__cf_env\" in globalThis ||\n (typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\");\n\n if (isWorkers) {\n // Workers: fresh connection per query — I/O can't be shared across requests\n return {\n async execute(sql) {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n try {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await conn.unsafe(pgSql, args as any[]);\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n } finally {\n await conn.end();\n }\n },\n };\n } else {\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\n // frozen instances don't exhaust Neon/Postgres' connection limit;\n // idle_timeout also closes idle connections before Neon's ~5min\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\n const pool = postgres(url, pgPoolOptions(url));\n if (trackSingletonResources) _pgPool = pool;\n\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<\n ArrayLike<unknown> & { count?: number }\n >(() => pool.unsafe(pgSql, args as any[]));\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n }\n }\n\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\n // serverless bundles do not need libsql's platform-specific native package.\n if (isLocalSqliteUrl(url)) {\n url = await prepareLocalSqliteUrl(\n url.startsWith(\"file:\") ? url : `file:${url}`,\n );\n const { default: Database } = await import(\"better-sqlite3\");\n const sqlite = new Database(sqliteFilenameFromUrl(url));\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n if (trackSingletonResources) _sqlite = sqlite;\n\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const stmt = sqlite.prepare(rawSql);\n if (stmt.reader) {\n return {\n rows: stmt.all(...args),\n rowsAffected: 0,\n };\n }\n const result = stmt.run(...args);\n return {\n rows: [],\n rowsAffected: result.changes ?? 0,\n };\n },\n };\n }\n\n const { createClient } = await import(\"@libsql/client/web\");\n const client = createClient({\n url,\n authToken: config.authToken,\n });\n\n return {\n async execute(sql) {\n if (typeof sql === \"string\") {\n const r = await client.execute(sql);\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n }\n const r = await client.execute({\n sql: sql.sql,\n args: sql.args as any[],\n });\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n },\n };\n}\n\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\n return createDbExecInternal(config, false);\n}\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n const url = getDatabaseUrl(\"file:./data/app.db\");\n _exec = await createDbExecInternal(\n {\n url,\n authToken: getDatabaseAuthToken(),\n d1Binding: dialect === \"d1\" ? globalThis.__cf_env?.DB : undefined,\n },\n true,\n );\n}\n\n/**\n * Get the singleton database client. Returns a `DbExec` whose first\n * `execute()` call lazily initializes the underlying driver.\n */\nexport function getDbExec(): DbExec {\n if (_exec) return _exec;\n\n // Sanitize args: replace undefined with null (libsql rejects undefined)\n function sanitize(\n sql: string | { sql: string; args: any[] },\n ): string | { sql: string; args: any[] } {\n if (typeof sql === \"object\" && sql.args) {\n return { ...sql, args: sql.args.map((a: any) => a ?? null) };\n }\n return sql;\n }\n\n // Return a proxy that lazy-inits on first call\n const proxy: DbExec = {\n async execute(sql) {\n if (!_initPromise) _initPromise = initClient();\n await _initPromise;\n // After init, swap to a sanitizing wrapper around the real client\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n };\n Object.assign(proxy, wrapper);\n return _exec!.execute(sanitize(sql));\n },\n };\n return proxy;\n}\n\n/** Close the database connection (for scripts that need cleanup). */\nexport async function closeDbExec(): Promise<void> {\n if (_pgPool) {\n await _pgPool.end();\n _pgPool = undefined;\n }\n if (_neonPool) {\n await _neonPool.end();\n _neonPool = undefined;\n }\n if (_sqlite) {\n _sqlite.close();\n _sqlite = undefined;\n }\n _exec = undefined;\n _initPromise = undefined;\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Central database client abstraction.\n *\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\n * and returns a unified `DbExec` interface that all core stores use.\n *\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\n * Cloudflare Workers, edge) without failing on missing native deps.\n */\nimport path from \"path\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbExec {\n execute(\n sql: string | { sql: string; args: any[] },\n ): Promise<{ rows: any[]; rowsAffected: number }>;\n}\n\nexport interface DbExecConfig {\n url?: string;\n authToken?: string;\n d1Binding?: any;\n}\n\n// ---------------------------------------------------------------------------\n// Per-app DATABASE_URL resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the database URL for the current app.\n *\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\n * then falls back to `DATABASE_URL`. This allows multiple apps to run in the\n * same process group (e.g. `dev:all` or builder.io) with separate databases.\n *\n * Set `APP_NAME=mail` in the child process env and\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\n */\nexport function getDatabaseUrl(fallback = \"\"): string {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_URL`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_URL || fallback;\n}\n\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\nexport function getDatabaseAuthToken(): string | undefined {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_AUTH_TOKEN;\n}\n\nexport function isLocalSqliteUrl(url: string): boolean {\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\n}\n\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\n if (!url.startsWith(\"file:\")) return url;\n\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\n // working directory is read-only. Detect this and redirect local SQLite to\n // /tmp which IS writable (ephemeral per invocation, but the server stays\n // alive for the request). Shares the canonical isServerlessRuntime() check.\n const isServerless = isServerlessRuntime();\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n return \"file:///tmp/data/app.db\";\n }\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n } catch {\n // Edge runtime — no filesystem.\n }\n return url;\n}\n\nexport function sqliteFilenameFromUrl(url: string): string {\n if (url.startsWith(\"file://\")) {\n return decodeURIComponent(new URL(url).pathname);\n }\n if (url.startsWith(\"file:\")) {\n return url.slice(\"file:\".length) || \":memory:\";\n }\n return url || \"./data/app.db\";\n}\n\n// ---------------------------------------------------------------------------\n// Safe JSON column parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON-serialized column value defensively. A malformed row — from a\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\n * must not break an entire list endpoint. Callers supply a fallback for the\n * malformed path; null/undefined values also fall back.\n */\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null) return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SQLite retry helper\n// ---------------------------------------------------------------------------\n\n/**\n * Retry an async operation when it fails with SQLITE_BUSY.\n * Used during WAL initialization and migrations where a stale WAL from a\n * previous crash or HMR restart can briefly lock the database.\n */\nexport async function retrySqliteBusy<T>(\n fn: () => Promise<T>,\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\n): Promise<T> {\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e: any) {\n last = e;\n const msg = String(e?.message || e);\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\n } else {\n break;\n }\n }\n }\n if (rethrow) throw last;\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\n}\n\n/**\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\n * to a Postgres pg_catalog race.\n *\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\n * `pg_class` catalog insert. When multiple processes boot concurrently and\n * issue the same CREATE, both can pass the existence check and one fails\n * with code 23505 on `pg_type_typname_nsp_index` or similar. The table does\n * end up created by the winner, so rerunning the same `IF NOT EXISTS`\n * statement is a safe no-op.\n */\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e: any) {\n if (!isPgCatalogRace(e)) throw e;\n return await fn();\n }\n}\n\nfunction isPgCatalogRace(e: any): boolean {\n if (e?.code === \"42P07\") return true;\n if (e?.code !== \"23505\") return false;\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\n const detail = String(e?.detail ?? \"\");\n const msg = String(e?.message ?? \"\");\n return (\n constraint.startsWith(\"pg_type\") ||\n constraint.startsWith(\"pg_class\") ||\n detail.includes(\"pg_type\") ||\n detail.includes(\"pg_class\") ||\n /relation .* already exists/i.test(msg)\n );\n}\n\n/**\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\n * surface a clean \"already exists\" error instead of the raw SQL text.\n */\nexport function isUniqueViolation(e: any): boolean {\n if (e?.code === \"23505\") return true;\n const code = String(e?.code ?? \"\");\n if (\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\n ) {\n return true;\n }\n const msg = String(e?.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique constraint\") ||\n msg.includes(\"primary key constraint\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dialect detection\n// ---------------------------------------------------------------------------\n\nlet _dialect: Dialect | undefined;\n\nexport function getDialect(): Dialect {\n if (_dialect !== undefined) return _dialect;\n\n // DATABASE_URL takes priority over D1 when set.\n const url = getDatabaseUrl();\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n _dialect = \"postgres\";\n return _dialect;\n }\n if (url && !url.startsWith(\"file:\")) {\n // Remote libsql (e.g. Turso)\n _dialect = \"sqlite\";\n return _dialect;\n }\n\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _dialect = \"d1\";\n return _dialect;\n }\n\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\n // available at import time. If we cache \"sqlite\" here, D1 will never be\n // detected once the bindings are set in the fetch handler.\n return \"sqlite\";\n}\n\nexport function isPostgres(): boolean {\n return getDialect() === \"postgres\";\n}\n\nfunction dialectForConfig(config: DbExecConfig): Dialect {\n const url = config.url ?? \"\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n return \"postgres\";\n }\n if (url && !url.startsWith(\"file:\")) {\n return \"sqlite\";\n }\n if (config.d1Binding) {\n return \"d1\";\n }\n return \"sqlite\";\n}\n\n/**\n * Returns true when the database is a local-only SQLite file (or unset, which\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\n * (Turso), and D1 — any backend that could be shared across developers.\n *\n * Used to gate local@localhost mode: that mode uses a single shared virtual\n * user with no per-machine scoping, so on any shared database two developers\n * would read and write each other's settings, oauth tokens, and app state.\n */\nexport function isLocalDatabase(): boolean {\n if (getDialect() !== \"sqlite\") return false;\n const url = getDatabaseUrl();\n return url === \"\" || url.startsWith(\"file:\");\n}\n\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\nexport function intType(): string {\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion: ? -> $1, $2, $3\n// ---------------------------------------------------------------------------\n\nfunction sqliteToPostgresParams(sql: string): string {\n let i = 0;\n return sql.replace(/\\?/g, () => `$${++i}`);\n}\n\n// ---------------------------------------------------------------------------\n// Connection error retry (ECONNRESET, etc.)\n// ---------------------------------------------------------------------------\n\n/** Error codes that indicate a dead/stale connection we can safely retry. */\nconst CONNECTION_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"ENOTFOUND\",\n \"CONNECT_TIMEOUT\",\n \"CONNECTION_ENDED\",\n \"CONNECTION_DESTROYED\",\n \"CONNECTION_CLOSED\",\n]);\n\nexport function isConnectionError(err: any): boolean {\n if (!err) return false;\n const code = err.code || err.cause?.code;\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\n // Neon serverless WS driver: errors from the underlying undici WebSocket\n // closing mid-query come through as TypeError or ErrorEvent without a code.\n const name = err.name || err.cause?.name || \"\";\n if (name === \"ErrorEvent\") return true;\n const stack = String(err.stack || err.cause?.stack || \"\");\n if (\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\n stack,\n )\n ) {\n return true;\n }\n const msg = String(err.message || err.cause?.message || \"\");\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\n msg,\n );\n}\n\nexport async function retryOnConnectionError<T>(\n fn: () => Promise<T>,\n maxAttempts = 3,\n): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e) {\n last = e;\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\n }\n }\n throw last;\n}\n\n// ---------------------------------------------------------------------------\n// Per-op timeout — converts a silent serverless hang into a retryable error\n// ---------------------------------------------------------------------------\n\n/**\n * Max wall time for a single DB op (init or query) before we treat it as a\n * dead connection. A frozen→thawed serverless instance can leave the Neon\n * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither\n * settles nor errors, so retryOnConnectionError() — which only retries thrown\n * errors — can't help and the request hangs until the platform kills the\n * function (~30s on Netlify). For authenticated requests that run a session\n * lookup on every navigation this surfaces as \"the site won't load\". Bounding\n * each op well under the platform function limit turns the silent hang into a\n * CONNECT_TIMEOUT that the existing retry and reject-reset paths already\n * handle. Override with DB_OP_TIMEOUT_MS.\n */\nexport function dbOpTimeoutMs(): number {\n const raw = Number(process.env.DB_OP_TIMEOUT_MS);\n if (Number.isFinite(raw) && raw > 0) return raw;\n return isServerlessRuntime() ? 8_000 : 30_000;\n}\n\n/**\n * Timeout error tagged with a recognized connection-error code so\n * isConnectionError() / retryOnConnectionError() treat a hung op as a\n * retryable dead connection, and upstream reject-reset guards (e.g. the\n * cached session-table init promise) clear their poisoned state.\n */\nclass DbTimeoutError extends Error {\n code = \"CONNECT_TIMEOUT\";\n constructor(op: string, ms: number) {\n super(`DB ${op} timed out after ${ms}ms (connection terminated)`);\n this.name = \"DbTimeoutError\";\n }\n}\n\n/**\n * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable\n * query or pooled client should pass onTimeout so the losing operation does\n * not keep occupying a scarce connection slot after the request has recovered.\n */\nexport async function withDbTimeout<T>(\n op: string,\n run: () => Promise<T>,\n ms = dbOpTimeoutMs(),\n onTimeout?: () => void | Promise<void>,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const runCleanup = () => {\n if (!onTimeout) return;\n try {\n const result = onTimeout();\n if (result && typeof (result as Promise<void>).catch === \"function\") {\n void (result as Promise<void>).catch((err) => {\n console.warn(\n `[db] timeout cleanup for ${op} failed:`,\n err instanceof Error ? err.message : err,\n );\n });\n }\n } catch (err) {\n console.warn(\n `[db] timeout cleanup for ${op} failed:`,\n err instanceof Error ? err.message : err,\n );\n }\n };\n\n return await new Promise<T>((resolve, reject) => {\n const finish = (\n complete: (value: T | PromiseLike<T>) => void,\n value: T | PromiseLike<T>,\n ) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n complete(value);\n };\n const fail = (err: unknown) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n reject(err);\n };\n\n timer = setTimeout(() => {\n runCleanup();\n fail(new DbTimeoutError(op, ms));\n }, ms);\n\n let promise: Promise<T>;\n try {\n promise = run();\n } catch (err) {\n fail(err);\n return;\n }\n promise.then((value) => finish(resolve, value), fail);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Serverless-aware Postgres pool options\n// ---------------------------------------------------------------------------\n\n/**\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\n * Cloudflare Pages Functions) where every concurrent request can spin up its\n * own frozen process. Connections cannot be shared across instances, so each\n * instance must keep its pool tiny — otherwise dozens of warm instances each\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\n * connections reached\".\n */\nexport function isServerlessRuntime(): boolean {\n return (\n !!process.env.NETLIFY ||\n !!process.env.VERCEL ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT ||\n !!process.env.CF_PAGES\n );\n}\n\n/**\n * postgres.js pool options tuned per runtime. A serverless instance handles\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\n * so a single slow query or open transaction can't serialize every other\n * query in the same request. Total connections stay bounded to ≈ 2×\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\n * serverless so a thawed-but-idle instance releases its connections quickly.\n * Long-lived Node servers keep the normal pool for throughput.\n */\nexport function pgPoolOptions(url: string): Record<string, unknown> {\n const serverless = isServerlessRuntime();\n return {\n onnotice: () => {},\n max: serverless ? 2 : 10,\n idle_timeout: serverless ? 20 : 240,\n max_lifetime: 60 * 30,\n connect_timeout: 10,\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\n // Only disable for Supabase URLs to avoid degrading other deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n };\n}\n\n/**\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\n * and keeps total connections bounded while still letting a second query\n * proceed when one connection is busy.\n */\nexport function neonPoolMax(): number {\n return isServerlessRuntime() ? 2 : 10;\n}\n\n// ---------------------------------------------------------------------------\n// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _sqlite: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function createDbExecInternal(\n config: DbExecConfig = {},\n trackSingletonResources = false,\n): Promise<DbExec> {\n const dialect = dialectForConfig(config);\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = config.d1Binding;\n return {\n async execute(sql) {\n if (typeof sql === \"string\") {\n const r = await d1.prepare(sql).all();\n return {\n rows: r.results || [],\n rowsAffected: r.meta?.changes ?? 0,\n };\n }\n const r = await d1\n .prepare(sql.sql)\n .bind(...sql.args)\n .all();\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\n },\n };\n }\n\n let url = config.url || \"file:./data/app.db\";\n\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\n // On Workers, connections can't be shared across requests, so we create a\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\n // different request\" error.\n if (dialect === \"postgres\") {\n const { isNeonUrl } = await import(\"./create-get-db.js\");\n\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\n // Neon's pooler is cold — every request after an idle period times out\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\n // and keeps the same `pg`-compatible query(...) interface we need here.\n if (isNeonUrl(url)) {\n const { Pool } = await import(\"@neondatabase/serverless\");\n const pool = new Pool({ connectionString: url, max: neonPoolMax() });\n // Neon's serverless Pool extends EventEmitter and emits 'error'\n // when its WebSocket connection drops (idle timeout, Lambda\n // suspend, network blip). Without a listener, Node 24 surfaces\n // these as fatal `Unhandled error` / `Connection terminated\n // unexpectedly` uncaught exceptions, even though the next query\n // would have transparently re-connected. Log and swallow.\n pool.on(\"error\", (err: unknown) => {\n console.warn(\n \"[db/neon] pool error (will reconnect on next query):\",\n err instanceof Error ? err.message : err,\n );\n });\n if (trackSingletonResources) _neonPool = pool;\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<{\n rows: unknown[];\n rowCount?: number;\n }>(async () => {\n const client = await pool.connect();\n let released = false;\n const releaseClient = (err?: Error | boolean) => {\n if (released) return;\n released = true;\n client.release(err);\n };\n\n try {\n const result = await withDbTimeout(\n \"query\",\n () =>\n client.query(pgSql, args as any[]) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n () => releaseClient(true),\n );\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n });\n return {\n rows: result.rows,\n rowsAffected: result.rowCount ?? 0,\n };\n },\n };\n }\n\n const { default: postgres } = await import(\"postgres\");\n const isWorkers =\n \"__cf_env\" in globalThis ||\n (typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\");\n\n if (isWorkers) {\n // Workers: fresh connection per query — I/O can't be shared across requests\n return {\n async execute(sql) {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n let timedOut = false;\n let query: ReturnType<typeof conn.unsafe> | undefined;\n try {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () => {\n query = conn.unsafe(pgSql, args as any[]);\n return query as Promise<\n ArrayLike<unknown> & { count?: number }\n >;\n },\n dbOpTimeoutMs(),\n () => {\n timedOut = true;\n query?.cancel?.();\n },\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n } finally {\n if (timedOut) await conn.end({ timeout: 1 });\n else await conn.end();\n }\n },\n };\n } else {\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\n // frozen instances don't exhaust Neon/Postgres' connection limit;\n // idle_timeout also closes idle connections before Neon's ~5min\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\n const pool = postgres(url, pgPoolOptions(url));\n if (trackSingletonResources) _pgPool = pool;\n\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<\n ArrayLike<unknown> & { count?: number }\n >(() => {\n const query = pool.unsafe(pgSql, args as any[]);\n return withDbTimeout(\n \"query\",\n () => query,\n dbOpTimeoutMs(),\n () => query.cancel(),\n );\n });\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n }\n }\n\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\n // serverless bundles do not need libsql's platform-specific native package.\n if (isLocalSqliteUrl(url)) {\n url = await prepareLocalSqliteUrl(\n url.startsWith(\"file:\") ? url : `file:${url}`,\n );\n const { default: Database } = await import(\"better-sqlite3\");\n const sqlite = new Database(sqliteFilenameFromUrl(url));\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n if (trackSingletonResources) _sqlite = sqlite;\n\n return {\n async execute(sql) {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const stmt = sqlite.prepare(rawSql);\n if (stmt.reader) {\n return {\n rows: stmt.all(...args),\n rowsAffected: 0,\n };\n }\n const result = stmt.run(...args);\n return {\n rows: [],\n rowsAffected: result.changes ?? 0,\n };\n },\n };\n }\n\n const { createClient } = await import(\"@libsql/client/web\");\n const client = createClient({\n url,\n authToken: config.authToken,\n });\n\n return {\n async execute(sql) {\n if (typeof sql === \"string\") {\n const r = await client.execute(sql);\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n }\n const r = await client.execute({\n sql: sql.sql,\n args: sql.args as any[],\n });\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n },\n };\n}\n\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\n return createDbExecInternal(config, false);\n}\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n const url = getDatabaseUrl(\"file:./data/app.db\");\n _exec = await createDbExecInternal(\n {\n url,\n authToken: getDatabaseAuthToken(),\n d1Binding: dialect === \"d1\" ? globalThis.__cf_env?.DB : undefined,\n },\n true,\n );\n}\n\n/**\n * Get the singleton database client. Returns a `DbExec` whose first\n * `execute()` call lazily initializes the underlying driver.\n */\nexport function getDbExec(): DbExec {\n if (_exec) return _exec;\n\n // Sanitize args: replace undefined with null (libsql rejects undefined)\n function sanitize(\n sql: string | { sql: string; args: any[] },\n ): string | { sql: string; args: any[] } {\n if (typeof sql === \"object\" && sql.args) {\n return { ...sql, args: sql.args.map((a: any) => a ?? null) };\n }\n return sql;\n }\n\n // Return a proxy that lazy-inits on first call\n const proxy: DbExec = {\n async execute(sql) {\n if (!_initPromise) _initPromise = initClient();\n try {\n await _initPromise;\n } catch (err) {\n // A failed/hung init must not poison the singleton for the life of\n // the process — drop it so the next call retries a fresh connection\n // instead of re-awaiting a permanently rejected/pending promise.\n _initPromise = undefined;\n _exec = undefined;\n throw err;\n }\n // After init, swap to a sanitizing wrapper around the real client\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n };\n Object.assign(proxy, wrapper);\n return _exec!.execute(sanitize(sql));\n },\n };\n return proxy;\n}\n\n/** Close the database connection (for scripts that need cleanup). */\nexport async function closeDbExec(): Promise<void> {\n if (_pgPool) {\n await _pgPool.end();\n _pgPool = undefined;\n }\n if (_neonPool) {\n await _neonPool.end();\n _neonPool = undefined;\n }\n if (_sqlite) {\n _sqlite.close();\n _sqlite = undefined;\n }\n _exec = undefined;\n _initPromise = undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAyBhE,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA2b1E"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA0BhE,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA6b1E"}
@@ -2,6 +2,7 @@ import { writeAppState } from "../application-state/script-helpers.js";
2
2
  import { createExtension, deleteExtension, getHiddenExtensionIdsForCurrentUser, getExtension, hideExtension, listExtensions, unhideExtension, updateExtension, updateExtensionContent, } from "./store.js";
3
3
  import { resolveAccess } from "../sharing/access.js";
4
4
  import { addExtensionSlotTarget, installExtensionSlot, uninstallExtensionSlot, listExtensionsForSlot, listSlotsForExtension, } from "./slots/store.js";
5
+ import { extensionPath } from "./path.js";
5
6
  export function createExtensionActionEntries() {
6
7
  return {
7
8
  "list-extensions": {
@@ -93,6 +94,7 @@ export function createExtensionActionEntries() {
93
94
  content,
94
95
  icon: args?.icon ? String(args.icon) : undefined,
95
96
  });
97
+ const path = extensionPath(extension.id, extension.name);
96
98
  // Auto-navigate so the user lands on the new extension instead of
97
99
  // having to read the JSON response and click a link. Writes a
98
100
  // one-shot `navigate` app-state command the UI consumes and clears.
@@ -100,7 +102,7 @@ export function createExtensionActionEntries() {
100
102
  await writeAppState("navigate", {
101
103
  view: "extensions",
102
104
  extensionId: extension.id,
103
- path: `/extensions/${extension.id}`,
105
+ path,
104
106
  // Unique-per-write token so the UI's `use-navigation-state` hook
105
107
  // can dedup race-driven re-reads of the same command.
106
108
  _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
@@ -111,7 +113,8 @@ export function createExtensionActionEntries() {
111
113
  }
112
114
  return {
113
115
  ok: true,
114
- extension,
116
+ extension: { ...extension, path },
117
+ path,
115
118
  next: `Created. The user is being navigated to the new extension automatically — no further navigation tool calls needed.`,
116
119
  };
117
120
  },
@@ -419,6 +422,7 @@ async function summarizeExtension(row, hiddenIds, includeContent) {
419
422
  return {
420
423
  id: row.id,
421
424
  name: row.name,
425
+ path: extensionPath(row.id, row.name),
422
426
  description: row.description,
423
427
  icon: row.icon,
424
428
  ownerEmail: row.ownerEmail,
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"../agent/production-agent.js\";\nimport { writeAppState } from \"../application-state/script-helpers.js\";\nimport {\n createExtension,\n deleteExtension,\n getHiddenExtensionIdsForCurrentUser,\n getExtension,\n hideExtension,\n listExtensions,\n unhideExtension,\n updateExtension,\n updateExtensionContent,\n type ExtensionRow,\n} from \"./store.js\";\nimport { resolveAccess } from \"../sharing/access.js\";\nimport {\n addExtensionSlotTarget,\n installExtensionSlot,\n uninstallExtensionSlot,\n listExtensionsForSlot,\n listSlotsForExtension,\n} from \"./slots/store.js\";\n\ntype ExtensionPatch = { find: string; replace: string };\n\nexport function createExtensionActionEntries(): Record<string, ActionEntry> {\n return {\n \"list-extensions\": {\n tool: {\n description:\n \"List extensions visible in the current user's Extensions list/sidebar. Use this before updating, hiding, or deleting existing extensions; do not query the legacy tools table directly for extension management.\",\n parameters: {\n type: \"object\",\n properties: {\n search: {\n type: \"string\",\n description:\n \"Optional case-insensitive filter matched against id, name, description, and owner email. Example: Connect Zoom.\",\n },\n includeHidden: {\n type: \"boolean\",\n description:\n \"Include extensions the current user has hidden from their list. Defaults to false.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to false to keep results concise.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum results to return. Defaults to 100.\",\n },\n },\n },\n },\n run: async (args) => {\n const includeHidden = coerceBoolean(args?.includeHidden);\n const includeContent = coerceBoolean(args?.includeContent);\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n const limit = coerceLimit(args?.limit);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n\n let rows = await listExtensions({ includeHidden });\n if (search) {\n rows = rows.filter((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n }\n\n rows = rows.slice(0, limit);\n const extensions = await Promise.all(\n rows.map((row) => summarizeExtension(row, hiddenIds, includeContent)),\n );\n return {\n ok: true,\n count: extensions.length,\n extensions,\n };\n },\n readOnly: true,\n },\n\n \"create-extension\": {\n tool: {\n description:\n \"Create a sandboxed Alpine.js mini-app extension. Use this when the user asks to create, build, or make an extension/widget/dashboard/calculator. Call this action exactly once per requested extension. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), dbExec(), extensionFetch(), and extensionData. Prefer appAction(name, params) for app data and actions, including read actions mounted as GET; do not call template /api/* routes from appFetch because the extension bridge only allows framework /_agent-native/* paths. Parse JSON string action results before aggregating; use dbQuery()/dbExec() only for known existing SQL tables. For any non-trivial component (more than a couple of state fields, any methods, any string formatting, any branching) put the component in a <script> block via Alpine.data('name', () => ({...})) and reference it with x-data=\\\"name\\\" — do NOT cram methods, template literals, or branching logic into an inline x-data=\\\"{...}\\\" attribute (HTML parser pitfalls cause ReferenceError failures). Define every variable referenced from x-text/x-show/x-if/x-for on the data object's initial state. If the extension's value depends on an LLM call, require a real key via ${keys.OPENAI_API_KEY}/${keys.ANTHROPIC_API_KEY} (and tell the user to add it in Settings → Secrets if missing) or route the AI work to the agent chat — never ship a stubbed analysis step that renders a placeholder/boolean as the result.\",\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n 'Short display name for the extension. Do not include \"app\" — e.g. name a todo app \"Todos\", a weather app \"Weather\".',\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the extension does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. The iframe canvas already has modest default padding, so avoid duplicate outer padding unless the design needs it. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) for native theming. Do not include a full app build, React code, or source files.\",\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n },\n required: [\"name\", \"content\"],\n },\n },\n run: async (args) => {\n const name = String(args?.name ?? \"\").trim();\n const content = String(args?.content ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n if (!content) return \"Error: content is required.\";\n\n const extension = await createExtension({\n name,\n description: String(args?.description ?? \"\").trim(),\n content,\n icon: args?.icon ? String(args.icon) : undefined,\n });\n\n // Auto-navigate so the user lands on the new extension instead of\n // having to read the JSON response and click a link. Writes a\n // one-shot `navigate` app-state command the UI consumes and clears.\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: extension.id,\n path: `/extensions/${extension.id}`,\n // Unique-per-write token so the UI's `use-navigation-state` hook\n // can dedup race-driven re-reads of the same command.\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n\n return {\n ok: true,\n extension,\n next: `Created. The user is being navigated to the new extension automatically — no further navigation tool calls needed.`,\n };\n },\n },\n\n \"update-extension\": {\n tool: {\n description:\n \"Update an existing sandboxed Alpine.js mini-app extension. Prefer patches for surgical edits; use full content replacement only when necessary.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to update.\",\n },\n name: {\n type: \"string\",\n description: \"Optional new display name.\",\n },\n description: {\n type: \"string\",\n description: \"Optional new description.\",\n },\n content: {\n type: \"string\",\n description:\n \"Optional full replacement Alpine.js HTML body snippet.\",\n },\n patches: {\n type: \"string\",\n description:\n 'Optional JSON array of { \"find\": \"...\", \"replace\": \"...\" } patches to apply to the current content.',\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n visibility: {\n type: \"string\",\n description: \"Optional sharing visibility.\",\n enum: [\"private\", \"org\", \"public\"],\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n\n let result = null;\n if (args?.content !== undefined || args?.patches !== undefined) {\n const patches = parsePatches((args as any).patches);\n if (args?.patches !== undefined && !patches) {\n return \"Error: patches must be a JSON array of { find, replace } objects.\";\n }\n result = await updateExtensionContent(id, {\n content:\n args?.content !== undefined ? String(args.content) : undefined,\n patches,\n });\n }\n\n const meta: Record<string, string> = {};\n if (args?.name !== undefined) meta.name = String(args.name).trim();\n if (args?.description !== undefined) {\n meta.description = String(args.description).trim();\n }\n if (args?.icon !== undefined) meta.icon = String(args.icon);\n if (args?.visibility !== undefined) {\n meta.visibility = String(args.visibility);\n }\n if (Object.keys(meta).length > 0) {\n result = await updateExtension(id, meta as any);\n }\n\n if (!result) result = await getExtension(id);\n if (!result) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"delete-extension\": {\n tool: {\n description:\n \"Permanently delete an extension everywhere it is shared. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to permanently delete. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n try {\n const ok = await deleteExtension(id);\n if (!ok) return `Error: extension not found: ${id}`;\n return { ok: true, deleted: summarizeDeletedExtension(extension) };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message ?? String(err),\n next: \"If the user wants this gone only from their own view, call hide-extension with the same id.\",\n };\n }\n },\n },\n\n \"hide-extension\": {\n tool: {\n description:\n \"Hide an accessible extension from the current user's Extensions list/sidebar without deleting it for anyone else. Use this when the user says to remove a shared extension from their view, or when delete-extension reports that the current user is not owner/admin.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for the current user. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await hideExtension(id);\n return { ok: true, hidden: summarizeDeletedExtension(extension) };\n },\n },\n\n \"unhide-extension\": {\n tool: {\n description:\n \"Restore an extension the current user previously hid so it appears in their Extensions list/sidebar again. Use list-extensions with includeHidden=true to find hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore for the current user.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n await unhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"add-extension-slot-target\": {\n tool: {\n description:\n 'Declare that an extension can render in a UI extension-point slot of an app (e.g. \"mail.contact-sidebar.bottom\"). Apps drop ExtensionSlot components in their UI; this action registers an extension as installable into one of those slots. Slot IDs follow the convention <app>.<area>.<position>. Caller must have editor access to the extension.',\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with slot-specific config (defaults, hints, etc.).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const row = await addExtensionSlotTarget(\n extensionId,\n slotId,\n args?.config ? String(args.config) : undefined,\n );\n return { ok: true, slot: row };\n },\n },\n\n \"install-extension\": {\n tool: {\n description:\n \"Install an extension as a widget in an extension-point slot for the current user. The extension must already declare the slot via add-extension-slot-target. Per-user installation — only affects the calling user's view. Use after creating an extension that targets a slot, or when the user asks to add an existing widget to a slot.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id to install.\",\n },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n position: {\n type: \"number\",\n description:\n \"Optional integer position within the slot (lower = earlier). Defaults to end.\",\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with per-install config (overrides, settings).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const position =\n args?.position !== undefined && args.position !== null\n ? Number(args.position)\n : undefined;\n const row = await installExtensionSlot(extensionId, slotId, {\n position: Number.isFinite(position as number) ? position : undefined,\n config: args?.config ? String(args.config) : undefined,\n });\n return { ok: true, install: row };\n },\n },\n\n \"uninstall-extension\": {\n tool: {\n description:\n \"Remove an extension from an extension-point slot for the current user. Does not delete the extension itself.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n await uninstallExtensionSlot(extensionId, slotId);\n return { ok: true };\n },\n },\n\n \"list-extensions-for-slot\": {\n tool: {\n description:\n \"List extensions the current user has access to that declare a given extension-point slot. Use to discover what's available to install into a slot the user mentioned.\",\n parameters: {\n type: \"object\",\n properties: {\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"slotId\"],\n },\n },\n run: async (args) => {\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!slotId) return \"Error: slotId is required.\";\n return { extensions: await listExtensionsForSlot(slotId) };\n },\n readOnly: true,\n },\n\n \"list-extension-slots\": {\n tool: {\n description:\n \"List the extension-point slots a specific extension declares it can render in. Caller must have viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n },\n required: [\"extensionId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n return { slots: await listSlotsForExtension(extensionId) };\n },\n readOnly: true,\n },\n };\n}\n\nasync function summarizeExtension(\n row: ExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n) {\n const access = await resolveAccess(\"extension\", row.id).catch(() => null);\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n icon: row.icon,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n role: access?.role ?? null,\n canEdit: access\n ? [\"owner\", \"admin\", \"editor\"].includes(access.role)\n : false,\n canDelete: access ? [\"owner\", \"admin\"].includes(access.role) : false,\n hidden: hiddenIds.has(row.id),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(includeContent ? { content: row.content } : {}),\n };\n}\n\nfunction summarizeDeletedExtension(row: ExtensionRow) {\n return {\n id: row.id,\n name: row.name,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n };\n}\n\nfunction coerceBoolean(value: unknown): boolean {\n return value === true || value === \"true\";\n}\n\nfunction coerceLimit(value: unknown): number {\n const limit = Number(value ?? 100);\n if (!Number.isFinite(limit)) return 100;\n return Math.min(Math.max(1, Math.floor(limit)), 500);\n}\n\nfunction parsePatches(value: unknown): ExtensionPatch[] | undefined {\n if (value === undefined) return undefined;\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (!Array.isArray(parsed)) return undefined;\n if (\n parsed.some(\n (patch) =>\n !patch ||\n typeof patch.find !== \"string\" ||\n typeof patch.replace !== \"string\",\n )\n ) {\n return undefined;\n }\n return parsed;\n}\n"]}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"../agent/production-agent.js\";\nimport { writeAppState } from \"../application-state/script-helpers.js\";\nimport {\n createExtension,\n deleteExtension,\n getHiddenExtensionIdsForCurrentUser,\n getExtension,\n hideExtension,\n listExtensions,\n unhideExtension,\n updateExtension,\n updateExtensionContent,\n type ExtensionRow,\n} from \"./store.js\";\nimport { resolveAccess } from \"../sharing/access.js\";\nimport {\n addExtensionSlotTarget,\n installExtensionSlot,\n uninstallExtensionSlot,\n listExtensionsForSlot,\n listSlotsForExtension,\n} from \"./slots/store.js\";\nimport { extensionPath } from \"./path.js\";\n\ntype ExtensionPatch = { find: string; replace: string };\n\nexport function createExtensionActionEntries(): Record<string, ActionEntry> {\n return {\n \"list-extensions\": {\n tool: {\n description:\n \"List extensions visible in the current user's Extensions list/sidebar. Use this before updating, hiding, or deleting existing extensions; do not query the legacy tools table directly for extension management.\",\n parameters: {\n type: \"object\",\n properties: {\n search: {\n type: \"string\",\n description:\n \"Optional case-insensitive filter matched against id, name, description, and owner email. Example: Connect Zoom.\",\n },\n includeHidden: {\n type: \"boolean\",\n description:\n \"Include extensions the current user has hidden from their list. Defaults to false.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to false to keep results concise.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum results to return. Defaults to 100.\",\n },\n },\n },\n },\n run: async (args) => {\n const includeHidden = coerceBoolean(args?.includeHidden);\n const includeContent = coerceBoolean(args?.includeContent);\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n const limit = coerceLimit(args?.limit);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n\n let rows = await listExtensions({ includeHidden });\n if (search) {\n rows = rows.filter((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n }\n\n rows = rows.slice(0, limit);\n const extensions = await Promise.all(\n rows.map((row) => summarizeExtension(row, hiddenIds, includeContent)),\n );\n return {\n ok: true,\n count: extensions.length,\n extensions,\n };\n },\n readOnly: true,\n },\n\n \"create-extension\": {\n tool: {\n description:\n \"Create a sandboxed Alpine.js mini-app extension. Use this when the user asks to create, build, or make an extension/widget/dashboard/calculator. Call this action exactly once per requested extension. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), dbExec(), extensionFetch(), and extensionData. Prefer appAction(name, params) for app data and actions, including read actions mounted as GET; do not call template /api/* routes from appFetch because the extension bridge only allows framework /_agent-native/* paths. Parse JSON string action results before aggregating; use dbQuery()/dbExec() only for known existing SQL tables. For any non-trivial component (more than a couple of state fields, any methods, any string formatting, any branching) put the component in a <script> block via Alpine.data('name', () => ({...})) and reference it with x-data=\\\"name\\\" — do NOT cram methods, template literals, or branching logic into an inline x-data=\\\"{...}\\\" attribute (HTML parser pitfalls cause ReferenceError failures). Define every variable referenced from x-text/x-show/x-if/x-for on the data object's initial state. If the extension's value depends on an LLM call, require a real key via ${keys.OPENAI_API_KEY}/${keys.ANTHROPIC_API_KEY} (and tell the user to add it in Settings → Secrets if missing) or route the AI work to the agent chat — never ship a stubbed analysis step that renders a placeholder/boolean as the result.\",\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n 'Short display name for the extension. Do not include \"app\" — e.g. name a todo app \"Todos\", a weather app \"Weather\".',\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the extension does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. The iframe canvas already has modest default padding, so avoid duplicate outer padding unless the design needs it. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) for native theming. Do not include a full app build, React code, or source files.\",\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n },\n required: [\"name\", \"content\"],\n },\n },\n run: async (args) => {\n const name = String(args?.name ?? \"\").trim();\n const content = String(args?.content ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n if (!content) return \"Error: content is required.\";\n\n const extension = await createExtension({\n name,\n description: String(args?.description ?? \"\").trim(),\n content,\n icon: args?.icon ? String(args.icon) : undefined,\n });\n const path = extensionPath(extension.id, extension.name);\n\n // Auto-navigate so the user lands on the new extension instead of\n // having to read the JSON response and click a link. Writes a\n // one-shot `navigate` app-state command the UI consumes and clears.\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: extension.id,\n path,\n // Unique-per-write token so the UI's `use-navigation-state` hook\n // can dedup race-driven re-reads of the same command.\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n\n return {\n ok: true,\n extension: { ...extension, path },\n path,\n next: `Created. The user is being navigated to the new extension automatically — no further navigation tool calls needed.`,\n };\n },\n },\n\n \"update-extension\": {\n tool: {\n description:\n \"Update an existing sandboxed Alpine.js mini-app extension. Prefer patches for surgical edits; use full content replacement only when necessary.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to update.\",\n },\n name: {\n type: \"string\",\n description: \"Optional new display name.\",\n },\n description: {\n type: \"string\",\n description: \"Optional new description.\",\n },\n content: {\n type: \"string\",\n description:\n \"Optional full replacement Alpine.js HTML body snippet.\",\n },\n patches: {\n type: \"string\",\n description:\n 'Optional JSON array of { \"find\": \"...\", \"replace\": \"...\" } patches to apply to the current content.',\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n visibility: {\n type: \"string\",\n description: \"Optional sharing visibility.\",\n enum: [\"private\", \"org\", \"public\"],\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n\n let result = null;\n if (args?.content !== undefined || args?.patches !== undefined) {\n const patches = parsePatches((args as any).patches);\n if (args?.patches !== undefined && !patches) {\n return \"Error: patches must be a JSON array of { find, replace } objects.\";\n }\n result = await updateExtensionContent(id, {\n content:\n args?.content !== undefined ? String(args.content) : undefined,\n patches,\n });\n }\n\n const meta: Record<string, string> = {};\n if (args?.name !== undefined) meta.name = String(args.name).trim();\n if (args?.description !== undefined) {\n meta.description = String(args.description).trim();\n }\n if (args?.icon !== undefined) meta.icon = String(args.icon);\n if (args?.visibility !== undefined) {\n meta.visibility = String(args.visibility);\n }\n if (Object.keys(meta).length > 0) {\n result = await updateExtension(id, meta as any);\n }\n\n if (!result) result = await getExtension(id);\n if (!result) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"delete-extension\": {\n tool: {\n description:\n \"Permanently delete an extension everywhere it is shared. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to permanently delete. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n try {\n const ok = await deleteExtension(id);\n if (!ok) return `Error: extension not found: ${id}`;\n return { ok: true, deleted: summarizeDeletedExtension(extension) };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message ?? String(err),\n next: \"If the user wants this gone only from their own view, call hide-extension with the same id.\",\n };\n }\n },\n },\n\n \"hide-extension\": {\n tool: {\n description:\n \"Hide an accessible extension from the current user's Extensions list/sidebar without deleting it for anyone else. Use this when the user says to remove a shared extension from their view, or when delete-extension reports that the current user is not owner/admin.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for the current user. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await hideExtension(id);\n return { ok: true, hidden: summarizeDeletedExtension(extension) };\n },\n },\n\n \"unhide-extension\": {\n tool: {\n description:\n \"Restore an extension the current user previously hid so it appears in their Extensions list/sidebar again. Use list-extensions with includeHidden=true to find hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore for the current user.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n await unhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"add-extension-slot-target\": {\n tool: {\n description:\n 'Declare that an extension can render in a UI extension-point slot of an app (e.g. \"mail.contact-sidebar.bottom\"). Apps drop ExtensionSlot components in their UI; this action registers an extension as installable into one of those slots. Slot IDs follow the convention <app>.<area>.<position>. Caller must have editor access to the extension.',\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with slot-specific config (defaults, hints, etc.).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const row = await addExtensionSlotTarget(\n extensionId,\n slotId,\n args?.config ? String(args.config) : undefined,\n );\n return { ok: true, slot: row };\n },\n },\n\n \"install-extension\": {\n tool: {\n description:\n \"Install an extension as a widget in an extension-point slot for the current user. The extension must already declare the slot via add-extension-slot-target. Per-user installation — only affects the calling user's view. Use after creating an extension that targets a slot, or when the user asks to add an existing widget to a slot.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id to install.\",\n },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n position: {\n type: \"number\",\n description:\n \"Optional integer position within the slot (lower = earlier). Defaults to end.\",\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with per-install config (overrides, settings).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const position =\n args?.position !== undefined && args.position !== null\n ? Number(args.position)\n : undefined;\n const row = await installExtensionSlot(extensionId, slotId, {\n position: Number.isFinite(position as number) ? position : undefined,\n config: args?.config ? String(args.config) : undefined,\n });\n return { ok: true, install: row };\n },\n },\n\n \"uninstall-extension\": {\n tool: {\n description:\n \"Remove an extension from an extension-point slot for the current user. Does not delete the extension itself.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n await uninstallExtensionSlot(extensionId, slotId);\n return { ok: true };\n },\n },\n\n \"list-extensions-for-slot\": {\n tool: {\n description:\n \"List extensions the current user has access to that declare a given extension-point slot. Use to discover what's available to install into a slot the user mentioned.\",\n parameters: {\n type: \"object\",\n properties: {\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"slotId\"],\n },\n },\n run: async (args) => {\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!slotId) return \"Error: slotId is required.\";\n return { extensions: await listExtensionsForSlot(slotId) };\n },\n readOnly: true,\n },\n\n \"list-extension-slots\": {\n tool: {\n description:\n \"List the extension-point slots a specific extension declares it can render in. Caller must have viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n },\n required: [\"extensionId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n return { slots: await listSlotsForExtension(extensionId) };\n },\n readOnly: true,\n },\n };\n}\n\nasync function summarizeExtension(\n row: ExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n) {\n const access = await resolveAccess(\"extension\", row.id).catch(() => null);\n return {\n id: row.id,\n name: row.name,\n path: extensionPath(row.id, row.name),\n description: row.description,\n icon: row.icon,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n role: access?.role ?? null,\n canEdit: access\n ? [\"owner\", \"admin\", \"editor\"].includes(access.role)\n : false,\n canDelete: access ? [\"owner\", \"admin\"].includes(access.role) : false,\n hidden: hiddenIds.has(row.id),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(includeContent ? { content: row.content } : {}),\n };\n}\n\nfunction summarizeDeletedExtension(row: ExtensionRow) {\n return {\n id: row.id,\n name: row.name,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n };\n}\n\nfunction coerceBoolean(value: unknown): boolean {\n return value === true || value === \"true\";\n}\n\nfunction coerceLimit(value: unknown): number {\n const limit = Number(value ?? 100);\n if (!Number.isFinite(limit)) return 100;\n return Math.min(Math.max(1, Math.floor(limit)), 500);\n}\n\nfunction parsePatches(value: unknown): ExtensionPatch[] | undefined {\n if (value === undefined) return undefined;\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (!Array.isArray(parsed)) return undefined;\n if (\n parsed.some(\n (patch) =>\n !patch ||\n typeof patch.find !== \"string\" ||\n typeof patch.replace !== \"string\",\n )\n ) {\n return undefined;\n }\n return parsed;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const EXTENSION_SLUG_MAX_LENGTH = 60;
2
+ export declare function extensionNameToSlug(name: string | null | undefined, maxLength?: number): string;
3
+ export declare function extensionPath(id: string, name?: string | null | undefined): string;
4
+ export declare function extensionIdFromPathname(pathname: string): string | null;
5
+ export declare function isExtensionPathname(pathname: string, id: string): boolean;
6
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/extensions/path.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,SAAS,SAA4B,GACpC,MAAM,CAcR;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAIR;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQvE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,38 @@
1
+ export const EXTENSION_SLUG_MAX_LENGTH = 60;
2
+ export function extensionNameToSlug(name, maxLength = EXTENSION_SLUG_MAX_LENGTH) {
3
+ const normalized = String(name ?? "")
4
+ .normalize("NFKD")
5
+ .replace(/[\u0300-\u036f]/g, "")
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, "-")
8
+ .replace(/^-+|-+$/g, "");
9
+ const limit = Math.max(1, Math.floor(maxLength));
10
+ const sliced = normalized.slice(0, limit).replace(/-+$/g, "");
11
+ if (normalized.length > limit) {
12
+ const lastDash = sliced.lastIndexOf("-");
13
+ if (lastDash > 0)
14
+ return sliced.slice(0, lastDash);
15
+ }
16
+ return sliced || "extension";
17
+ }
18
+ export function extensionPath(id, name) {
19
+ const encodedId = encodeURIComponent(id);
20
+ if (name === undefined)
21
+ return `/extensions/${encodedId}`;
22
+ return `/extensions/${encodedId}/${extensionNameToSlug(name)}`;
23
+ }
24
+ export function extensionIdFromPathname(pathname) {
25
+ const match = pathname.match(/^\/extensions\/([^/?#]+)/);
26
+ if (!match?.[1])
27
+ return null;
28
+ try {
29
+ return decodeURIComponent(match[1]);
30
+ }
31
+ catch {
32
+ return match[1];
33
+ }
34
+ }
35
+ export function isExtensionPathname(pathname, id) {
36
+ return extensionIdFromPathname(pathname) === id;
37
+ }
38
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/extensions/path.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,MAAM,UAAU,mBAAmB,CACjC,IAA+B,EAC/B,SAAS,GAAG,yBAAyB;IAErC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SAClC,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,IAAI,WAAW,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,IAAgC;IAEhC,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,eAAe,SAAS,EAAE,CAAC;IAC1D,OAAO,eAAe,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,EAAU;IAC9D,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC","sourcesContent":["export const EXTENSION_SLUG_MAX_LENGTH = 60;\n\nexport function extensionNameToSlug(\n name: string | null | undefined,\n maxLength = EXTENSION_SLUG_MAX_LENGTH,\n): string {\n const normalized = String(name ?? \"\")\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const limit = Math.max(1, Math.floor(maxLength));\n const sliced = normalized.slice(0, limit).replace(/-+$/g, \"\");\n if (normalized.length > limit) {\n const lastDash = sliced.lastIndexOf(\"-\");\n if (lastDash > 0) return sliced.slice(0, lastDash);\n }\n return sliced || \"extension\";\n}\n\nexport function extensionPath(\n id: string,\n name?: string | null | undefined,\n): string {\n const encodedId = encodeURIComponent(id);\n if (name === undefined) return `/extensions/${encodedId}`;\n return `/extensions/${encodedId}/${extensionNameToSlug(name)}`;\n}\n\nexport function extensionIdFromPathname(pathname: string): string | null {\n const match = pathname.match(/^\\/extensions\\/([^/?#]+)/);\n if (!match?.[1]) return null;\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport function isExtensionPathname(pathname: string, id: string): boolean {\n return extensionIdFromPathname(pathname) === id;\n}\n"]}
@@ -26,7 +26,7 @@ export declare const MCP_CONNECT_SCOPE = "mcp-connect";
26
26
  /** Device codes are valid for 10 minutes. */
27
27
  export declare const DEVICE_CODE_TTL_MS: number;
28
28
  /** Default minted-token lifetime. Configurable per-request 1–365 days. */
29
- export declare const DEFAULT_TOKEN_TTL_DAYS = 90;
29
+ export declare const DEFAULT_TOKEN_TTL_DAYS = 365;
30
30
  export declare const MIN_TOKEN_TTL_DAYS = 1;
31
31
  export declare const MAX_TOKEN_TTL_DAYS = 365;
32
32
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"connect-store.d.ts","sourceRoot":"","sources":["../../src/mcp/connect-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,QAAc,CAAC;AAE9C,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,sBAAsB,QAAS,CAAC;AA+C7C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBhE;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,EAAE,CAAC,CAsB3B;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/D;AAMD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACpE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAmBD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAgD/D;AAgBD,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAc/B;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAc/B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,CAuB9D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAY/B;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAW/B;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE"}
1
+ {"version":3,"file":"connect-store.d.ts","sourceRoot":"","sources":["../../src/mcp/connect-store.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ export const MCP_CONNECT_SCOPE = "mcp-connect";
29
29
  /** Device codes are valid for 10 minutes. */
30
30
  export const DEVICE_CODE_TTL_MS = 10 * 60_000;
31
31
  /** Default minted-token lifetime. Configurable per-request 1–365 days. */
32
- export const DEFAULT_TOKEN_TTL_DAYS = 90;
32
+ export const DEFAULT_TOKEN_TTL_DAYS = 365;
33
33
  export const MIN_TOKEN_TTL_DAYS = 1;
34
34
  export const MAX_TOKEN_TTL_DAYS = 365;
35
35
  /**