@agent-native/core 0.7.19 → 0.7.20
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.
- package/README.md +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +45 -2
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/loop-settings.d.ts +37 -0
- package/dist/agent/loop-settings.d.ts.map +1 -0
- package/dist/agent/loop-settings.js +127 -0
- package/dist/agent/loop-settings.js.map +1 -0
- package/dist/agent/production-agent.d.ts +8 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +268 -29
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +76 -3
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +65 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +3 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +52 -10
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/tool-search.d.ts +37 -0
- package/dist/agent/tool-search.d.ts.map +1 -0
- package/dist/agent/tool-search.js +201 -0
- package/dist/agent/tool-search.js.map +1 -0
- package/dist/agent/types.d.ts +8 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +44 -9
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/workspacify.d.ts +2 -0
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +34 -1
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +277 -18
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +1 -1
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +14 -6
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts +14 -0
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -0
- package/dist/client/NewWorkspaceAppFlow.js +200 -0
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -0
- package/dist/client/PoweredByBadge.d.ts +10 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +120 -8
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +3 -5
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +26 -19
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +15 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/analytics.d.ts +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +141 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-frame.d.ts +10 -0
- package/dist/client/builder-frame.d.ts.map +1 -0
- package/dist/client/builder-frame.js +94 -0
- package/dist/client/builder-frame.js.map +1 -0
- package/dist/client/composer/MentionPopover.d.ts.map +1 -1
- package/dist/client/composer/MentionPopover.js +5 -1
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +11 -6
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/error-format.d.ts +20 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +53 -5
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +88 -6
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +145 -9
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +13 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +50 -9
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +3 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +88 -7
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
- package/dist/client/tools/ToolsListPage.js +16 -1
- package/dist/client/tools/ToolsListPage.js.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.js +63 -8
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
- package/dist/client/tools/tool-order.d.ts +7 -0
- package/dist/client/tools/tool-order.d.ts.map +1 -0
- package/dist/client/tools/tool-order.js +47 -0
- package/dist/client/tools/tool-order.js.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js +71 -6
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
- package/dist/client/use-send-to-agent-chat.js +11 -3
- package/dist/client/use-send-to-agent-chat.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +1 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +5 -1
- package/dist/db/client.js.map +1 -1
- package/dist/deploy/build.d.ts +1 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +4 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/oauth-tokens/index.d.ts +1 -1
- package/dist/oauth-tokens/index.d.ts.map +1 -1
- package/dist/oauth-tokens/index.js +1 -1
- package/dist/oauth-tokens/index.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +6 -0
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/observability/store.d.ts.map +1 -1
- package/dist/observability/store.js +19 -19
- package/dist/observability/store.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +95 -61
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +17 -8
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/org/migrations.js +2 -2
- package/dist/org/migrations.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +2 -3
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/db/exec.d.ts +2 -1
- package/dist/scripts/db/exec.d.ts.map +1 -1
- package/dist/scripts/db/exec.js +264 -61
- package/dist/scripts/db/exec.js.map +1 -1
- package/dist/scripts/db/schema.d.ts.map +1 -1
- package/dist/scripts/db/schema.js +16 -4
- package/dist/scripts/db/schema.js.map +1 -1
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +36 -11
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/scripts/manage-agent-loop-settings.d.ts +7 -0
- package/dist/scripts/manage-agent-loop-settings.d.ts.map +1 -0
- package/dist/scripts/manage-agent-loop-settings.js +63 -0
- package/dist/scripts/manage-agent-loop-settings.js.map +1 -0
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +11 -0
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +60 -18
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/app-url.d.ts +5 -4
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +8 -4
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +8 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +82 -29
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +16 -5
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +12 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +36 -4
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +350 -53
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +21 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +51 -21
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/google-oauth.d.ts +3 -0
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +27 -3
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +4 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/schema-prompt.d.ts.map +1 -1
- package/dist/server/schema-prompt.js +2 -1
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/server/security-headers.d.ts +3 -0
- package/dist/server/security-headers.d.ts.map +1 -1
- package/dist/server/security-headers.js +7 -1
- package/dist/server/security-headers.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +24 -4
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/templates/default/_gitignore +5 -1
- package/dist/templates/default/app/root.tsx +1 -0
- package/dist/templates/default/public/favicon.svg +3 -3
- package/dist/templates/default/public/icon-180.svg +3 -3
- package/dist/templates/default/public/icon-192.svg +3 -3
- package/dist/templates/default/public/icon-512.svg +3 -3
- package/dist/templates/workspace-core/AGENTS.md +23 -7
- package/dist/templates/workspace-core/package.json +2 -1
- package/dist/templates/workspace-core/src/credentials.ts +22 -11
- package/dist/templates/workspace-root/.env.example +7 -0
- package/dist/templates/workspace-root/README.md +6 -3
- package/dist/templates/workspace-root/_gitignore +3 -0
- package/dist/templates/workspace-root/package.json +3 -1
- package/dist/templates/workspace-root/scripts/workspace-dev.ts +410 -0
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +2 -0
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/html-shell.d.ts.map +1 -1
- package/dist/tools/html-shell.js +13 -1
- package/dist/tools/html-shell.js.map +1 -1
- package/dist/tools/store.d.ts.map +1 -1
- package/dist/tools/store.js +10 -10
- package/dist/tools/store.js.map +1 -1
- package/dist/tracking/providers.d.ts +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +72 -0
- package/dist/tracking/providers.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +106 -9
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +67 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/content/authentication.md +17 -13
- package/docs/content/deployment.md +11 -11
- package/docs/content/mcp-clients.md +2 -2
- package/docs/content/onboarding.md +32 -30
- package/docs/content/security.md +1 -1
- package/docs/content/tools.md +4 -0
- package/package.json +2 -2
- package/src/templates/default/_gitignore +5 -1
- package/src/templates/default/app/root.tsx +1 -0
- package/src/templates/default/public/favicon.svg +3 -3
- package/src/templates/default/public/icon-180.svg +3 -3
- package/src/templates/default/public/icon-192.svg +3 -3
- package/src/templates/default/public/icon-512.svg +3 -3
- package/src/templates/workspace-core/AGENTS.md +23 -7
- package/src/templates/workspace-core/package.json +2 -1
- package/src/templates/workspace-core/src/credentials.ts +22 -11
- package/src/templates/workspace-root/.env.example +7 -0
- package/src/templates/workspace-root/README.md +6 -3
- package/src/templates/workspace-root/_gitignore +3 -0
- package/src/templates/workspace-root/package.json +3 -1
- package/src/templates/workspace-root/scripts/workspace-dev.ts +410 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProductionAgent.js","sourceRoot":"","sources":["../../src/client/useProductionAgent.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useCallback, useRef } from \"react\";\nimport type { AgentMessage, AgentChatEvent } from \"../agent/types.js\";\nimport { formatChatErrorText } from \"./error-format.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface ProductionAgentMessage {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n toolCalls?: Array<{\n tool: string;\n input: Record<string, string>;\n result?: string;\n }>;\n}\n\nexport interface UseProductionAgentOptions {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n}\n\nexport interface UseProductionAgentResult {\n messages: ProductionAgentMessage[];\n isGenerating: boolean;\n sendMessage: (text: string) => void;\n clearHistory: () => void;\n}\n\n/** @deprecated Use `AssistantChat` component instead */\nexport function useProductionAgent(\n options?: UseProductionAgentOptions,\n): UseProductionAgentResult {\n const apiUrl =\n options?.apiUrl ?? agentNativePath(\"/_agent-native/agent-chat\");\n const [messages, setMessages] = useState<ProductionAgentMessage[]>([]);\n const [isGenerating, setIsGenerating] = useState(false);\n const abortRef = useRef<AbortController | null>(null);\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isGenerating) return;\n\n const userMsg: ProductionAgentMessage = {\n id: `user-${Date.now()}`,\n role: \"user\",\n content: text.trim(),\n };\n\n setMessages((prev) => [...prev, userMsg]);\n setIsGenerating(true);\n\n // Notify any listeners that generation is running\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { running: true },\n }),\n );\n\n // Build history for this request — skip empty-content messages\n // (assistant turns with only tool calls have no text content to send)\n const history: AgentMessage[] = messages\n .filter((m) => m.content.trim())\n .map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantId = `assistant-${Date.now()}`;\n const assistantMsg: ProductionAgentMessage = {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const abort = new AbortController();\n abortRef.current = abort;\n\n try {\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message: text.trim(), history }),\n signal: abort.signal,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(`Server error: ${res.status}`);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buf = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const raw = line.slice(6).trim();\n if (!raw) continue;\n\n let ev: AgentChatEvent;\n try {\n ev = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (ev.type === \"text\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: m.content + ev.text }\n : m,\n ),\n );\n } else if (ev.type === \"tool_start\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n toolCalls: [\n ...(m.toolCalls ?? []),\n { tool: ev.tool, input: ev.input },\n ],\n }\n : m,\n ),\n );\n } else if (ev.type === \"tool_done\") {\n setMessages((prev) =>\n prev.map((m) => {\n if (m.id !== assistantId) return m;\n const calls = [...(m.toolCalls ?? [])];\n // Update last tool call with result\n const idx = calls.map((c) => c.tool).lastIndexOf(ev.tool);\n if (idx >= 0)\n calls[idx] = { ...calls[idx], result: ev.result };\n return { ...m, toolCalls: calls };\n }),\n );\n } else if (ev.type === \"agent_call\") {\n const agentName = ev.agent;\n if (ev.status === \"start\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n toolCalls: [\n ...(m.toolCalls ?? []),\n {\n tool: `agent:${agentName}`,\n input: {},\n },\n ],\n }\n : m,\n ),\n );\n } else if (ev.status === \"done\" || ev.status === \"error\") {\n setMessages((prev) =>\n prev.map((m) => {\n if (m.id !== assistantId) return m;\n const calls = [...(m.toolCalls ?? [])];\n const idx = calls\n .map((c) => c.tool)\n .lastIndexOf(`agent:${agentName}`);\n if (idx >= 0)\n calls[idx] = {\n ...calls[idx],\n result:\n ev.status === \"error\"\n ? \"Error calling agent\"\n : \"Done\",\n };\n return { ...m, toolCalls: calls };\n }),\n );\n }\n } else if (ev.type === \"done\" || ev.type === \"error\") {\n if (ev.type === \"error\") {\n const fallbackContent = formatChatErrorText(\n ev.error ?? \"Unknown error\",\n ev.upgradeUrl,\n );\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: m.content || fallbackContent }\n : m,\n ),\n );\n }\n break;\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== \"AbortError\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n content:\n m.content || \"Something went wrong. Please try again.\",\n }\n : m,\n ),\n );\n }\n } finally {\n setIsGenerating(false);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { running: false },\n }),\n );\n abortRef.current = null;\n }\n },\n [messages, isGenerating],\n );\n\n const clearHistory = useCallback(() => {\n abortRef.current?.abort();\n setMessages([]);\n setIsGenerating(false);\n }, []);\n\n return { messages, isGenerating, sendMessage, clearHistory };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useProductionAgent.js","sourceRoot":"","sources":["../../src/client/useProductionAgent.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useCallback, useRef } from \"react\";\nimport type { AgentMessage, AgentChatEvent } from \"../agent/types.js\";\nimport { formatChatErrorText } from \"./error-format.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface ProductionAgentMessage {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n toolCalls?: Array<{\n tool: string;\n input: Record<string, string>;\n result?: string;\n }>;\n}\n\nexport interface UseProductionAgentOptions {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n}\n\nexport interface UseProductionAgentResult {\n messages: ProductionAgentMessage[];\n isGenerating: boolean;\n sendMessage: (text: string) => void;\n clearHistory: () => void;\n}\n\n/** @deprecated Use `AssistantChat` component instead */\nexport function useProductionAgent(\n options?: UseProductionAgentOptions,\n): UseProductionAgentResult {\n const apiUrl =\n options?.apiUrl ?? agentNativePath(\"/_agent-native/agent-chat\");\n const [messages, setMessages] = useState<ProductionAgentMessage[]>([]);\n const [isGenerating, setIsGenerating] = useState(false);\n const abortRef = useRef<AbortController | null>(null);\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isGenerating) return;\n\n const userMsg: ProductionAgentMessage = {\n id: `user-${Date.now()}`,\n role: \"user\",\n content: text.trim(),\n };\n\n setMessages((prev) => [...prev, userMsg]);\n setIsGenerating(true);\n\n // Notify any listeners that generation is running\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { running: true },\n }),\n );\n\n // Build history for this request — skip empty-content messages\n // (assistant turns with only tool calls have no text content to send)\n const history: AgentMessage[] = messages\n .filter((m) => m.content.trim())\n .map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantId = `assistant-${Date.now()}`;\n const assistantMsg: ProductionAgentMessage = {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n toolCalls: [],\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const abort = new AbortController();\n abortRef.current = abort;\n\n try {\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message: text.trim(), history }),\n signal: abort.signal,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(`Server error: ${res.status}`);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buf = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const raw = line.slice(6).trim();\n if (!raw) continue;\n\n let ev: AgentChatEvent;\n try {\n ev = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (ev.type === \"text\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: m.content + ev.text }\n : m,\n ),\n );\n } else if (ev.type === \"tool_start\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n toolCalls: [\n ...(m.toolCalls ?? []),\n { tool: ev.tool, input: ev.input },\n ],\n }\n : m,\n ),\n );\n } else if (ev.type === \"tool_done\") {\n setMessages((prev) =>\n prev.map((m) => {\n if (m.id !== assistantId) return m;\n const calls = [...(m.toolCalls ?? [])];\n // Update last tool call with result\n const idx = calls.map((c) => c.tool).lastIndexOf(ev.tool);\n if (idx >= 0)\n calls[idx] = { ...calls[idx], result: ev.result };\n return { ...m, toolCalls: calls };\n }),\n );\n } else if (ev.type === \"agent_call\") {\n const agentName = ev.agent;\n if (ev.status === \"start\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n toolCalls: [\n ...(m.toolCalls ?? []),\n {\n tool: `agent:${agentName}`,\n input: {},\n },\n ],\n }\n : m,\n ),\n );\n } else if (ev.status === \"done\" || ev.status === \"error\") {\n setMessages((prev) =>\n prev.map((m) => {\n if (m.id !== assistantId) return m;\n const calls = [...(m.toolCalls ?? [])];\n const idx = calls\n .map((c) => c.tool)\n .lastIndexOf(`agent:${agentName}`);\n if (idx >= 0)\n calls[idx] = {\n ...calls[idx],\n result:\n ev.status === \"error\"\n ? \"Error calling agent\"\n : \"Done\",\n };\n return { ...m, toolCalls: calls };\n }),\n );\n }\n } else if (ev.type === \"done\" || ev.type === \"error\") {\n if (ev.type === \"error\") {\n const fallbackContent = formatChatErrorText(\n ev.error ?? \"Unknown error\",\n ev.upgradeUrl,\n ev.errorCode,\n );\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: m.content || fallbackContent }\n : m,\n ),\n );\n }\n break;\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== \"AbortError\") {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n content:\n m.content || \"Something went wrong. Please try again.\",\n }\n : m,\n ),\n );\n }\n } finally {\n setIsGenerating(false);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { running: false },\n }),\n );\n abortRef.current = null;\n }\n },\n [messages, isGenerating],\n );\n\n const clearHistory = useCallback(() => {\n abortRef.current?.abort();\n setMessages([]);\n setIsGenerating(false);\n }, []);\n\n return { messages, isGenerating, sendMessage, clearHistory };\n}\n"]}
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AAEnD,MAAM,WAAW,MAAM;IACrB,OAAO,CACL,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,GACzC,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CAOpD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAO/D;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxE;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AAEnD,MAAM,WAAW,MAAM;IACrB,OAAO,CACL,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,GACzC,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CAOpD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAO/D;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxE;AAiBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAejD;AAQD,wBAAgB,UAAU,IAAI,OAAO,CAyBpC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED,iFAAiF;AACjF,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AA0BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAoBnD;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,SAAI,GACd,OAAO,CAAC,CAAC,CAAC,CAYZ;AAqMD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CA2BlC;AAED,qEAAqE;AACrE,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjD"}
|
package/dist/db/client.js
CHANGED
|
@@ -112,14 +112,18 @@ export async function retryOnDdlRace(fn) {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
function isPgCatalogRace(e) {
|
|
115
|
+
if (e?.code === "42P07")
|
|
116
|
+
return true;
|
|
115
117
|
if (e?.code !== "23505")
|
|
116
118
|
return false;
|
|
117
119
|
const constraint = String(e?.constraint_name ?? e?.constraint ?? "");
|
|
118
120
|
const detail = String(e?.detail ?? "");
|
|
121
|
+
const msg = String(e?.message ?? "");
|
|
119
122
|
return (constraint.startsWith("pg_type") ||
|
|
120
123
|
constraint.startsWith("pg_class") ||
|
|
121
124
|
detail.includes("pg_type") ||
|
|
122
|
-
detail.includes("pg_class")
|
|
125
|
+
detail.includes("pg_class") ||
|
|
126
|
+
/relation .* already exists/i.test(msg));
|
|
123
127
|
}
|
|
124
128
|
/**
|
|
125
129
|
* True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any
|
package/dist/db/client.js.map
CHANGED
|
@@ -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 and @libsql/client are lazy (dynamic import) so this\n * module can be loaded in any runtime (Node.js, Cloudflare Workers, edge)\n * 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\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\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 !== \"23505\") return false;\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\n const detail = String(e?.detail ?? \"\");\n return (\n constraint.startsWith(\"pg_type\") ||\n constraint.startsWith(\"pg_class\") ||\n detail.includes(\"pg_type\") ||\n detail.includes(\"pg_class\")\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\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 \"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// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = globalThis.__cf_env?.DB;\n _exec = {\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 return;\n }\n\n let url = getDatabaseUrl(\"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 _neonPool = new Pool({ connectionString: url });\n const pool = _neonPool;\n _exec = {\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 return;\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 _exec = {\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.\n // idle_timeout:240 closes idle connections before Neon's ~5min server-side\n // timeout, avoiding ECONNRESET when the server hangs up on us.\n _pgPool = postgres(url, {\n onnotice: () => {},\n idle_timeout: 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 Postgres deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n });\n const pool = _pgPool;\n\n _exec = {\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 return;\n }\n\n // SQLite / libsql (default)\n if (url.startsWith(\"file:\")) {\n // On serverless runtimes (Netlify, AWS Lambda) the working directory is\n // read-only. Detect this and redirect local SQLite to /tmp which IS\n // writable (ephemeral per invocation, but the server stays alive for the\n // duration of the request).\n const isServerless =\n !!process.env.NETLIFY ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT;\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n url = \"file:///tmp/data/app.db\";\n } else {\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n }\n } catch {\n // Edge runtime — no filesystem\n }\n }\n\n const { createClient } = await import(\"@libsql/client\");\n const client = createClient({\n url,\n authToken: getDatabaseAuthToken(),\n });\n\n // Enable WAL mode and set busy timeout for local SQLite.\n // Retries handle SQLITE_BUSY_RECOVERY (stale WAL from a previous crash/HMR restart).\n if (url.startsWith(\"file:\") || url.endsWith(\".db\")) {\n await retrySqliteBusy(async () => {\n await client.execute(\"PRAGMA busy_timeout = 10000\");\n await client.execute(\"PRAGMA journal_mode = WAL\");\n });\n }\n\n _exec = {\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\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 _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 and @libsql/client are lazy (dynamic import) so this\n * module can be loaded in any runtime (Node.js, Cloudflare Workers, edge)\n * 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\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\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\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 \"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// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = globalThis.__cf_env?.DB;\n _exec = {\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 return;\n }\n\n let url = getDatabaseUrl(\"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 _neonPool = new Pool({ connectionString: url });\n const pool = _neonPool;\n _exec = {\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 return;\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 _exec = {\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.\n // idle_timeout:240 closes idle connections before Neon's ~5min server-side\n // timeout, avoiding ECONNRESET when the server hangs up on us.\n _pgPool = postgres(url, {\n onnotice: () => {},\n idle_timeout: 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 Postgres deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n });\n const pool = _pgPool;\n\n _exec = {\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 return;\n }\n\n // SQLite / libsql (default)\n if (url.startsWith(\"file:\")) {\n // On serverless runtimes (Netlify, AWS Lambda) the working directory is\n // read-only. Detect this and redirect local SQLite to /tmp which IS\n // writable (ephemeral per invocation, but the server stays alive for the\n // duration of the request).\n const isServerless =\n !!process.env.NETLIFY ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT;\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n url = \"file:///tmp/data/app.db\";\n } else {\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n }\n } catch {\n // Edge runtime — no filesystem\n }\n }\n\n const { createClient } = await import(\"@libsql/client\");\n const client = createClient({\n url,\n authToken: getDatabaseAuthToken(),\n });\n\n // Enable WAL mode and set busy timeout for local SQLite.\n // Retries handle SQLITE_BUSY_RECOVERY (stale WAL from a previous crash/HMR restart).\n if (url.startsWith(\"file:\") || url.endsWith(\".db\")) {\n await retrySqliteBusy(async () => {\n await client.execute(\"PRAGMA busy_timeout = 10000\");\n await client.execute(\"PRAGMA journal_mode = WAL\");\n });\n }\n\n _exec = {\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\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 _exec = undefined;\n _initPromise = undefined;\n}\n"]}
|
package/dist/deploy/build.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ import { type WorkspaceCoreExports } from "./workspace-core.js";
|
|
|
24
24
|
* inheritance model: app local > workspace core > framework default.
|
|
25
25
|
*/
|
|
26
26
|
export declare function generateWorkerEntry(routes: DiscoveredRoute[], pluginPaths: string[], defaultPluginStems?: string[], actions?: DiscoveredAction[], workspaceCore?: WorkspaceCoreExports | null): string;
|
|
27
|
+
export declare function getNodeBuiltinNames(): string[];
|
|
27
28
|
//# sourceMappingURL=build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAwB7B;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EAAE,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,kBAAkB,GAAE,MAAM,EAAO,EACjC,OAAO,GAAE,gBAAgB,EAAO,EAChC,aAAa,GAAE,oBAAoB,GAAG,IAAW,GAChD,MAAM,CAkVR"}
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAwB7B;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EAAE,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,kBAAkB,GAAE,MAAM,EAAO,EACjC,OAAO,GAAE,gBAAgB,EAAO,EAChC,aAAa,GAAE,oBAAoB,GAAG,IAAW,GAChD,MAAM,CAkVR;AA+WD,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
package/dist/deploy/build.js
CHANGED
|
@@ -630,6 +630,7 @@ const NODE_BUILTINS = [
|
|
|
630
630
|
"querystring",
|
|
631
631
|
"readline",
|
|
632
632
|
"repl",
|
|
633
|
+
"sqlite",
|
|
633
634
|
"stream",
|
|
634
635
|
"stream/web",
|
|
635
636
|
"string_decoder",
|
|
@@ -646,7 +647,7 @@ const NODE_BUILTINS = [
|
|
|
646
647
|
"worker_threads",
|
|
647
648
|
"zlib",
|
|
648
649
|
];
|
|
649
|
-
function getNodeBuiltinNames() {
|
|
650
|
+
export function getNodeBuiltinNames() {
|
|
650
651
|
return NODE_BUILTINS;
|
|
651
652
|
}
|
|
652
653
|
/**
|
|
@@ -1056,6 +1057,7 @@ export default bundle;
|
|
|
1056
1057
|
"child_process",
|
|
1057
1058
|
"module",
|
|
1058
1059
|
"process",
|
|
1060
|
+
"sqlite",
|
|
1059
1061
|
"worker_threads",
|
|
1060
1062
|
"querystring",
|
|
1061
1063
|
"zlib",
|
|
@@ -1231,6 +1233,7 @@ export default bundle;
|
|
|
1231
1233
|
"child_process",
|
|
1232
1234
|
"module",
|
|
1233
1235
|
"process",
|
|
1236
|
+
"sqlite",
|
|
1234
1237
|
"worker_threads",
|
|
1235
1238
|
"string_decoder",
|
|
1236
1239
|
"diagnostics_channel",
|