@agent-native/core 0.131.7 → 0.132.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +123 -0
- package/corpus/core/docs/content/durable-background-runs.mdx +15 -6
- package/corpus/core/docs/design/durable-agent-runs.md +15 -11
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/activity.ts +127 -10
- package/corpus/core/src/a2a/index.ts +3 -0
- package/corpus/core/src/agent/durable-background.ts +38 -28
- package/corpus/core/src/agent/harness/background.ts +12 -2
- package/corpus/core/src/agent/production-agent.ts +18 -15
- package/corpus/core/src/agent/run-store.ts +45 -3
- package/corpus/core/src/application-state/handlers.ts +45 -0
- package/corpus/core/src/application-state/index.ts +3 -0
- package/corpus/core/src/application-state/store.ts +38 -34
- package/corpus/core/src/audit/redact.ts +104 -18
- package/corpus/core/src/cli/create.ts +115 -16
- package/corpus/core/src/client/AgentPanel.tsx +2 -7
- package/corpus/core/src/client/AssistantChat.tsx +10 -2
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +29 -6
- package/corpus/core/src/client/agent-chat.ts +4 -9
- package/corpus/core/src/client/application-state.ts +115 -12
- package/corpus/core/src/client/dynamic-suggestions.ts +4 -12
- package/corpus/core/src/client/frame-protocol.ts +5 -1
- package/corpus/core/src/client/guided-questions.tsx +12 -23
- package/corpus/core/src/db/client.ts +148 -28
- package/corpus/core/src/db/create-get-db.ts +39 -6
- package/corpus/core/src/db/runtime-diagnostics.ts +41 -6
- package/corpus/core/src/deploy/build.ts +26 -33
- package/corpus/core/src/feature-flags/store.ts +10 -5
- package/corpus/core/src/integrations/a2a-continuations-store.ts +11 -0
- package/corpus/core/src/integrations/config-store.ts +13 -0
- package/corpus/core/src/integrations/google-docs-poller.ts +26 -2
- package/corpus/core/src/mcp-client/routes.ts +33 -2
- package/corpus/core/src/onboarding/plugin.ts +31 -25
- package/corpus/core/src/org/accept-pending.ts +2 -0
- package/corpus/core/src/org/auto-join-domain.ts +2 -0
- package/corpus/core/src/org/context.ts +35 -10
- package/corpus/core/src/org/handlers.ts +6 -0
- package/corpus/core/src/org/request-org-cache.ts +71 -0
- package/corpus/core/src/resources/store.ts +10 -9
- package/corpus/core/src/scripts/runner.ts +6 -3
- package/corpus/core/src/secrets/storage.ts +97 -5
- package/corpus/core/src/server/action-change.ts +33 -0
- package/corpus/core/src/server/action-routes.ts +11 -9
- package/corpus/core/src/server/agent-teams.ts +10 -2
- package/corpus/core/src/server/better-auth-instance.ts +39 -12
- package/corpus/core/src/server/core-routes-plugin.ts +19 -2
- package/corpus/core/src/server/credential-provider.ts +57 -14
- package/corpus/core/src/server/http-response-telemetry.ts +1 -0
- package/corpus/core/src/server/poll.ts +95 -57
- package/corpus/core/src/server/voice-providers-status.ts +19 -4
- package/corpus/core/src/workspace-files/tool.ts +18 -11
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +38 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
- package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +299 -0
- package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +34 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +82 -0
- package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +2 -2
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +40 -34
- package/corpus/templates/analytics/app/hooks/use-user-pref.ts +3 -3
- package/corpus/templates/analytics/app/i18n-data.ts +40 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +18 -10
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +14 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/routes/chart.tsx +3 -0
- package/corpus/templates/analytics/changelog/2026-07-30-analytics-dashboards-now-expose-native-funnel-heatmap-callou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-30-analytics-now-ships-reusable-native-v2-dashboard-manifests-w.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +81 -1
- package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +457 -0
- package/corpus/templates/analytics/server/lib/report-chart-svg.ts +73 -2
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/analytics/shared/dashboard-funnel.ts +83 -0
- package/corpus/templates/clips/actions/generate-workflow.ts +6 -4
- package/corpus/templates/clips/actions/reconcile-workflow-generation.ts +257 -0
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +166 -4
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
- package/corpus/templates/clips/changelog/2026-07-27-stopped-agent-runs-no-longer-leave-generated-workflow-cards-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-30-workflow-generation-now-stops-retrying-after-repeated-failur.md +6 -0
- package/corpus/templates/clips/shared/workflow.ts +5 -0
- package/corpus/templates/content/changelog/2026-07-30-long-running-delegated-requests-now-continue-reliably.md +6 -0
- package/corpus/templates/content/netlify.toml +3 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -1
- package/corpus/templates/slides/actions/patch-deck.ts +25 -1
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +17 -4
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +9 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +11 -3
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +39 -11
- package/corpus/templates/slides/app/pages/Index.tsx +2 -2
- package/corpus/templates/slides/changelog/2026-07-30-slide-previews-keep-their-aspect-ratio-isolate-embedded-styl.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slides-no-longer-lose-decks-while-organization-access-is-loa.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +8 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/runtime-adapters.tsx +16 -11
- package/dist/a2a/activity.d.ts +22 -4
- package/dist/a2a/activity.d.ts.map +1 -1
- package/dist/a2a/activity.js +97 -11
- package/dist/a2a/activity.js.map +1 -1
- package/dist/a2a/index.d.ts +1 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -1
- package/dist/a2a/index.js.map +1 -1
- package/dist/agent/durable-background.d.ts +13 -8
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +36 -28
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/harness/background.d.ts.map +1 -1
- package/dist/agent/harness/background.js +12 -2
- package/dist/agent/harness/background.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +18 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts +2 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +44 -3
- package/dist/agent/run-store.js.map +1 -1
- package/dist/application-state/handlers.d.ts +15 -0
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/handlers.js +42 -2
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/application-state/index.d.ts +2 -2
- package/dist/application-state/index.d.ts.map +1 -1
- package/dist/application-state/index.js +2 -2
- package/dist/application-state/index.js.map +1 -1
- package/dist/application-state/store.d.ts +11 -0
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +37 -40
- package/dist/application-state/store.js.map +1 -1
- package/dist/audit/redact.d.ts +25 -2
- package/dist/audit/redact.d.ts.map +1 -1
- package/dist/audit/redact.js +85 -21
- package/dist/audit/redact.js.map +1 -1
- package/dist/cli/create.d.ts +8 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +98 -16
- package/dist/cli/create.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -7
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +10 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +11 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +20 -7
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +4 -6
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/application-state.d.ts +11 -0
- package/dist/client/application-state.d.ts.map +1 -1
- package/dist/client/application-state.js +87 -9
- package/dist/client/application-state.js.map +1 -1
- package/dist/client/dynamic-suggestions.d.ts.map +1 -1
- package/dist/client/dynamic-suggestions.js +4 -13
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +1 -0
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +6 -22
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +57 -10
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +122 -31
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +31 -7
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/runtime-diagnostics.d.ts +1 -0
- package/dist/db/runtime-diagnostics.d.ts.map +1 -1
- package/dist/db/runtime-diagnostics.js +31 -6
- package/dist/db/runtime-diagnostics.js.map +1 -1
- package/dist/deploy/build.d.ts +5 -20
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +18 -30
- package/dist/deploy/build.js.map +1 -1
- package/dist/feature-flags/store.d.ts.map +1 -1
- package/dist/feature-flags/store.js +10 -5
- package/dist/feature-flags/store.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +12 -0
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/config-store.d.ts +1 -0
- package/dist/integrations/config-store.d.ts.map +1 -1
- package/dist/integrations/config-store.js +11 -0
- package/dist/integrations/config-store.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +19 -2
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +30 -2
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/notifications/routes.d.ts +6 -6
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +12 -8
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/org/accept-pending.d.ts.map +1 -1
- package/dist/org/accept-pending.js +2 -0
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +2 -0
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +29 -9
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +5 -0
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/request-org-cache.d.ts +16 -0
- package/dist/org/request-org-cache.d.ts.map +1 -0
- package/dist/org/request-org-cache.js +62 -0
- package/dist/org/request-org-cache.js.map +1 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +11 -9
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +3 -3
- package/dist/scripts/runner.js.map +1 -1
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +82 -5
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/action-change.d.ts +20 -0
- package/dist/server/action-change.d.ts.map +1 -1
- package/dist/server/action-change.js +29 -0
- package/dist/server/action-change.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +7 -8
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +10 -2
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +31 -14
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +18 -4
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +16 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +49 -13
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +1 -0
- package/dist/server/http-response-telemetry.js.map +1 -1
- package/dist/server/poll.d.ts +6 -0
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +84 -47
- package/dist/server/poll.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/voice-providers-status.d.ts.map +1 -1
- package/dist/server/voice-providers-status.js +12 -3
- package/dist/server/voice-providers-status.js.map +1 -1
- package/dist/workspace-files/tool.d.ts.map +1 -1
- package/dist/workspace-files/tool.js +18 -11
- package/dist/workspace-files/tool.js.map +1 -1
- package/docs/content/durable-background-runs.mdx +15 -6
- package/docs/design/durable-agent-runs.md +15 -11
- package/package.json +3 -3
- package/src/a2a/activity.ts +127 -10
- package/src/a2a/index.ts +3 -0
- package/src/agent/durable-background.ts +38 -28
- package/src/agent/harness/background.ts +12 -2
- package/src/agent/production-agent.ts +18 -15
- package/src/agent/run-store.ts +45 -3
- package/src/application-state/handlers.ts +45 -0
- package/src/application-state/index.ts +3 -0
- package/src/application-state/store.ts +38 -34
- package/src/audit/redact.ts +104 -18
- package/src/cli/create.ts +115 -16
- package/src/client/AgentPanel.tsx +2 -7
- package/src/client/AssistantChat.tsx +10 -2
- package/src/client/MultiTabAssistantChat.tsx +3 -0
- package/src/client/RunStuckBanner.tsx +29 -6
- package/src/client/agent-chat.ts +4 -9
- package/src/client/application-state.ts +115 -12
- package/src/client/dynamic-suggestions.ts +4 -12
- package/src/client/frame-protocol.ts +5 -1
- package/src/client/guided-questions.tsx +12 -23
- package/src/db/client.ts +148 -28
- package/src/db/create-get-db.ts +39 -6
- package/src/db/runtime-diagnostics.ts +41 -6
- package/src/deploy/build.ts +26 -33
- package/src/feature-flags/store.ts +10 -5
- package/src/integrations/a2a-continuations-store.ts +11 -0
- package/src/integrations/config-store.ts +13 -0
- package/src/integrations/google-docs-poller.ts +26 -2
- package/src/mcp-client/routes.ts +33 -2
- package/src/onboarding/plugin.ts +31 -25
- package/src/org/accept-pending.ts +2 -0
- package/src/org/auto-join-domain.ts +2 -0
- package/src/org/context.ts +35 -10
- package/src/org/handlers.ts +6 -0
- package/src/org/request-org-cache.ts +71 -0
- package/src/resources/store.ts +10 -9
- package/src/scripts/runner.ts +6 -3
- package/src/secrets/storage.ts +97 -5
- package/src/server/action-change.ts +33 -0
- package/src/server/action-routes.ts +11 -9
- package/src/server/agent-teams.ts +10 -2
- package/src/server/better-auth-instance.ts +39 -12
- package/src/server/core-routes-plugin.ts +19 -2
- package/src/server/credential-provider.ts +57 -14
- package/src/server/http-response-telemetry.ts +1 -0
- package/src/server/poll.ts +95 -57
- package/src/server/voice-providers-status.ts +19 -4
- package/src/workspace-files/tool.ts +18 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/resources/store.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\n\nimport {\n getDbExec,\n isPostgres,\n intType,\n retryOnDdlRace,\n type DbExec,\n} from \"../db/client.js\";\nimport { ensureColumnExists, ensureTableExists } from \"../db/ddl-guard.js\";\nimport { widenIntColumnsToBigInt } from \"../db/widen-columns.js\";\nimport {\n canUseLocalWorkspaceResourcePath,\n deleteLocalWorkspaceResource,\n isLocalWorkspaceResourceId,\n isLocalWorkspaceResourcesEnabled,\n listLocalWorkspaceResources,\n localWorkspaceResourcePathFromId,\n readLocalWorkspaceResource,\n writeLocalWorkspaceResource,\n type LocalWorkspaceResourceFile,\n type LocalWorkspaceResourceMeta,\n} from \"../local-artifacts/index.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport type { StoreWriteOptions } from \"../settings/store.js\";\nimport { emitResourceChange, emitResourceDelete } from \"./emitter.js\";\n\nexport const SHARED_OWNER = \"__shared__\";\nexport const WORKSPACE_OWNER = \"__workspace__\";\nconst ORGANIZATION_OWNER_PREFIX = \"__organization__:\";\n\n/**\n * Encode an organization id into the existing resource owner key. This keeps\n * organization resources isolated without a destructive resources-table\n * migration, while preserving the legacy `__shared__` owner as the app-wide\n * default/fallback used by older deployments and solo mode.\n */\nexport function organizationResourceOwner(orgId: string): string {\n const normalized = orgId.trim();\n if (!normalized) {\n throw new Error(\"organizationResourceOwner requires a non-empty orgId\");\n }\n return `${ORGANIZATION_OWNER_PREFIX}${encodeURIComponent(normalized)}`;\n}\n\nexport function organizationIdFromResourceOwner(owner: string): string | null {\n if (!owner.startsWith(ORGANIZATION_OWNER_PREFIX)) return null;\n const encoded = owner.slice(ORGANIZATION_OWNER_PREFIX.length);\n if (!encoded) return null;\n try {\n return decodeURIComponent(encoded);\n } catch {\n return null;\n }\n}\n\n/** Active organization scope, with the legacy app-shared owner as solo fallback. */\nexport function sharedResourceOwner(orgId?: string | null): string {\n const activeOrgId = orgId === undefined ? (getRequestOrgId() ?? null) : orgId;\n return activeOrgId ? organizationResourceOwner(activeOrgId) : SHARED_OWNER;\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/[!%_]/g, (char) => `!${char}`);\n}\n\nfunction prefixLike(value: string): string {\n return `${escapeLike(value)}%`;\n}\n\nexport interface Resource {\n id: string;\n path: string;\n owner: string;\n content: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: ResourceCreatedBy;\n visibility: ResourceVisibility;\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface ResourceMeta {\n id: string;\n path: string;\n owner: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: ResourceCreatedBy;\n visibility: ResourceVisibility;\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport type ResourceCreatedBy = \"user\" | \"agent\" | \"system\";\nexport type ResourceVisibility = \"workspace\" | \"agent_scratch\";\n\nexport interface ResourceWriteOptions extends StoreWriteOptions {\n createdBy?: ResourceCreatedBy;\n visibility?: ResourceVisibility;\n threadId?: string | null;\n runId?: string | null;\n expiresAt?: number | null;\n metadata?: string | Record<string, unknown> | null;\n}\n\nexport interface ResourceListOptions {\n includeAgentScratch?: boolean;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}\n\nexport interface ResourceResolutionOptions {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}\n\nexport type ResourceInheritanceScope = \"workspace\" | \"shared\" | \"personal\";\n\nexport interface EffectiveResourceLayer {\n scope: ResourceInheritanceScope;\n label: string;\n owner: string;\n resource: ResourceMeta | null;\n exists: boolean;\n effective: boolean;\n overridden: boolean;\n canWrite: boolean;\n}\n\nexport interface EffectiveResourceContext {\n path: string;\n effectiveResource: ResourceMeta | null;\n effectiveScope: ResourceInheritanceScope | null;\n layers: EffectiveResourceLayer[];\n}\n\nlet _initPromise: Promise<void> | undefined;\nlet _lastScratchCleanupAt = 0;\n\nconst AGENT_SCRATCH_TTL_MS = 24 * 60 * 60 * 1000;\nconst SCRATCH_CLEANUP_INTERVAL_MS = 60 * 1000;\nconst RESOURCE_META_SELECT =\n \"id, path, owner, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata\";\nconst DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX = \"dispatch-workspace-resource:\";\nconst DISPATCH_WORKSPACE_RESOURCE_METADATA_SOURCE =\n \"dispatch-workspace-resource\";\nexport const LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE =\n \"local-workspace-resource\";\n\nconst DEFAULT_LEARNINGS_SHARED_MD = `# Learnings\n\nUser preferences, corrections, and patterns. The agent reads this at the start of every conversation.\n\nKeep this file tidy — revise, consolidate, and remove outdated entries. Don't just append forever.\n\n## Preferences\n\n## Corrections\n\n## Patterns\n`;\n\n/**\n * Read the project-root learnings seed file for the shared LEARNINGS.md\n * resource. Prefers `learnings.md` (scaffolded by `create.ts`, possibly\n * customized locally), then the checked-in `learnings.defaults.md` — the\n * scaffolded copy is gitignored, so production deploys built from git only\n * carry the defaults file. Returns null when neither file is present, both\n * are empty, or fs is unavailable (e.g. edge runtimes) so seeding falls back\n * to the built-in default. Only consulted on first insert (INSERT OR IGNORE),\n * so an existing LEARNINGS.md resource is never overwritten.\n */\nasync function readProjectRootLearningsSeed(): Promise<string | null> {\n try {\n const [fs, path] = await Promise.all([import(\"fs\"), import(\"path\")]);\n for (const name of [\"learnings.md\", \"learnings.defaults.md\"]) {\n const filePath = path.resolve(process.cwd(), name);\n if (!fs.existsSync(filePath)) continue;\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.trim()) return content;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nconst DEFAULT_LEARNINGS_PERSONAL_MD = `# My Learnings\n\nPersonal preferences, corrections, and patterns — only visible to you.\n\n## Preferences\n\n## Corrections\n\n## Patterns\n`;\n\nconst DEFAULT_SKILL_LEARN_MD = `---\nname: learn\ndescription: >-\n Review the conversation and save structured memories for future sessions.\nuser-invocable: true\n---\n\n# Learn\n\nReview the current conversation and save anything worth remembering using the structured memory system.\n\n## Memory types\n\n- **user** — Preferences, role, personal context, contacts\n- **feedback** — Corrections (\"don't do X, do Y instead\"), confirmed approaches\n- **project** — Ongoing work context, decisions, status\n- **reference** — Pointers to external systems, URLs, API details\n\n## Steps\n\n1. Review the conversation for new insights\n2. Check your memory index with the \\`resources\\` tool: \\`action: \"read\"\\`, \\`path: \"memory/MEMORY.md\"\\`\n3. For each new insight, use \\`save-memory\\` with a descriptive name, type, and content\n4. If updating an existing memory, read it first with the \\`resources\\` tool (\\`action: \"read\"\\`, \\`path: \"memory/<name>.md\"\\`), then save with merged content\n\n## What NOT to capture\n\n- Things obvious from reading the code\n- Standard language/framework behavior\n- Temporary debugging notes\n- Anything already in AGENTS.md or other skills\n\nKeep one memory per logical topic. Descriptions should be concise — the index is loaded every conversation.\n`;\n\nconst DEFAULT_SKILL_LEARN_SHARED_MD = `---\nname: learn-shared\ndescription: >-\n Update the shared LEARNINGS.md with team-wide preferences, corrections, and\n patterns from this session.\nuser-invocable: true\n---\n\n# Learn (Shared)\n\nReview the current conversation and update the shared \\`LEARNINGS.md\\` resource with anything the whole team should know.\n\n## What to capture\n\n- **Team conventions** — agreed-upon approaches, code style decisions\n- **Technical learnings** — API quirks, library gotchas, surprising behavior\n- **Architectural decisions** — why something is done a certain way\n- **Corrections** — mistakes that any team member's agent should avoid\n\n## What NOT to capture\n\n- Personal preferences (use \\`/learn\\` for those)\n- Things obvious from reading the code\n- Standard language/framework behavior\n\n## Steps\n\n1. Read shared learnings with the \\`resources\\` tool: \\`action: \"read\"\\`, \\`path: \"LEARNINGS.md\"\\`, \\`scope: \"shared\"\\`\n2. Review the conversation for team-relevant insights\n3. Merge new learnings with existing ones — don't duplicate, refine existing entries\n4. Write back with the \\`resources\\` tool: \\`action: \"write\"\\`, \\`path: \"LEARNINGS.md\"\\`, \\`scope: \"shared\"\\`, \\`content: \"...\"\\`\n\nKeep entries concise — one line per learning, grouped by category (Conventions, Technical, Patterns).\n`;\n\nconst DEFAULT_AGENTS_SHARED_MD = `# Agent Instructions\n\nThis file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.\n\nWorkspace-level resources managed from Dispatch are inherited before this file.\nUse this shared app/organization file to override or narrow those defaults for\nthis app or team.\n\n## What to put here\n\n- **Preferences** — Tone, style, verbosity, response format\n- **Context** — Domain knowledge, terminology, team conventions\n- **Rules** — Things the agent should always/never do\n- **Skills** — Reference skill files for specialized tasks (create them in the \\`skills/\\` folder)\n\n## Skills\n\nYou can create skill files to give the agent specialized knowledge for specific tasks. Create resources under \\`skills/<name>/SKILL.md\\` (e.g., \\`skills/data-analysis/SKILL.md\\`, \\`skills/code-review/SKILL.md\\`) and reference them here:\n\n| Skill | Path | Description |\n|-------|------|-------------|\n| *(add your skills here)* | \\`skills/example/SKILL.md\\` | What this skill teaches the agent |\n\nThe agent will read the relevant skill file when performing that type of task.\n\n## Global instructions\n\nPut always-on guardrails in this shared \\`AGENTS.md\\`. For separate policy files that should also apply every turn, create shared resources under \\`instructions/<name>.md\\`. These are loaded automatically with this file.\n\n## Shared reference resources\n\nPut company, brand, positioning, persona, product, or messaging context in shared resources under paths like \\`context/core-positioning.md\\` or \\`context/brand-guidelines.md\\`. The agent sees an index of shared reference resources and reads the relevant files when a task may depend on them.\n\n## Workspace files\n\nWorkspace resources are for files users intentionally add, edit, or manage. Agents may create hidden \\`agent_scratch\\` resources for temporary working notes, scripts, or intermediate results; only promote those files into workspace visibility when a user explicitly asks to keep them.\n\n## Example\n\n\\`\\`\\`markdown\n## Tone\nBe concise. Lead with the answer. Skip filler.\n\n## Code style\n- Use TypeScript, never JavaScript\n- Prefer named exports\n- Use early returns\n\n## Domain context\nWe sell B2B SaaS. Our customers are enterprise engineering teams.\n\\`\\`\\`\n`;\n\nconst DEFAULT_AGENTS_PERSONAL_MD = `# My Agent Instructions\n\nPersonal agent instructions — only visible to you. Use this for your own contacts, preferences, and context.\n\n## Contacts\n\nAdd people you frequently interact with so the agent can resolve names like \"email my wife\" or \"message John\":\n\n| Name | Email | Notes |\n|------|-------|-------|\n| *(add your contacts here)* | | |\n\n## Preferences\n\n## Context\n\n## Workspace files\n\nFiles you create here are user-facing. Temporary agent working files should stay hidden as \\`agent_scratch\\` unless you ask the agent to keep them.\n`;\n\nasync function migrateDefaultResourcePath({\n client,\n owner,\n fromPath,\n toPath,\n defaultContent,\n}: {\n client: DbExec;\n owner: string;\n fromPath: string;\n toPath: string;\n defaultContent: string;\n}): Promise<void> {\n try {\n const existing = await client.execute({\n sql: `SELECT id, content FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, fromPath],\n });\n const row = existing.rows?.[0] as\n | { id: string; content: string }\n | undefined;\n if (!row || row.content !== defaultContent) return;\n\n const destination = await client.execute({\n sql: `SELECT id FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, toPath],\n });\n if ((destination.rows?.length ?? 0) > 0) return;\n\n await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [toPath, Date.now(), row.id],\n });\n } catch {\n // Best-effort compatibility migration; seeding below still works if it fails.\n }\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = (err as { code?: string })?.code;\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureResourceColumn(\n client: DbExec,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(`ALTER TABLE resources ADD COLUMN ${definition}`),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nfunction normalizeCreatedBy(value: unknown): ResourceCreatedBy {\n return value === \"agent\" || value === \"system\" || value === \"user\"\n ? value\n : \"user\";\n}\n\nfunction normalizeVisibility(value: unknown): ResourceVisibility {\n return value === \"agent_scratch\" ? \"agent_scratch\" : \"workspace\";\n}\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction hasOption<K extends keyof ResourceWriteOptions>(\n options: ResourceWriteOptions | undefined,\n key: K,\n): boolean {\n return (\n Object.prototype.hasOwnProperty.call(options ?? {}, key) &&\n options?.[key] !== undefined\n );\n}\n\nfunction serializeMetadata(\n value: ResourceWriteOptions[\"metadata\"] | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction scratchFilterSql(options?: ResourceListOptions): string {\n return options?.includeAgentScratch === true\n ? \"\"\n : \" AND (visibility IS NULL OR visibility != 'agent_scratch')\";\n}\n\nfunction normalizeWorkspaceAppId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const candidate = trimmed.replace(/^\\/+/, \"\").split(\"/\")[0] ?? \"\";\n if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate)) return null;\n return candidate;\n}\n\nfunction workspaceAppIdFromBasePath(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n return normalizeWorkspaceAppId(value);\n}\n\nfunction currentWorkspaceAppId(explicit?: string | null): string | null {\n return (\n normalizeWorkspaceAppId(explicit) ??\n normalizeWorkspaceAppId(process.env.AGENT_NATIVE_WORKSPACE_APP_ID) ??\n normalizeWorkspaceAppId(process.env.APP_NAME) ??\n normalizeWorkspaceAppId(process.env.AGENT_APP) ??\n workspaceAppIdFromBasePath(process.env.APP_BASE_PATH) ??\n workspaceAppIdFromBasePath(process.env.VITE_APP_BASE_PATH)\n );\n}\n\nfunction requestScopedResourceIdentity(options?: ResourceResolutionOptions): {\n userEmail: string | null;\n orgId: string | null;\n} {\n const userEmail = options?.userEmail ?? getRequestUserEmail() ?? null;\n const orgId = options?.orgId ?? getRequestOrgId() ?? null;\n return { userEmail, orgId };\n}\n\nfunction workspaceResourceMimeType(path: string): string {\n return path.endsWith(\".json\") ? \"application/json\" : \"text/markdown\";\n}\n\nfunction syntheticWorkspaceResourceId(resourceId: string): string {\n return `${DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX}${resourceId}`;\n}\n\nfunction physicalWorkspaceResourceId(id: string): string | null {\n return id.startsWith(DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX)\n ? id.slice(DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX.length)\n : null;\n}\n\nfunction rowToGrantedWorkspaceResource(row: any): Resource {\n const content = String(row.content ?? \"\");\n const path = String(row.path ?? \"\");\n return {\n id: syntheticWorkspaceResourceId(String(row.id)),\n path,\n owner: WORKSPACE_OWNER,\n content,\n mimeType: workspaceResourceMimeType(path),\n size: Buffer.byteLength(content, \"utf8\"),\n createdAt: Number(row.created_at ?? Date.now()),\n updatedAt: Number(row.updated_at ?? Date.now()),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: JSON.stringify({\n source: DISPATCH_WORKSPACE_RESOURCE_METADATA_SOURCE,\n resourceId: String(row.id),\n grantId: row.grant_id ? String(row.grant_id) : null,\n kind: row.kind ?? null,\n name: row.name ?? null,\n description: row.description ?? null,\n scope: \"selected\",\n appId: row.app_id ?? null,\n updatedAt: Number(row.updated_at ?? Date.now()),\n }),\n };\n}\n\nfunction localResourceTimestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : Date.now();\n}\n\nfunction localWorkspaceResourceMetadata(\n resource: LocalWorkspaceResourceMeta,\n): string {\n return JSON.stringify({\n source: LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE,\n absolutePath: resource.absolutePath,\n hash: resource.hash,\n mtimeMs: resource.mtimeMs,\n });\n}\n\nfunction localWorkspaceResourceToResource(\n resource: LocalWorkspaceResourceFile,\n): Resource {\n return {\n id: resource.id,\n path: resource.path,\n owner: WORKSPACE_OWNER,\n content: resource.content,\n mimeType: resource.mimeType,\n size: resource.sizeBytes,\n createdAt: localResourceTimestamp(resource.createdAt),\n updatedAt: localResourceTimestamp(resource.updatedAt),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: localWorkspaceResourceMetadata(resource),\n };\n}\n\nfunction localWorkspaceResourceToMeta(\n resource: LocalWorkspaceResourceMeta,\n): ResourceMeta {\n return {\n id: resource.id,\n path: resource.path,\n owner: WORKSPACE_OWNER,\n mimeType: resource.mimeType,\n size: resource.sizeBytes,\n createdAt: localResourceTimestamp(resource.createdAt),\n updatedAt: localResourceTimestamp(resource.updatedAt),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: localWorkspaceResourceMetadata(resource),\n };\n}\n\nasync function localWorkspaceResourceById(\n id: string,\n): Promise<Resource | null> {\n const resourcePath = localWorkspaceResourcePathFromId(id);\n if (!resourcePath) return null;\n const resource = await readLocalWorkspaceResource({ path: resourcePath });\n return resource ? localWorkspaceResourceToResource(resource) : null;\n}\n\nasync function localWorkspaceResourceByPath(\n resourcePath: string,\n): Promise<Resource | null> {\n if (!canUseLocalWorkspaceResourcePath(resourcePath)) return null;\n const resource = await readLocalWorkspaceResource({ path: resourcePath });\n return resource ? localWorkspaceResourceToResource(resource) : null;\n}\n\nasync function localWorkspaceResourceMetas(\n pathPrefix?: string,\n): Promise<ResourceMeta[]> {\n const resources = (await listLocalWorkspaceResources()).map(\n localWorkspaceResourceToMeta,\n );\n if (!pathPrefix) return resources;\n return resources.filter((resource) => resource.path.startsWith(pathPrefix));\n}\n\nexport async function canWriteLocalWorkspaceResourcePath(\n resourcePath: string,\n): Promise<boolean> {\n return (\n canUseLocalWorkspaceResourcePath(resourcePath) &&\n (await isLocalWorkspaceResourcesEnabled())\n );\n}\n\nasync function shouldHandleWorkspaceResourceAsLocal(resourcePath: string) {\n return (\n (await isLocalWorkspaceResourcesEnabled()) &&\n canUseLocalWorkspaceResourcePath(resourcePath)\n );\n}\n\nasync function assertWritableWorkspaceResourcePath(resourcePath: string) {\n if (\n (await isLocalWorkspaceResourcesEnabled()) &&\n !canUseLocalWorkspaceResourcePath(resourcePath)\n ) {\n throw new Error(\n \"Workspace resources in local file mode must be AGENTS.md, agent-native.json, mcp.config.json, .mcp.json, or under skills/.\",\n );\n }\n}\n\nexport { isLocalWorkspaceResourceId };\n\nfunction mergeResourceMetas(\n primary: ResourceMeta[],\n inherited: ResourceMeta[],\n): ResourceMeta[] {\n const seen = new Set(primary.map((resource) => resource.path));\n const merged = [...primary];\n for (const resource of inherited) {\n if (seen.has(resource.path)) continue;\n seen.add(resource.path);\n merged.push(resource);\n }\n return merged;\n}\n\nasync function selectGrantedWorkspaceResourceRows(input: {\n resourceId?: string;\n path?: string;\n pathPrefix?: string;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<any[]> {\n const appId = currentWorkspaceAppId(input.workspaceAppId);\n const { userEmail, orgId } = requestScopedResourceIdentity(input);\n if (!appId || (!userEmail && !orgId)) return [];\n\n const conditions = [\"wr.scope = ?\", \"wg.status = ?\", \"wg.app_id = ?\"];\n const args: unknown[] = [\"selected\", \"active\", appId];\n\n if (input.resourceId) {\n conditions.push(\"wr.id = ?\");\n args.push(input.resourceId);\n }\n if (input.path) {\n conditions.push(\"wr.path = ?\");\n args.push(input.path);\n }\n if (input.pathPrefix) {\n conditions.push(\"wr.path LIKE ? ESCAPE '!'\");\n args.push(prefixLike(input.pathPrefix));\n }\n\n if (orgId) {\n conditions.push(\"wr.org_id = ?\", \"wg.org_id = ?\");\n args.push(orgId, orgId);\n } else if (userEmail) {\n conditions.push(\n \"wr.owner_email = ?\",\n \"wr.org_id IS NULL\",\n \"wg.owner_email = ?\",\n \"wg.org_id IS NULL\",\n );\n args.push(userEmail, userEmail);\n }\n\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.kind,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.created_at,\n wr.updated_at,\n wg.id AS grant_id,\n wg.app_id AS app_id\n FROM workspace_resources wr\n INNER JOIN workspace_resource_grants wg ON wg.resource_id = wr.id\n WHERE ${conditions.join(\" AND \")}\n ORDER BY wr.updated_at DESC\n `,\n args,\n });\n return rows;\n}\n\nasync function grantedWorkspaceResources(input: {\n pathPrefix?: string;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<Resource[]> {\n try {\n const rows = await selectGrantedWorkspaceResourceRows(input);\n return rows.map(rowToGrantedWorkspaceResource);\n } catch {\n // Dispatch workspace-resource tables are optional for standalone apps.\n return [];\n }\n}\n\nasync function grantedWorkspaceResourceById(\n id: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n const resourceId = physicalWorkspaceResourceId(id);\n if (!resourceId) return null;\n try {\n const rows = await selectGrantedWorkspaceResourceRows({\n resourceId,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return rows[0] ? rowToGrantedWorkspaceResource(rows[0]) : null;\n } catch {\n return null;\n }\n}\n\nasync function grantedWorkspaceResourceByPath(\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n try {\n const rows = await selectGrantedWorkspaceResourceRows({\n path,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return rows[0] ? rowToGrantedWorkspaceResource(rows[0]) : null;\n } catch {\n return null;\n }\n}\n\nasync function cleanupExpiredAgentScratchResources(\n client: DbExec,\n): Promise<void> {\n const now = Date.now();\n if (now - _lastScratchCleanupAt < SCRATCH_CLEANUP_INTERVAL_MS) return;\n _lastScratchCleanupAt = now;\n await client.execute({\n sql: `DELETE FROM resources WHERE visibility = ? AND expires_at IS NOT NULL AND expires_at <= ?`,\n args: [\"agent_scratch\", now],\n });\n}\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = _doEnsureTable().catch((err) => {\n // Don't cache the rejection — let the next caller retry a fresh init.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nasync function _doEnsureTable(): Promise<void> {\n const client = getDbExec();\n const createSql = `\n CREATE TABLE IF NOT EXISTS resources (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n owner TEXT NOT NULL,\n content TEXT NOT NULL DEFAULT '',\n mime_type TEXT NOT NULL DEFAULT 'text/markdown',\n size ${intType()} NOT NULL DEFAULT 0,\n created_at ${intType()} NOT NULL,\n updated_at ${intType()} NOT NULL,\n created_by TEXT NOT NULL DEFAULT 'user',\n visibility TEXT NOT NULL DEFAULT 'workspace',\n thread_id TEXT,\n run_id TEXT,\n expires_at ${intType()},\n metadata TEXT,\n UNIQUE(path, owner)\n )\n `;\n\n if (isPostgres()) {\n // Hot path: the `resources` table and its additive columns are virtually\n // always already present in production. Issuing `CREATE TABLE`/`ALTER\n // TABLE` still takes an ACCESS EXCLUSIVE lock that, in a fresh\n // background-worker process behind a concurrent connection on the shared\n // Neon DB, can block ~indefinitely. The ensure* wrappers probe\n // `information_schema` first (plain reads, no lock) and run DDL ONLY for\n // what is actually missing, bounded by a transaction-scoped `lock_timeout`.\n // If a swallowed lock-timeout leaves the schema still missing they RE-PROBE\n // and THROW rather than letting init memoize success against absent schema.\n await ensureTableExists(\"resources\", createSql);\n // Additive columns — guarded so the hot path (columns already present)\n // skips the ACCESS EXCLUSIVE ALTER entirely.\n const pgColumns: Array<[string, string]> = [\n [\"created_by\", \"TEXT NOT NULL DEFAULT 'user'\"],\n [\"visibility\", \"TEXT NOT NULL DEFAULT 'workspace'\"],\n [\"thread_id\", \"TEXT\"],\n [\"run_id\", \"TEXT\"],\n [\"expires_at\", intType()],\n [\"metadata\", \"TEXT\"],\n ];\n for (const [col, def] of pgColumns) {\n await ensureColumnExists(\n \"resources\",\n col,\n `ALTER TABLE resources ADD COLUMN IF NOT EXISTS ${col} ${def}`,\n );\n }\n } else {\n // SQLite (local dev): no lock problem — keep the original behaviour using\n // `retryOnDdlRace` + `ensureResourceColumn` (duplicate-column catch).\n await retryOnDdlRace(() => client.execute(createSql));\n await ensureResourceColumn(\n client,\n \"created_by TEXT NOT NULL DEFAULT 'user'\",\n );\n await ensureResourceColumn(\n client,\n \"visibility TEXT NOT NULL DEFAULT 'workspace'\",\n );\n await ensureResourceColumn(client, \"thread_id TEXT\");\n await ensureResourceColumn(client, \"run_id TEXT\");\n await ensureResourceColumn(client, `expires_at ${intType()}`);\n await ensureResourceColumn(client, \"metadata TEXT\");\n }\n\n // Older deployments have 32-bit timestamp columns; on Postgres the\n // `Date.now()` written on insert/update overflows int4. Widen in place\n // (no-op once done / on fresh DBs).\n await widenIntColumnsToBigInt(\"resources\", [\n \"created_at\",\n \"updated_at\",\n \"expires_at\",\n ]);\n\n // Seed default shared resources if they don't exist (INSERT OR IGNORE to avoid race conditions)\n const now = Date.now();\n const seedSql = isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO NOTHING`\n : `INSERT OR IGNORE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;\n\n // AGENTS.md — shared agent instructions\n const agentsSize = Buffer.byteLength(DEFAULT_AGENTS_SHARED_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"AGENTS.md\",\n SHARED_OWNER,\n DEFAULT_AGENTS_SHARED_MD,\n \"text/markdown\",\n agentsSize,\n now,\n now,\n ],\n });\n\n // LEARNINGS.md — shared learnings (preferences, corrections, patterns).\n // Prefer the project-root learnings.md (scaffolded from the template's\n // learnings.defaults.md) so template-authored defaults reach the prompt\n // without a manual migrate-learnings step. INSERT OR IGNORE means this only\n // applies on first seed — existing LEARNINGS.md content is never overwritten.\n const learningsSeedContent =\n (await readProjectRootLearningsSeed()) ?? DEFAULT_LEARNINGS_SHARED_MD;\n const learningsSize = Buffer.byteLength(learningsSeedContent, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"LEARNINGS.md\",\n SHARED_OWNER,\n learningsSeedContent,\n \"text/markdown\",\n learningsSize,\n now,\n now,\n ],\n });\n\n await migrateDefaultResourcePath({\n client,\n owner: SHARED_OWNER,\n fromPath: \"skills/learn-shared.md\",\n toPath: \"skills/learn-shared/SKILL.md\",\n defaultContent: DEFAULT_SKILL_LEARN_SHARED_MD,\n });\n\n // skills/learn-shared/SKILL.md — shared skill for updating shared LEARNINGS.md\n const learnSharedSize = Buffer.byteLength(\n DEFAULT_SKILL_LEARN_SHARED_MD,\n \"utf8\",\n );\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"skills/learn-shared/SKILL.md\",\n SHARED_OWNER,\n DEFAULT_SKILL_LEARN_SHARED_MD,\n \"text/markdown\",\n learnSharedSize,\n now,\n now,\n ],\n });\n\n // Seed built-in agents as shared resources under remote-agents/. ALWAYS\n // use the production URL here, never the env-resolved devUrl. The seed\n // runs once per DB (ON CONFLICT DO NOTHING), so a localhost URL written\n // during a dev run sticks forever — including when that DB is later used\n // by a prod deploy and the override wins over the built-in's prod URL.\n // (Verified problem: `dispatch.agent-native.com` had every remote-agents\n // entry pointing at localhost from an early-seed run, breaking call-agent\n // outbound from Lambda for ~12h before this was caught.)\n try {\n const { getBuiltinAgents, BUILTIN_AGENTS_FOR_SEEDING } =\n await import(\"../server/agent-discovery.js\");\n void getBuiltinAgents; // referenced to keep type-only import alive\n const builtins = BUILTIN_AGENTS_FOR_SEEDING;\n for (const agent of builtins) {\n const agentJson = JSON.stringify(\n {\n id: agent.id,\n name: agent.name,\n description: agent.description,\n url: agent.url, // always prod\n color: agent.color,\n },\n null,\n 2,\n );\n const agentSize = Buffer.byteLength(agentJson, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n `remote-agents/${agent.id}.json`,\n SHARED_OWNER,\n agentJson,\n \"application/json\",\n agentSize,\n now,\n now,\n ],\n });\n }\n } catch {\n // Agent discovery not available — skip seeding\n }\n\n // One-time migration: rename legacy agents/*.json (A2A manifests) to\n // remote-agents/*.json so they live in their own folder, separate from\n // custom agents (agents/*.md).\n try {\n const legacy = await client.execute({\n sql: `SELECT id, path FROM resources WHERE path LIKE ? AND path LIKE ?`,\n args: [\"agents/%\", \"%.json\"],\n });\n const rows = (legacy.rows ?? []) as Array<{ id: string; path: string }>;\n for (const row of rows) {\n const newPath = row.path.replace(/^agents\\//, \"remote-agents/\");\n try {\n await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [newPath, Date.now(), row.id],\n });\n } catch {\n // Skip if destination path already exists (unique constraint) —\n // we'll leave the old row in place; readers accept both paths and\n // canonical remote-agents/ entries win when both exist.\n }\n }\n } catch {\n // Migration best-effort\n }\n}\n\nconst _personalSeeded = new Set<string>();\n\n/**\n * Seed personal AGENTS.md and LEARNINGS.md for a user if they don't exist.\n * Called when listing resources or from the agent chat plugin.\n */\nexport async function ensurePersonalDefaults(owner: string): Promise<void> {\n if (\n owner === SHARED_OWNER ||\n owner === WORKSPACE_OWNER ||\n _personalSeeded.has(owner)\n ) {\n return;\n }\n await ensureTable();\n\n const client = getDbExec();\n const now = Date.now();\n const seedSql = isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO NOTHING`\n : `INSERT OR IGNORE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;\n\n const agentsSize = Buffer.byteLength(DEFAULT_AGENTS_PERSONAL_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"AGENTS.md\",\n owner,\n DEFAULT_AGENTS_PERSONAL_MD,\n \"text/markdown\",\n agentsSize,\n now,\n now,\n ],\n });\n\n const learningsSize = Buffer.byteLength(\n DEFAULT_LEARNINGS_PERSONAL_MD,\n \"utf8\",\n );\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"LEARNINGS.md\",\n owner,\n DEFAULT_LEARNINGS_PERSONAL_MD,\n \"text/markdown\",\n learningsSize,\n now,\n now,\n ],\n });\n\n // memory/MEMORY.md — personal structured memory index\n const memoryIndexContent = \"# Memory Index\\n\";\n const memoryIndexSize = Buffer.byteLength(memoryIndexContent, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"memory/MEMORY.md\",\n owner,\n memoryIndexContent,\n \"text/markdown\",\n memoryIndexSize,\n now,\n now,\n ],\n });\n\n await migrateDefaultResourcePath({\n client,\n owner,\n fromPath: \"skills/learn.md\",\n toPath: \"skills/learn/SKILL.md\",\n defaultContent: DEFAULT_SKILL_LEARN_MD,\n });\n\n // skills/learn/SKILL.md — personal skill for updating memory\n const learnSize = Buffer.byteLength(DEFAULT_SKILL_LEARN_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"skills/learn/SKILL.md\",\n owner,\n DEFAULT_SKILL_LEARN_MD,\n \"text/markdown\",\n learnSize,\n now,\n now,\n ],\n });\n\n // Mark seeded only after all seeds succeed. If any await above throws (e.g. a\n // transient DB error), the owner is NOT cached as seeded, so the next request\n // retries instead of permanently skipping seeding. Seeds use INSERT OR IGNORE\n // / ON CONFLICT DO NOTHING, so a concurrent re-run is harmless.\n _personalSeeded.add(owner);\n}\n\nfunction rowToResource(row: any): Resource {\n return {\n id: row.id as string,\n path: row.path as string,\n owner: row.owner as string,\n content: row.content as string,\n mimeType: row.mime_type as string,\n size: Number(row.size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n createdBy: normalizeCreatedBy(row.created_by),\n visibility: normalizeVisibility(row.visibility),\n threadId: nullableString(row.thread_id),\n runId: nullableString(row.run_id),\n expiresAt: nullableNumber(row.expires_at),\n metadata: nullableString(row.metadata),\n };\n}\n\nfunction rowToMeta(row: any): ResourceMeta {\n return {\n id: row.id as string,\n path: row.path as string,\n owner: row.owner as string,\n mimeType: row.mime_type as string,\n size: Number(row.size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n createdBy: normalizeCreatedBy(row.created_by),\n visibility: normalizeVisibility(row.visibility),\n threadId: nullableString(row.thread_id),\n runId: nullableString(row.run_id),\n expiresAt: nullableNumber(row.expires_at),\n metadata: nullableString(row.metadata),\n };\n}\n\nfunction resourceToMeta(resource: Resource): ResourceMeta {\n const { content: _content, ...meta } = resource;\n return meta;\n}\n\nexport async function resourceGet(\n id: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n await ensureTable();\n if (isLocalWorkspaceResourceId(id)) {\n return localWorkspaceResourceById(id);\n }\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return grantedWorkspaceResourceById(id, options);\n return rowToResource(rows[0]);\n}\n\nexport async function resourceGetByPath(\n owner: string,\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n await ensureTable();\n if (owner === WORKSPACE_OWNER) {\n const local = await localWorkspaceResourceByPath(path);\n if (local) return local;\n }\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n if (rows.length === 0 && owner === WORKSPACE_OWNER) {\n return grantedWorkspaceResourceByPath(path, options);\n }\n if (rows.length === 0) return null;\n return rowToResource(rows[0]);\n}\n\nexport async function resourcePut(\n owner: string,\n path: string,\n content: string,\n mimeType?: string,\n options?: ResourceWriteOptions,\n): Promise<Resource> {\n await ensureTable();\n if (\n owner === WORKSPACE_OWNER &&\n (await shouldHandleWorkspaceResourceAsLocal(path))\n ) {\n const written = await writeLocalWorkspaceResource({ path, content });\n const resource = localWorkspaceResourceToResource({\n ...written,\n content,\n });\n emitResourceChange(\n resource.id,\n resource.path,\n resource.owner,\n options?.requestSource,\n );\n return resource;\n }\n if (owner === WORKSPACE_OWNER) {\n await assertWritableWorkspaceResourcePath(path);\n }\n const client = getDbExec();\n const now = Date.now();\n const size = Buffer.byteLength(content, \"utf8\");\n const mime = mimeType || \"text/markdown\";\n\n // Check for existing resource to preserve ID on upsert\n const { rows: existing } = await client.execute({\n sql: `SELECT id, created_at, created_by, visibility, thread_id, run_id, expires_at, metadata FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n const existingRow = existing[0] as\n | {\n id: string;\n created_at: number;\n created_by?: string | null;\n visibility?: string | null;\n thread_id?: string | null;\n run_id?: string | null;\n expires_at?: number | null;\n metadata?: string | null;\n }\n | undefined;\n\n const id =\n existing.length > 0 ? (existingRow?.id as string) : crypto.randomUUID();\n const createdAt = existingRow ? Number(existingRow.created_at) : now;\n const createdBy = normalizeCreatedBy(\n hasOption(options, \"createdBy\")\n ? options?.createdBy\n : existingRow?.created_by,\n );\n const visibility = normalizeVisibility(\n hasOption(options, \"visibility\")\n ? options?.visibility\n : existingRow?.visibility,\n );\n const threadId = hasOption(options, \"threadId\")\n ? (options?.threadId ?? null)\n : nullableString(existingRow?.thread_id);\n const runId = hasOption(options, \"runId\")\n ? (options?.runId ?? null)\n : nullableString(existingRow?.run_id);\n let expiresAt = hasOption(options, \"expiresAt\")\n ? (options?.expiresAt ?? null)\n : nullableNumber(existingRow?.expires_at);\n if (visibility === \"agent_scratch\" && expiresAt === null) {\n expiresAt = now + AGENT_SCRATCH_TTL_MS;\n }\n if (visibility === \"workspace\" && !hasOption(options, \"expiresAt\")) {\n expiresAt = null;\n }\n const serializedMetadata = serializeMetadata(options?.metadata);\n const metadata =\n serializedMetadata !== undefined\n ? serializedMetadata\n : nullableString(existingRow?.metadata);\n\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO UPDATE SET id=EXCLUDED.id, content=EXCLUDED.content, mime_type=EXCLUDED.mime_type, size=EXCLUDED.size, updated_at=EXCLUDED.updated_at, created_by=EXCLUDED.created_by, visibility=EXCLUDED.visibility, thread_id=EXCLUDED.thread_id, run_id=EXCLUDED.run_id, expires_at=EXCLUDED.expires_at, metadata=EXCLUDED.metadata`\n : `INSERT OR REPLACE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n path,\n owner,\n content,\n mime,\n size,\n createdAt,\n now,\n createdBy,\n visibility,\n threadId,\n runId,\n expiresAt,\n metadata,\n ],\n });\n\n emitResourceChange(id, path, owner, options?.requestSource);\n\n return {\n id,\n path,\n owner,\n content,\n mimeType: mime,\n size,\n createdAt,\n updatedAt: now,\n createdBy,\n visibility,\n threadId,\n runId,\n expiresAt,\n metadata,\n };\n}\n\nexport async function resourceDelete(id: string): Promise<boolean> {\n await ensureTable();\n if (isLocalWorkspaceResourceId(id)) {\n const resourcePath = localWorkspaceResourcePathFromId(id);\n if (!resourcePath) return false;\n const deleted = await deleteLocalWorkspaceResource({ path: resourcePath });\n if (deleted) {\n emitResourceDelete(id, resourcePath, WORKSPACE_OWNER);\n }\n return deleted;\n }\n const client = getDbExec();\n\n // Get resource info for emitter before deleting\n const { rows } = await client.execute({\n sql: `SELECT path, owner FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `DELETE FROM resources WHERE id = ?`,\n args: [id],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) {\n emitResourceDelete(id, rows[0].path as string, rows[0].owner as string);\n }\n return deleted;\n}\n\nexport async function resourceDeleteByPath(\n owner: string,\n path: string,\n): Promise<boolean> {\n await ensureTable();\n if (\n owner === WORKSPACE_OWNER &&\n (await shouldHandleWorkspaceResourceAsLocal(path))\n ) {\n const existing = await localWorkspaceResourceByPath(path);\n const deleted = await deleteLocalWorkspaceResource({ path });\n if (deleted) {\n emitResourceDelete(existing?.id ?? \"\", path, WORKSPACE_OWNER);\n return true;\n }\n }\n if (owner === WORKSPACE_OWNER) {\n await assertWritableWorkspaceResourcePath(path);\n }\n const client = getDbExec();\n\n // Get resource info for emitter before deleting\n const { rows } = await client.execute({\n sql: `SELECT id FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `DELETE FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) {\n emitResourceDelete(rows[0].id as string, path, owner);\n }\n return deleted;\n}\n\nexport async function resourceList(\n owner: string,\n pathPrefix?: string,\n options?: ResourceListOptions,\n): Promise<ResourceMeta[]> {\n await ensureTable();\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const visibilitySql = scratchFilterSql(options);\n\n if (pathPrefix) {\n const { rows } = await client.execute({\n sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ? AND path LIKE ? ESCAPE '!'${visibilitySql}`,\n args: [owner, prefixLike(pathPrefix)],\n });\n const resources = rows.map(rowToMeta);\n if (owner !== WORKSPACE_OWNER) return resources;\n const local = await localWorkspaceResourceMetas(pathPrefix);\n const granted = await grantedWorkspaceResources({\n pathPrefix,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return mergeResourceMetas(\n local,\n mergeResourceMetas(resources, granted.map(resourceToMeta)),\n );\n }\n\n const { rows } = await client.execute({\n sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ?${visibilitySql}`,\n args: [owner],\n });\n const resources = rows.map(rowToMeta);\n if (owner !== WORKSPACE_OWNER) return resources;\n const local = await localWorkspaceResourceMetas();\n const granted = await grantedWorkspaceResources({\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return mergeResourceMetas(\n local,\n mergeResourceMetas(resources, granted.map(resourceToMeta)),\n );\n}\n\nexport async function resourceListAccessible(\n userEmail: string,\n pathPrefix?: string,\n options?: ResourceListOptions,\n): Promise<ResourceMeta[]> {\n const organizationOwner = sharedResourceOwner(options?.orgId);\n const [personal, organization, legacyShared, workspace] = await Promise.all([\n resourceList(userEmail, pathPrefix, options),\n organizationOwner === SHARED_OWNER\n ? Promise.resolve([])\n : resourceList(organizationOwner, pathPrefix, options),\n resourceList(SHARED_OWNER, pathPrefix, options),\n resourceList(WORKSPACE_OWNER, pathPrefix, {\n ...options,\n userEmail,\n }),\n ]);\n\n // Later layers are inherited fallbacks. A personal resource wins over an\n // organization resource, which wins over the legacy app-shared default,\n // which wins over the workspace default.\n return mergeResourceMetas(\n personal,\n mergeResourceMetas(\n organization,\n mergeResourceMetas(legacyShared, workspace),\n ),\n );\n}\n\nexport async function resourceEffectiveContext(\n userEmail: string,\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<EffectiveResourceContext> {\n await ensureTable();\n\n const workspace = await resourceGetByPath(WORKSPACE_OWNER, path, {\n ...options,\n userEmail,\n });\n const organizationOwner = sharedResourceOwner(options?.orgId);\n const organization =\n organizationOwner === SHARED_OWNER\n ? null\n : await resourceGetByPath(organizationOwner, path);\n const legacyShared = await resourceGetByPath(SHARED_OWNER, path);\n const shared = organization ?? legacyShared;\n const personal = await resourceGetByPath(userEmail, path);\n const effective = personal ?? shared ?? workspace ?? null;\n const effectiveScope: ResourceInheritanceScope | null = personal\n ? \"personal\"\n : shared\n ? \"shared\"\n : workspace\n ? \"workspace\"\n : null;\n\n const layerDefs: Array<{\n scope: ResourceInheritanceScope;\n label: string;\n owner: string;\n resource: Resource | null;\n canWrite: boolean;\n }> = [\n {\n scope: \"workspace\",\n label: \"Workspace default\",\n owner: WORKSPACE_OWNER,\n resource: workspace,\n canWrite: workspace ? isLocalWorkspaceResourceId(workspace.id) : false,\n },\n {\n scope: \"shared\",\n label: \"Organization/app override\",\n owner: organizationOwner,\n resource: shared,\n canWrite: true,\n },\n {\n scope: \"personal\",\n label: \"Personal override\",\n owner: userEmail,\n resource: personal,\n canWrite: true,\n },\n ];\n\n return {\n path,\n effectiveResource: effective ? resourceToMeta(effective) : null,\n effectiveScope,\n layers: layerDefs.map((layer) => ({\n scope: layer.scope,\n label: layer.label,\n owner: layer.owner,\n resource: layer.resource ? resourceToMeta(layer.resource) : null,\n exists: !!layer.resource,\n effective: !!layer.resource && layer.resource.id === effective?.id,\n overridden: !!layer.resource && layer.resource.id !== effective?.id,\n canWrite: layer.canWrite,\n })),\n };\n}\n\n/**\n * List all resources matching a path prefix across ALL owners.\n * Used by the recurring jobs scheduler to find all job resources.\n */\nexport async function resourceListAllOwners(\n pathPrefix: string,\n): Promise<Resource[]> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE path LIKE ? ESCAPE '!'`,\n args: [prefixLike(pathPrefix)],\n });\n const localResources = (\n await Promise.all(\n (\n await localWorkspaceResourceMetas(pathPrefix)\n ).map((resource) => resourceGet(resource.id)),\n )\n ).filter((resource): resource is Resource => !!resource);\n const localPaths = new Set(localResources.map((resource) => resource.path));\n return [\n ...localResources,\n ...rows\n .map(rowToResource)\n .filter((resource) => !localPaths.has(resource.path)),\n ];\n}\n\nexport async function resourceMove(\n id: string,\n newPath: string,\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n\n // Get current resource info\n const { rows } = await client.execute({\n sql: `SELECT path, owner FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [newPath, now, id],\n });\n const moved = result.rowsAffected > 0;\n if (moved) {\n emitResourceChange(id, newPath, rows[0].owner as string);\n }\n return moved;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/resources/store.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\n\nimport {\n getDbExec,\n isPostgres,\n intType,\n retryOnDdlRace,\n type DbExec,\n} from \"../db/client.js\";\nimport { ensureColumnExists, ensureTableExists } from \"../db/ddl-guard.js\";\nimport { widenIntColumnsToBigInt } from \"../db/widen-columns.js\";\nimport {\n canUseLocalWorkspaceResourcePath,\n deleteLocalWorkspaceResource,\n isLocalWorkspaceResourceId,\n isLocalWorkspaceResourcesEnabled,\n listLocalWorkspaceResources,\n localWorkspaceResourcePathFromId,\n readLocalWorkspaceResource,\n writeLocalWorkspaceResource,\n type LocalWorkspaceResourceFile,\n type LocalWorkspaceResourceMeta,\n} from \"../local-artifacts/index.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport type { StoreWriteOptions } from \"../settings/store.js\";\nimport { emitResourceChange, emitResourceDelete } from \"./emitter.js\";\n\nexport const SHARED_OWNER = \"__shared__\";\nexport const WORKSPACE_OWNER = \"__workspace__\";\nconst ORGANIZATION_OWNER_PREFIX = \"__organization__:\";\n\n/**\n * Encode an organization id into the existing resource owner key. This keeps\n * organization resources isolated without a destructive resources-table\n * migration, while preserving the legacy `__shared__` owner as the app-wide\n * default/fallback used by older deployments and solo mode.\n */\nexport function organizationResourceOwner(orgId: string): string {\n const normalized = orgId.trim();\n if (!normalized) {\n throw new Error(\"organizationResourceOwner requires a non-empty orgId\");\n }\n return `${ORGANIZATION_OWNER_PREFIX}${encodeURIComponent(normalized)}`;\n}\n\nexport function organizationIdFromResourceOwner(owner: string): string | null {\n if (!owner.startsWith(ORGANIZATION_OWNER_PREFIX)) return null;\n const encoded = owner.slice(ORGANIZATION_OWNER_PREFIX.length);\n if (!encoded) return null;\n try {\n return decodeURIComponent(encoded);\n } catch {\n return null;\n }\n}\n\n/** Active organization scope, with the legacy app-shared owner as solo fallback. */\nexport function sharedResourceOwner(orgId?: string | null): string {\n const activeOrgId = orgId === undefined ? (getRequestOrgId() ?? null) : orgId;\n return activeOrgId ? organizationResourceOwner(activeOrgId) : SHARED_OWNER;\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/[!%_]/g, (char) => `!${char}`);\n}\n\nfunction prefixLike(value: string): string {\n return `${escapeLike(value)}%`;\n}\n\nexport interface Resource {\n id: string;\n path: string;\n owner: string;\n content: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: ResourceCreatedBy;\n visibility: ResourceVisibility;\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface ResourceMeta {\n id: string;\n path: string;\n owner: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: ResourceCreatedBy;\n visibility: ResourceVisibility;\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport type ResourceCreatedBy = \"user\" | \"agent\" | \"system\";\nexport type ResourceVisibility = \"workspace\" | \"agent_scratch\";\n\nexport interface ResourceWriteOptions extends StoreWriteOptions {\n createdBy?: ResourceCreatedBy;\n visibility?: ResourceVisibility;\n threadId?: string | null;\n runId?: string | null;\n expiresAt?: number | null;\n metadata?: string | Record<string, unknown> | null;\n}\n\nexport interface ResourceListOptions {\n includeAgentScratch?: boolean;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}\n\nexport interface ResourceResolutionOptions {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}\n\nexport type ResourceInheritanceScope = \"workspace\" | \"shared\" | \"personal\";\n\nexport interface EffectiveResourceLayer {\n scope: ResourceInheritanceScope;\n label: string;\n owner: string;\n resource: ResourceMeta | null;\n exists: boolean;\n effective: boolean;\n overridden: boolean;\n canWrite: boolean;\n}\n\nexport interface EffectiveResourceContext {\n path: string;\n effectiveResource: ResourceMeta | null;\n effectiveScope: ResourceInheritanceScope | null;\n layers: EffectiveResourceLayer[];\n}\n\nlet _initPromise: Promise<void> | undefined;\nlet _lastScratchCleanupAt = 0;\n\nconst AGENT_SCRATCH_TTL_MS = 24 * 60 * 60 * 1000;\nconst SCRATCH_CLEANUP_INTERVAL_MS = 60 * 1000;\nconst RESOURCE_META_SELECT =\n \"id, path, owner, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata\";\nconst DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX = \"dispatch-workspace-resource:\";\nconst DISPATCH_WORKSPACE_RESOURCE_METADATA_SOURCE =\n \"dispatch-workspace-resource\";\nexport const LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE =\n \"local-workspace-resource\";\n\nconst DEFAULT_LEARNINGS_SHARED_MD = `# Learnings\n\nUser preferences, corrections, and patterns. The agent reads this at the start of every conversation.\n\nKeep this file tidy — revise, consolidate, and remove outdated entries. Don't just append forever.\n\n## Preferences\n\n## Corrections\n\n## Patterns\n`;\n\n/**\n * Read the project-root learnings seed file for the shared LEARNINGS.md\n * resource. Prefers `learnings.md` (scaffolded by `create.ts`, possibly\n * customized locally), then the checked-in `learnings.defaults.md` — the\n * scaffolded copy is gitignored, so production deploys built from git only\n * carry the defaults file. Returns null when neither file is present, both\n * are empty, or fs is unavailable (e.g. edge runtimes) so seeding falls back\n * to the built-in default. Only consulted on first insert (INSERT OR IGNORE),\n * so an existing LEARNINGS.md resource is never overwritten.\n */\nasync function readProjectRootLearningsSeed(): Promise<string | null> {\n try {\n const [fs, path] = await Promise.all([import(\"fs\"), import(\"path\")]);\n for (const name of [\"learnings.md\", \"learnings.defaults.md\"]) {\n const filePath = path.resolve(process.cwd(), name);\n if (!fs.existsSync(filePath)) continue;\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.trim()) return content;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nconst DEFAULT_LEARNINGS_PERSONAL_MD = `# My Learnings\n\nPersonal preferences, corrections, and patterns — only visible to you.\n\n## Preferences\n\n## Corrections\n\n## Patterns\n`;\n\nconst DEFAULT_SKILL_LEARN_MD = `---\nname: learn\ndescription: >-\n Review the conversation and save structured memories for future sessions.\nuser-invocable: true\n---\n\n# Learn\n\nReview the current conversation and save anything worth remembering using the structured memory system.\n\n## Memory types\n\n- **user** — Preferences, role, personal context, contacts\n- **feedback** — Corrections (\"don't do X, do Y instead\"), confirmed approaches\n- **project** — Ongoing work context, decisions, status\n- **reference** — Pointers to external systems, URLs, API details\n\n## Steps\n\n1. Review the conversation for new insights\n2. Check your memory index with the \\`resources\\` tool: \\`action: \"read\"\\`, \\`path: \"memory/MEMORY.md\"\\`\n3. For each new insight, use \\`save-memory\\` with a descriptive name, type, and content\n4. If updating an existing memory, read it first with the \\`resources\\` tool (\\`action: \"read\"\\`, \\`path: \"memory/<name>.md\"\\`), then save with merged content\n\n## What NOT to capture\n\n- Things obvious from reading the code\n- Standard language/framework behavior\n- Temporary debugging notes\n- Anything already in AGENTS.md or other skills\n\nKeep one memory per logical topic. Descriptions should be concise — the index is loaded every conversation.\n`;\n\nconst DEFAULT_SKILL_LEARN_SHARED_MD = `---\nname: learn-shared\ndescription: >-\n Update the shared LEARNINGS.md with team-wide preferences, corrections, and\n patterns from this session.\nuser-invocable: true\n---\n\n# Learn (Shared)\n\nReview the current conversation and update the shared \\`LEARNINGS.md\\` resource with anything the whole team should know.\n\n## What to capture\n\n- **Team conventions** — agreed-upon approaches, code style decisions\n- **Technical learnings** — API quirks, library gotchas, surprising behavior\n- **Architectural decisions** — why something is done a certain way\n- **Corrections** — mistakes that any team member's agent should avoid\n\n## What NOT to capture\n\n- Personal preferences (use \\`/learn\\` for those)\n- Things obvious from reading the code\n- Standard language/framework behavior\n\n## Steps\n\n1. Read shared learnings with the \\`resources\\` tool: \\`action: \"read\"\\`, \\`path: \"LEARNINGS.md\"\\`, \\`scope: \"shared\"\\`\n2. Review the conversation for team-relevant insights\n3. Merge new learnings with existing ones — don't duplicate, refine existing entries\n4. Write back with the \\`resources\\` tool: \\`action: \"write\"\\`, \\`path: \"LEARNINGS.md\"\\`, \\`scope: \"shared\"\\`, \\`content: \"...\"\\`\n\nKeep entries concise — one line per learning, grouped by category (Conventions, Technical, Patterns).\n`;\n\nconst DEFAULT_AGENTS_SHARED_MD = `# Agent Instructions\n\nThis file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.\n\nWorkspace-level resources managed from Dispatch are inherited before this file.\nUse this shared app/organization file to override or narrow those defaults for\nthis app or team.\n\n## What to put here\n\n- **Preferences** — Tone, style, verbosity, response format\n- **Context** — Domain knowledge, terminology, team conventions\n- **Rules** — Things the agent should always/never do\n- **Skills** — Reference skill files for specialized tasks (create them in the \\`skills/\\` folder)\n\n## Skills\n\nYou can create skill files to give the agent specialized knowledge for specific tasks. Create resources under \\`skills/<name>/SKILL.md\\` (e.g., \\`skills/data-analysis/SKILL.md\\`, \\`skills/code-review/SKILL.md\\`) and reference them here:\n\n| Skill | Path | Description |\n|-------|------|-------------|\n| *(add your skills here)* | \\`skills/example/SKILL.md\\` | What this skill teaches the agent |\n\nThe agent will read the relevant skill file when performing that type of task.\n\n## Global instructions\n\nPut always-on guardrails in this shared \\`AGENTS.md\\`. For separate policy files that should also apply every turn, create shared resources under \\`instructions/<name>.md\\`. These are loaded automatically with this file.\n\n## Shared reference resources\n\nPut company, brand, positioning, persona, product, or messaging context in shared resources under paths like \\`context/core-positioning.md\\` or \\`context/brand-guidelines.md\\`. The agent sees an index of shared reference resources and reads the relevant files when a task may depend on them.\n\n## Workspace files\n\nWorkspace resources are for files users intentionally add, edit, or manage. Agents may create hidden \\`agent_scratch\\` resources for temporary working notes, scripts, or intermediate results; only promote those files into workspace visibility when a user explicitly asks to keep them.\n\n## Example\n\n\\`\\`\\`markdown\n## Tone\nBe concise. Lead with the answer. Skip filler.\n\n## Code style\n- Use TypeScript, never JavaScript\n- Prefer named exports\n- Use early returns\n\n## Domain context\nWe sell B2B SaaS. Our customers are enterprise engineering teams.\n\\`\\`\\`\n`;\n\nconst DEFAULT_AGENTS_PERSONAL_MD = `# My Agent Instructions\n\nPersonal agent instructions — only visible to you. Use this for your own contacts, preferences, and context.\n\n## Contacts\n\nAdd people you frequently interact with so the agent can resolve names like \"email my wife\" or \"message John\":\n\n| Name | Email | Notes |\n|------|-------|-------|\n| *(add your contacts here)* | | |\n\n## Preferences\n\n## Context\n\n## Workspace files\n\nFiles you create here are user-facing. Temporary agent working files should stay hidden as \\`agent_scratch\\` unless you ask the agent to keep them.\n`;\n\nasync function migrateDefaultResourcePath({\n client,\n owner,\n fromPath,\n toPath,\n defaultContent,\n}: {\n client: DbExec;\n owner: string;\n fromPath: string;\n toPath: string;\n defaultContent: string;\n}): Promise<void> {\n try {\n const existing = await client.execute({\n sql: `SELECT id, content FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, fromPath],\n });\n const row = existing.rows?.[0] as\n | { id: string; content: string }\n | undefined;\n if (!row || row.content !== defaultContent) return;\n\n const destination = await client.execute({\n sql: `SELECT id FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, toPath],\n });\n if ((destination.rows?.length ?? 0) > 0) return;\n\n await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [toPath, Date.now(), row.id],\n });\n } catch {\n // Best-effort compatibility migration; seeding below still works if it fails.\n }\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = (err as { code?: string })?.code;\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureResourceColumn(\n client: DbExec,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(`ALTER TABLE resources ADD COLUMN ${definition}`),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nfunction normalizeCreatedBy(value: unknown): ResourceCreatedBy {\n return value === \"agent\" || value === \"system\" || value === \"user\"\n ? value\n : \"user\";\n}\n\nfunction normalizeVisibility(value: unknown): ResourceVisibility {\n return value === \"agent_scratch\" ? \"agent_scratch\" : \"workspace\";\n}\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction hasOption<K extends keyof ResourceWriteOptions>(\n options: ResourceWriteOptions | undefined,\n key: K,\n): boolean {\n return (\n Object.prototype.hasOwnProperty.call(options ?? {}, key) &&\n options?.[key] !== undefined\n );\n}\n\nfunction serializeMetadata(\n value: ResourceWriteOptions[\"metadata\"] | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction scratchFilterSql(options?: ResourceListOptions): string {\n return options?.includeAgentScratch === true\n ? \"\"\n : \" AND (visibility IS NULL OR visibility != 'agent_scratch')\";\n}\n\nfunction normalizeWorkspaceAppId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const candidate = trimmed.replace(/^\\/+/, \"\").split(\"/\")[0] ?? \"\";\n if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate)) return null;\n return candidate;\n}\n\nfunction workspaceAppIdFromBasePath(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n return normalizeWorkspaceAppId(value);\n}\n\nfunction currentWorkspaceAppId(explicit?: string | null): string | null {\n return (\n normalizeWorkspaceAppId(explicit) ??\n normalizeWorkspaceAppId(process.env.AGENT_NATIVE_WORKSPACE_APP_ID) ??\n normalizeWorkspaceAppId(process.env.APP_NAME) ??\n normalizeWorkspaceAppId(process.env.AGENT_APP) ??\n workspaceAppIdFromBasePath(process.env.APP_BASE_PATH) ??\n workspaceAppIdFromBasePath(process.env.VITE_APP_BASE_PATH)\n );\n}\n\nfunction requestScopedResourceIdentity(options?: ResourceResolutionOptions): {\n userEmail: string | null;\n orgId: string | null;\n} {\n const userEmail = options?.userEmail ?? getRequestUserEmail() ?? null;\n const orgId = options?.orgId ?? getRequestOrgId() ?? null;\n return { userEmail, orgId };\n}\n\nfunction workspaceResourceMimeType(path: string): string {\n return path.endsWith(\".json\") ? \"application/json\" : \"text/markdown\";\n}\n\nfunction syntheticWorkspaceResourceId(resourceId: string): string {\n return `${DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX}${resourceId}`;\n}\n\nfunction physicalWorkspaceResourceId(id: string): string | null {\n return id.startsWith(DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX)\n ? id.slice(DISPATCH_WORKSPACE_RESOURCE_ID_PREFIX.length)\n : null;\n}\n\nfunction rowToGrantedWorkspaceResource(row: any): Resource {\n const content = String(row.content ?? \"\");\n const path = String(row.path ?? \"\");\n return {\n id: syntheticWorkspaceResourceId(String(row.id)),\n path,\n owner: WORKSPACE_OWNER,\n content,\n mimeType: workspaceResourceMimeType(path),\n size: Buffer.byteLength(content, \"utf8\"),\n createdAt: Number(row.created_at ?? Date.now()),\n updatedAt: Number(row.updated_at ?? Date.now()),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: JSON.stringify({\n source: DISPATCH_WORKSPACE_RESOURCE_METADATA_SOURCE,\n resourceId: String(row.id),\n grantId: row.grant_id ? String(row.grant_id) : null,\n kind: row.kind ?? null,\n name: row.name ?? null,\n description: row.description ?? null,\n scope: \"selected\",\n appId: row.app_id ?? null,\n updatedAt: Number(row.updated_at ?? Date.now()),\n }),\n };\n}\n\nfunction localResourceTimestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : Date.now();\n}\n\nfunction localWorkspaceResourceMetadata(\n resource: LocalWorkspaceResourceMeta,\n): string {\n return JSON.stringify({\n source: LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE,\n absolutePath: resource.absolutePath,\n hash: resource.hash,\n mtimeMs: resource.mtimeMs,\n });\n}\n\nfunction localWorkspaceResourceToResource(\n resource: LocalWorkspaceResourceFile,\n): Resource {\n return {\n id: resource.id,\n path: resource.path,\n owner: WORKSPACE_OWNER,\n content: resource.content,\n mimeType: resource.mimeType,\n size: resource.sizeBytes,\n createdAt: localResourceTimestamp(resource.createdAt),\n updatedAt: localResourceTimestamp(resource.updatedAt),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: localWorkspaceResourceMetadata(resource),\n };\n}\n\nfunction localWorkspaceResourceToMeta(\n resource: LocalWorkspaceResourceMeta,\n): ResourceMeta {\n return {\n id: resource.id,\n path: resource.path,\n owner: WORKSPACE_OWNER,\n mimeType: resource.mimeType,\n size: resource.sizeBytes,\n createdAt: localResourceTimestamp(resource.createdAt),\n updatedAt: localResourceTimestamp(resource.updatedAt),\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: localWorkspaceResourceMetadata(resource),\n };\n}\n\nasync function localWorkspaceResourceById(\n id: string,\n): Promise<Resource | null> {\n const resourcePath = localWorkspaceResourcePathFromId(id);\n if (!resourcePath) return null;\n const resource = await readLocalWorkspaceResource({ path: resourcePath });\n return resource ? localWorkspaceResourceToResource(resource) : null;\n}\n\nasync function localWorkspaceResourceByPath(\n resourcePath: string,\n): Promise<Resource | null> {\n if (!canUseLocalWorkspaceResourcePath(resourcePath)) return null;\n const resource = await readLocalWorkspaceResource({ path: resourcePath });\n return resource ? localWorkspaceResourceToResource(resource) : null;\n}\n\nasync function localWorkspaceResourceMetas(\n pathPrefix?: string,\n): Promise<ResourceMeta[]> {\n const resources = (await listLocalWorkspaceResources()).map(\n localWorkspaceResourceToMeta,\n );\n if (!pathPrefix) return resources;\n return resources.filter((resource) => resource.path.startsWith(pathPrefix));\n}\n\nexport async function canWriteLocalWorkspaceResourcePath(\n resourcePath: string,\n): Promise<boolean> {\n return (\n canUseLocalWorkspaceResourcePath(resourcePath) &&\n (await isLocalWorkspaceResourcesEnabled())\n );\n}\n\nasync function shouldHandleWorkspaceResourceAsLocal(resourcePath: string) {\n return (\n (await isLocalWorkspaceResourcesEnabled()) &&\n canUseLocalWorkspaceResourcePath(resourcePath)\n );\n}\n\nasync function assertWritableWorkspaceResourcePath(resourcePath: string) {\n if (\n (await isLocalWorkspaceResourcesEnabled()) &&\n !canUseLocalWorkspaceResourcePath(resourcePath)\n ) {\n throw new Error(\n \"Workspace resources in local file mode must be AGENTS.md, agent-native.json, mcp.config.json, .mcp.json, or under skills/.\",\n );\n }\n}\n\nexport { isLocalWorkspaceResourceId };\n\nfunction mergeResourceMetas(\n primary: ResourceMeta[],\n inherited: ResourceMeta[],\n): ResourceMeta[] {\n const seen = new Set(primary.map((resource) => resource.path));\n const merged = [...primary];\n for (const resource of inherited) {\n if (seen.has(resource.path)) continue;\n seen.add(resource.path);\n merged.push(resource);\n }\n return merged;\n}\n\nasync function selectGrantedWorkspaceResourceRows(input: {\n resourceId?: string;\n path?: string;\n pathPrefix?: string;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<any[]> {\n const appId = currentWorkspaceAppId(input.workspaceAppId);\n const { userEmail, orgId } = requestScopedResourceIdentity(input);\n if (!appId || (!userEmail && !orgId)) return [];\n\n const conditions = [\"wr.scope = ?\", \"wg.status = ?\", \"wg.app_id = ?\"];\n const args: unknown[] = [\"selected\", \"active\", appId];\n\n if (input.resourceId) {\n conditions.push(\"wr.id = ?\");\n args.push(input.resourceId);\n }\n if (input.path) {\n conditions.push(\"wr.path = ?\");\n args.push(input.path);\n }\n if (input.pathPrefix) {\n conditions.push(\"wr.path LIKE ? ESCAPE '!'\");\n args.push(prefixLike(input.pathPrefix));\n }\n\n if (orgId) {\n conditions.push(\"wr.org_id = ?\", \"wg.org_id = ?\");\n args.push(orgId, orgId);\n } else if (userEmail) {\n conditions.push(\n \"wr.owner_email = ?\",\n \"wr.org_id IS NULL\",\n \"wg.owner_email = ?\",\n \"wg.org_id IS NULL\",\n );\n args.push(userEmail, userEmail);\n }\n\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.kind,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.created_at,\n wr.updated_at,\n wg.id AS grant_id,\n wg.app_id AS app_id\n FROM workspace_resources wr\n INNER JOIN workspace_resource_grants wg ON wg.resource_id = wr.id\n WHERE ${conditions.join(\" AND \")}\n ORDER BY wr.updated_at DESC\n `,\n args,\n });\n return rows;\n}\n\nasync function grantedWorkspaceResources(input: {\n pathPrefix?: string;\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<Resource[]> {\n try {\n const rows = await selectGrantedWorkspaceResourceRows(input);\n return rows.map(rowToGrantedWorkspaceResource);\n } catch {\n // Dispatch workspace-resource tables are optional for standalone apps.\n return [];\n }\n}\n\nasync function grantedWorkspaceResourceById(\n id: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n const resourceId = physicalWorkspaceResourceId(id);\n if (!resourceId) return null;\n try {\n const rows = await selectGrantedWorkspaceResourceRows({\n resourceId,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return rows[0] ? rowToGrantedWorkspaceResource(rows[0]) : null;\n } catch {\n return null;\n }\n}\n\nasync function grantedWorkspaceResourceByPath(\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n try {\n const rows = await selectGrantedWorkspaceResourceRows({\n path,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return rows[0] ? rowToGrantedWorkspaceResource(rows[0]) : null;\n } catch {\n return null;\n }\n}\n\nasync function cleanupExpiredAgentScratchResources(\n client: DbExec,\n): Promise<void> {\n const now = Date.now();\n if (now - _lastScratchCleanupAt < SCRATCH_CLEANUP_INTERVAL_MS) return;\n _lastScratchCleanupAt = now;\n await client.execute({\n sql: `DELETE FROM resources WHERE visibility = ? AND expires_at IS NOT NULL AND expires_at <= ?`,\n args: [\"agent_scratch\", now],\n });\n}\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = _doEnsureTable().catch((err) => {\n // Don't cache the rejection — let the next caller retry a fresh init.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nasync function _doEnsureTable(): Promise<void> {\n const client = getDbExec();\n const createSql = `\n CREATE TABLE IF NOT EXISTS resources (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n owner TEXT NOT NULL,\n content TEXT NOT NULL DEFAULT '',\n mime_type TEXT NOT NULL DEFAULT 'text/markdown',\n size ${intType()} NOT NULL DEFAULT 0,\n created_at ${intType()} NOT NULL,\n updated_at ${intType()} NOT NULL,\n created_by TEXT NOT NULL DEFAULT 'user',\n visibility TEXT NOT NULL DEFAULT 'workspace',\n thread_id TEXT,\n run_id TEXT,\n expires_at ${intType()},\n metadata TEXT,\n UNIQUE(path, owner)\n )\n `;\n\n if (isPostgres()) {\n // Hot path: the `resources` table and its additive columns are virtually\n // always already present in production. Issuing `CREATE TABLE`/`ALTER\n // TABLE` still takes an ACCESS EXCLUSIVE lock that, in a fresh\n // background-worker process behind a concurrent connection on the shared\n // Neon DB, can block ~indefinitely. The ensure* wrappers probe\n // `information_schema` first (plain reads, no lock) and run DDL ONLY for\n // what is actually missing, bounded by a transaction-scoped `lock_timeout`.\n // If a swallowed lock-timeout leaves the schema still missing they RE-PROBE\n // and THROW rather than letting init memoize success against absent schema.\n await ensureTableExists(\"resources\", createSql);\n // Additive columns — guarded so the hot path (columns already present)\n // skips the ACCESS EXCLUSIVE ALTER entirely.\n const pgColumns: Array<[string, string]> = [\n [\"created_by\", \"TEXT NOT NULL DEFAULT 'user'\"],\n [\"visibility\", \"TEXT NOT NULL DEFAULT 'workspace'\"],\n [\"thread_id\", \"TEXT\"],\n [\"run_id\", \"TEXT\"],\n [\"expires_at\", intType()],\n [\"metadata\", \"TEXT\"],\n ];\n for (const [col, def] of pgColumns) {\n await ensureColumnExists(\n \"resources\",\n col,\n `ALTER TABLE resources ADD COLUMN IF NOT EXISTS ${col} ${def}`,\n );\n }\n } else {\n // SQLite (local dev): no lock problem — keep the original behaviour using\n // `retryOnDdlRace` + `ensureResourceColumn` (duplicate-column catch).\n await retryOnDdlRace(() => client.execute(createSql));\n await ensureResourceColumn(\n client,\n \"created_by TEXT NOT NULL DEFAULT 'user'\",\n );\n await ensureResourceColumn(\n client,\n \"visibility TEXT NOT NULL DEFAULT 'workspace'\",\n );\n await ensureResourceColumn(client, \"thread_id TEXT\");\n await ensureResourceColumn(client, \"run_id TEXT\");\n await ensureResourceColumn(client, `expires_at ${intType()}`);\n await ensureResourceColumn(client, \"metadata TEXT\");\n }\n\n // Older deployments have 32-bit timestamp columns; on Postgres the\n // `Date.now()` written on insert/update overflows int4. Widen in place\n // (no-op once done / on fresh DBs).\n await widenIntColumnsToBigInt(\"resources\", [\n \"created_at\",\n \"updated_at\",\n \"expires_at\",\n ]);\n\n // Seed default shared resources if they don't exist (INSERT OR IGNORE to avoid race conditions)\n const now = Date.now();\n const seedSql = isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO NOTHING`\n : `INSERT OR IGNORE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;\n\n // AGENTS.md — shared agent instructions\n const agentsSize = Buffer.byteLength(DEFAULT_AGENTS_SHARED_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"AGENTS.md\",\n SHARED_OWNER,\n DEFAULT_AGENTS_SHARED_MD,\n \"text/markdown\",\n agentsSize,\n now,\n now,\n ],\n });\n\n // LEARNINGS.md — shared learnings (preferences, corrections, patterns).\n // Prefer the project-root learnings.md (scaffolded from the template's\n // learnings.defaults.md) so template-authored defaults reach the prompt\n // without a manual migrate-learnings step. INSERT OR IGNORE means this only\n // applies on first seed — existing LEARNINGS.md content is never overwritten.\n const learningsSeedContent =\n (await readProjectRootLearningsSeed()) ?? DEFAULT_LEARNINGS_SHARED_MD;\n const learningsSize = Buffer.byteLength(learningsSeedContent, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"LEARNINGS.md\",\n SHARED_OWNER,\n learningsSeedContent,\n \"text/markdown\",\n learningsSize,\n now,\n now,\n ],\n });\n\n await migrateDefaultResourcePath({\n client,\n owner: SHARED_OWNER,\n fromPath: \"skills/learn-shared.md\",\n toPath: \"skills/learn-shared/SKILL.md\",\n defaultContent: DEFAULT_SKILL_LEARN_SHARED_MD,\n });\n\n // skills/learn-shared/SKILL.md — shared skill for updating shared LEARNINGS.md\n const learnSharedSize = Buffer.byteLength(\n DEFAULT_SKILL_LEARN_SHARED_MD,\n \"utf8\",\n );\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"skills/learn-shared/SKILL.md\",\n SHARED_OWNER,\n DEFAULT_SKILL_LEARN_SHARED_MD,\n \"text/markdown\",\n learnSharedSize,\n now,\n now,\n ],\n });\n\n // Seed built-in agents as shared resources under remote-agents/. ALWAYS\n // use the production URL here, never the env-resolved devUrl. The seed\n // runs once per DB (ON CONFLICT DO NOTHING), so a localhost URL written\n // during a dev run sticks forever — including when that DB is later used\n // by a prod deploy and the override wins over the built-in's prod URL.\n // (Verified problem: `dispatch.agent-native.com` had every remote-agents\n // entry pointing at localhost from an early-seed run, breaking call-agent\n // outbound from Lambda for ~12h before this was caught.)\n try {\n const { getBuiltinAgents, BUILTIN_AGENTS_FOR_SEEDING } =\n await import(\"../server/agent-discovery.js\");\n void getBuiltinAgents; // referenced to keep type-only import alive\n const builtins = BUILTIN_AGENTS_FOR_SEEDING;\n for (const agent of builtins) {\n const agentJson = JSON.stringify(\n {\n id: agent.id,\n name: agent.name,\n description: agent.description,\n url: agent.url, // always prod\n color: agent.color,\n },\n null,\n 2,\n );\n const agentSize = Buffer.byteLength(agentJson, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n `remote-agents/${agent.id}.json`,\n SHARED_OWNER,\n agentJson,\n \"application/json\",\n agentSize,\n now,\n now,\n ],\n });\n }\n } catch {\n // Agent discovery not available — skip seeding\n }\n\n // One-time migration: rename legacy agents/*.json (A2A manifests) to\n // remote-agents/*.json so they live in their own folder, separate from\n // custom agents (agents/*.md).\n try {\n const legacy = await client.execute({\n sql: `SELECT id, path FROM resources WHERE path LIKE ? AND path LIKE ?`,\n args: [\"agents/%\", \"%.json\"],\n });\n const rows = (legacy.rows ?? []) as Array<{ id: string; path: string }>;\n for (const row of rows) {\n const newPath = row.path.replace(/^agents\\//, \"remote-agents/\");\n try {\n await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [newPath, Date.now(), row.id],\n });\n } catch {\n // Skip if destination path already exists (unique constraint) —\n // we'll leave the old row in place; readers accept both paths and\n // canonical remote-agents/ entries win when both exist.\n }\n }\n } catch {\n // Migration best-effort\n }\n}\n\nconst _personalSeeded = new Set<string>();\n\n/**\n * Seed personal AGENTS.md and LEARNINGS.md for a user if they don't exist.\n * Called when listing resources or from the agent chat plugin.\n */\nexport async function ensurePersonalDefaults(owner: string): Promise<void> {\n if (\n owner === SHARED_OWNER ||\n owner === WORKSPACE_OWNER ||\n _personalSeeded.has(owner)\n ) {\n return;\n }\n await ensureTable();\n\n const client = getDbExec();\n const now = Date.now();\n const seedSql = isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO NOTHING`\n : `INSERT OR IGNORE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;\n\n const agentsSize = Buffer.byteLength(DEFAULT_AGENTS_PERSONAL_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"AGENTS.md\",\n owner,\n DEFAULT_AGENTS_PERSONAL_MD,\n \"text/markdown\",\n agentsSize,\n now,\n now,\n ],\n });\n\n const learningsSize = Buffer.byteLength(\n DEFAULT_LEARNINGS_PERSONAL_MD,\n \"utf8\",\n );\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"LEARNINGS.md\",\n owner,\n DEFAULT_LEARNINGS_PERSONAL_MD,\n \"text/markdown\",\n learningsSize,\n now,\n now,\n ],\n });\n\n // memory/MEMORY.md — personal structured memory index\n const memoryIndexContent = \"# Memory Index\\n\";\n const memoryIndexSize = Buffer.byteLength(memoryIndexContent, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"memory/MEMORY.md\",\n owner,\n memoryIndexContent,\n \"text/markdown\",\n memoryIndexSize,\n now,\n now,\n ],\n });\n\n await migrateDefaultResourcePath({\n client,\n owner,\n fromPath: \"skills/learn.md\",\n toPath: \"skills/learn/SKILL.md\",\n defaultContent: DEFAULT_SKILL_LEARN_MD,\n });\n\n // skills/learn/SKILL.md — personal skill for updating memory\n const learnSize = Buffer.byteLength(DEFAULT_SKILL_LEARN_MD, \"utf8\");\n await client.execute({\n sql: seedSql,\n args: [\n crypto.randomUUID(),\n \"skills/learn/SKILL.md\",\n owner,\n DEFAULT_SKILL_LEARN_MD,\n \"text/markdown\",\n learnSize,\n now,\n now,\n ],\n });\n\n // Mark seeded only after all seeds succeed. If any await above throws (e.g. a\n // transient DB error), the owner is NOT cached as seeded, so the next request\n // retries instead of permanently skipping seeding. Seeds use INSERT OR IGNORE\n // / ON CONFLICT DO NOTHING, so a concurrent re-run is harmless.\n _personalSeeded.add(owner);\n}\n\nfunction rowToResource(row: any): Resource {\n return {\n id: row.id as string,\n path: row.path as string,\n owner: row.owner as string,\n content: row.content as string,\n mimeType: row.mime_type as string,\n size: Number(row.size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n createdBy: normalizeCreatedBy(row.created_by),\n visibility: normalizeVisibility(row.visibility),\n threadId: nullableString(row.thread_id),\n runId: nullableString(row.run_id),\n expiresAt: nullableNumber(row.expires_at),\n metadata: nullableString(row.metadata),\n };\n}\n\nfunction rowToMeta(row: any): ResourceMeta {\n return {\n id: row.id as string,\n path: row.path as string,\n owner: row.owner as string,\n mimeType: row.mime_type as string,\n size: Number(row.size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n createdBy: normalizeCreatedBy(row.created_by),\n visibility: normalizeVisibility(row.visibility),\n threadId: nullableString(row.thread_id),\n runId: nullableString(row.run_id),\n expiresAt: nullableNumber(row.expires_at),\n metadata: nullableString(row.metadata),\n };\n}\n\nfunction resourceToMeta(resource: Resource): ResourceMeta {\n const { content: _content, ...meta } = resource;\n return meta;\n}\n\nexport async function resourceGet(\n id: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n await ensureTable();\n if (isLocalWorkspaceResourceId(id)) {\n return localWorkspaceResourceById(id);\n }\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return grantedWorkspaceResourceById(id, options);\n return rowToResource(rows[0]);\n}\n\nexport async function resourceGetByPath(\n owner: string,\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<Resource | null> {\n await ensureTable();\n if (owner === WORKSPACE_OWNER) {\n const local = await localWorkspaceResourceByPath(path);\n if (local) return local;\n }\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n if (rows.length === 0 && owner === WORKSPACE_OWNER) {\n return grantedWorkspaceResourceByPath(path, options);\n }\n if (rows.length === 0) return null;\n return rowToResource(rows[0]);\n}\n\nexport async function resourcePut(\n owner: string,\n path: string,\n content: string,\n mimeType?: string,\n options?: ResourceWriteOptions,\n): Promise<Resource> {\n await ensureTable();\n if (\n owner === WORKSPACE_OWNER &&\n (await shouldHandleWorkspaceResourceAsLocal(path))\n ) {\n const written = await writeLocalWorkspaceResource({ path, content });\n const resource = localWorkspaceResourceToResource({\n ...written,\n content,\n });\n emitResourceChange(\n resource.id,\n resource.path,\n resource.owner,\n options?.requestSource,\n );\n return resource;\n }\n if (owner === WORKSPACE_OWNER) {\n await assertWritableWorkspaceResourcePath(path);\n }\n const client = getDbExec();\n const now = Date.now();\n const size = Buffer.byteLength(content, \"utf8\");\n const mime = mimeType || \"text/markdown\";\n\n // Check for existing resource to preserve ID on upsert\n const { rows: existing } = await client.execute({\n sql: `SELECT id, created_at, created_by, visibility, thread_id, run_id, expires_at, metadata FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n const existingRow = existing[0] as\n | {\n id: string;\n created_at: number;\n created_by?: string | null;\n visibility?: string | null;\n thread_id?: string | null;\n run_id?: string | null;\n expires_at?: number | null;\n metadata?: string | null;\n }\n | undefined;\n\n const id =\n existing.length > 0 ? (existingRow?.id as string) : crypto.randomUUID();\n const createdAt = existingRow ? Number(existingRow.created_at) : now;\n const createdBy = normalizeCreatedBy(\n hasOption(options, \"createdBy\")\n ? options?.createdBy\n : existingRow?.created_by,\n );\n const visibility = normalizeVisibility(\n hasOption(options, \"visibility\")\n ? options?.visibility\n : existingRow?.visibility,\n );\n const threadId = hasOption(options, \"threadId\")\n ? (options?.threadId ?? null)\n : nullableString(existingRow?.thread_id);\n const runId = hasOption(options, \"runId\")\n ? (options?.runId ?? null)\n : nullableString(existingRow?.run_id);\n let expiresAt = hasOption(options, \"expiresAt\")\n ? (options?.expiresAt ?? null)\n : nullableNumber(existingRow?.expires_at);\n if (visibility === \"agent_scratch\" && expiresAt === null) {\n expiresAt = now + AGENT_SCRATCH_TTL_MS;\n }\n if (visibility === \"workspace\" && !hasOption(options, \"expiresAt\")) {\n expiresAt = null;\n }\n const serializedMetadata = serializeMetadata(options?.metadata);\n const metadata =\n serializedMetadata !== undefined\n ? serializedMetadata\n : nullableString(existingRow?.metadata);\n\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (path, owner) DO UPDATE SET id=EXCLUDED.id, content=EXCLUDED.content, mime_type=EXCLUDED.mime_type, size=EXCLUDED.size, updated_at=EXCLUDED.updated_at, created_by=EXCLUDED.created_by, visibility=EXCLUDED.visibility, thread_id=EXCLUDED.thread_id, run_id=EXCLUDED.run_id, expires_at=EXCLUDED.expires_at, metadata=EXCLUDED.metadata`\n : `INSERT OR REPLACE INTO resources (id, path, owner, content, mime_type, size, created_at, updated_at, created_by, visibility, thread_id, run_id, expires_at, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n path,\n owner,\n content,\n mime,\n size,\n createdAt,\n now,\n createdBy,\n visibility,\n threadId,\n runId,\n expiresAt,\n metadata,\n ],\n });\n\n emitResourceChange(id, path, owner, options?.requestSource);\n\n return {\n id,\n path,\n owner,\n content,\n mimeType: mime,\n size,\n createdAt,\n updatedAt: now,\n createdBy,\n visibility,\n threadId,\n runId,\n expiresAt,\n metadata,\n };\n}\n\nexport async function resourceDelete(id: string): Promise<boolean> {\n await ensureTable();\n if (isLocalWorkspaceResourceId(id)) {\n const resourcePath = localWorkspaceResourcePathFromId(id);\n if (!resourcePath) return false;\n const deleted = await deleteLocalWorkspaceResource({ path: resourcePath });\n if (deleted) {\n emitResourceDelete(id, resourcePath, WORKSPACE_OWNER);\n }\n return deleted;\n }\n const client = getDbExec();\n\n // Get resource info for emitter before deleting\n const { rows } = await client.execute({\n sql: `SELECT path, owner FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `DELETE FROM resources WHERE id = ?`,\n args: [id],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) {\n emitResourceDelete(id, rows[0].path as string, rows[0].owner as string);\n }\n return deleted;\n}\n\nexport async function resourceDeleteByPath(\n owner: string,\n path: string,\n): Promise<boolean> {\n await ensureTable();\n if (\n owner === WORKSPACE_OWNER &&\n (await shouldHandleWorkspaceResourceAsLocal(path))\n ) {\n const existing = await localWorkspaceResourceByPath(path);\n const deleted = await deleteLocalWorkspaceResource({ path });\n if (deleted) {\n emitResourceDelete(existing?.id ?? \"\", path, WORKSPACE_OWNER);\n return true;\n }\n }\n if (owner === WORKSPACE_OWNER) {\n await assertWritableWorkspaceResourcePath(path);\n }\n const client = getDbExec();\n\n // Get resource info for emitter before deleting\n const { rows } = await client.execute({\n sql: `SELECT id FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `DELETE FROM resources WHERE owner = ? AND path = ?`,\n args: [owner, path],\n });\n const deleted = result.rowsAffected > 0;\n if (deleted) {\n emitResourceDelete(rows[0].id as string, path, owner);\n }\n return deleted;\n}\n\nexport async function resourceList(\n owner: string,\n pathPrefix?: string,\n options?: ResourceListOptions,\n): Promise<ResourceMeta[]> {\n await ensureTable();\n const client = getDbExec();\n await cleanupExpiredAgentScratchResources(client);\n const visibilitySql = scratchFilterSql(options);\n\n if (pathPrefix) {\n const { rows } = await client.execute({\n sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ? AND path LIKE ? ESCAPE '!'${visibilitySql}`,\n args: [owner, prefixLike(pathPrefix)],\n });\n const resources = rows.map(rowToMeta);\n if (owner !== WORKSPACE_OWNER) return resources;\n const local = await localWorkspaceResourceMetas(pathPrefix);\n const granted = await grantedWorkspaceResources({\n pathPrefix,\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return mergeResourceMetas(\n local,\n mergeResourceMetas(resources, granted.map(resourceToMeta)),\n );\n }\n\n const { rows } = await client.execute({\n sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ?${visibilitySql}`,\n args: [owner],\n });\n const resources = rows.map(rowToMeta);\n if (owner !== WORKSPACE_OWNER) return resources;\n const local = await localWorkspaceResourceMetas();\n const granted = await grantedWorkspaceResources({\n workspaceAppId: options?.workspaceAppId,\n userEmail: options?.userEmail,\n orgId: options?.orgId,\n });\n return mergeResourceMetas(\n local,\n mergeResourceMetas(resources, granted.map(resourceToMeta)),\n );\n}\n\nexport async function resourceListAccessible(\n userEmail: string,\n pathPrefix?: string,\n options?: ResourceListOptions,\n): Promise<ResourceMeta[]> {\n const organizationOwner = sharedResourceOwner(options?.orgId);\n const [personal, organization, legacyShared, workspace] = await Promise.all([\n resourceList(userEmail, pathPrefix, options),\n organizationOwner === SHARED_OWNER\n ? Promise.resolve([])\n : resourceList(organizationOwner, pathPrefix, options),\n resourceList(SHARED_OWNER, pathPrefix, options),\n resourceList(WORKSPACE_OWNER, pathPrefix, {\n ...options,\n userEmail,\n }),\n ]);\n\n // Later layers are inherited fallbacks. A personal resource wins over an\n // organization resource, which wins over the legacy app-shared default,\n // which wins over the workspace default.\n return mergeResourceMetas(\n personal,\n mergeResourceMetas(\n organization,\n mergeResourceMetas(legacyShared, workspace),\n ),\n );\n}\n\nexport async function resourceEffectiveContext(\n userEmail: string,\n path: string,\n options?: ResourceResolutionOptions,\n): Promise<EffectiveResourceContext> {\n await ensureTable();\n\n // Four independent reads of the same path under different owners; the\n // precedence below is pure JS, so serialising them only bought four round\n // trips of latency. Mirrors `resourceListAccessible`, which already fans out.\n const organizationOwner = sharedResourceOwner(options?.orgId);\n const [workspace, organization, legacyShared, personal] = await Promise.all([\n resourceGetByPath(WORKSPACE_OWNER, path, { ...options, userEmail }),\n organizationOwner === SHARED_OWNER\n ? Promise.resolve(null)\n : resourceGetByPath(organizationOwner, path),\n resourceGetByPath(SHARED_OWNER, path),\n resourceGetByPath(userEmail, path),\n ]);\n const shared = organization ?? legacyShared;\n const effective = personal ?? shared ?? workspace ?? null;\n const effectiveScope: ResourceInheritanceScope | null = personal\n ? \"personal\"\n : shared\n ? \"shared\"\n : workspace\n ? \"workspace\"\n : null;\n\n const layerDefs: Array<{\n scope: ResourceInheritanceScope;\n label: string;\n owner: string;\n resource: Resource | null;\n canWrite: boolean;\n }> = [\n {\n scope: \"workspace\",\n label: \"Workspace default\",\n owner: WORKSPACE_OWNER,\n resource: workspace,\n canWrite: workspace ? isLocalWorkspaceResourceId(workspace.id) : false,\n },\n {\n scope: \"shared\",\n label: \"Organization/app override\",\n owner: organizationOwner,\n resource: shared,\n canWrite: true,\n },\n {\n scope: \"personal\",\n label: \"Personal override\",\n owner: userEmail,\n resource: personal,\n canWrite: true,\n },\n ];\n\n return {\n path,\n effectiveResource: effective ? resourceToMeta(effective) : null,\n effectiveScope,\n layers: layerDefs.map((layer) => ({\n scope: layer.scope,\n label: layer.label,\n owner: layer.owner,\n resource: layer.resource ? resourceToMeta(layer.resource) : null,\n exists: !!layer.resource,\n effective: !!layer.resource && layer.resource.id === effective?.id,\n overridden: !!layer.resource && layer.resource.id !== effective?.id,\n canWrite: layer.canWrite,\n })),\n };\n}\n\n/**\n * List all resources matching a path prefix across ALL owners.\n * Used by the recurring jobs scheduler to find all job resources.\n */\nexport async function resourceListAllOwners(\n pathPrefix: string,\n): Promise<Resource[]> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM resources WHERE path LIKE ? ESCAPE '!'`,\n args: [prefixLike(pathPrefix)],\n });\n const localResources = (\n await Promise.all(\n (\n await localWorkspaceResourceMetas(pathPrefix)\n ).map((resource) => resourceGet(resource.id)),\n )\n ).filter((resource): resource is Resource => !!resource);\n const localPaths = new Set(localResources.map((resource) => resource.path));\n return [\n ...localResources,\n ...rows\n .map(rowToResource)\n .filter((resource) => !localPaths.has(resource.path)),\n ];\n}\n\nexport async function resourceMove(\n id: string,\n newPath: string,\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n\n // Get current resource info\n const { rows } = await client.execute({\n sql: `SELECT path, owner FROM resources WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return false;\n\n const result = await client.execute({\n sql: `UPDATE resources SET path = ?, updated_at = ? WHERE id = ?`,\n args: [newPath, now, id],\n });\n const moved = result.rowsAffected > 0;\n if (moved) {\n emitResourceChange(id, newPath, rows[0].owner as string);\n }\n return moved;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAyEhE,KAAK,uBAAuB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,UAAU,oBAAoB;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,KACX;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,uBAAuB,CA8EzB;AAeD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAaD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E7E"}
|
package/dist/scripts/runner.js
CHANGED
|
@@ -14,7 +14,7 @@ import { spawnSync } from "node:child_process";
|
|
|
14
14
|
import path from "path";
|
|
15
15
|
import { pathToFileURL } from "url";
|
|
16
16
|
import { closeDbExec } from "../db/client.js";
|
|
17
|
-
import { notifyActionChange } from "../server/action-change.js";
|
|
17
|
+
import { actionCallIsReadOnly, notifyActionChange, } from "../server/action-change.js";
|
|
18
18
|
import { runWithRequestContext, getRequestOrgId, getRequestUserEmail, } from "../server/request-context.js";
|
|
19
19
|
import { coreScripts, getCoreScriptNames } from "./core-scripts.js";
|
|
20
20
|
import { resolveDevUserEmail } from "./dev-session.js";
|
|
@@ -332,7 +332,7 @@ async function dispatchAction(actionName, args, options) {
|
|
|
332
332
|
typeof handler.run === "function") {
|
|
333
333
|
const parsed = parseActionArgs(args, { coerceBooleans: true });
|
|
334
334
|
const result = await handler.run(parsed, cliActionCtx(actionName));
|
|
335
|
-
if (handler
|
|
335
|
+
if (!actionCallIsReadOnly(handler, parsed, false)) {
|
|
336
336
|
await notifyActionChange({ actionName }).catch(() => { });
|
|
337
337
|
}
|
|
338
338
|
if (result)
|
|
@@ -361,7 +361,7 @@ async function dispatchAction(actionName, args, options) {
|
|
|
361
361
|
await runAppDbPluginIfPresent();
|
|
362
362
|
const parsed = parseActionArgs(args, { coerceBooleans: true });
|
|
363
363
|
const result = await packageAction.run(parsed, cliActionCtx(actionName));
|
|
364
|
-
if (packageAction
|
|
364
|
+
if (!actionCallIsReadOnly(packageAction, parsed, false)) {
|
|
365
365
|
await notifyActionChange({ actionName }).catch(() => { });
|
|
366
366
|
}
|
|
367
367
|
if (result)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generic action dispatcher for @agent-native/core apps.\n *\n * Dynamically imports and runs actions from the app's actions/ directory.\n * Falls back to scripts/ directory for backwards compatibility, then to\n * core scripts (db-schema, db-query, db-exec, etc.) when no local action is found.\n *\n * Actions must export a default function: (args: string[]) => Promise<void>\n *\n * Usage: pnpm action <action-name> ['{\"arg\":\"value\"}'] [--args]\n */\n\nimport fs from \"fs\";\nimport { spawnSync } from \"node:child_process\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\n\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport { closeDbExec } from \"../db/client.js\";\nimport { notifyActionChange } from \"../server/action-change.js\";\nimport {\n runWithRequestContext,\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport { coreScripts, getCoreScriptNames } from \"./core-scripts.js\";\nimport { resolveDevUserEmail } from \"./dev-session.js\";\nimport { loadEnv } from \"./utils.js\";\n\n// Load .env from cwd so DATABASE_URL and other vars are available to all actions.\nloadEnv();\n\nconst CLI_HANDOFF_KEYS = new Set([\"embedStartUrl\", \"startUrl\"]);\nconst CLI_HANDOFF_URL_PATTERN =\n /\\/_agent-native\\/embed\\/start\\?[^\\s\"'<>)}\\]]+/g;\n\nfunction withoutCliHandoffText(value: unknown): string {\n return String(value).replace(\n CLI_HANDOFF_URL_PATTERN,\n \"[redacted embed handoff]\",\n );\n}\n\nfunction cliHandoffUrl(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n for (const key of CLI_HANDOFF_KEYS) {\n const value = (result as Record<string, unknown>)[key];\n if (\n typeof value === \"string\" &&\n value.includes(\"/_agent-native/embed/start?\")\n ) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction withoutCliHandoffSecrets(\n value: unknown,\n ancestors = new WeakSet<object>(),\n): unknown {\n if (\n typeof value === \"string\" &&\n value.includes(\"/_agent-native/embed/start?\")\n ) {\n return withoutCliHandoffText(value);\n }\n if (!value || typeof value !== \"object\") return value;\n if (ancestors.has(value)) return \"[Circular]\";\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((child) => withoutCliHandoffSecrets(child, ancestors));\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => !CLI_HANDOFF_KEYS.has(key))\n .map(([key, child]) => [\n key,\n withoutCliHandoffSecrets(child, ancestors),\n ]),\n );\n } finally {\n ancestors.delete(value);\n }\n}\n\ntype CliHandoffLaunchOutcome =\n | { ok: true }\n | {\n ok: false;\n reason: \"disabled\" | \"missing-base\" | \"invalid-url\" | \"open-failed\";\n message: string;\n };\n\ninterface CliHandoffLaunchDeps {\n env?: NodeJS.ProcessEnv;\n platform?: NodeJS.Platform;\n spawn?: (\n command: string,\n args: string[],\n ) => { status: number | null; error?: Error };\n}\n\nexport function openCliHandoff(\n urlOrPath: string,\n deps: CliHandoffLaunchDeps = {},\n): CliHandoffLaunchOutcome {\n const env = deps.env ?? process.env;\n if (env.AGENT_NATIVE_NO_OPEN === \"1\") {\n return {\n ok: false,\n reason: \"disabled\",\n message:\n \"Secure browser handoff is disabled by AGENT_NATIVE_NO_OPEN. Remove it and rerun this action.\",\n };\n }\n let url = urlOrPath;\n if (urlOrPath.startsWith(\"/\")) {\n const baseUrl =\n env.APP_URL ||\n env.WORKSPACE_GATEWAY_URL ||\n env.VITE_WORKSPACE_GATEWAY_URL ||\n env.BETTER_AUTH_URL;\n if (!baseUrl) {\n return {\n ok: false,\n reason: \"missing-base\",\n message:\n \"Secure browser handoff needs APP_URL or WORKSPACE_GATEWAY_URL. Start the app locally or set its URL, then rerun this action.\",\n };\n }\n try {\n url = new URL(urlOrPath, baseUrl).toString();\n } catch {\n return {\n ok: false,\n reason: \"invalid-url\",\n message:\n \"Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.\",\n };\n }\n }\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"unsupported protocol\");\n }\n } catch {\n return {\n ok: false,\n reason: \"invalid-url\",\n message:\n \"Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.\",\n };\n }\n\n const platform = deps.platform ?? process.platform;\n const command =\n platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const launch =\n deps.spawn?.(command, args) ??\n spawnSync(command, args, {\n stdio: \"ignore\",\n timeout: 10_000,\n });\n if (launch.error || launch.status !== 0) {\n return {\n ok: false,\n reason: \"open-failed\",\n message:\n \"Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.\",\n };\n }\n } catch {\n return {\n ok: false,\n reason: \"open-failed\",\n message:\n \"Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.\",\n };\n }\n return { ok: true };\n}\n\nfunction printActionResult(result: unknown): CliHandoffLaunchOutcome | null {\n const handoffUrl = cliHandoffUrl(result);\n const handoff = handoffUrl ? openCliHandoff(handoffUrl) : null;\n console.log(withoutCliHandoffSecrets(result));\n return handoff;\n}\n\nfunction assertCliHandoffLaunched(\n outcome: CliHandoffLaunchOutcome | null,\n): void {\n if (outcome && !outcome.ok) throw new Error(outcome.message);\n}\n\nexport interface RunScriptOptions {\n /**\n * Actions contributed by packages rather than the app's local `actions/`\n * directory. Local app actions still win on name collision.\n */\n packageActions?: Record<string, ActionEntry>;\n /** Help-section label for package actions. */\n packageActionLabel?: string;\n}\n\nasync function runAppDbPluginIfPresent(): Promise<void> {\n const dbPluginPath = path.resolve(process.cwd(), \"server/plugins/db.ts\");\n if (!fs.existsSync(dbPluginPath)) return;\n\n const mod = await import(/* @vite-ignore */ pathToFileURL(dbPluginPath).href);\n const plugin = mod.default;\n if (typeof plugin === \"function\") {\n await plugin({});\n }\n}\n\n/**\n * Run the action dispatcher. Call this from your app's actions/run.ts (or scripts/run.ts):\n *\n * import { runScript } from \"@agent-native/core\";\n * runScript();\n */\nexport async function runScript(options: RunScriptOptions = {}): Promise<void> {\n const actionName = process.argv[2];\n\n if (!actionName || actionName === \"--help\") {\n console.log(\n `Usage: pnpm action <action-name> ['{\"arg\":\"value\"}'] [--arg value ...]`,\n );\n console.log(`\\nRun any action with --help for usage details.`);\n\n // List local actions (try actions/ first, then scripts/)\n const actionsDir = path.resolve(process.cwd(), \"actions\");\n const scriptsDir = path.resolve(process.cwd(), \"scripts\");\n const localDir = fs.existsSync(actionsDir) ? actionsDir : scriptsDir;\n if (fs.existsSync(localDir)) {\n const locals = fs\n .readdirSync(localDir)\n .filter((f) => f.endsWith(\".ts\") && f !== \"run.ts\")\n .map((f) => f.replace(/\\.ts$/, \"\"));\n if (locals.length > 0) {\n console.log(`\\nApp actions:`);\n for (const name of locals) {\n console.log(` ${name}`);\n }\n }\n }\n\n const packageActionNames = Object.keys(options.packageActions ?? {}).sort();\n if (packageActionNames.length > 0) {\n console.log(`\\n${options.packageActionLabel ?? \"Package actions\"}:`);\n for (const name of packageActionNames) {\n console.log(` ${name}`);\n }\n }\n\n // List core scripts\n const coreNames = getCoreScriptNames();\n if (coreNames.length > 0) {\n console.log(`\\nCore actions (built-in):`);\n for (const name of coreNames) {\n console.log(` ${name}`);\n }\n }\n\n process.exit(0);\n }\n\n // Validate action name (only allow alphanumeric + hyphens)\n if (!/^[a-z][a-z0-9-]*$/.test(actionName)) {\n console.error(`Error: Invalid action name \"${actionName}\"`);\n process.exit(1);\n }\n\n const args = process.argv.slice(3);\n\n // Establish a request context for the duration of this CLI run. Without\n // it, db-exec / db-query / db-patch and any action that calls\n // `getRequestUserEmail()` see no identity and refuse to run. The\n // resolver picks up `AGENT_USER_EMAIL` if explicitly set, otherwise\n // reads the DB session owner only when it is unambiguous (dev-only,\n // narrowly gated — see dev-session.ts).\n //\n // This wrap is intentionally a single point of injection: it covers\n // both the local-action branch and the fall-through to core scripts\n // (db-query, db-exec, …) so every CLI entrypoint runs scoped to a real\n // user. It uses `runWithRequestContext` rather than mutating\n // `process.env.AGENT_USER_EMAIL` because env mutation leaks across\n // boundaries — see the cautionary comment in\n // `server/request-context.ts` about exactly that pattern.\n const userEmail = await resolveDevUserEmail();\n const orgId = process.env.AGENT_ORG_ID || undefined;\n\n return runWithRequestContext({ userEmail, orgId }, () =>\n dispatchAction(actionName, args, options),\n );\n}\n\nfunction coerceCliValue(\n value: string,\n coerceBooleans: boolean,\n): string | boolean {\n if (!coerceBooleans) return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return value;\n}\n\nfunction setParsedArg(\n parsed: Record<string, unknown>,\n key: string,\n value: unknown,\n) {\n const existing = parsed[key];\n if (existing === undefined) {\n parsed[key] = value;\n return;\n }\n parsed[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n}\n\nfunction parseActionArgs(\n args: string[],\n options: { coerceBooleans?: boolean } = {},\n): Record<string, unknown> {\n const parsed = parsePositionalJsonArg(args);\n const flagArgs: Record<string, unknown> = {};\n const coerceBooleans = options.coerceBooleans ?? false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg.startsWith(\"--\")) continue;\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > 0) {\n setParsedArg(\n flagArgs,\n arg.slice(2, eqIdx),\n coerceCliValue(arg.slice(eqIdx + 1), coerceBooleans),\n );\n } else {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n setParsedArg(flagArgs, key, coerceCliValue(next, coerceBooleans));\n i++;\n } else {\n setParsedArg(flagArgs, key, coerceBooleans ? true : \"true\");\n }\n }\n }\n return { ...parsed, ...flagArgs };\n}\n\nfunction parsePositionalJsonArg(args: string[]): Record<string, unknown> {\n let jsonArg: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n if (!arg.includes(\"=\") && args[i + 1] && !args[i + 1].startsWith(\"--\")) {\n i++;\n }\n continue;\n }\n\n const trimmed = arg.trim();\n if (!trimmed.startsWith(\"{\")) continue;\n if (jsonArg !== undefined) {\n throw new Error(\"Only one positional JSON object argument is supported.\");\n }\n jsonArg = trimmed;\n }\n\n if (jsonArg === undefined) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonArg);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid positional JSON argument: ${message}`);\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Positional JSON argument must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * Build the `ctx` passed as the action's second arg for CLI dispatch. The\n * identity comes from the `runWithRequestContext` wrap in `runScript` (which\n * resolves `AGENT_USER_EMAIL` / the dev session); we never inject a dev\n * identity here beyond what that wrap already established.\n */\nfunction cliActionCtx(\n actionName: string,\n): import(\"../action.js\").ActionRunContext {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId() ?? null,\n caller: \"cli\",\n actionName,\n };\n}\n\nasync function dispatchAction(\n actionName: string,\n args: string[],\n options: RunScriptOptions,\n): Promise<void> {\n // 1. Try local app action first (actions/ then scripts/ for backwards compat)\n const actionsPath = path.resolve(\n process.cwd(),\n \"actions\",\n `${actionName}.ts`,\n );\n const scriptsPath = path.resolve(\n process.cwd(),\n \"scripts\",\n `${actionName}.ts`,\n );\n const localPath = fs.existsSync(actionsPath) ? actionsPath : scriptsPath;\n\n if (fs.existsSync(localPath)) {\n try {\n await runAppDbPluginIfPresent();\n const mod = await import(\n /* @vite-ignore */ pathToFileURL(localPath).href\n );\n const handler = mod.default;\n // Support defineAction-style default exports (object with run method)\n if (\n handler &&\n typeof handler === \"object\" &&\n typeof handler.run === \"function\"\n ) {\n const parsed = parseActionArgs(args, { coerceBooleans: true });\n const result = await handler.run(parsed, cliActionCtx(actionName));\n if (handler.readOnly !== true) {\n await notifyActionChange({ actionName }).catch(() => {});\n }\n if (result) assertCliHandoffLaunched(printActionResult(result));\n } else if (typeof handler === \"function\") {\n await handler(args);\n } else {\n console.error(\n `Action \"${actionName}\" does not export a default function or defineAction.`,\n );\n process.exit(1);\n }\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 2. Try package-contributed actions (e.g. @agent-native/dispatch)\n const packageAction = options.packageActions?.[actionName];\n if (packageAction) {\n try {\n await runAppDbPluginIfPresent();\n const parsed = parseActionArgs(args, { coerceBooleans: true });\n const result = await packageAction.run(\n parsed as Record<string, string>,\n cliActionCtx(actionName),\n );\n if (packageAction.readOnly !== true) {\n await notifyActionChange({ actionName }).catch(() => {});\n }\n if (result) assertCliHandoffLaunched(printActionResult(result));\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 3. Fall back to core scripts\n const coreScript = coreScripts[actionName];\n if (coreScript) {\n try {\n await coreScript(args);\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Core action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 4. Not found anywhere\n console.error(\n `Error: Action \"${actionName}\" not found. Run \"pnpm action --help\" for available actions.`,\n );\n process.exit(1);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generic action dispatcher for @agent-native/core apps.\n *\n * Dynamically imports and runs actions from the app's actions/ directory.\n * Falls back to scripts/ directory for backwards compatibility, then to\n * core scripts (db-schema, db-query, db-exec, etc.) when no local action is found.\n *\n * Actions must export a default function: (args: string[]) => Promise<void>\n *\n * Usage: pnpm action <action-name> ['{\"arg\":\"value\"}'] [--args]\n */\n\nimport fs from \"fs\";\nimport { spawnSync } from \"node:child_process\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\n\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport { closeDbExec } from \"../db/client.js\";\nimport {\n actionCallIsReadOnly,\n notifyActionChange,\n} from \"../server/action-change.js\";\nimport {\n runWithRequestContext,\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport { coreScripts, getCoreScriptNames } from \"./core-scripts.js\";\nimport { resolveDevUserEmail } from \"./dev-session.js\";\nimport { loadEnv } from \"./utils.js\";\n\n// Load .env from cwd so DATABASE_URL and other vars are available to all actions.\nloadEnv();\n\nconst CLI_HANDOFF_KEYS = new Set([\"embedStartUrl\", \"startUrl\"]);\nconst CLI_HANDOFF_URL_PATTERN =\n /\\/_agent-native\\/embed\\/start\\?[^\\s\"'<>)}\\]]+/g;\n\nfunction withoutCliHandoffText(value: unknown): string {\n return String(value).replace(\n CLI_HANDOFF_URL_PATTERN,\n \"[redacted embed handoff]\",\n );\n}\n\nfunction cliHandoffUrl(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n for (const key of CLI_HANDOFF_KEYS) {\n const value = (result as Record<string, unknown>)[key];\n if (\n typeof value === \"string\" &&\n value.includes(\"/_agent-native/embed/start?\")\n ) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction withoutCliHandoffSecrets(\n value: unknown,\n ancestors = new WeakSet<object>(),\n): unknown {\n if (\n typeof value === \"string\" &&\n value.includes(\"/_agent-native/embed/start?\")\n ) {\n return withoutCliHandoffText(value);\n }\n if (!value || typeof value !== \"object\") return value;\n if (ancestors.has(value)) return \"[Circular]\";\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((child) => withoutCliHandoffSecrets(child, ancestors));\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => !CLI_HANDOFF_KEYS.has(key))\n .map(([key, child]) => [\n key,\n withoutCliHandoffSecrets(child, ancestors),\n ]),\n );\n } finally {\n ancestors.delete(value);\n }\n}\n\ntype CliHandoffLaunchOutcome =\n | { ok: true }\n | {\n ok: false;\n reason: \"disabled\" | \"missing-base\" | \"invalid-url\" | \"open-failed\";\n message: string;\n };\n\ninterface CliHandoffLaunchDeps {\n env?: NodeJS.ProcessEnv;\n platform?: NodeJS.Platform;\n spawn?: (\n command: string,\n args: string[],\n ) => { status: number | null; error?: Error };\n}\n\nexport function openCliHandoff(\n urlOrPath: string,\n deps: CliHandoffLaunchDeps = {},\n): CliHandoffLaunchOutcome {\n const env = deps.env ?? process.env;\n if (env.AGENT_NATIVE_NO_OPEN === \"1\") {\n return {\n ok: false,\n reason: \"disabled\",\n message:\n \"Secure browser handoff is disabled by AGENT_NATIVE_NO_OPEN. Remove it and rerun this action.\",\n };\n }\n let url = urlOrPath;\n if (urlOrPath.startsWith(\"/\")) {\n const baseUrl =\n env.APP_URL ||\n env.WORKSPACE_GATEWAY_URL ||\n env.VITE_WORKSPACE_GATEWAY_URL ||\n env.BETTER_AUTH_URL;\n if (!baseUrl) {\n return {\n ok: false,\n reason: \"missing-base\",\n message:\n \"Secure browser handoff needs APP_URL or WORKSPACE_GATEWAY_URL. Start the app locally or set its URL, then rerun this action.\",\n };\n }\n try {\n url = new URL(urlOrPath, baseUrl).toString();\n } catch {\n return {\n ok: false,\n reason: \"invalid-url\",\n message:\n \"Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.\",\n };\n }\n }\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"unsupported protocol\");\n }\n } catch {\n return {\n ok: false,\n reason: \"invalid-url\",\n message:\n \"Secure browser handoff found an invalid app URL. Fix APP_URL or WORKSPACE_GATEWAY_URL, then rerun this action.\",\n };\n }\n\n const platform = deps.platform ?? process.platform;\n const command =\n platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const launch =\n deps.spawn?.(command, args) ??\n spawnSync(command, args, {\n stdio: \"ignore\",\n timeout: 10_000,\n });\n if (launch.error || launch.status !== 0) {\n return {\n ok: false,\n reason: \"open-failed\",\n message:\n \"Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.\",\n };\n }\n } catch {\n return {\n ok: false,\n reason: \"open-failed\",\n message:\n \"Secure browser handoff could not invoke the system URL opener. Verify local URL handling, then rerun this action.\",\n };\n }\n return { ok: true };\n}\n\nfunction printActionResult(result: unknown): CliHandoffLaunchOutcome | null {\n const handoffUrl = cliHandoffUrl(result);\n const handoff = handoffUrl ? openCliHandoff(handoffUrl) : null;\n console.log(withoutCliHandoffSecrets(result));\n return handoff;\n}\n\nfunction assertCliHandoffLaunched(\n outcome: CliHandoffLaunchOutcome | null,\n): void {\n if (outcome && !outcome.ok) throw new Error(outcome.message);\n}\n\nexport interface RunScriptOptions {\n /**\n * Actions contributed by packages rather than the app's local `actions/`\n * directory. Local app actions still win on name collision.\n */\n packageActions?: Record<string, ActionEntry>;\n /** Help-section label for package actions. */\n packageActionLabel?: string;\n}\n\nasync function runAppDbPluginIfPresent(): Promise<void> {\n const dbPluginPath = path.resolve(process.cwd(), \"server/plugins/db.ts\");\n if (!fs.existsSync(dbPluginPath)) return;\n\n const mod = await import(/* @vite-ignore */ pathToFileURL(dbPluginPath).href);\n const plugin = mod.default;\n if (typeof plugin === \"function\") {\n await plugin({});\n }\n}\n\n/**\n * Run the action dispatcher. Call this from your app's actions/run.ts (or scripts/run.ts):\n *\n * import { runScript } from \"@agent-native/core\";\n * runScript();\n */\nexport async function runScript(options: RunScriptOptions = {}): Promise<void> {\n const actionName = process.argv[2];\n\n if (!actionName || actionName === \"--help\") {\n console.log(\n `Usage: pnpm action <action-name> ['{\"arg\":\"value\"}'] [--arg value ...]`,\n );\n console.log(`\\nRun any action with --help for usage details.`);\n\n // List local actions (try actions/ first, then scripts/)\n const actionsDir = path.resolve(process.cwd(), \"actions\");\n const scriptsDir = path.resolve(process.cwd(), \"scripts\");\n const localDir = fs.existsSync(actionsDir) ? actionsDir : scriptsDir;\n if (fs.existsSync(localDir)) {\n const locals = fs\n .readdirSync(localDir)\n .filter((f) => f.endsWith(\".ts\") && f !== \"run.ts\")\n .map((f) => f.replace(/\\.ts$/, \"\"));\n if (locals.length > 0) {\n console.log(`\\nApp actions:`);\n for (const name of locals) {\n console.log(` ${name}`);\n }\n }\n }\n\n const packageActionNames = Object.keys(options.packageActions ?? {}).sort();\n if (packageActionNames.length > 0) {\n console.log(`\\n${options.packageActionLabel ?? \"Package actions\"}:`);\n for (const name of packageActionNames) {\n console.log(` ${name}`);\n }\n }\n\n // List core scripts\n const coreNames = getCoreScriptNames();\n if (coreNames.length > 0) {\n console.log(`\\nCore actions (built-in):`);\n for (const name of coreNames) {\n console.log(` ${name}`);\n }\n }\n\n process.exit(0);\n }\n\n // Validate action name (only allow alphanumeric + hyphens)\n if (!/^[a-z][a-z0-9-]*$/.test(actionName)) {\n console.error(`Error: Invalid action name \"${actionName}\"`);\n process.exit(1);\n }\n\n const args = process.argv.slice(3);\n\n // Establish a request context for the duration of this CLI run. Without\n // it, db-exec / db-query / db-patch and any action that calls\n // `getRequestUserEmail()` see no identity and refuse to run. The\n // resolver picks up `AGENT_USER_EMAIL` if explicitly set, otherwise\n // reads the DB session owner only when it is unambiguous (dev-only,\n // narrowly gated — see dev-session.ts).\n //\n // This wrap is intentionally a single point of injection: it covers\n // both the local-action branch and the fall-through to core scripts\n // (db-query, db-exec, …) so every CLI entrypoint runs scoped to a real\n // user. It uses `runWithRequestContext` rather than mutating\n // `process.env.AGENT_USER_EMAIL` because env mutation leaks across\n // boundaries — see the cautionary comment in\n // `server/request-context.ts` about exactly that pattern.\n const userEmail = await resolveDevUserEmail();\n const orgId = process.env.AGENT_ORG_ID || undefined;\n\n return runWithRequestContext({ userEmail, orgId }, () =>\n dispatchAction(actionName, args, options),\n );\n}\n\nfunction coerceCliValue(\n value: string,\n coerceBooleans: boolean,\n): string | boolean {\n if (!coerceBooleans) return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return value;\n}\n\nfunction setParsedArg(\n parsed: Record<string, unknown>,\n key: string,\n value: unknown,\n) {\n const existing = parsed[key];\n if (existing === undefined) {\n parsed[key] = value;\n return;\n }\n parsed[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n}\n\nfunction parseActionArgs(\n args: string[],\n options: { coerceBooleans?: boolean } = {},\n): Record<string, unknown> {\n const parsed = parsePositionalJsonArg(args);\n const flagArgs: Record<string, unknown> = {};\n const coerceBooleans = options.coerceBooleans ?? false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg.startsWith(\"--\")) continue;\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > 0) {\n setParsedArg(\n flagArgs,\n arg.slice(2, eqIdx),\n coerceCliValue(arg.slice(eqIdx + 1), coerceBooleans),\n );\n } else {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n setParsedArg(flagArgs, key, coerceCliValue(next, coerceBooleans));\n i++;\n } else {\n setParsedArg(flagArgs, key, coerceBooleans ? true : \"true\");\n }\n }\n }\n return { ...parsed, ...flagArgs };\n}\n\nfunction parsePositionalJsonArg(args: string[]): Record<string, unknown> {\n let jsonArg: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n if (!arg.includes(\"=\") && args[i + 1] && !args[i + 1].startsWith(\"--\")) {\n i++;\n }\n continue;\n }\n\n const trimmed = arg.trim();\n if (!trimmed.startsWith(\"{\")) continue;\n if (jsonArg !== undefined) {\n throw new Error(\"Only one positional JSON object argument is supported.\");\n }\n jsonArg = trimmed;\n }\n\n if (jsonArg === undefined) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonArg);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid positional JSON argument: ${message}`);\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Positional JSON argument must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * Build the `ctx` passed as the action's second arg for CLI dispatch. The\n * identity comes from the `runWithRequestContext` wrap in `runScript` (which\n * resolves `AGENT_USER_EMAIL` / the dev session); we never inject a dev\n * identity here beyond what that wrap already established.\n */\nfunction cliActionCtx(\n actionName: string,\n): import(\"../action.js\").ActionRunContext {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId() ?? null,\n caller: \"cli\",\n actionName,\n };\n}\n\nasync function dispatchAction(\n actionName: string,\n args: string[],\n options: RunScriptOptions,\n): Promise<void> {\n // 1. Try local app action first (actions/ then scripts/ for backwards compat)\n const actionsPath = path.resolve(\n process.cwd(),\n \"actions\",\n `${actionName}.ts`,\n );\n const scriptsPath = path.resolve(\n process.cwd(),\n \"scripts\",\n `${actionName}.ts`,\n );\n const localPath = fs.existsSync(actionsPath) ? actionsPath : scriptsPath;\n\n if (fs.existsSync(localPath)) {\n try {\n await runAppDbPluginIfPresent();\n const mod = await import(\n /* @vite-ignore */ pathToFileURL(localPath).href\n );\n const handler = mod.default;\n // Support defineAction-style default exports (object with run method)\n if (\n handler &&\n typeof handler === \"object\" &&\n typeof handler.run === \"function\"\n ) {\n const parsed = parseActionArgs(args, { coerceBooleans: true });\n const result = await handler.run(parsed, cliActionCtx(actionName));\n if (!actionCallIsReadOnly(handler, parsed, false)) {\n await notifyActionChange({ actionName }).catch(() => {});\n }\n if (result) assertCliHandoffLaunched(printActionResult(result));\n } else if (typeof handler === \"function\") {\n await handler(args);\n } else {\n console.error(\n `Action \"${actionName}\" does not export a default function or defineAction.`,\n );\n process.exit(1);\n }\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 2. Try package-contributed actions (e.g. @agent-native/dispatch)\n const packageAction = options.packageActions?.[actionName];\n if (packageAction) {\n try {\n await runAppDbPluginIfPresent();\n const parsed = parseActionArgs(args, { coerceBooleans: true });\n const result = await packageAction.run(\n parsed as Record<string, string>,\n cliActionCtx(actionName),\n );\n if (!actionCallIsReadOnly(packageAction, parsed, false)) {\n await notifyActionChange({ actionName }).catch(() => {});\n }\n if (result) assertCliHandoffLaunched(printActionResult(result));\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 3. Fall back to core scripts\n const coreScript = coreScripts[actionName];\n if (coreScript) {\n try {\n await coreScript(args);\n await closeDbExec().catch(() => {});\n process.exit(0);\n } catch (err: any) {\n await closeDbExec().catch(() => {});\n console.error(\n `Core action \"${actionName}\" failed:`,\n withoutCliHandoffText(err.message || err),\n );\n process.exit(1);\n }\n }\n\n // 4. Not found anywhere\n console.error(\n `Error: Action \"${actionName}\" not found. Run \"pnpm action --help\" for available actions.`,\n );\n process.exit(1);\n}\n"]}
|