@agent-native/core 0.31.0 → 0.31.2

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 (197) hide show
  1. package/dist/a2a/client.js +1 -1
  2. package/dist/a2a/client.js.map +1 -1
  3. package/dist/a2a/task-store.d.ts.map +1 -1
  4. package/dist/a2a/task-store.js +5 -1
  5. package/dist/a2a/task-store.js.map +1 -1
  6. package/dist/action.js +22 -4
  7. package/dist/action.js.map +1 -1
  8. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  9. package/dist/agent/engine/ai-sdk-engine.js +5 -0
  10. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  11. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  12. package/dist/agent/engine/builder-engine.js +4 -0
  13. package/dist/agent/engine/builder-engine.js.map +1 -1
  14. package/dist/agent/production-agent.d.ts.map +1 -1
  15. package/dist/agent/production-agent.js +24 -1
  16. package/dist/agent/production-agent.js.map +1 -1
  17. package/dist/agent/run-manager.d.ts.map +1 -1
  18. package/dist/agent/run-manager.js +7 -2
  19. package/dist/agent/run-manager.js.map +1 -1
  20. package/dist/agent/run-store.d.ts.map +1 -1
  21. package/dist/agent/run-store.js +5 -1
  22. package/dist/agent/run-store.js.map +1 -1
  23. package/dist/agent/tool-search.js.map +1 -1
  24. package/dist/application-state/store.d.ts.map +1 -1
  25. package/dist/application-state/store.js +18 -7
  26. package/dist/application-state/store.js.map +1 -1
  27. package/dist/browser-sessions/store.d.ts.map +1 -1
  28. package/dist/browser-sessions/store.js +6 -1
  29. package/dist/browser-sessions/store.js.map +1 -1
  30. package/dist/chat-threads/store.d.ts.map +1 -1
  31. package/dist/chat-threads/store.js +6 -2
  32. package/dist/chat-threads/store.js.map +1 -1
  33. package/dist/checkpoints/store.d.ts.map +1 -1
  34. package/dist/checkpoints/store.js +5 -1
  35. package/dist/checkpoints/store.js.map +1 -1
  36. package/dist/client/AgentPanel.js +18 -18
  37. package/dist/client/AgentPanel.js.map +1 -1
  38. package/dist/client/agent-chat.d.ts +0 -3
  39. package/dist/client/agent-chat.d.ts.map +1 -1
  40. package/dist/client/agent-chat.js +0 -3
  41. package/dist/client/agent-chat.js.map +1 -1
  42. package/dist/client/components/CodeRequiredDialog.js +0 -7
  43. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  44. package/dist/client/composer/use-file-search.d.ts.map +1 -1
  45. package/dist/client/composer/use-file-search.js +14 -3
  46. package/dist/client/composer/use-file-search.js.map +1 -1
  47. package/dist/client/db-admin/EditableCell.js +1 -1
  48. package/dist/client/db-admin/EditableCell.js.map +1 -1
  49. package/dist/client/dev-overlay/DevOverlay.d.ts +0 -2
  50. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  51. package/dist/client/dev-overlay/DevOverlay.js +1 -1
  52. package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
  53. package/dist/client/mcp-app-host.d.ts.map +1 -1
  54. package/dist/client/mcp-app-host.js +19 -2
  55. package/dist/client/mcp-app-host.js.map +1 -1
  56. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  57. package/dist/client/resources/ResourcesPanel.js +0 -1
  58. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  59. package/dist/client/settings/SettingsPanel.js +2 -2
  60. package/dist/client/settings/SettingsPanel.js.map +1 -1
  61. package/dist/client/sse-event-processor.d.ts.map +1 -1
  62. package/dist/client/sse-event-processor.js +13 -3
  63. package/dist/client/sse-event-processor.js.map +1 -1
  64. package/dist/client/use-db-sync.d.ts.map +1 -1
  65. package/dist/client/use-db-sync.js +16 -0
  66. package/dist/client/use-db-sync.js.map +1 -1
  67. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  68. package/dist/client/use-run-stuck-detection.js +7 -1
  69. package/dist/client/use-run-stuck-detection.js.map +1 -1
  70. package/dist/collab/agent-presence.d.ts +0 -3
  71. package/dist/collab/agent-presence.d.ts.map +1 -1
  72. package/dist/collab/agent-presence.js +2 -4
  73. package/dist/collab/agent-presence.js.map +1 -1
  74. package/dist/collab/awareness.d.ts.map +1 -1
  75. package/dist/collab/awareness.js +3 -1
  76. package/dist/collab/awareness.js.map +1 -1
  77. package/dist/collab/storage.d.ts.map +1 -1
  78. package/dist/collab/storage.js +5 -1
  79. package/dist/collab/storage.js.map +1 -1
  80. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  81. package/dist/collab/ydoc-manager.js +35 -8
  82. package/dist/collab/ydoc-manager.js.map +1 -1
  83. package/dist/extensions/content-patch.js +1 -1
  84. package/dist/extensions/content-patch.js.map +1 -1
  85. package/dist/extensions/routes.js +12 -12
  86. package/dist/extensions/routes.js.map +1 -1
  87. package/dist/extensions/slots/store.d.ts.map +1 -1
  88. package/dist/extensions/slots/store.js +5 -1
  89. package/dist/extensions/slots/store.js.map +1 -1
  90. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  91. package/dist/integrations/a2a-continuations-store.js +5 -1
  92. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  93. package/dist/integrations/adapters/email.d.ts.map +1 -1
  94. package/dist/integrations/adapters/email.js +5 -2
  95. package/dist/integrations/adapters/email.js.map +1 -1
  96. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  97. package/dist/integrations/google-docs-poller.js +2 -4
  98. package/dist/integrations/google-docs-poller.js.map +1 -1
  99. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  100. package/dist/integrations/pending-tasks-retry-job.js +6 -2
  101. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  102. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  103. package/dist/integrations/pending-tasks-store.js +5 -1
  104. package/dist/integrations/pending-tasks-store.js.map +1 -1
  105. package/dist/integrations/plugin.d.ts.map +1 -1
  106. package/dist/integrations/plugin.js +14 -3
  107. package/dist/integrations/plugin.js.map +1 -1
  108. package/dist/integrations/remote-commands-store.d.ts.map +1 -1
  109. package/dist/integrations/remote-commands-store.js +5 -1
  110. package/dist/integrations/remote-commands-store.js.map +1 -1
  111. package/dist/integrations/remote-devices-store.d.ts.map +1 -1
  112. package/dist/integrations/remote-devices-store.js +5 -1
  113. package/dist/integrations/remote-devices-store.js.map +1 -1
  114. package/dist/integrations/remote-push-store.d.ts.map +1 -1
  115. package/dist/integrations/remote-push-store.js +5 -1
  116. package/dist/integrations/remote-push-store.js.map +1 -1
  117. package/dist/integrations/remote-retry-job.js +1 -1
  118. package/dist/integrations/remote-retry-job.js.map +1 -1
  119. package/dist/integrations/remote-run-events-store.d.ts.map +1 -1
  120. package/dist/integrations/remote-run-events-store.js +5 -1
  121. package/dist/integrations/remote-run-events-store.js.map +1 -1
  122. package/dist/integrations/thread-mapping-store.d.ts.map +1 -1
  123. package/dist/integrations/thread-mapping-store.js +5 -1
  124. package/dist/integrations/thread-mapping-store.js.map +1 -1
  125. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  126. package/dist/integrations/webhook-handler.js.map +1 -1
  127. package/dist/jobs/scheduler.d.ts.map +1 -1
  128. package/dist/jobs/scheduler.js +31 -15
  129. package/dist/jobs/scheduler.js.map +1 -1
  130. package/dist/jobs/tools.d.ts.map +1 -1
  131. package/dist/jobs/tools.js +4 -1
  132. package/dist/jobs/tools.js.map +1 -1
  133. package/dist/mcp/build-server.d.ts.map +1 -1
  134. package/dist/mcp/build-server.js +4 -1
  135. package/dist/mcp/build-server.js.map +1 -1
  136. package/dist/mcp/connect-store.d.ts +3 -4
  137. package/dist/mcp/connect-store.d.ts.map +1 -1
  138. package/dist/mcp/connect-store.js +4 -4
  139. package/dist/mcp/connect-store.js.map +1 -1
  140. package/dist/mcp-client/routes.js +6 -1
  141. package/dist/mcp-client/routes.js.map +1 -1
  142. package/dist/oauth-tokens/store.d.ts.map +1 -1
  143. package/dist/oauth-tokens/store.js +5 -1
  144. package/dist/oauth-tokens/store.js.map +1 -1
  145. package/dist/org/accept-pending.js +1 -1
  146. package/dist/org/accept-pending.js.map +1 -1
  147. package/dist/progress/store.d.ts.map +1 -1
  148. package/dist/progress/store.js +11 -1
  149. package/dist/progress/store.js.map +1 -1
  150. package/dist/resources/handlers.d.ts.map +1 -1
  151. package/dist/resources/handlers.js +0 -2
  152. package/dist/resources/handlers.js.map +1 -1
  153. package/dist/resources/store.d.ts.map +1 -1
  154. package/dist/resources/store.js +23 -13
  155. package/dist/resources/store.js.map +1 -1
  156. package/dist/scripts/db/query.d.ts.map +1 -1
  157. package/dist/scripts/db/query.js +1 -2
  158. package/dist/scripts/db/query.js.map +1 -1
  159. package/dist/server/action-discovery.d.ts.map +1 -1
  160. package/dist/server/action-discovery.js +10 -3
  161. package/dist/server/action-discovery.js.map +1 -1
  162. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  163. package/dist/server/agent-chat-plugin.js +3 -0
  164. package/dist/server/agent-chat-plugin.js.map +1 -1
  165. package/dist/server/auth.d.ts.map +1 -1
  166. package/dist/server/auth.js +13 -9
  167. package/dist/server/auth.js.map +1 -1
  168. package/dist/server/identity-sso-store.d.ts.map +1 -1
  169. package/dist/server/identity-sso-store.js +14 -3
  170. package/dist/server/identity-sso-store.js.map +1 -1
  171. package/dist/server/poll.d.ts.map +1 -1
  172. package/dist/server/poll.js +18 -0
  173. package/dist/server/poll.js.map +1 -1
  174. package/dist/server/schema-prompt.js +1 -1
  175. package/dist/server/schema-prompt.js.map +1 -1
  176. package/dist/server/security-headers.d.ts +5 -4
  177. package/dist/server/security-headers.d.ts.map +1 -1
  178. package/dist/server/security-headers.js +5 -4
  179. package/dist/server/security-headers.js.map +1 -1
  180. package/dist/settings/store.d.ts.map +1 -1
  181. package/dist/settings/store.js +5 -1
  182. package/dist/settings/store.js.map +1 -1
  183. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  184. package/dist/sharing/actions/set-resource-visibility.js +8 -1
  185. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  186. package/dist/triggers/actions.d.ts.map +1 -1
  187. package/dist/triggers/actions.js +1 -2
  188. package/dist/triggers/actions.js.map +1 -1
  189. package/dist/triggers/dispatcher.d.ts.map +1 -1
  190. package/dist/triggers/dispatcher.js +36 -8
  191. package/dist/triggers/dispatcher.js.map +1 -1
  192. package/dist/usage/store.d.ts.map +1 -1
  193. package/dist/usage/store.js +5 -1
  194. package/dist/usage/store.js.map +1 -1
  195. package/dist/vite/client.js +5 -5
  196. package/dist/vite/client.js.map +1 -1
  197. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../src/agent/tool-search.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"./production-agent.js\";\nimport { parseMcpToolName } from \"../mcp-client/manager.js\";\nimport { isMcpToolAllowedForRequest } from \"../mcp-client/visibility.js\";\n\nexport const TOOL_SEARCH_ACTION_NAME = \"tool-search\";\n\ntype ToolSearchArgs = {\n query?: unknown;\n limit?: unknown;\n includeSchemas?: unknown;\n};\n\ntype ToolParameterSummary = {\n name: string;\n type?: string;\n required: boolean;\n description?: string;\n enum?: string[];\n};\n\ntype ToolSearchResult = {\n name: string;\n kind: \"action\" | \"mcp\";\n source?: string;\n description: string;\n score: number;\n parameters: ToolParameterSummary[];\n inputSchema?: unknown;\n};\n\ntype ToolSearchOptions = {\n defaultLimit?: number;\n maxLimit?: number;\n};\n\nconst DEFAULT_LIMIT = 8;\nconst MAX_LIMIT = 25;\n\nexport function createToolSearchEntry(\n getRegistry: () => Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): ActionEntry {\n return {\n tool: {\n description:\n \"Search the live registry of callable tools/actions, including connected MCP server tools named `mcp__<server>__<tool>`. Use this when you need a capability but are not sure which tool to call, especially after users connect new MCP servers. Returns exact tool names and parameter summaries so you can call the matching tool directly.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"What capability to find, e.g. `send slack message`, `create calendar event`, `zapier gmail`, or `browser screenshot`.\",\n },\n limit: {\n type: \"number\",\n description: `Maximum results to return. Defaults to ${options.defaultLimit ?? DEFAULT_LIMIT}.`,\n } as any,\n includeSchemas: {\n type: \"boolean\",\n description:\n \"When true, include each matching tool's full input schema. Default false.\",\n } as any,\n },\n required: [\"query\"],\n },\n },\n http: false,\n readOnly: true,\n run: async (args: Record<string, string>) =>\n searchToolRegistry(getRegistry(), args, options),\n };\n}\n\nexport function attachToolSearch(\n registry: Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): Record<string, ActionEntry> {\n registry[TOOL_SEARCH_ACTION_NAME] = createToolSearchEntry(\n () => registry,\n options,\n );\n return registry;\n}\n\nexport function searchToolRegistry(\n registry: Record<string, ActionEntry>,\n args: ToolSearchArgs = {},\n options: ToolSearchOptions = {},\n): {\n query: string;\n totalTools: number;\n count: number;\n results: ToolSearchResult[];\n} {\n const query = String(args.query ?? \"\").trim();\n const includeSchemas = parseBoolean(args.includeSchemas);\n const limit = parseLimit(\n args.limit,\n options.defaultLimit ?? DEFAULT_LIMIT,\n options.maxLimit ?? MAX_LIMIT,\n );\n const queryTokens = tokenize(query);\n\n const candidates: ToolSearchResult[] = [];\n let totalTools = 0;\n\n for (const [name, entry] of Object.entries(registry)) {\n if (!entry?.tool || name === TOOL_SEARCH_ACTION_NAME) continue;\n if (name.startsWith(\"mcp__\") && !isMcpToolAllowedForRequest(name)) {\n continue;\n }\n\n totalTools++;\n const description = normalizeWhitespace(entry.tool.description ?? \"\");\n const parameters = summarizeParameters(entry.tool.parameters);\n const parsedMcp = parseMcpToolName(name);\n const kind = parsedMcp ? \"mcp\" : \"action\";\n const source = parsedMcp?.serverId;\n const score = scoreTool({\n query,\n queryTokens,\n name,\n source,\n description,\n parameters,\n kind,\n });\n\n if (queryTokens.length > 0 && score <= 0) continue;\n\n candidates.push({\n name,\n kind,\n ...(source ? { source } : {}),\n description,\n score,\n parameters,\n ...(includeSchemas ? { inputSchema: entry.tool.parameters ?? {} } : {}),\n });\n }\n\n candidates.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n });\n\n return {\n query,\n totalTools,\n count: Math.min(candidates.length, limit),\n results: candidates.slice(0, limit),\n };\n}\n\nfunction parseLimit(value: unknown, fallback: number, max: number): number {\n const n =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim()\n ? Number(value)\n : fallback;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.max(1, Math.min(max, Math.floor(n)));\n}\n\nfunction parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value !== \"string\") return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\n}\n\nfunction summarizeParameters(schema: unknown): ToolParameterSummary[] {\n if (!schema || typeof schema !== \"object\") return [];\n const obj = schema as {\n properties?: Record<string, unknown>;\n required?: unknown;\n };\n const properties = obj.properties;\n if (!properties || typeof properties !== \"object\") return [];\n const required = new Set(\n Array.isArray(obj.required)\n ? obj.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n\n return Object.entries(properties).map(([name, raw]) => {\n const prop =\n raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const enumValues = Array.isArray(prop.enum)\n ? prop.enum.map((value) => String(value)).slice(0, 20)\n : undefined;\n return {\n name,\n type: summarizeType(prop.type),\n required: required.has(name),\n description:\n typeof prop.description === \"string\"\n ? normalizeWhitespace(prop.description)\n : undefined,\n ...(enumValues && enumValues.length > 0 ? { enum: enumValues } : {}),\n };\n });\n}\n\nfunction summarizeType(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n const parts = value.filter((v): v is string => typeof v === \"string\");\n return parts.length > 0 ? parts.join(\" | \") : undefined;\n }\n return undefined;\n}\n\nfunction scoreTool(input: {\n query: string;\n queryTokens: string[];\n name: string;\n source?: string;\n description: string;\n parameters: ToolParameterSummary[];\n kind: \"action\" | \"mcp\";\n}): number {\n if (input.queryTokens.length === 0) return 1;\n\n const name = searchableText(input.name);\n const source = searchableText(input.source ?? \"\");\n const description = searchableText(input.description);\n const params = searchableText(\n input.parameters\n .map((p) => `${p.name} ${p.type ?? \"\"} ${p.description ?? \"\"}`)\n .join(\" \"),\n );\n const all = `${name} ${source} ${description} ${params} ${input.kind}`;\n const phrase = searchableText(input.query);\n\n let score = 0;\n if (name.includes(phrase)) score += 14;\n if (source && source.includes(phrase)) score += 10;\n if (description.includes(phrase)) score += 8;\n if (params.includes(phrase)) score += 5;\n\n for (const token of input.queryTokens) {\n if (name.split(\" \").includes(token)) score += 9;\n else if (name.includes(token)) score += 6;\n\n if (source) {\n if (source.split(\" \").includes(token)) score += 6;\n else if (source.includes(token)) score += 3;\n }\n\n if (description.includes(token)) score += 3;\n if (params.includes(token)) score += 2;\n if (all.includes(token)) score += 1;\n }\n\n return score;\n}\n\nfunction tokenize(value: string): string[] {\n const seen = new Set<string>();\n for (const token of searchableText(value).split(\" \")) {\n if (token.length > 0) seen.add(token);\n }\n return Array.from(seen);\n}\n\nfunction searchableText(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim();\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n"]}
1
+ {"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../src/agent/tool-search.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"./production-agent.js\";\nimport { parseMcpToolName } from \"../mcp-client/manager.js\";\nimport { isMcpToolAllowedForRequest } from \"../mcp-client/visibility.js\";\n\nexport const TOOL_SEARCH_ACTION_NAME = \"tool-search\";\n\ntype ToolSearchArgs = {\n query?: unknown;\n limit?: unknown;\n includeSchemas?: unknown;\n};\n\ntype ToolParameterSummary = {\n name: string;\n type?: string;\n required: boolean;\n description?: string;\n enum?: string[];\n};\n\ntype ToolSearchResult = {\n name: string;\n kind: \"action\" | \"mcp\";\n source?: string;\n description: string;\n score: number;\n parameters: ToolParameterSummary[];\n inputSchema?: unknown;\n};\n\ntype ToolSearchOptions = {\n defaultLimit?: number;\n maxLimit?: number;\n};\n\nconst DEFAULT_LIMIT = 8;\nconst MAX_LIMIT = 25;\n\nexport function createToolSearchEntry(\n getRegistry: () => Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): ActionEntry {\n return {\n tool: {\n description:\n \"Search the live registry of callable tools/actions, including connected MCP server tools named `mcp__<server>__<tool>`. Use this when you need a capability but are not sure which tool to call, especially after users connect new MCP servers. Returns exact tool names and parameter summaries so you can call the matching tool directly.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"What capability to find, e.g. `send slack message`, `create calendar event`, `zapier gmail`, or `browser screenshot`.\",\n },\n limit: {\n type: \"number\",\n description: `Maximum results to return. Defaults to ${options.defaultLimit ?? DEFAULT_LIMIT}.`,\n },\n includeSchemas: {\n type: \"boolean\",\n description:\n \"When true, include each matching tool's full input schema. Default false.\",\n },\n },\n required: [\"query\"],\n },\n },\n http: false,\n readOnly: true,\n run: async (args: Record<string, string>) =>\n searchToolRegistry(getRegistry(), args, options),\n };\n}\n\nexport function attachToolSearch(\n registry: Record<string, ActionEntry>,\n options: ToolSearchOptions = {},\n): Record<string, ActionEntry> {\n registry[TOOL_SEARCH_ACTION_NAME] = createToolSearchEntry(\n () => registry,\n options,\n );\n return registry;\n}\n\nexport function searchToolRegistry(\n registry: Record<string, ActionEntry>,\n args: ToolSearchArgs = {},\n options: ToolSearchOptions = {},\n): {\n query: string;\n totalTools: number;\n count: number;\n results: ToolSearchResult[];\n} {\n const query = String(args.query ?? \"\").trim();\n const includeSchemas = parseBoolean(args.includeSchemas);\n const limit = parseLimit(\n args.limit,\n options.defaultLimit ?? DEFAULT_LIMIT,\n options.maxLimit ?? MAX_LIMIT,\n );\n const queryTokens = tokenize(query);\n\n const candidates: ToolSearchResult[] = [];\n let totalTools = 0;\n\n for (const [name, entry] of Object.entries(registry)) {\n if (!entry?.tool || name === TOOL_SEARCH_ACTION_NAME) continue;\n if (name.startsWith(\"mcp__\") && !isMcpToolAllowedForRequest(name)) {\n continue;\n }\n\n totalTools++;\n const description = normalizeWhitespace(entry.tool.description ?? \"\");\n const parameters = summarizeParameters(entry.tool.parameters);\n const parsedMcp = parseMcpToolName(name);\n const kind = parsedMcp ? \"mcp\" : \"action\";\n const source = parsedMcp?.serverId;\n const score = scoreTool({\n query,\n queryTokens,\n name,\n source,\n description,\n parameters,\n kind,\n });\n\n if (queryTokens.length > 0 && score <= 0) continue;\n\n candidates.push({\n name,\n kind,\n ...(source ? { source } : {}),\n description,\n score,\n parameters,\n ...(includeSchemas ? { inputSchema: entry.tool.parameters ?? {} } : {}),\n });\n }\n\n candidates.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n });\n\n return {\n query,\n totalTools,\n count: Math.min(candidates.length, limit),\n results: candidates.slice(0, limit),\n };\n}\n\nfunction parseLimit(value: unknown, fallback: number, max: number): number {\n const n =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim()\n ? Number(value)\n : fallback;\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.max(1, Math.min(max, Math.floor(n)));\n}\n\nfunction parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value !== \"string\") return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\n}\n\nfunction summarizeParameters(schema: unknown): ToolParameterSummary[] {\n if (!schema || typeof schema !== \"object\") return [];\n const obj = schema as {\n properties?: Record<string, unknown>;\n required?: unknown;\n };\n const properties = obj.properties;\n if (!properties || typeof properties !== \"object\") return [];\n const required = new Set(\n Array.isArray(obj.required)\n ? obj.required.filter(\n (value): value is string => typeof value === \"string\",\n )\n : [],\n );\n\n return Object.entries(properties).map(([name, raw]) => {\n const prop =\n raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const enumValues = Array.isArray(prop.enum)\n ? prop.enum.map((value) => String(value)).slice(0, 20)\n : undefined;\n return {\n name,\n type: summarizeType(prop.type),\n required: required.has(name),\n description:\n typeof prop.description === \"string\"\n ? normalizeWhitespace(prop.description)\n : undefined,\n ...(enumValues && enumValues.length > 0 ? { enum: enumValues } : {}),\n };\n });\n}\n\nfunction summarizeType(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n const parts = value.filter((v): v is string => typeof v === \"string\");\n return parts.length > 0 ? parts.join(\" | \") : undefined;\n }\n return undefined;\n}\n\nfunction scoreTool(input: {\n query: string;\n queryTokens: string[];\n name: string;\n source?: string;\n description: string;\n parameters: ToolParameterSummary[];\n kind: \"action\" | \"mcp\";\n}): number {\n if (input.queryTokens.length === 0) return 1;\n\n const name = searchableText(input.name);\n const source = searchableText(input.source ?? \"\");\n const description = searchableText(input.description);\n const params = searchableText(\n input.parameters\n .map((p) => `${p.name} ${p.type ?? \"\"} ${p.description ?? \"\"}`)\n .join(\" \"),\n );\n const all = `${name} ${source} ${description} ${params} ${input.kind}`;\n const phrase = searchableText(input.query);\n\n let score = 0;\n if (name.includes(phrase)) score += 14;\n if (source && source.includes(phrase)) score += 10;\n if (description.includes(phrase)) score += 8;\n if (params.includes(phrase)) score += 5;\n\n for (const token of input.queryTokens) {\n if (name.split(\" \").includes(token)) score += 9;\n else if (name.includes(token)) score += 6;\n\n if (source) {\n if (source.split(\" \").includes(token)) score += 6;\n else if (source.includes(token)) score += 3;\n }\n\n if (description.includes(token)) score += 3;\n if (params.includes(token)) score += 2;\n if (all.includes(token)) score += 1;\n }\n\n return score;\n}\n\nfunction tokenize(value: string): string[] {\n const seen = new Set<string>();\n for (const token of searchableText(value).split(\" \")) {\n if (token.length > 0) seen.add(token);\n }\n return Array.from(seen);\n}\n\nfunction searchableText(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim();\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAsB9D,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAgBzC;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAWjE;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAkC9D,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAgBzC;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAWjE;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -1,6 +1,13 @@
1
1
  import { getDbExec, isConnectionError, isPostgres, intType, } from "../db/client.js";
2
2
  import { emitAppStateChange, emitAppStateDelete } from "./emitter.js";
3
3
  let _initPromise;
4
+ // Escapes LIKE wildcards (`%`, `_`) and the escape char itself so a caller's
5
+ // literal prefix is matched verbatim. Used with `ESCAPE '\'` in prefix queries
6
+ // below; without this, a prefix such as `user_settings` would treat `_` as a
7
+ // single-char wildcard and over-match (e.g. delete `userXsettings`).
8
+ function escapeLike(s) {
9
+ return s.replace(/([\\%_])/g, "\\$1");
10
+ }
4
11
  async function ensureTable() {
5
12
  if (!_initPromise) {
6
13
  _initPromise = (async () => {
@@ -14,7 +21,11 @@ async function ensureTable() {
14
21
  PRIMARY KEY (session_id, key)
15
22
  )
16
23
  `);
17
- })();
24
+ })().catch((err) => {
25
+ // Retry init on the next call after a failed startup.
26
+ _initPromise = undefined;
27
+ throw err;
28
+ });
18
29
  }
19
30
  return _initPromise;
20
31
  }
@@ -65,8 +76,8 @@ export async function appStateList(sessionId, keyPrefix) {
65
76
  await ensureTable();
66
77
  const client = getDbExec();
67
78
  const { rows } = await client.execute({
68
- sql: `SELECT key, value FROM application_state WHERE session_id = ? AND key LIKE ?`,
69
- args: [sessionId, keyPrefix + "%"],
79
+ sql: `SELECT key, value FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\'`,
80
+ args: [sessionId, escapeLike(keyPrefix) + "%"],
70
81
  });
71
82
  return rows.map((row) => ({
72
83
  key: row.key,
@@ -78,14 +89,14 @@ export async function appStateDeleteByPrefix(sessionId, keyPrefix, options) {
78
89
  const client = getDbExec();
79
90
  // Get keys first so we can emit events
80
91
  const { rows } = await client.execute({
81
- sql: `SELECT key FROM application_state WHERE session_id = ? AND key LIKE ?`,
82
- args: [sessionId, keyPrefix + "%"],
92
+ sql: `SELECT key FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\'`,
93
+ args: [sessionId, escapeLike(keyPrefix) + "%"],
83
94
  });
84
95
  if (rows.length === 0)
85
96
  return 0;
86
97
  const result = await client.execute({
87
- sql: `DELETE FROM application_state WHERE session_id = ? AND key LIKE ?`,
88
- args: [sessionId, keyPrefix + "%"],
98
+ sql: `DELETE FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\'`,
99
+ args: [sessionId, escapeLike(keyPrefix) + "%"],
89
100
  });
90
101
  for (const row of rows) {
91
102
  emitAppStateDelete(row.key, options?.requestSource, sessionId);
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n isConnectionError,\n isPostgres,\n intType,\n} from \"../db/client.js\";\nimport { emitAppStateChange, emitAppStateDelete } from \"./emitter.js\";\nimport type { StoreWriteOptions } from \"../settings/store.js\";\n\nlet _initPromise: Promise<void> | undefined;\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n await client.execute(`\n CREATE TABLE IF NOT EXISTS application_state (\n session_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at ${intType()} NOT NULL,\n PRIMARY KEY (session_id, key)\n )\n `);\n })();\n }\n return _initPromise;\n}\n\nexport async function appStateGet(\n sessionId: string,\n key: string,\n): Promise<Record<string, unknown> | null> {\n try {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT value FROM application_state WHERE session_id = ? AND key = ?`,\n args: [sessionId, key],\n });\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].value as string);\n } catch (err) {\n // Transient WS / connection drops (Neon serverless) — caller polls every\n // 2s and will see the value on the next tick. Swallow rather than 500.\n if (isConnectionError(err)) return null;\n throw err;\n }\n}\n\nexport async function appStatePut(\n sessionId: string,\n key: string,\n value: Record<string, unknown>,\n options?: StoreWriteOptions,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO application_state (session_id, key, value, updated_at) VALUES (?, ?, ?, ?) ON CONFLICT (session_id, key) DO UPDATE SET value=EXCLUDED.value, updated_at=EXCLUDED.updated_at`\n : `INSERT OR REPLACE INTO application_state (session_id, key, value, updated_at) VALUES (?, ?, ?, ?)`,\n args: [sessionId, key, JSON.stringify(value), Date.now()],\n });\n emitAppStateChange(key, options?.requestSource, sessionId);\n}\n\nexport async function appStateDelete(\n sessionId: string,\n key: string,\n options?: StoreWriteOptions,\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `DELETE FROM application_state WHERE session_id = ? AND key = ?`,\n args: [sessionId, key],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) emitAppStateDelete(key, options?.requestSource, sessionId);\n return deleted;\n}\n\nexport async function appStateList(\n sessionId: string,\n keyPrefix: string,\n): Promise<Array<{ key: string; value: Record<string, unknown> }>> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT key, value FROM application_state WHERE session_id = ? AND key LIKE ?`,\n args: [sessionId, keyPrefix + \"%\"],\n });\n return rows.map((row) => ({\n key: row.key as string,\n value: JSON.parse(row.value as string),\n }));\n}\n\nexport async function appStateDeleteByPrefix(\n sessionId: string,\n keyPrefix: string,\n options?: StoreWriteOptions,\n): Promise<number> {\n await ensureTable();\n const client = getDbExec();\n\n // Get keys first so we can emit events\n const { rows } = await client.execute({\n sql: `SELECT key FROM application_state WHERE session_id = ? AND key LIKE ?`,\n args: [sessionId, keyPrefix + \"%\"],\n });\n\n if (rows.length === 0) return 0;\n\n const result = await client.execute({\n sql: `DELETE FROM application_state WHERE session_id = ? AND key LIKE ?`,\n args: [sessionId, keyPrefix + \"%\"],\n });\n\n for (const row of rows) {\n emitAppStateDelete(row.key as string, options?.requestSource, sessionId);\n }\n\n return result.rowsAffected;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n isConnectionError,\n isPostgres,\n intType,\n} from \"../db/client.js\";\nimport { emitAppStateChange, emitAppStateDelete } from \"./emitter.js\";\nimport type { StoreWriteOptions } from \"../settings/store.js\";\n\nlet _initPromise: Promise<void> | undefined;\n\n// Escapes LIKE wildcards (`%`, `_`) and the escape char itself so a caller's\n// literal prefix is matched verbatim. Used with `ESCAPE '\\'` in prefix queries\n// below; without this, a prefix such as `user_settings` would treat `_` as a\n// single-char wildcard and over-match (e.g. delete `userXsettings`).\nfunction escapeLike(s: string): string {\n return s.replace(/([\\\\%_])/g, \"\\\\$1\");\n}\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n await client.execute(`\n CREATE TABLE IF NOT EXISTS application_state (\n session_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at ${intType()} NOT NULL,\n PRIMARY KEY (session_id, key)\n )\n `);\n })().catch((err) => {\n // Retry init on the next call after a failed startup.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nexport async function appStateGet(\n sessionId: string,\n key: string,\n): Promise<Record<string, unknown> | null> {\n try {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT value FROM application_state WHERE session_id = ? AND key = ?`,\n args: [sessionId, key],\n });\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].value as string);\n } catch (err) {\n // Transient WS / connection drops (Neon serverless) — caller polls every\n // 2s and will see the value on the next tick. Swallow rather than 500.\n if (isConnectionError(err)) return null;\n throw err;\n }\n}\n\nexport async function appStatePut(\n sessionId: string,\n key: string,\n value: Record<string, unknown>,\n options?: StoreWriteOptions,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO application_state (session_id, key, value, updated_at) VALUES (?, ?, ?, ?) ON CONFLICT (session_id, key) DO UPDATE SET value=EXCLUDED.value, updated_at=EXCLUDED.updated_at`\n : `INSERT OR REPLACE INTO application_state (session_id, key, value, updated_at) VALUES (?, ?, ?, ?)`,\n args: [sessionId, key, JSON.stringify(value), Date.now()],\n });\n emitAppStateChange(key, options?.requestSource, sessionId);\n}\n\nexport async function appStateDelete(\n sessionId: string,\n key: string,\n options?: StoreWriteOptions,\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `DELETE FROM application_state WHERE session_id = ? AND key = ?`,\n args: [sessionId, key],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) emitAppStateDelete(key, options?.requestSource, sessionId);\n return deleted;\n}\n\nexport async function appStateList(\n sessionId: string,\n keyPrefix: string,\n): Promise<Array<{ key: string; value: Record<string, unknown> }>> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT key, value FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\\\'`,\n args: [sessionId, escapeLike(keyPrefix) + \"%\"],\n });\n return rows.map((row) => ({\n key: row.key as string,\n value: JSON.parse(row.value as string),\n }));\n}\n\nexport async function appStateDeleteByPrefix(\n sessionId: string,\n keyPrefix: string,\n options?: StoreWriteOptions,\n): Promise<number> {\n await ensureTable();\n const client = getDbExec();\n\n // Get keys first so we can emit events\n const { rows } = await client.execute({\n sql: `SELECT key FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\\\'`,\n args: [sessionId, escapeLike(keyPrefix) + \"%\"],\n });\n\n if (rows.length === 0) return 0;\n\n const result = await client.execute({\n sql: `DELETE FROM application_state WHERE session_id = ? AND key LIKE ? ESCAPE '\\\\'`,\n args: [sessionId, escapeLike(keyPrefix) + \"%\"],\n });\n\n for (const row of rows) {\n emitAppStateDelete(row.key as string, options?.requestSource, sessionId);\n }\n\n return result.rowsAffected;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,+BAA+B,EAC/B,gCAAgC,EAGhC,2CAA2C,EAC3C,sCAAsC,EACvC,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,0CAA0C,QAAS,CAAC;AACjE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAmR3D,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,+BAA+B,CAAC,CA2C1C;AAED,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAqB5C;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAYjD;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AA8CD,wBAAsB,2BAA2B,CAC/C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,GACjD,OAAO,CAAC,gCAAgC,CAAC,CAqC3C;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAUlD;AAED,wBAAsB,0BAA0B,CAC9C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CA6BlD;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,EACF;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,OAAO,CAAC,gCAAgC,CAAC,CAoC3C;AAED,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAyClB;AAED,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,EAClD,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAalB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,+BAA+B,EAC/B,gCAAgC,EAGhC,2CAA2C,EAC3C,sCAAsC,EACvC,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,0CAA0C,QAAS,CAAC;AACjE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAwR3D,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,+BAA+B,CAAC,CA2C1C;AAED,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAqB5C;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAYjD;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AA8CD,wBAAsB,2BAA2B,CAC/C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,GACjD,OAAO,CAAC,gCAAgC,CAAC,CAqC3C;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAUlD;AAED,wBAAsB,0BAA0B,CAC9C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CA6BlD;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,EACF;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,OAAO,CAAC,gCAAgC,CAAC,CAoC3C;AAED,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAyClB;AAED,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,EAClD,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -58,7 +58,12 @@ async function ensureTables() {
58
58
  CREATE INDEX IF NOT EXISTS agent_native_browser_session_requests_pending_idx
59
59
  ON ${REQUEST_TABLE} (owner_email, session_id, status, created_at)
60
60
  `));
61
- })();
61
+ })().catch((err) => {
62
+ // Don't cache a transient init failure — otherwise every browser-session
63
+ // call re-awaits the same rejected promise until the process restarts.
64
+ initPromise = undefined;
65
+ throw err;
66
+ });
62
67
  }
63
68
  return initPromise;
64
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n intType,\n isPostgres,\n retryOnDdlRace,\n safeJsonParse,\n} from \"../db/client.js\";\nimport type {\n AgentNativeBrowserSession,\n AgentNativeBrowserSessionAction,\n AgentNativeBrowserSessionRecord,\n AgentNativeBrowserSessionRequest,\n AgentNativeBrowserSessionRequestStatus,\n AgentNativeBrowserSessionRequestType,\n CreateAgentNativeBrowserSessionRequestInput,\n RegisterAgentNativeBrowserSessionInput,\n} from \"./types.js\";\n\nexport const DEFAULT_BROWSER_SESSION_TTL_MS = 45_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS = 30_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS = 250;\n\nconst SESSION_TABLE = \"agent_native_browser_sessions\";\nconst REQUEST_TABLE = \"agent_native_browser_session_requests\";\nconst SAFE_ID_RE = /^[A-Za-z0-9._:-]{1,160}$/;\n\nlet initPromise: Promise<void> | undefined;\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function ensureTables(): Promise<void> {\n if (!initPromise) {\n initPromise = (async () => {\n const client = getDbExec();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${SESSION_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n label TEXT,\n url TEXT,\n session_json TEXT NOT NULL,\n context_json TEXT,\n actions_json TEXT,\n connected_at ${intType()} NOT NULL,\n last_seen_at ${intType()} NOT NULL,\n expires_at ${intType()} NOT NULL,\n PRIMARY KEY (owner_email, session_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_sessions_owner_seen_idx\n ON ${SESSION_TABLE} (owner_email, last_seen_at)\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${REQUEST_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n request_id TEXT NOT NULL,\n type TEXT NOT NULL,\n name TEXT,\n command TEXT,\n payload_json TEXT,\n status TEXT NOT NULL,\n created_at ${intType()} NOT NULL,\n claimed_at ${intType()},\n completed_at ${intType()},\n expires_at ${intType()} NOT NULL,\n result_json TEXT,\n error TEXT,\n PRIMARY KEY (owner_email, request_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_session_requests_pending_idx\n ON ${REQUEST_TABLE} (owner_email, session_id, status, created_at)\n `),\n );\n })();\n }\n return initPromise;\n}\n\nfunction assertOwnerEmail(ownerEmail: string): string {\n const trimmed = ownerEmail.trim();\n if (!trimmed) throw new Error(\"ownerEmail is required\");\n return trimmed;\n}\n\nfunction assertSafeId(value: string, label: string): string {\n const trimmed = value.trim();\n if (!SAFE_ID_RE.test(trimmed)) {\n throw new Error(\n `${label} must be 1-160 characters using letters, numbers, dot, underscore, colon, or dash`,\n );\n }\n return trimmed;\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction json(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction parseOptionalObject(\n value: unknown,\n): Record<string, unknown> | undefined {\n if (value == null) return undefined;\n const parsed = safeJsonParse<unknown>(value, undefined);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n}\n\nfunction parseActions(value: unknown): AgentNativeBrowserSessionAction[] {\n const parsed = safeJsonParse<unknown>(value, []);\n return Array.isArray(parsed)\n ? (parsed.filter(\n (action) =>\n action &&\n typeof action === \"object\" &&\n typeof (action as { name?: unknown }).name === \"string\",\n ) as AgentNativeBrowserSessionAction[])\n : [];\n}\n\nfunction parseSession(\n value: unknown,\n sessionId: string,\n): AgentNativeBrowserSession {\n const parsed = safeJsonParse<unknown>(value, { id: sessionId });\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? ({\n id: sessionId,\n ...(parsed as Record<string, unknown>),\n } as AgentNativeBrowserSession)\n : { id: sessionId };\n}\n\nfunction coerceTime(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n}\n\nfunction normalizeSessionInput(input: RegisterAgentNativeBrowserSessionInput): {\n sessionId: string;\n session: AgentNativeBrowserSession;\n label?: string;\n url?: string;\n context?: Record<string, unknown>;\n actions: AgentNativeBrowserSessionAction[];\n connectedAt: number;\n ttlMs: number;\n} {\n const sessionRecord: Partial<AgentNativeBrowserSession> =\n input.session && typeof input.session === \"object\" ? input.session : {};\n const rawId = input.sessionId || sessionRecord.id;\n if (typeof rawId !== \"string\") {\n throw new Error(\"session.id is required\");\n }\n const sessionId = assertSafeId(rawId, \"session.id\");\n const now = nowMs();\n const connectedAt = coerceTime(sessionRecord.connectedAt) ?? now;\n const label =\n typeof input.label === \"string\" && input.label.trim()\n ? input.label.trim()\n : typeof sessionRecord.label === \"string\" && sessionRecord.label.trim()\n ? sessionRecord.label.trim()\n : undefined;\n const url =\n typeof input.url === \"string\" && input.url.trim()\n ? input.url.trim()\n : typeof sessionRecord.url === \"string\" && sessionRecord.url.trim()\n ? sessionRecord.url.trim()\n : undefined;\n const session: AgentNativeBrowserSession = {\n ...sessionRecord,\n id: sessionId,\n ...(label ? { label } : {}),\n connectedAt: new Date(connectedAt).toISOString(),\n ...(url ? { url } : {}),\n };\n return {\n sessionId,\n session,\n label,\n url,\n context:\n input.context &&\n typeof input.context === \"object\" &&\n !Array.isArray(input.context)\n ? input.context\n : undefined,\n actions: Array.isArray(input.actions) ? input.actions : [],\n connectedAt,\n ttlMs:\n typeof input.ttlMs === \"number\" && input.ttlMs > 0\n ? Math.min(input.ttlMs, 5 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_TTL_MS,\n };\n}\n\nfunction rowToSession(\n row: Record<string, unknown>,\n now = nowMs(),\n): AgentNativeBrowserSessionRecord {\n const sessionId = String(row.session_id ?? \"\");\n const expiresAt = Number(row.expires_at ?? 0);\n return {\n sessionId,\n session: parseSession(row.session_json, sessionId),\n label: typeof row.label === \"string\" ? row.label : undefined,\n url: typeof row.url === \"string\" ? row.url : undefined,\n context: parseOptionalObject(row.context_json),\n actions: parseActions(row.actions_json),\n connectedAt: Number(row.connected_at ?? 0),\n lastSeenAt: Number(row.last_seen_at ?? 0),\n expiresAt,\n active: expiresAt > now,\n };\n}\n\nfunction rowToRequest(\n row: Record<string, unknown>,\n): AgentNativeBrowserSessionRequest {\n const type = String(\n row.type ?? \"get-context\",\n ) as AgentNativeBrowserSessionRequestType;\n const payload = safeJsonParse<unknown>(row.payload_json, undefined);\n const result = safeJsonParse<unknown>(row.result_json, undefined);\n const request: AgentNativeBrowserSessionRequest = {\n id: String(row.request_id ?? \"\"),\n sessionId: String(row.session_id ?? \"\"),\n type,\n status: String(\n row.status ?? \"pending\",\n ) as AgentNativeBrowserSessionRequestStatus,\n createdAt: Number(row.created_at ?? 0),\n expiresAt: Number(row.expires_at ?? 0),\n ...(typeof row.name === \"string\" && row.name ? { name: row.name } : {}),\n ...(typeof row.command === \"string\" && row.command\n ? { command: row.command }\n : {}),\n ...(row.claimed_at != null ? { claimedAt: Number(row.claimed_at) } : {}),\n ...(row.completed_at != null\n ? { completedAt: Number(row.completed_at) }\n : {}),\n ...(row.error ? { error: String(row.error) } : {}),\n ...(row.result_json != null ? { result } : {}),\n };\n if (type === \"run-action\") request.args = payload;\n else request.payload = payload;\n return request;\n}\n\nasync function expireOldRequests(\n ownerEmail: string,\n sessionId?: string,\n): Promise<void> {\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n await client.execute({\n sql: sessionId\n ? `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed') AND expires_at < ?`\n : `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND status IN ('pending', 'claimed') AND expires_at < ?`,\n args: sessionId\n ? [now, ownerEmail, sessionId, now]\n : [now, ownerEmail, now],\n });\n}\n\nexport async function registerBrowserSession(\n ownerEmailInput: string,\n input: RegisterAgentNativeBrowserSessionInput,\n): Promise<AgentNativeBrowserSessionRecord> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const normalized = normalizeSessionInput(input);\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n const expiresAt = now + normalized.ttlMs;\n\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (owner_email, session_id) DO UPDATE SET\n label = EXCLUDED.label,\n url = EXCLUDED.url,\n session_json = EXCLUDED.session_json,\n context_json = EXCLUDED.context_json,\n actions_json = EXCLUDED.actions_json,\n last_seen_at = EXCLUDED.last_seen_at,\n expires_at = EXCLUDED.expires_at`\n : `INSERT OR REPLACE INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n ownerEmail,\n normalized.sessionId,\n normalized.label ?? null,\n normalized.url ?? null,\n json(normalized.session),\n normalized.context ? json(normalized.context) : null,\n json(normalized.actions),\n normalized.connectedAt,\n now,\n expiresAt,\n ],\n });\n\n const saved = await getBrowserSession(ownerEmail, normalized.sessionId, {\n includeExpired: true,\n });\n if (!saved) throw new Error(\"Failed to register browser session\");\n return saved;\n}\n\nexport async function listBrowserSessions(\n ownerEmailInput: string,\n options: { includeExpired?: boolean; limit?: number } = {},\n): Promise<AgentNativeBrowserSessionRecord[]> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n await ensureTables();\n await expireOldRequests(ownerEmail);\n const client = getDbExec();\n const limit =\n typeof options.limit === \"number\" && options.limit > 0\n ? Math.min(Math.floor(options.limit), 100)\n : 25;\n const now = nowMs();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE}\n WHERE owner_email = ?\n ORDER BY last_seen_at DESC\n LIMIT ?`,\n args: [ownerEmail, limit],\n });\n const sessions = rows.map((row) => rowToSession(row, now));\n return options.includeExpired\n ? sessions\n : sessions.filter((session) => session.active);\n}\n\nexport async function getBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n options: { includeExpired?: boolean } = {},\n): Promise<AgentNativeBrowserSessionRecord | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n if (rows.length === 0) return null;\n const session = rowToSession(rows[0]);\n return options.includeExpired || session.active ? session : null;\n}\n\nexport async function disconnectBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<boolean> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser session disconnected'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed')`,\n args: [nowMs(), ownerEmail, sessionId],\n });\n const result = await client.execute({\n sql: `DELETE FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n return result.rowsAffected > 0;\n}\n\nfunction normalizeRequestInput(\n input: CreateAgentNativeBrowserSessionRequestInput,\n): {\n type: AgentNativeBrowserSessionRequestType;\n name?: string;\n command?: string;\n payload?: unknown;\n timeoutMs: number;\n} {\n if (\n input.type !== \"get-context\" &&\n input.type !== \"list-actions\" &&\n input.type !== \"run-action\" &&\n input.type !== \"command\"\n ) {\n throw new Error(\n \"request type must be get-context, list-actions, run-action, or command\",\n );\n }\n const name =\n typeof input.name === \"string\" && input.name.trim()\n ? input.name.trim()\n : undefined;\n if (input.type === \"run-action\" && !name) {\n throw new Error(\"name is required for run-action requests\");\n }\n const command =\n typeof input.command === \"string\" && input.command.trim()\n ? input.command.trim()\n : input.type === \"command\"\n ? \"refreshData\"\n : undefined;\n return {\n type: input.type,\n name,\n command,\n payload: input.type === \"run-action\" ? input.args : input.payload,\n timeoutMs:\n typeof input.timeoutMs === \"number\" && input.timeoutMs > 0\n ? Math.min(input.timeoutMs, 2 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS,\n };\n}\n\nexport async function createBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const session = await getBrowserSession(ownerEmail, sessionId);\n if (!session) {\n throw new Error(`No active browser session found for \"${sessionId}\"`);\n }\n const normalized = normalizeRequestInput(input);\n await ensureTables();\n const client = getDbExec();\n const createdAt = nowMs();\n const requestId = generateId(\"browser-request\");\n const expiresAt = createdAt + normalized.timeoutMs + 15_000;\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)\n ON CONFLICT (owner_email, request_id) DO NOTHING`\n : `INSERT OR IGNORE INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,\n args: [\n ownerEmail,\n sessionId,\n requestId,\n normalized.type,\n normalized.name ?? null,\n normalized.command ?? null,\n json(normalized.payload),\n createdAt,\n expiresAt,\n ],\n });\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request) throw new Error(\"Failed to create browser-session request\");\n return request;\n}\n\nexport async function getBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE} WHERE owner_email = ? AND request_id = ?`,\n args: [ownerEmail, requestId],\n });\n return rows.length ? rowToRequest(rows[0]) : null;\n}\n\nexport async function claimBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n await expireOldRequests(ownerEmail, sessionId);\n const client = getDbExec();\n const now = nowMs();\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE}\n WHERE owner_email = ? AND session_id = ? AND status = 'pending' AND expires_at >= ?\n ORDER BY created_at ASC\n LIMIT 1`,\n args: [ownerEmail, sessionId, now],\n });\n if (rows.length === 0) return null;\n const candidate = rowToRequest(rows[0]);\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'claimed', claimed_at = ?\n WHERE owner_email = ? AND request_id = ? AND status = 'pending'`,\n args: [now, ownerEmail, candidate.id],\n });\n if (updated.rowsAffected > 0) {\n return getBrowserSessionRequest(ownerEmail, candidate.id);\n }\n }\n return null;\n}\n\nexport async function completeBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n requestIdInput: string,\n result:\n | { ok: true; result?: unknown }\n | { ok: false; error?: string; result?: unknown },\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const completedAt = nowMs();\n const status: AgentNativeBrowserSessionRequestStatus =\n result.ok === true ? \"completed\" : \"failed\";\n const error =\n result.ok === false\n ? result.error || \"Browser-session request failed\"\n : null;\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = ?, completed_at = ?, result_json = ?, error = ?\n WHERE owner_email = ? AND session_id = ? AND request_id = ? AND status IN ('pending', 'claimed')`,\n args: [\n status,\n completedAt,\n \"result\" in result ? json(result.result) : null,\n error,\n ownerEmail,\n sessionId,\n requestId,\n ],\n });\n if (updated.rowsAffected === 0) {\n const existing = await getBrowserSessionRequest(ownerEmail, requestId);\n if (existing) return existing;\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n }\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n return request;\n}\n\nexport async function waitForBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n const timeoutMs =\n typeof options.timeoutMs === \"number\" && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS;\n const pollMs =\n typeof options.pollMs === \"number\" && options.pollMs > 0\n ? options.pollMs\n : DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS;\n const deadline = nowMs() + timeoutMs;\n\n while (nowMs() <= deadline) {\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n if (request.status === \"completed\") return request.result;\n if (request.status === \"failed\") {\n throw new Error(request.error || \"Browser-session request failed\");\n }\n if (request.status === \"expired\" || request.expiresAt < nowMs()) {\n await expireOldRequests(ownerEmail, request.sessionId);\n throw new Error(request.error || \"Browser-session request expired\");\n }\n await sleep(Math.min(pollMs, Math.max(1, deadline - nowMs())));\n }\n\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (request) {\n await completeBrowserSessionRequest(\n ownerEmail,\n request.sessionId,\n requestId,\n {\n ok: false,\n error: \"Timed out waiting for browser-session response\",\n },\n );\n }\n throw new Error(\"Timed out waiting for browser-session response\");\n}\n\nexport async function callBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const request = await createBrowserSessionRequest(\n ownerEmailInput,\n sessionIdInput,\n {\n ...input,\n timeoutMs: input.timeoutMs ?? options.timeoutMs,\n },\n );\n return waitForBrowserSessionRequest(ownerEmailInput, request.id, {\n timeoutMs: options.timeoutMs ?? input.timeoutMs,\n pollMs: options.pollMs,\n });\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n intType,\n isPostgres,\n retryOnDdlRace,\n safeJsonParse,\n} from \"../db/client.js\";\nimport type {\n AgentNativeBrowserSession,\n AgentNativeBrowserSessionAction,\n AgentNativeBrowserSessionRecord,\n AgentNativeBrowserSessionRequest,\n AgentNativeBrowserSessionRequestStatus,\n AgentNativeBrowserSessionRequestType,\n CreateAgentNativeBrowserSessionRequestInput,\n RegisterAgentNativeBrowserSessionInput,\n} from \"./types.js\";\n\nexport const DEFAULT_BROWSER_SESSION_TTL_MS = 45_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS = 30_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS = 250;\n\nconst SESSION_TABLE = \"agent_native_browser_sessions\";\nconst REQUEST_TABLE = \"agent_native_browser_session_requests\";\nconst SAFE_ID_RE = /^[A-Za-z0-9._:-]{1,160}$/;\n\nlet initPromise: Promise<void> | undefined;\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function ensureTables(): Promise<void> {\n if (!initPromise) {\n initPromise = (async () => {\n const client = getDbExec();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${SESSION_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n label TEXT,\n url TEXT,\n session_json TEXT NOT NULL,\n context_json TEXT,\n actions_json TEXT,\n connected_at ${intType()} NOT NULL,\n last_seen_at ${intType()} NOT NULL,\n expires_at ${intType()} NOT NULL,\n PRIMARY KEY (owner_email, session_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_sessions_owner_seen_idx\n ON ${SESSION_TABLE} (owner_email, last_seen_at)\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${REQUEST_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n request_id TEXT NOT NULL,\n type TEXT NOT NULL,\n name TEXT,\n command TEXT,\n payload_json TEXT,\n status TEXT NOT NULL,\n created_at ${intType()} NOT NULL,\n claimed_at ${intType()},\n completed_at ${intType()},\n expires_at ${intType()} NOT NULL,\n result_json TEXT,\n error TEXT,\n PRIMARY KEY (owner_email, request_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_session_requests_pending_idx\n ON ${REQUEST_TABLE} (owner_email, session_id, status, created_at)\n `),\n );\n })().catch((err) => {\n // Don't cache a transient init failure — otherwise every browser-session\n // call re-awaits the same rejected promise until the process restarts.\n initPromise = undefined;\n throw err;\n });\n }\n return initPromise;\n}\n\nfunction assertOwnerEmail(ownerEmail: string): string {\n const trimmed = ownerEmail.trim();\n if (!trimmed) throw new Error(\"ownerEmail is required\");\n return trimmed;\n}\n\nfunction assertSafeId(value: string, label: string): string {\n const trimmed = value.trim();\n if (!SAFE_ID_RE.test(trimmed)) {\n throw new Error(\n `${label} must be 1-160 characters using letters, numbers, dot, underscore, colon, or dash`,\n );\n }\n return trimmed;\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction json(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction parseOptionalObject(\n value: unknown,\n): Record<string, unknown> | undefined {\n if (value == null) return undefined;\n const parsed = safeJsonParse<unknown>(value, undefined);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n}\n\nfunction parseActions(value: unknown): AgentNativeBrowserSessionAction[] {\n const parsed = safeJsonParse<unknown>(value, []);\n return Array.isArray(parsed)\n ? (parsed.filter(\n (action) =>\n action &&\n typeof action === \"object\" &&\n typeof (action as { name?: unknown }).name === \"string\",\n ) as AgentNativeBrowserSessionAction[])\n : [];\n}\n\nfunction parseSession(\n value: unknown,\n sessionId: string,\n): AgentNativeBrowserSession {\n const parsed = safeJsonParse<unknown>(value, { id: sessionId });\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? ({\n id: sessionId,\n ...(parsed as Record<string, unknown>),\n } as AgentNativeBrowserSession)\n : { id: sessionId };\n}\n\nfunction coerceTime(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n}\n\nfunction normalizeSessionInput(input: RegisterAgentNativeBrowserSessionInput): {\n sessionId: string;\n session: AgentNativeBrowserSession;\n label?: string;\n url?: string;\n context?: Record<string, unknown>;\n actions: AgentNativeBrowserSessionAction[];\n connectedAt: number;\n ttlMs: number;\n} {\n const sessionRecord: Partial<AgentNativeBrowserSession> =\n input.session && typeof input.session === \"object\" ? input.session : {};\n const rawId = input.sessionId || sessionRecord.id;\n if (typeof rawId !== \"string\") {\n throw new Error(\"session.id is required\");\n }\n const sessionId = assertSafeId(rawId, \"session.id\");\n const now = nowMs();\n const connectedAt = coerceTime(sessionRecord.connectedAt) ?? now;\n const label =\n typeof input.label === \"string\" && input.label.trim()\n ? input.label.trim()\n : typeof sessionRecord.label === \"string\" && sessionRecord.label.trim()\n ? sessionRecord.label.trim()\n : undefined;\n const url =\n typeof input.url === \"string\" && input.url.trim()\n ? input.url.trim()\n : typeof sessionRecord.url === \"string\" && sessionRecord.url.trim()\n ? sessionRecord.url.trim()\n : undefined;\n const session: AgentNativeBrowserSession = {\n ...sessionRecord,\n id: sessionId,\n ...(label ? { label } : {}),\n connectedAt: new Date(connectedAt).toISOString(),\n ...(url ? { url } : {}),\n };\n return {\n sessionId,\n session,\n label,\n url,\n context:\n input.context &&\n typeof input.context === \"object\" &&\n !Array.isArray(input.context)\n ? input.context\n : undefined,\n actions: Array.isArray(input.actions) ? input.actions : [],\n connectedAt,\n ttlMs:\n typeof input.ttlMs === \"number\" && input.ttlMs > 0\n ? Math.min(input.ttlMs, 5 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_TTL_MS,\n };\n}\n\nfunction rowToSession(\n row: Record<string, unknown>,\n now = nowMs(),\n): AgentNativeBrowserSessionRecord {\n const sessionId = String(row.session_id ?? \"\");\n const expiresAt = Number(row.expires_at ?? 0);\n return {\n sessionId,\n session: parseSession(row.session_json, sessionId),\n label: typeof row.label === \"string\" ? row.label : undefined,\n url: typeof row.url === \"string\" ? row.url : undefined,\n context: parseOptionalObject(row.context_json),\n actions: parseActions(row.actions_json),\n connectedAt: Number(row.connected_at ?? 0),\n lastSeenAt: Number(row.last_seen_at ?? 0),\n expiresAt,\n active: expiresAt > now,\n };\n}\n\nfunction rowToRequest(\n row: Record<string, unknown>,\n): AgentNativeBrowserSessionRequest {\n const type = String(\n row.type ?? \"get-context\",\n ) as AgentNativeBrowserSessionRequestType;\n const payload = safeJsonParse<unknown>(row.payload_json, undefined);\n const result = safeJsonParse<unknown>(row.result_json, undefined);\n const request: AgentNativeBrowserSessionRequest = {\n id: String(row.request_id ?? \"\"),\n sessionId: String(row.session_id ?? \"\"),\n type,\n status: String(\n row.status ?? \"pending\",\n ) as AgentNativeBrowserSessionRequestStatus,\n createdAt: Number(row.created_at ?? 0),\n expiresAt: Number(row.expires_at ?? 0),\n ...(typeof row.name === \"string\" && row.name ? { name: row.name } : {}),\n ...(typeof row.command === \"string\" && row.command\n ? { command: row.command }\n : {}),\n ...(row.claimed_at != null ? { claimedAt: Number(row.claimed_at) } : {}),\n ...(row.completed_at != null\n ? { completedAt: Number(row.completed_at) }\n : {}),\n ...(row.error ? { error: String(row.error) } : {}),\n ...(row.result_json != null ? { result } : {}),\n };\n if (type === \"run-action\") request.args = payload;\n else request.payload = payload;\n return request;\n}\n\nasync function expireOldRequests(\n ownerEmail: string,\n sessionId?: string,\n): Promise<void> {\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n await client.execute({\n sql: sessionId\n ? `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed') AND expires_at < ?`\n : `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND status IN ('pending', 'claimed') AND expires_at < ?`,\n args: sessionId\n ? [now, ownerEmail, sessionId, now]\n : [now, ownerEmail, now],\n });\n}\n\nexport async function registerBrowserSession(\n ownerEmailInput: string,\n input: RegisterAgentNativeBrowserSessionInput,\n): Promise<AgentNativeBrowserSessionRecord> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const normalized = normalizeSessionInput(input);\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n const expiresAt = now + normalized.ttlMs;\n\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (owner_email, session_id) DO UPDATE SET\n label = EXCLUDED.label,\n url = EXCLUDED.url,\n session_json = EXCLUDED.session_json,\n context_json = EXCLUDED.context_json,\n actions_json = EXCLUDED.actions_json,\n last_seen_at = EXCLUDED.last_seen_at,\n expires_at = EXCLUDED.expires_at`\n : `INSERT OR REPLACE INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n ownerEmail,\n normalized.sessionId,\n normalized.label ?? null,\n normalized.url ?? null,\n json(normalized.session),\n normalized.context ? json(normalized.context) : null,\n json(normalized.actions),\n normalized.connectedAt,\n now,\n expiresAt,\n ],\n });\n\n const saved = await getBrowserSession(ownerEmail, normalized.sessionId, {\n includeExpired: true,\n });\n if (!saved) throw new Error(\"Failed to register browser session\");\n return saved;\n}\n\nexport async function listBrowserSessions(\n ownerEmailInput: string,\n options: { includeExpired?: boolean; limit?: number } = {},\n): Promise<AgentNativeBrowserSessionRecord[]> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n await ensureTables();\n await expireOldRequests(ownerEmail);\n const client = getDbExec();\n const limit =\n typeof options.limit === \"number\" && options.limit > 0\n ? Math.min(Math.floor(options.limit), 100)\n : 25;\n const now = nowMs();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE}\n WHERE owner_email = ?\n ORDER BY last_seen_at DESC\n LIMIT ?`,\n args: [ownerEmail, limit],\n });\n const sessions = rows.map((row) => rowToSession(row, now));\n return options.includeExpired\n ? sessions\n : sessions.filter((session) => session.active);\n}\n\nexport async function getBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n options: { includeExpired?: boolean } = {},\n): Promise<AgentNativeBrowserSessionRecord | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n if (rows.length === 0) return null;\n const session = rowToSession(rows[0]);\n return options.includeExpired || session.active ? session : null;\n}\n\nexport async function disconnectBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<boolean> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser session disconnected'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed')`,\n args: [nowMs(), ownerEmail, sessionId],\n });\n const result = await client.execute({\n sql: `DELETE FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n return result.rowsAffected > 0;\n}\n\nfunction normalizeRequestInput(\n input: CreateAgentNativeBrowserSessionRequestInput,\n): {\n type: AgentNativeBrowserSessionRequestType;\n name?: string;\n command?: string;\n payload?: unknown;\n timeoutMs: number;\n} {\n if (\n input.type !== \"get-context\" &&\n input.type !== \"list-actions\" &&\n input.type !== \"run-action\" &&\n input.type !== \"command\"\n ) {\n throw new Error(\n \"request type must be get-context, list-actions, run-action, or command\",\n );\n }\n const name =\n typeof input.name === \"string\" && input.name.trim()\n ? input.name.trim()\n : undefined;\n if (input.type === \"run-action\" && !name) {\n throw new Error(\"name is required for run-action requests\");\n }\n const command =\n typeof input.command === \"string\" && input.command.trim()\n ? input.command.trim()\n : input.type === \"command\"\n ? \"refreshData\"\n : undefined;\n return {\n type: input.type,\n name,\n command,\n payload: input.type === \"run-action\" ? input.args : input.payload,\n timeoutMs:\n typeof input.timeoutMs === \"number\" && input.timeoutMs > 0\n ? Math.min(input.timeoutMs, 2 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS,\n };\n}\n\nexport async function createBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const session = await getBrowserSession(ownerEmail, sessionId);\n if (!session) {\n throw new Error(`No active browser session found for \"${sessionId}\"`);\n }\n const normalized = normalizeRequestInput(input);\n await ensureTables();\n const client = getDbExec();\n const createdAt = nowMs();\n const requestId = generateId(\"browser-request\");\n const expiresAt = createdAt + normalized.timeoutMs + 15_000;\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)\n ON CONFLICT (owner_email, request_id) DO NOTHING`\n : `INSERT OR IGNORE INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,\n args: [\n ownerEmail,\n sessionId,\n requestId,\n normalized.type,\n normalized.name ?? null,\n normalized.command ?? null,\n json(normalized.payload),\n createdAt,\n expiresAt,\n ],\n });\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request) throw new Error(\"Failed to create browser-session request\");\n return request;\n}\n\nexport async function getBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE} WHERE owner_email = ? AND request_id = ?`,\n args: [ownerEmail, requestId],\n });\n return rows.length ? rowToRequest(rows[0]) : null;\n}\n\nexport async function claimBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n await expireOldRequests(ownerEmail, sessionId);\n const client = getDbExec();\n const now = nowMs();\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE}\n WHERE owner_email = ? AND session_id = ? AND status = 'pending' AND expires_at >= ?\n ORDER BY created_at ASC\n LIMIT 1`,\n args: [ownerEmail, sessionId, now],\n });\n if (rows.length === 0) return null;\n const candidate = rowToRequest(rows[0]);\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'claimed', claimed_at = ?\n WHERE owner_email = ? AND request_id = ? AND status = 'pending'`,\n args: [now, ownerEmail, candidate.id],\n });\n if (updated.rowsAffected > 0) {\n return getBrowserSessionRequest(ownerEmail, candidate.id);\n }\n }\n return null;\n}\n\nexport async function completeBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n requestIdInput: string,\n result:\n | { ok: true; result?: unknown }\n | { ok: false; error?: string; result?: unknown },\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const completedAt = nowMs();\n const status: AgentNativeBrowserSessionRequestStatus =\n result.ok === true ? \"completed\" : \"failed\";\n const error =\n result.ok === false\n ? result.error || \"Browser-session request failed\"\n : null;\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = ?, completed_at = ?, result_json = ?, error = ?\n WHERE owner_email = ? AND session_id = ? AND request_id = ? AND status IN ('pending', 'claimed')`,\n args: [\n status,\n completedAt,\n \"result\" in result ? json(result.result) : null,\n error,\n ownerEmail,\n sessionId,\n requestId,\n ],\n });\n if (updated.rowsAffected === 0) {\n const existing = await getBrowserSessionRequest(ownerEmail, requestId);\n if (existing) return existing;\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n }\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n return request;\n}\n\nexport async function waitForBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n const timeoutMs =\n typeof options.timeoutMs === \"number\" && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS;\n const pollMs =\n typeof options.pollMs === \"number\" && options.pollMs > 0\n ? options.pollMs\n : DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS;\n const deadline = nowMs() + timeoutMs;\n\n while (nowMs() <= deadline) {\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n if (request.status === \"completed\") return request.result;\n if (request.status === \"failed\") {\n throw new Error(request.error || \"Browser-session request failed\");\n }\n if (request.status === \"expired\" || request.expiresAt < nowMs()) {\n await expireOldRequests(ownerEmail, request.sessionId);\n throw new Error(request.error || \"Browser-session request expired\");\n }\n await sleep(Math.min(pollMs, Math.max(1, deadline - nowMs())));\n }\n\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (request) {\n await completeBrowserSessionRequest(\n ownerEmail,\n request.sessionId,\n requestId,\n {\n ok: false,\n error: \"Timed out waiting for browser-session response\",\n },\n );\n }\n throw new Error(\"Timed out waiting for browser-session response\");\n}\n\nexport async function callBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const request = await createBrowserSessionRequest(\n ownerEmailInput,\n sessionIdInput,\n {\n ...input,\n timeoutMs: input.timeoutMs ?? options.timeoutMs,\n },\n );\n return waitForBrowserSessionRequest(ownerEmailInput, request.id, {\n timeoutMs: options.timeoutMs ?? input.timeoutMs,\n pollMs: options.pollMs,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/chat-threads/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/chat-threads/store.ts"],"names":[],"mappings":"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"}
@@ -74,7 +74,11 @@ async function ensureTable() {
74
74
  // Column already exists.
75
75
  }
76
76
  }
77
- })();
77
+ })().catch((err) => {
78
+ // Retry init on the next call after a failed startup.
79
+ _initPromise = undefined;
80
+ throw err;
81
+ });
78
82
  }
79
83
  return _initPromise;
80
84
  }
@@ -336,7 +340,7 @@ export async function searchThreads(ownerEmail, query, limit = 50, options = {})
336
340
  const filters = [
337
341
  `owner_email = ?`,
338
342
  `(message_count > 0 OR thread_data LIKE '%"messages"%')`,
339
- `(title LIKE ? OR preview LIKE ? OR thread_data LIKE ?)`,
343
+ `(title LIKE ? ESCAPE '\\' OR preview LIKE ? ESCAPE '\\' OR thread_data LIKE ? ESCAPE '\\')`,
340
344
  ];
341
345
  const args = [ownerEmail, pattern, pattern, pattern];
342
346
  if (options.scope) {