@agent-native/core 0.15.12 → 0.16.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/README.md +37 -0
- package/dist/agent/app-model-defaults.d.ts +37 -0
- package/dist/agent/app-model-defaults.d.ts.map +1 -0
- package/dist/agent/app-model-defaults.js +136 -0
- package/dist/agent/app-model-defaults.js.map +1 -0
- package/dist/agent/engine/registry.d.ts +12 -7
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +28 -8
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts +2 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +3 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/browser-sessions/actions.d.ts +7 -0
- package/dist/browser-sessions/actions.d.ts.map +1 -0
- package/dist/browser-sessions/actions.js +223 -0
- package/dist/browser-sessions/actions.js.map +1 -0
- package/dist/browser-sessions/routes.d.ts +7 -0
- package/dist/browser-sessions/routes.d.ts.map +1 -0
- package/dist/browser-sessions/routes.js +159 -0
- package/dist/browser-sessions/routes.js.map +1 -0
- package/dist/browser-sessions/store.d.ts +33 -0
- package/dist/browser-sessions/store.d.ts.map +1 -0
- package/dist/browser-sessions/store.js +506 -0
- package/dist/browser-sessions/store.js.map +1 -0
- package/dist/browser-sessions/types.d.ts +68 -0
- package/dist/browser-sessions/types.d.ts.map +1 -0
- package/dist/browser-sessions/types.js +2 -0
- package/dist/browser-sessions/types.js.map +1 -0
- package/dist/cli/code-agent-commands.d.ts +36 -0
- package/dist/cli/code-agent-commands.d.ts.map +1 -0
- package/dist/cli/code-agent-commands.js +192 -0
- package/dist/cli/code-agent-commands.js.map +1 -0
- package/dist/cli/code-agent-connector.d.ts +17 -0
- package/dist/cli/code-agent-connector.d.ts.map +1 -0
- package/dist/cli/code-agent-connector.js +724 -0
- package/dist/cli/code-agent-connector.js.map +1 -0
- package/dist/cli/code-agent-executor.d.ts +31 -0
- package/dist/cli/code-agent-executor.d.ts.map +1 -0
- package/dist/cli/code-agent-executor.js +921 -0
- package/dist/cli/code-agent-executor.js.map +1 -0
- package/dist/cli/code-agent-runs.d.ts +102 -0
- package/dist/cli/code-agent-runs.d.ts.map +1 -0
- package/dist/cli/code-agent-runs.js +277 -0
- package/dist/cli/code-agent-runs.js.map +1 -0
- package/dist/cli/code.d.ts +66 -0
- package/dist/cli/code.d.ts.map +1 -0
- package/dist/cli/code.js +1306 -0
- package/dist/cli/code.js.map +1 -0
- package/dist/cli/create.d.ts +2 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +11 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +26 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/migrate.d.ts +27 -0
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +1328 -20
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +27 -3
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts +2 -0
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +2 -1
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentNative.d.ts +32 -0
- package/dist/client/AgentNative.d.ts.map +1 -0
- package/dist/client/AgentNative.js +79 -0
- package/dist/client/AgentNative.js.map +1 -0
- package/dist/client/AgentNativeEmbedded.d.ts +47 -0
- package/dist/client/AgentNativeEmbedded.d.ts.map +1 -0
- package/dist/client/AgentNativeEmbedded.js +148 -0
- package/dist/client/AgentNativeEmbedded.js.map +1 -0
- package/dist/client/AgentNativeFrame.d.ts +25 -0
- package/dist/client/AgentNativeFrame.d.ts.map +1 -0
- package/dist/client/AgentNativeFrame.js +68 -0
- package/dist/client/AgentNativeFrame.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +19 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +15 -4
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +79 -48
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +2 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +3 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/browser-session-bridge.d.ts +44 -0
- package/dist/client/browser-session-bridge.d.ts.map +1 -0
- package/dist/client/browser-session-bridge.js +339 -0
- package/dist/client/browser-session-bridge.js.map +1 -0
- package/dist/client/client-action.d.ts +7 -0
- package/dist/client/client-action.d.ts.map +1 -0
- package/dist/client/client-action.js +4 -0
- package/dist/client/client-action.js.map +1 -0
- package/dist/client/components/ui/tooltip.d.ts.map +1 -1
- package/dist/client/components/ui/tooltip.js +1 -1
- package/dist/client/components/ui/tooltip.js.map +1 -1
- package/dist/client/composer/AgentComposerFrame.d.ts +17 -0
- package/dist/client/composer/AgentComposerFrame.d.ts.map +1 -0
- package/dist/client/composer/AgentComposerFrame.js +14 -0
- package/dist/client/composer/AgentComposerFrame.js.map +1 -0
- package/dist/client/composer/MentionPopover.d.ts.map +1 -1
- package/dist/client/composer/MentionPopover.js +2 -2
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts +35 -2
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +31 -17
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +20 -2
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +112 -22
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/index.d.ts +3 -2
- package/dist/client/composer/index.d.ts.map +1 -1
- package/dist/client/composer/index.js +1 -0
- package/dist/client/composer/index.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/types.js.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +58 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts +2 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js +110 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.js +354 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts +2 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js +68 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js.map +1 -0
- package/dist/client/extensions/agent-native-extension-runtime.d.ts +69 -0
- package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +1 -0
- package/dist/client/extensions/agent-native-extension-runtime.js +348 -0
- package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -0
- package/dist/client/extensions/index.d.ts +2 -0
- package/dist/client/extensions/index.d.ts.map +1 -1
- package/dist/client/extensions/index.js +2 -0
- package/dist/client/extensions/index.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +86 -0
- package/dist/client/extensions/portable-extension.d.ts.map +1 -0
- package/dist/client/extensions/portable-extension.js +480 -0
- package/dist/client/extensions/portable-extension.js.map +1 -0
- package/dist/client/host-bridge.d.ts +266 -0
- package/dist/client/host-bridge.d.ts.map +1 -0
- package/dist/client/host-bridge.js +745 -0
- package/dist/client/host-bridge.js.map +1 -0
- package/dist/client/host-tools.d.ts +40 -0
- package/dist/client/host-tools.d.ts.map +1 -0
- package/dist/client/host-tools.js +94 -0
- package/dist/client/host-tools.js.map +1 -0
- package/dist/client/index.d.ts +13 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +11 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts +10 -0
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -0
- package/dist/client/resources/BuiltinCapabilityDetail.js +51 -0
- package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -0
- package/dist/client/resources/ResourceEditor.d.ts +3 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +40 -17
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +23 -2
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +77 -17
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/index.d.ts +1 -0
- package/dist/client/resources/index.d.ts.map +1 -1
- package/dist/client/resources/index.js +1 -0
- package/dist/client/resources/index.js.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts +62 -0
- package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -0
- package/dist/client/resources/use-builtin-capabilities.js +54 -0
- package/dist/client/resources/use-builtin-capabilities.js.map +1 -0
- package/dist/client/resources/use-resources.d.ts +30 -2
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +42 -1
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +151 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/use-chat-models.d.ts.map +1 -1
- package/dist/client/use-chat-models.js +20 -0
- package/dist/client/use-chat-models.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +46 -2
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-chat-threads.spec.js +77 -0
- package/dist/client/use-chat-threads.spec.js.map +1 -1
- package/dist/code-agents/index.d.ts +4 -0
- package/dist/code-agents/index.d.ts.map +1 -0
- package/dist/code-agents/index.js +4 -0
- package/dist/code-agents/index.js.map +1 -0
- package/dist/connections/catalog.d.ts +134 -0
- package/dist/connections/catalog.d.ts.map +1 -0
- package/dist/connections/catalog.js +180 -0
- package/dist/connections/catalog.js.map +1 -0
- package/dist/connections/index.d.ts +2 -0
- package/dist/connections/index.d.ts.map +1 -0
- package/dist/connections/index.js +2 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/extensions/change-marker.d.ts +10 -0
- package/dist/extensions/change-marker.d.ts.map +1 -0
- package/dist/extensions/change-marker.js +42 -0
- package/dist/extensions/change-marker.js.map +1 -0
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +1 -7
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/schema.d.ts +1 -0
- package/dist/extensions/schema.d.ts.map +1 -1
- package/dist/extensions/schema.js +1 -0
- package/dist/extensions/schema.js.map +1 -1
- package/dist/extensions/slots/routes.js +1 -1
- package/dist/extensions/slots/routes.js.map +1 -1
- package/dist/extensions/store.d.ts +3 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +112 -4
- package/dist/extensions/store.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +1 -0
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/index.d.ts +5 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +4 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts +8 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +760 -32
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/remote-commands-store.d.ts +36 -0
- package/dist/integrations/remote-commands-store.d.ts.map +1 -0
- package/dist/integrations/remote-commands-store.js +273 -0
- package/dist/integrations/remote-commands-store.js.map +1 -0
- package/dist/integrations/remote-devices-store.d.ts +43 -0
- package/dist/integrations/remote-devices-store.d.ts.map +1 -0
- package/dist/integrations/remote-devices-store.js +315 -0
- package/dist/integrations/remote-devices-store.js.map +1 -0
- package/dist/integrations/remote-push-store.d.ts +37 -0
- package/dist/integrations/remote-push-store.d.ts.map +1 -0
- package/dist/integrations/remote-push-store.js +299 -0
- package/dist/integrations/remote-push-store.js.map +1 -0
- package/dist/integrations/remote-retry-job.d.ts +7 -0
- package/dist/integrations/remote-retry-job.d.ts.map +1 -0
- package/dist/integrations/remote-retry-job.js +45 -0
- package/dist/integrations/remote-retry-job.js.map +1 -0
- package/dist/integrations/remote-run-events-store.d.ts +18 -0
- package/dist/integrations/remote-run-events-store.d.ts.map +1 -0
- package/dist/integrations/remote-run-events-store.js +82 -0
- package/dist/integrations/remote-run-events-store.js.map +1 -0
- package/dist/integrations/remote-types.d.ts +101 -0
- package/dist/integrations/remote-types.d.ts.map +1 -0
- package/dist/integrations/remote-types.js +2 -0
- package/dist/integrations/remote-types.js.map +1 -0
- package/dist/integrations/webhook-handler.d.ts +2 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +4 -1
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +4 -2
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +9 -3
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/mcp-client/builtin-capabilities.d.ts +20 -0
- package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -0
- package/dist/mcp-client/builtin-capabilities.js +75 -0
- package/dist/mcp-client/builtin-capabilities.js.map +1 -0
- package/dist/mcp-client/builtin-store.d.ts +10 -0
- package/dist/mcp-client/builtin-store.d.ts.map +1 -0
- package/dist/mcp-client/builtin-store.js +55 -0
- package/dist/mcp-client/builtin-store.js.map +1 -0
- package/dist/mcp-client/index.d.ts +3 -1
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +3 -1
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/routes.d.ts +28 -0
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +195 -1
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +34 -0
- package/dist/org/context.js.map +1 -1
- package/dist/resources/handlers.d.ts +4 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +46 -7
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts +8 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +18 -8
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +19 -0
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +86 -3
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -7
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +100 -7
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +4 -1
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/effective.d.ts +11 -0
- package/dist/scripts/resources/effective.d.ts.map +1 -0
- package/dist/scripts/resources/effective.js +54 -0
- package/dist/scripts/resources/effective.js.map +1 -0
- package/dist/scripts/resources/index.d.ts.map +1 -1
- package/dist/scripts/resources/index.js +1 -0
- package/dist/scripts/resources/index.js.map +1 -1
- package/dist/scripts/resources/list.d.ts +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +17 -5
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/read.d.ts +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +20 -5
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +4 -1
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/scripts/runner.d.ts +11 -1
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +75 -27
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +24 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +608 -54
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +2 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/embedded.d.ts +72 -0
- package/dist/server/embedded.d.ts.map +1 -0
- package/dist/server/embedded.js +119 -0
- package/dist/server/embedded.js.map +1 -0
- package/dist/server/index.d.ts +8 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +184 -13
- package/dist/server/poll.js.map +1 -1
- package/dist/server/resources-plugin.d.ts.map +1 -1
- package/dist/server/resources-plugin.js +11 -2
- package/dist/server/resources-plugin.js.map +1 -1
- package/dist/sharing/actions/extension-change.d.ts +4 -0
- package/dist/sharing/actions/extension-change.d.ts.map +1 -0
- package/dist/sharing/actions/extension-change.js +13 -0
- package/dist/sharing/actions/extension-change.js.map +1 -0
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +3 -0
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +4 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
- package/dist/sharing/actions/unshare-resource.js +3 -0
- package/dist/sharing/actions/unshare-resource.js.map +1 -1
- package/dist/templates/default/AGENTS.md +3 -3
- package/dist/templates/workspace-core/AGENTS.md +7 -0
- package/dist/templates/workspace-root/AGENTS.md +7 -0
- package/dist/templates/workspace-root/README.md +25 -0
- package/dist/triggers/dispatcher.d.ts +3 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +9 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/workspace-connections/index.d.ts +2 -0
- package/dist/workspace-connections/index.d.ts.map +1 -0
- package/dist/workspace-connections/index.js +2 -0
- package/dist/workspace-connections/index.js.map +1 -0
- package/dist/workspace-connections/store.d.ts +229 -0
- package/dist/workspace-connections/store.d.ts.map +1 -0
- package/dist/workspace-connections/store.js +938 -0
- package/dist/workspace-connections/store.js.map +1 -0
- package/docs/content/agent-teams.md +6 -0
- package/docs/content/cloneable-saas.md +1 -0
- package/docs/content/code-agents-ui.md +261 -0
- package/docs/content/dispatch.md +40 -3
- package/docs/content/embedding-sdk.md +459 -0
- package/docs/content/faq.md +1 -0
- package/docs/content/getting-started.md +1 -0
- package/docs/content/mcp-clients.md +41 -3
- package/docs/content/migration-workbench.md +237 -54
- package/docs/content/multi-app-workspace.md +41 -0
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/template-brain.md +418 -0
- package/docs/content/template-dispatch.md +30 -0
- package/docs/content/workspace-connections.md +509 -0
- package/docs/content/workspace-management.md +12 -12
- package/docs/content/workspace.md +180 -40
- package/package.json +7 -2
- package/src/templates/default/AGENTS.md +3 -3
- package/src/templates/workspace-core/AGENTS.md +7 -0
- package/src/templates/workspace-root/AGENTS.md +7 -0
- package/src/templates/workspace-root/README.md +25 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineEventHandler,\n getQuery,\n getRouterParam,\n setResponseHeader,\n setResponseStatus,\n getMethod,\n readMultipartFormData,\n} from \"h3\";\nimport {\n resourceGet,\n resourceGetByPath,\n resourcePut,\n resourceDelete,\n resourceDeleteByPath,\n resourceList,\n resourceListAccessible,\n resourceMove,\n ensurePersonalDefaults,\n SHARED_OWNER,\n type Resource,\n type ResourceMeta,\n} from \"./store.js\";\nimport {\n getResourceKind,\n isRemoteAgentPath,\n parseCustomAgentProfile,\n parseRemoteAgentManifest,\n parseSkillMetadata,\n type CustomAgentProfile,\n type RemoteAgentManifest,\n type SkillMetadata,\n} from \"./metadata.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport { uploadFile } from \"../file-upload/index.js\";\nimport { runWithRequestContext } from \"../server/request-context.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { createError } from \"h3\";\n\n// ---------------------------------------------------------------------------\n// Owner resolution\n// ---------------------------------------------------------------------------\n\nasync function resolveOwner(event: any, shared?: boolean): Promise<string> {\n if (shared) return SHARED_OWNER;\n const session = await getSession(event);\n if (!session?.email) {\n const { createError } = await import(\"h3\");\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n return session.email;\n}\n\nasync function resolveEmail(event: any): Promise<string> {\n const session = await getSession(event);\n if (!session?.email) {\n const { createError } = await import(\"h3\");\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n return session.email;\n}\n\n/**\n * Reject writes to organization-wide resources unless the user is the\n * organization owner/admin (or the deployment is solo — no org membership).\n * Read access remains open to every org member.\n */\nasync function assertCanEditShared(event: any): Promise<void> {\n const session = await getSession(event);\n if (!session?.email) {\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n const ctx = await getOrgContext(event);\n if (!ctx.orgId) return; // solo / dev mode — no org, treat as owner\n if (ctx.role === \"owner\" || ctx.role === \"admin\") return;\n throw createError({\n statusCode: 403,\n message: \"Only organization admins can edit organization files\",\n });\n}\n\nfunction shouldIncludeAgentScratch(query: Record<string, unknown>): boolean {\n return (\n query.includeAgentScratch === \"true\" ||\n query.includeScratch === \"true\" ||\n query.includeAgentScratch === true ||\n query.includeScratch === true\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\ninterface JobMetadata {\n schedule?: string;\n scheduleDescription?: string;\n enabled?: boolean;\n lastStatus?: string;\n lastRun?: string;\n nextRun?: string;\n}\n\ninterface TreeNode {\n name: string;\n path: string;\n type: \"file\" | \"folder\";\n kind?: \"file\" | \"skill\" | \"job\" | \"agent\" | \"remote-agent\";\n children?: TreeNode[];\n resource?: ResourceMeta;\n jobMeta?: JobMetadata;\n skillMeta?: SkillMetadata;\n agentMeta?: CustomAgentProfile;\n remoteAgentMeta?: RemoteAgentManifest;\n}\n\nfunction buildTree(resources: ResourceMeta[]): TreeNode[] {\n const root: TreeNode[] = [];\n\n for (const res of resources) {\n const parts = res.path.split(\"/\").filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n const currentPath = \"/\" + parts.slice(0, i + 1).join(\"/\");\n\n if (isLast) {\n current.push({\n name: part,\n path: currentPath,\n type: \"file\",\n kind: getResourceKind(res.path),\n resource: res,\n });\n } else {\n let folder = current.find(\n (n) => n.name === part && n.type === \"folder\",\n );\n if (!folder) {\n folder = {\n name: part,\n path: currentPath,\n type: \"folder\",\n children: [],\n };\n current.push(folder);\n }\n current = folder.children!;\n }\n }\n }\n\n sortTree(root);\n return root;\n}\n\n/** Sort tree nodes: folders first, then files, alphabetically within each group */\nfunction sortTree(nodes: TreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.type !== b.type) return a.type === \"folder\" ? -1 : 1;\n return a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n });\n for (const node of nodes) {\n if (node.children) sortTree(node.children);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\n/** GET /_agent-native/resources — list resources */\nexport async function handleListResources(event: any) {\n const query = getQuery(event);\n const prefix = (query.prefix as string) || undefined;\n const scope = (query.scope as string) || \"all\";\n const email = await resolveEmail(event);\n const listOptions = shouldIncludeAgentScratch(query)\n ? { includeAgentScratch: true }\n : undefined;\n\n // Seed personal AGENTS.md + LEARNINGS.md on first access\n await ensurePersonalDefaults(email);\n\n let resources: ResourceMeta[];\n\n if (scope === \"personal\") {\n resources = listOptions\n ? await resourceList(email, prefix, listOptions)\n : await resourceList(email, prefix);\n } else if (scope === \"shared\") {\n resources = listOptions\n ? await resourceList(SHARED_OWNER, prefix, listOptions)\n : await resourceList(SHARED_OWNER, prefix);\n } else {\n // \"all\" — personal + shared\n resources = listOptions\n ? await resourceListAccessible(email, prefix, listOptions)\n : await resourceListAccessible(email, prefix);\n }\n\n return { resources };\n}\n\n/** GET /_agent-native/resources/tree — build nested tree */\nexport async function handleGetResourceTree(event: any) {\n const query = getQuery(event);\n const scope = (query.scope as string) || \"all\";\n const email = await resolveEmail(event);\n const listOptions = shouldIncludeAgentScratch(query)\n ? { includeAgentScratch: true }\n : undefined;\n\n // Seed personal AGENTS.md + LEARNINGS.md on first access\n await ensurePersonalDefaults(email);\n\n let resources: ResourceMeta[];\n\n if (scope === \"personal\") {\n resources = listOptions\n ? await resourceList(email, undefined, listOptions)\n : await resourceList(email);\n } else if (scope === \"shared\") {\n resources = listOptions\n ? await resourceList(SHARED_OWNER, undefined, listOptions)\n : await resourceList(SHARED_OWNER);\n } else {\n resources = listOptions\n ? await resourceListAccessible(email, undefined, listOptions)\n : await resourceListAccessible(email);\n }\n\n const tree = buildTree(resources);\n\n // Enrich typed resources with parsed metadata for richer UI\n await enrichTreeNodes(tree);\n\n return { tree };\n}\n\n/**\n * Walk the tree and add typed metadata for jobs, skills, and agents.\n */\nasync function enrichTreeNodes(nodes: TreeNode[]): Promise<void> {\n let parseFn: typeof import(\"../jobs/scheduler.js\").parseJobFrontmatter;\n let describeFn: typeof import(\"../jobs/cron.js\").describeCron;\n try {\n const scheduler = await import(\"../jobs/scheduler.js\");\n const cron = await import(\"../jobs/cron.js\");\n parseFn = scheduler.parseJobFrontmatter;\n describeFn = cron.describeCron;\n } catch {\n return; // Jobs module not available\n }\n\n for (const node of nodes) {\n if (node.type === \"folder\" && node.children) {\n await enrichTreeNodes(node.children);\n }\n if (node.type === \"file\" && node.resource) {\n try {\n const full = await resourceGet(node.resource.id);\n if (!full?.content) continue;\n\n if (\n node.resource.path.startsWith(\"jobs/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n const { meta } = parseFn(full.content);\n node.jobMeta = {\n schedule: meta.schedule,\n scheduleDescription: meta.schedule\n ? describeFn(meta.schedule)\n : undefined,\n enabled: meta.enabled,\n lastStatus: meta.lastStatus,\n lastRun: meta.lastRun,\n nextRun: meta.nextRun,\n };\n }\n\n if (\n node.resource.path.startsWith(\"skills/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n node.skillMeta =\n parseSkillMetadata(full.content, node.resource.path) ?? undefined;\n }\n\n if (\n node.resource.path.startsWith(\"agents/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n node.agentMeta =\n parseCustomAgentProfile(full.content, node.resource.path) ??\n undefined;\n }\n\n if (isRemoteAgentPath(node.resource.path)) {\n node.remoteAgentMeta =\n parseRemoteAgentManifest(full.content, node.resource.path) ??\n undefined;\n }\n } catch {\n // Skip individual file errors\n }\n }\n }\n}\n\n/** GET /_agent-native/resources/:id — get single resource with content.\n * If the request comes from an <img>/<video>/etc tag (Accept includes the\n * resource's mime type, or query param `?raw` is set), return the raw binary\n * with the correct Content-Type so the browser can render it inline. */\nexport async function handleGetResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const resource = await resourceGet(id);\n if (!resource) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n const email = await resolveEmail(event);\n if (resource.owner !== SHARED_OWNER && resource.owner !== email) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Serve raw binary when ?raw query param is set (used by <img> tags etc.)\n const query = getQuery(event);\n const wantsRaw = query.raw !== undefined;\n\n if (wantsRaw && resource.content) {\n const isText =\n resource.mimeType.startsWith(\"text/\") ||\n resource.mimeType === \"application/json\";\n const buf = isText\n ? Buffer.from(resource.content, \"utf-8\")\n : Buffer.from(resource.content, \"base64\");\n\n setResponseHeader(event, \"Content-Type\", resource.mimeType);\n setResponseHeader(event, \"Content-Length\", String(buf.length));\n return new Response(buf);\n }\n\n // For binary resources (images, audio, video), omit the content field from\n // the JSON response — it can be megabytes of base64. The client fetches\n // the actual bytes via ?raw when it needs to display them.\n const isBinary =\n resource.mimeType.startsWith(\"image/\") ||\n resource.mimeType.startsWith(\"audio/\") ||\n resource.mimeType.startsWith(\"video/\") ||\n resource.mimeType === \"application/octet-stream\";\n\n if (isBinary) {\n const { content: _content, ...meta } = resource;\n return { ...meta, content: \"\" };\n }\n\n return resource;\n}\n\n/** POST /_agent-native/resources — create a resource */\nexport async function handleCreateResource(event: any) {\n const body = await readBody(event);\n\n if (!body?.path || typeof body.path !== \"string\") {\n setResponseStatus(event, 400);\n return { error: \"path is required\" };\n }\n\n if (body.shared) {\n await assertCanEditShared(event);\n }\n\n const owner = await resolveOwner(event, body.shared);\n\n // If ifNotExists is set, skip if the resource already exists\n if (body.ifNotExists) {\n const existing = await resourceGetByPath(owner, body.path);\n if (existing) {\n return existing;\n }\n }\n\n const resource = await resourcePut(\n owner,\n body.path,\n body.content ?? \"\",\n body.mimeType,\n );\n\n setResponseStatus(event, 201);\n return resource;\n}\n\n/** PUT /_agent-native/resources/:id — update an existing resource */\nexport async function handleUpdateResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const existing = await resourceGet(id);\n if (!existing) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Ownership check: only the owner (or shared resource editors) can update\n const email = await resolveEmail(event);\n if (existing.owner !== SHARED_OWNER && existing.owner !== email) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n if (existing.owner === SHARED_OWNER) {\n await assertCanEditShared(event);\n }\n\n const body = await readBody(event);\n\n // If path changed, move it\n if (body.path && body.path !== existing.path) {\n await resourceMove(id, body.path);\n }\n\n // Update content/mimeType by re-putting\n const resource = await resourcePut(\n existing.owner,\n body.path ?? existing.path,\n body.content ?? existing.content,\n body.mimeType ?? existing.mimeType,\n );\n\n return resource;\n}\n\n/** DELETE /_agent-native/resources/:id — delete a resource */\nexport async function handleDeleteResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const existing = await resourceGet(id);\n if (!existing) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Ownership check: only the owner (or shared resource editors) can delete\n const email = await resolveEmail(event);\n if (existing.owner !== SHARED_OWNER && existing.owner !== email) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n if (existing.owner === SHARED_OWNER) {\n await assertCanEditShared(event);\n }\n\n await resourceDelete(id);\n return { ok: true };\n}\n\n/** POST /_agent-native/resources/upload — upload a file as a resource */\nexport async function handleUploadResource(event: any) {\n const parts = await readMultipartFormData(event);\n\n if (!parts || parts.length === 0) {\n setResponseStatus(event, 400);\n return { error: \"No file uploaded\" };\n }\n\n const filePart = parts.find((p) => p.name === \"file\");\n const pathPart = parts.find((p) => p.name === \"path\");\n const sharedPart = parts.find((p) => p.name === \"shared\");\n\n if (!filePart || !filePart.data) {\n setResponseStatus(event, 400);\n return { error: \"No file data found\" };\n }\n\n const fileName = filePart.filename || \"upload\";\n const path = pathPart?.data?.toString() || `/${fileName}`;\n const shared = sharedPart?.data?.toString() === \"true\";\n const mimeType = filePart.type || \"application/octet-stream\";\n if (shared) {\n await assertCanEditShared(event);\n }\n const owner = await resolveOwner(event, shared);\n\n // Prefer a registered file upload provider (e.g. Builder.io) for binary\n // assets so we get a real CDN URL instead of a base64 blob in SQL.\n // Text resources still live in SQL — they're edited inline and benefit\n // from the resource store's metadata/search features.\n const isText =\n mimeType.startsWith(\"text/\") || mimeType === \"application/json\";\n\n if (!isText) {\n // Use the actual session user email for credential resolution — not `owner`,\n // which is \"__shared__\" for org-wide resources and would break the per-user\n // DB credential lookup (resolveBuilderCredential refuses env fallback for any\n // non-null non-local email, including the sentinel value).\n const credentialEmail =\n owner !== SHARED_OWNER\n ? owner\n : (await getSession(event).catch(() => null))?.email;\n const doUpload = () =>\n uploadFile({\n data: filePart.data,\n filename: fileName,\n mimeType,\n ownerEmail: owner,\n });\n const uploaded = credentialEmail\n ? await runWithRequestContext({ userEmail: credentialEmail }, doUpload)\n : await doUpload();\n if (uploaded) {\n const resource = await resourcePut(owner, path, uploaded.url, mimeType);\n setResponseStatus(event, 201);\n return { ...resource, url: uploaded.url, provider: uploaded.provider };\n }\n }\n\n // Fallback: store contents in SQL (base64 for binary, text as-is).\n const content = isText\n ? Buffer.from(filePart.data).toString(\"utf-8\")\n : Buffer.from(filePart.data).toString(\"base64\");\n\n const resource = await resourcePut(owner, path, content, mimeType);\n\n setResponseStatus(event, 201);\n return resource;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EAEjB,qBAAqB,GACtB,MAAM,IAAI,CAAC;AACZ,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,cAAc,EAEd,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,eAAe,GAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,GAInB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAEjC,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CAAC,KAAU,EAAE,MAAgB;IACtD,IAAI,MAAM;QAAE,OAAO,YAAY,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,eAAe,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAU;IACpC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAAC,KAAU;IAC3C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,2CAA2C;IACnE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO;IACzD,MAAM,WAAW,CAAC;QAChB,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,sDAAsD;KAChE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA8B;IAC/D,OAAO,CACL,KAAK,CAAC,mBAAmB,KAAK,MAAM;QACpC,KAAK,CAAC,cAAc,KAAK,MAAM;QAC/B,KAAK,CAAC,mBAAmB,KAAK,IAAI;QAClC,KAAK,CAAC,cAAc,KAAK,IAAI,CAC9B,CAAC;AACJ,CAAC;AA4BD,SAAS,SAAS,CAAC,SAAyB;IAC1C,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE1D,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC/B,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC9C,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,GAAG;wBACP,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,EAAE;qBACb,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO,GAAG,MAAM,CAAC,QAAS,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mFAAmF;AACnF,SAAS,QAAQ,CAAC,KAAiB;IACjC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAU;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,SAAS,CAAC;IACrD,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,KAAK,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,yBAAyB,CAAC,KAAK,CAAC;QAClD,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAC/B,CAAC,CAAC,SAAS,CAAC;IAEd,yDAAyD;IACzD,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,SAAyB,CAAC;IAE9B,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC;YAChD,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC;YAC1D,CAAC,CAAC,MAAM,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC;YACvD,CAAC,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC;YAC1D,CAAC,CAAC,MAAM,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAU;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,KAAK,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,yBAAyB,CAAC,KAAK,CAAC;QAClD,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAC/B,CAAC,CAAC,SAAS,CAAC;IAEd,yDAAyD;IACzD,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,SAAyB,CAAC;IAE9B,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC;YACnD,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC;YAC7D,CAAC,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC;YAC1D,CAAC,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,WAAW;YACrB,CAAC,CAAC,MAAM,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC;YAC7D,CAAC,CAAC,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAElC,4DAA4D;IAC5D,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAE5B,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,KAAU;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,KAAiB;IAC9C,IAAI,OAAkE,CAAC;IACvE,IAAI,UAAyD,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC7C,OAAO,GAAG,SAAS,CAAC,mBAAmB,CAAC;QACxC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,4BAA4B;IACtC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI,EAAE,OAAO;oBAAE,SAAS;gBAE7B,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAClC,CAAC;oBACD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvC,IAAI,CAAC,OAAO,GAAG;wBACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,mBAAmB,EAAE,IAAI,CAAC,QAAQ;4BAChC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;4BAC3B,CAAC,CAAC,SAAS;wBACb,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB,CAAC;gBACJ,CAAC;gBAED,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAClC,CAAC;oBACD,IAAI,CAAC,SAAS;wBACZ,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;gBACtE,CAAC;gBAED,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAClC,CAAC;oBACD,IAAI,CAAC,SAAS;wBACZ,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACzD,SAAS,CAAC;gBACd,CAAC;gBAED,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC,eAAe;wBAClB,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAC1D,SAAS,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;yEAGyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAU;IAChD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IACnE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,0EAA0E;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;IAEzC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,MAAM,GACV,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,QAAQ,KAAK,kBAAkB,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5C,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5D,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,2DAA2D;IAC3D,MAAM,QAAQ,GACZ,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC,QAAQ,CAAC,QAAQ,KAAK,0BAA0B,CAAC;IAEnD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QAChD,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU;IACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjD,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAErD,6DAA6D;IAC7D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,MAAM,WAAW,CACf,KAAK,EACL,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,IAAI,EAAE,EAClB,IAAI,CAAC,QAAQ,EACb,YAAY,CACb;QACH,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3E,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU;IACnD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IACnE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,0EAA0E;IAC1E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACvC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,wCAAwC;IACxC,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,MAAM,WAAW,CACf,QAAQ,CAAC,KAAK,EACd,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAC1B,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,EAChC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAClC,YAAY,CACb;QACH,CAAC,CAAC,MAAM,WAAW,CACf,QAAQ,CAAC,KAAK,EACd,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAC1B,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,EAChC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CACnC,CAAC;IAEN,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU;IACnD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IACnE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,0EAA0E;IAC1E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACvC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU;IACnD,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAE1D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC/C,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,MAAM,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,0BAA0B,CAAC;IAC7D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhD,wEAAwE;IACxE,mEAAmE;IACnE,uEAAuE;IACvE,sDAAsD;IACtD,MAAM,MAAM,GACV,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,kBAAkB,CAAC;IAElE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,6EAA6E;QAC7E,4EAA4E;QAC5E,8EAA8E;QAC9E,2DAA2D;QAC3D,MAAM,eAAe,GACnB,KAAK,KAAK,YAAY;YACpB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,UAAU,CAAC;YACT,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ;YAClB,QAAQ;YACR,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACL,MAAM,QAAQ,GAAG,eAAe;YAC9B,CAAC,CAAC,MAAM,qBAAqB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC;YACvE,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACxE,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEnE,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import {\n defineEventHandler,\n getQuery,\n getRouterParam,\n setResponseHeader,\n setResponseStatus,\n getMethod,\n readMultipartFormData,\n} from \"h3\";\nimport {\n resourceGet,\n resourceGetByPath,\n resourcePut,\n resourceDelete,\n resourceDeleteByPath,\n resourceList,\n resourceListAccessible,\n resourceMove,\n resourceEffectiveContext,\n ensurePersonalDefaults,\n SHARED_OWNER,\n WORKSPACE_OWNER,\n type Resource,\n type ResourceMeta,\n} from \"./store.js\";\nimport {\n getResourceKind,\n isRemoteAgentPath,\n parseCustomAgentProfile,\n parseRemoteAgentManifest,\n parseSkillMetadata,\n type CustomAgentProfile,\n type RemoteAgentManifest,\n type SkillMetadata,\n} from \"./metadata.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport { uploadFile } from \"../file-upload/index.js\";\nimport { runWithRequestContext } from \"../server/request-context.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { createError } from \"h3\";\n\n// ---------------------------------------------------------------------------\n// Owner resolution\n// ---------------------------------------------------------------------------\n\nasync function resolveOwner(event: any, shared?: boolean): Promise<string> {\n if (shared) return SHARED_OWNER;\n const session = await getSession(event);\n if (!session?.email) {\n const { createError } = await import(\"h3\");\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n return session.email;\n}\n\nfunction canReadOwner(owner: string, email: string): boolean {\n return owner === email || owner === SHARED_OWNER || owner === WORKSPACE_OWNER;\n}\n\nasync function resolveEmail(event: any): Promise<string> {\n const session = await getSession(event);\n if (!session?.email) {\n const { createError } = await import(\"h3\");\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n return session.email;\n}\n\n/**\n * Reject writes to organization-wide resources unless the user is the\n * organization owner/admin (or the deployment is solo — no org membership).\n * Read access remains open to every org member.\n */\nasync function assertCanEditShared(event: any): Promise<void> {\n const session = await getSession(event);\n if (!session?.email) {\n throw createError({ statusCode: 401, statusMessage: \"Unauthenticated\" });\n }\n const ctx = await getOrgContext(event);\n if (!ctx.orgId) return; // solo / dev mode — no org, treat as owner\n if (ctx.role === \"owner\" || ctx.role === \"admin\") return;\n throw createError({\n statusCode: 403,\n message: \"Only organization admins can edit organization files\",\n });\n}\n\nfunction shouldIncludeAgentScratch(query: Record<string, unknown>): boolean {\n return (\n query.includeAgentScratch === \"true\" ||\n query.includeScratch === \"true\" ||\n query.includeAgentScratch === true ||\n query.includeScratch === true\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\ninterface JobMetadata {\n schedule?: string;\n scheduleDescription?: string;\n enabled?: boolean;\n lastStatus?: string;\n lastRun?: string;\n nextRun?: string;\n}\n\ninterface TreeNode {\n name: string;\n path: string;\n type: \"file\" | \"folder\";\n kind?: \"file\" | \"skill\" | \"job\" | \"agent\" | \"remote-agent\";\n children?: TreeNode[];\n resource?: ResourceMeta;\n jobMeta?: JobMetadata;\n skillMeta?: SkillMetadata;\n agentMeta?: CustomAgentProfile;\n remoteAgentMeta?: RemoteAgentManifest;\n}\n\nfunction buildTree(resources: ResourceMeta[]): TreeNode[] {\n const root: TreeNode[] = [];\n\n for (const res of resources) {\n const parts = res.path.split(\"/\").filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n const currentPath = \"/\" + parts.slice(0, i + 1).join(\"/\");\n\n if (isLast) {\n current.push({\n name: part,\n path: currentPath,\n type: \"file\",\n kind: getResourceKind(res.path),\n resource: res,\n });\n } else {\n let folder = current.find(\n (n) => n.name === part && n.type === \"folder\",\n );\n if (!folder) {\n folder = {\n name: part,\n path: currentPath,\n type: \"folder\",\n children: [],\n };\n current.push(folder);\n }\n current = folder.children!;\n }\n }\n }\n\n sortTree(root);\n return root;\n}\n\n/** Sort tree nodes: folders first, then files, alphabetically within each group */\nfunction sortTree(nodes: TreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.type !== b.type) return a.type === \"folder\" ? -1 : 1;\n return a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n });\n for (const node of nodes) {\n if (node.children) sortTree(node.children);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\n/** GET /_agent-native/resources — list resources */\nexport async function handleListResources(event: any) {\n const query = getQuery(event);\n const prefix = (query.prefix as string) || undefined;\n const scope = (query.scope as string) || \"all\";\n const email = await resolveEmail(event);\n const listOptions = shouldIncludeAgentScratch(query)\n ? { includeAgentScratch: true }\n : undefined;\n\n // Seed personal AGENTS.md + LEARNINGS.md on first access\n await ensurePersonalDefaults(email);\n\n let resources: ResourceMeta[];\n\n if (scope === \"personal\") {\n resources = listOptions\n ? await resourceList(email, prefix, listOptions)\n : await resourceList(email, prefix);\n } else if (scope === \"workspace\") {\n resources = listOptions\n ? await resourceList(WORKSPACE_OWNER, prefix, listOptions)\n : await resourceList(WORKSPACE_OWNER, prefix);\n } else if (scope === \"shared\") {\n resources = listOptions\n ? await resourceList(SHARED_OWNER, prefix, listOptions)\n : await resourceList(SHARED_OWNER, prefix);\n } else {\n // \"all\" — personal + organization/shared + inherited workspace\n resources = listOptions\n ? await resourceListAccessible(email, prefix, listOptions)\n : await resourceListAccessible(email, prefix);\n }\n\n return { resources };\n}\n\n/** GET /_agent-native/resources/tree — build nested tree */\nexport async function handleGetResourceTree(event: any) {\n const query = getQuery(event);\n const scope = (query.scope as string) || \"all\";\n const email = await resolveEmail(event);\n const listOptions = shouldIncludeAgentScratch(query)\n ? { includeAgentScratch: true }\n : undefined;\n\n // Seed personal AGENTS.md + LEARNINGS.md on first access\n await ensurePersonalDefaults(email);\n\n let resources: ResourceMeta[];\n\n if (scope === \"personal\") {\n resources = listOptions\n ? await resourceList(email, undefined, listOptions)\n : await resourceList(email);\n } else if (scope === \"workspace\") {\n resources = listOptions\n ? await resourceList(WORKSPACE_OWNER, undefined, listOptions)\n : await resourceList(WORKSPACE_OWNER);\n } else if (scope === \"shared\") {\n resources = listOptions\n ? await resourceList(SHARED_OWNER, undefined, listOptions)\n : await resourceList(SHARED_OWNER);\n } else {\n resources = listOptions\n ? await resourceListAccessible(email, undefined, listOptions)\n : await resourceListAccessible(email);\n }\n\n const tree = buildTree(resources);\n\n // Enrich typed resources with parsed metadata for richer UI\n await enrichTreeNodes(tree);\n\n return { tree };\n}\n\n/** GET /_agent-native/resources/effective?path=... — show inheritance stack */\nexport async function handleGetEffectiveResourceContext(event: any) {\n const query = getQuery(event);\n const path = query.path;\n if (typeof path !== \"string\" || path.trim().length === 0) {\n setResponseStatus(event, 400);\n return { error: \"path is required\" };\n }\n\n const email = await resolveEmail(event);\n await ensurePersonalDefaults(email);\n return resourceEffectiveContext(email, path);\n}\n\n/**\n * Walk the tree and add typed metadata for jobs, skills, and agents.\n */\nasync function enrichTreeNodes(nodes: TreeNode[]): Promise<void> {\n let parseFn: typeof import(\"../jobs/scheduler.js\").parseJobFrontmatter;\n let describeFn: typeof import(\"../jobs/cron.js\").describeCron;\n try {\n const scheduler = await import(\"../jobs/scheduler.js\");\n const cron = await import(\"../jobs/cron.js\");\n parseFn = scheduler.parseJobFrontmatter;\n describeFn = cron.describeCron;\n } catch {\n return; // Jobs module not available\n }\n\n for (const node of nodes) {\n if (node.type === \"folder\" && node.children) {\n await enrichTreeNodes(node.children);\n }\n if (node.type === \"file\" && node.resource) {\n try {\n const full = await resourceGet(node.resource.id);\n if (!full?.content) continue;\n\n if (\n node.resource.path.startsWith(\"jobs/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n const { meta } = parseFn(full.content);\n node.jobMeta = {\n schedule: meta.schedule,\n scheduleDescription: meta.schedule\n ? describeFn(meta.schedule)\n : undefined,\n enabled: meta.enabled,\n lastStatus: meta.lastStatus,\n lastRun: meta.lastRun,\n nextRun: meta.nextRun,\n };\n }\n\n if (\n node.resource.path.startsWith(\"skills/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n node.skillMeta =\n parseSkillMetadata(full.content, node.resource.path) ?? undefined;\n }\n\n if (\n node.resource.path.startsWith(\"agents/\") &&\n node.resource.path.endsWith(\".md\")\n ) {\n node.agentMeta =\n parseCustomAgentProfile(full.content, node.resource.path) ??\n undefined;\n }\n\n if (isRemoteAgentPath(node.resource.path)) {\n node.remoteAgentMeta =\n parseRemoteAgentManifest(full.content, node.resource.path) ??\n undefined;\n }\n } catch {\n // Skip individual file errors\n }\n }\n }\n}\n\n/** GET /_agent-native/resources/:id — get single resource with content.\n * If the request comes from an <img>/<video>/etc tag (Accept includes the\n * resource's mime type, or query param `?raw` is set), return the raw binary\n * with the correct Content-Type so the browser can render it inline. */\nexport async function handleGetResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const resource = await resourceGet(id);\n if (!resource) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n const email = await resolveEmail(event);\n if (!canReadOwner(resource.owner, email)) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Serve raw binary when ?raw query param is set (used by <img> tags etc.)\n const query = getQuery(event);\n const wantsRaw = query.raw !== undefined;\n\n if (wantsRaw && resource.content) {\n const isText =\n resource.mimeType.startsWith(\"text/\") ||\n resource.mimeType === \"application/json\";\n const buf = isText\n ? Buffer.from(resource.content, \"utf-8\")\n : Buffer.from(resource.content, \"base64\");\n\n setResponseHeader(event, \"Content-Type\", resource.mimeType);\n setResponseHeader(event, \"Content-Length\", String(buf.length));\n return new Response(buf);\n }\n\n // For binary resources (images, audio, video), omit the content field from\n // the JSON response — it can be megabytes of base64. The client fetches\n // the actual bytes via ?raw when it needs to display them.\n const isBinary =\n resource.mimeType.startsWith(\"image/\") ||\n resource.mimeType.startsWith(\"audio/\") ||\n resource.mimeType.startsWith(\"video/\") ||\n resource.mimeType === \"application/octet-stream\";\n\n if (isBinary) {\n const { content: _content, ...meta } = resource;\n return { ...meta, content: \"\" };\n }\n\n return resource;\n}\n\n/** POST /_agent-native/resources — create a resource */\nexport async function handleCreateResource(event: any) {\n const body = await readBody(event);\n\n if (!body?.path || typeof body.path !== \"string\") {\n setResponseStatus(event, 400);\n return { error: \"path is required\" };\n }\n\n if (body.shared) {\n await assertCanEditShared(event);\n }\n\n const owner = await resolveOwner(event, body.shared);\n\n // If ifNotExists is set, skip if the resource already exists\n if (body.ifNotExists) {\n const existing = await resourceGetByPath(owner, body.path);\n if (existing) {\n return existing;\n }\n }\n\n const writeOptions =\n body.metadata !== undefined ? { metadata: body.metadata } : undefined;\n const resource = writeOptions\n ? await resourcePut(\n owner,\n body.path,\n body.content ?? \"\",\n body.mimeType,\n writeOptions,\n )\n : await resourcePut(owner, body.path, body.content ?? \"\", body.mimeType);\n\n setResponseStatus(event, 201);\n return resource;\n}\n\n/** PUT /_agent-native/resources/:id — update an existing resource */\nexport async function handleUpdateResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const existing = await resourceGet(id);\n if (!existing) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Ownership check: only the owner (or shared resource editors) can update\n const email = await resolveEmail(event);\n if (!canReadOwner(existing.owner, email)) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n if (existing.owner === WORKSPACE_OWNER) {\n setResponseStatus(event, 403);\n return { error: \"Workspace resources are managed from Dispatch\" };\n }\n if (existing.owner === SHARED_OWNER) {\n await assertCanEditShared(event);\n }\n\n const body = await readBody(event);\n\n // If path changed, move it\n if (body.path && body.path !== existing.path) {\n await resourceMove(id, body.path);\n }\n\n // Update content/mimeType by re-putting\n const writeOptions =\n body.metadata !== undefined ? { metadata: body.metadata } : undefined;\n const resource = writeOptions\n ? await resourcePut(\n existing.owner,\n body.path ?? existing.path,\n body.content ?? existing.content,\n body.mimeType ?? existing.mimeType,\n writeOptions,\n )\n : await resourcePut(\n existing.owner,\n body.path ?? existing.path,\n body.content ?? existing.content,\n body.mimeType ?? existing.mimeType,\n );\n\n return resource;\n}\n\n/** DELETE /_agent-native/resources/:id — delete a resource */\nexport async function handleDeleteResource(event: any) {\n const id = getRouterParam(event, \"id\") || event.context.params?.id;\n if (!id) {\n setResponseStatus(event, 400);\n return { error: \"Resource ID is required\" };\n }\n\n const existing = await resourceGet(id);\n if (!existing) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n\n // Ownership check: only the owner (or shared resource editors) can delete\n const email = await resolveEmail(event);\n if (!canReadOwner(existing.owner, email)) {\n setResponseStatus(event, 404);\n return { error: \"Resource not found\" };\n }\n if (existing.owner === WORKSPACE_OWNER) {\n setResponseStatus(event, 403);\n return { error: \"Workspace resources are managed from Dispatch\" };\n }\n if (existing.owner === SHARED_OWNER) {\n await assertCanEditShared(event);\n }\n\n await resourceDelete(id);\n return { ok: true };\n}\n\n/** POST /_agent-native/resources/upload — upload a file as a resource */\nexport async function handleUploadResource(event: any) {\n const parts = await readMultipartFormData(event);\n\n if (!parts || parts.length === 0) {\n setResponseStatus(event, 400);\n return { error: \"No file uploaded\" };\n }\n\n const filePart = parts.find((p) => p.name === \"file\");\n const pathPart = parts.find((p) => p.name === \"path\");\n const sharedPart = parts.find((p) => p.name === \"shared\");\n\n if (!filePart || !filePart.data) {\n setResponseStatus(event, 400);\n return { error: \"No file data found\" };\n }\n\n const fileName = filePart.filename || \"upload\";\n const path = pathPart?.data?.toString() || `/${fileName}`;\n const shared = sharedPart?.data?.toString() === \"true\";\n const mimeType = filePart.type || \"application/octet-stream\";\n if (shared) {\n await assertCanEditShared(event);\n }\n const owner = await resolveOwner(event, shared);\n\n // Prefer a registered file upload provider (e.g. Builder.io) for binary\n // assets so we get a real CDN URL instead of a base64 blob in SQL.\n // Text resources still live in SQL — they're edited inline and benefit\n // from the resource store's metadata/search features.\n const isText =\n mimeType.startsWith(\"text/\") || mimeType === \"application/json\";\n\n if (!isText) {\n // Use the actual session user email for credential resolution — not `owner`,\n // which is \"__shared__\" for org-wide resources and would break the per-user\n // DB credential lookup (resolveBuilderCredential refuses env fallback for any\n // non-null non-local email, including the sentinel value).\n const credentialEmail =\n owner !== SHARED_OWNER\n ? owner\n : (await getSession(event).catch(() => null))?.email;\n const doUpload = () =>\n uploadFile({\n data: filePart.data,\n filename: fileName,\n mimeType,\n ownerEmail: owner,\n });\n const uploaded = credentialEmail\n ? await runWithRequestContext({ userEmail: credentialEmail }, doUpload)\n : await doUpload();\n if (uploaded) {\n const resource = await resourcePut(owner, path, uploaded.url, mimeType);\n setResponseStatus(event, 201);\n return { ...resource, url: uploaded.url, provider: uploaded.provider };\n }\n }\n\n // Fallback: store contents in SQL (base64 for binary, text as-is).\n const content = isText\n ? Buffer.from(filePart.data).toString(\"utf-8\")\n : Buffer.from(filePart.data).toString(\"base64\");\n\n const resource = await resourcePut(owner, path, content, mimeType);\n\n setResponseStatus(event, 201);\n return resource;\n}\n"]}
|
|
@@ -5,12 +5,15 @@
|
|
|
5
5
|
* runtime) or — in CLI-only contexts — read AGENT_USER_EMAIL. Both paths
|
|
6
6
|
* require a real identity; there is no dev-mode fallback.
|
|
7
7
|
*/
|
|
8
|
-
import { type ResourceMeta, type ResourceVisibility, type ResourceCreatedBy } from "./store.js";
|
|
8
|
+
import { type ResourceMeta, type EffectiveResourceContext, type ResourceVisibility, type ResourceCreatedBy } from "./store.js";
|
|
9
|
+
type ResourceHelperScope = "personal" | "shared" | "workspace";
|
|
9
10
|
export declare function readResource(path: string, options?: {
|
|
10
11
|
shared?: boolean;
|
|
12
|
+
scope?: ResourceHelperScope;
|
|
11
13
|
}): Promise<string | null>;
|
|
12
14
|
export declare function writeResource(path: string, content: string, options?: {
|
|
13
15
|
shared?: boolean;
|
|
16
|
+
scope?: Exclude<ResourceHelperScope, "workspace">;
|
|
14
17
|
mimeType?: string;
|
|
15
18
|
visibility?: ResourceVisibility;
|
|
16
19
|
createdBy?: ResourceCreatedBy;
|
|
@@ -21,12 +24,16 @@ export declare function writeResource(path: string, content: string, options?: {
|
|
|
21
24
|
}): Promise<void>;
|
|
22
25
|
export declare function deleteResource(path: string, options?: {
|
|
23
26
|
shared?: boolean;
|
|
27
|
+
scope?: Exclude<ResourceHelperScope, "workspace">;
|
|
24
28
|
}): Promise<boolean>;
|
|
25
29
|
export declare function listResources(prefix?: string, options?: {
|
|
26
30
|
shared?: boolean;
|
|
31
|
+
scope?: ResourceHelperScope;
|
|
27
32
|
includeAgentScratch?: boolean;
|
|
28
33
|
}): Promise<ResourceMeta[]>;
|
|
29
34
|
export declare function listAllResources(prefix?: string, options?: {
|
|
30
35
|
includeAgentScratch?: boolean;
|
|
31
36
|
}): Promise<ResourceMeta[]>;
|
|
37
|
+
export declare function getEffectiveResourceContext(path: string): Promise<EffectiveResourceContext>;
|
|
38
|
+
export {};
|
|
32
39
|
//# sourceMappingURL=script-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-helpers.d.ts","sourceRoot":"","sources":["../../src/resources/script-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"script-helpers.d.ts","sourceRoot":"","sources":["../../src/resources/script-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAUL,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAGpB,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAqB/D,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIxB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACpD,GACA,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;CACnD,GACA,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,aAAa,CACjC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GACA,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CAInC"}
|
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
* runtime) or — in CLI-only contexts — read AGENT_USER_EMAIL. Both paths
|
|
6
6
|
* require a real identity; there is no dev-mode fallback.
|
|
7
7
|
*/
|
|
8
|
-
import { SHARED_OWNER, resourceGetByPath, resourcePut, resourceDeleteByPath, resourceList, resourceListAccessible, } from "./store.js";
|
|
8
|
+
import { SHARED_OWNER, WORKSPACE_OWNER, resourceGetByPath, resourcePut, resourceDeleteByPath, resourceList, resourceListAccessible, resourceEffectiveContext, ensurePersonalDefaults, } from "./store.js";
|
|
9
9
|
import { getRequestUserEmail } from "../server/request-context.js";
|
|
10
|
-
function
|
|
11
|
-
if (shared)
|
|
10
|
+
function getOwnerForScope(scope) {
|
|
11
|
+
if (scope === "shared")
|
|
12
12
|
return SHARED_OWNER;
|
|
13
|
+
if (scope === "workspace")
|
|
14
|
+
return WORKSPACE_OWNER;
|
|
13
15
|
const userEmail = getRequestUserEmail();
|
|
14
16
|
if (userEmail)
|
|
15
17
|
return userEmail;
|
|
@@ -18,13 +20,16 @@ function getOwner(shared) {
|
|
|
18
20
|
return cliEmail;
|
|
19
21
|
throw new Error("Resource access requires an authenticated request context or AGENT_USER_EMAIL env var");
|
|
20
22
|
}
|
|
23
|
+
function resolveScope(options) {
|
|
24
|
+
return options?.scope ?? (options?.shared ? "shared" : "personal");
|
|
25
|
+
}
|
|
21
26
|
export async function readResource(path, options) {
|
|
22
|
-
const owner =
|
|
27
|
+
const owner = getOwnerForScope(resolveScope(options));
|
|
23
28
|
const resource = await resourceGetByPath(owner, path);
|
|
24
29
|
return resource ? resource.content : null;
|
|
25
30
|
}
|
|
26
31
|
export async function writeResource(path, content, options) {
|
|
27
|
-
const owner =
|
|
32
|
+
const owner = getOwnerForScope(resolveScope(options));
|
|
28
33
|
const writeOptions = {
|
|
29
34
|
visibility: options?.visibility,
|
|
30
35
|
createdBy: options?.createdBy,
|
|
@@ -41,19 +46,24 @@ export async function writeResource(path, content, options) {
|
|
|
41
46
|
await resourcePut(owner, path, content, options?.mimeType);
|
|
42
47
|
}
|
|
43
48
|
export async function deleteResource(path, options) {
|
|
44
|
-
const owner =
|
|
49
|
+
const owner = getOwnerForScope(resolveScope(options));
|
|
45
50
|
return resourceDeleteByPath(owner, path);
|
|
46
51
|
}
|
|
47
52
|
export async function listResources(prefix, options) {
|
|
48
|
-
const owner =
|
|
53
|
+
const owner = getOwnerForScope(resolveScope(options));
|
|
49
54
|
return options?.includeAgentScratch
|
|
50
55
|
? resourceList(owner, prefix, { includeAgentScratch: true })
|
|
51
56
|
: resourceList(owner, prefix);
|
|
52
57
|
}
|
|
53
58
|
export async function listAllResources(prefix, options) {
|
|
54
|
-
const userEmail =
|
|
59
|
+
const userEmail = getOwnerForScope("personal");
|
|
55
60
|
return options?.includeAgentScratch
|
|
56
61
|
? resourceListAccessible(userEmail, prefix, { includeAgentScratch: true })
|
|
57
62
|
: resourceListAccessible(userEmail, prefix);
|
|
58
63
|
}
|
|
64
|
+
export async function getEffectiveResourceContext(path) {
|
|
65
|
+
const userEmail = getOwnerForScope("personal");
|
|
66
|
+
await ensurePersonalDefaults(userEmail);
|
|
67
|
+
return resourceEffectiveContext(userEmail, path);
|
|
68
|
+
}
|
|
59
69
|
//# sourceMappingURL=script-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-helpers.js","sourceRoot":"","sources":["../../src/resources/script-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,
|
|
1
|
+
{"version":3,"file":"script-helpers.js","sourceRoot":"","sources":["../../src/resources/script-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resource helpers for use in scripts.\n *\n * Scripts run inside an authenticated request context (set by the agent\n * runtime) or — in CLI-only contexts — read AGENT_USER_EMAIL. Both paths\n * require a real identity; there is no dev-mode fallback.\n */\n\nimport {\n SHARED_OWNER,\n WORKSPACE_OWNER,\n resourceGetByPath,\n resourcePut,\n resourceDeleteByPath,\n resourceList,\n resourceListAccessible,\n resourceEffectiveContext,\n ensurePersonalDefaults,\n type ResourceMeta,\n type EffectiveResourceContext,\n type ResourceVisibility,\n type ResourceCreatedBy,\n} from \"./store.js\";\nimport { getRequestUserEmail } from \"../server/request-context.js\";\n\ntype ResourceHelperScope = \"personal\" | \"shared\" | \"workspace\";\n\nfunction getOwnerForScope(scope?: ResourceHelperScope): string {\n if (scope === \"shared\") return SHARED_OWNER;\n if (scope === \"workspace\") return WORKSPACE_OWNER;\n const userEmail = getRequestUserEmail();\n if (userEmail) return userEmail;\n const cliEmail = process.env.AGENT_USER_EMAIL;\n if (cliEmail) return cliEmail;\n throw new Error(\n \"Resource access requires an authenticated request context or AGENT_USER_EMAIL env var\",\n );\n}\n\nfunction resolveScope(options?: {\n shared?: boolean;\n scope?: ResourceHelperScope;\n}): ResourceHelperScope {\n return options?.scope ?? (options?.shared ? \"shared\" : \"personal\");\n}\n\nexport async function readResource(\n path: string,\n options?: { shared?: boolean; scope?: ResourceHelperScope },\n): Promise<string | null> {\n const owner = getOwnerForScope(resolveScope(options));\n const resource = await resourceGetByPath(owner, path);\n return resource ? resource.content : null;\n}\n\nexport async function writeResource(\n path: string,\n content: string,\n options?: {\n shared?: boolean;\n scope?: Exclude<ResourceHelperScope, \"workspace\">;\n mimeType?: string;\n visibility?: ResourceVisibility;\n createdBy?: ResourceCreatedBy;\n threadId?: string | null;\n runId?: string | null;\n expiresAt?: number | null;\n metadata?: string | Record<string, unknown> | null;\n },\n): Promise<void> {\n const owner = getOwnerForScope(resolveScope(options));\n const writeOptions = {\n visibility: options?.visibility,\n createdBy: options?.createdBy,\n threadId: options?.threadId,\n runId: options?.runId,\n expiresAt: options?.expiresAt,\n metadata: options?.metadata,\n };\n const hasWriteOptions = Object.values(writeOptions).some(\n (value) => value !== undefined,\n );\n if (hasWriteOptions) {\n await resourcePut(owner, path, content, options?.mimeType, writeOptions);\n return;\n }\n await resourcePut(owner, path, content, options?.mimeType);\n}\n\nexport async function deleteResource(\n path: string,\n options?: {\n shared?: boolean;\n scope?: Exclude<ResourceHelperScope, \"workspace\">;\n },\n): Promise<boolean> {\n const owner = getOwnerForScope(resolveScope(options));\n return resourceDeleteByPath(owner, path);\n}\n\nexport async function listResources(\n prefix?: string,\n options?: {\n shared?: boolean;\n scope?: ResourceHelperScope;\n includeAgentScratch?: boolean;\n },\n): Promise<ResourceMeta[]> {\n const owner = getOwnerForScope(resolveScope(options));\n return options?.includeAgentScratch\n ? resourceList(owner, prefix, { includeAgentScratch: true })\n : resourceList(owner, prefix);\n}\n\nexport async function listAllResources(\n prefix?: string,\n options?: { includeAgentScratch?: boolean },\n): Promise<ResourceMeta[]> {\n const userEmail = getOwnerForScope(\"personal\");\n return options?.includeAgentScratch\n ? resourceListAccessible(userEmail, prefix, { includeAgentScratch: true })\n : resourceListAccessible(userEmail, prefix);\n}\n\nexport async function getEffectiveResourceContext(\n path: string,\n): Promise<EffectiveResourceContext> {\n const userEmail = getOwnerForScope(\"personal\");\n await ensurePersonalDefaults(userEmail);\n return resourceEffectiveContext(userEmail, path);\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { StoreWriteOptions } from "../settings/store.js";
|
|
2
2
|
export declare const SHARED_OWNER = "__shared__";
|
|
3
|
+
export declare const WORKSPACE_OWNER = "__workspace__";
|
|
3
4
|
export interface Resource {
|
|
4
5
|
id: string;
|
|
5
6
|
path: string;
|
|
@@ -44,6 +45,23 @@ export interface ResourceWriteOptions extends StoreWriteOptions {
|
|
|
44
45
|
export interface ResourceListOptions {
|
|
45
46
|
includeAgentScratch?: boolean;
|
|
46
47
|
}
|
|
48
|
+
export type ResourceInheritanceScope = "workspace" | "shared" | "personal";
|
|
49
|
+
export interface EffectiveResourceLayer {
|
|
50
|
+
scope: ResourceInheritanceScope;
|
|
51
|
+
label: string;
|
|
52
|
+
owner: string;
|
|
53
|
+
resource: ResourceMeta | null;
|
|
54
|
+
exists: boolean;
|
|
55
|
+
effective: boolean;
|
|
56
|
+
overridden: boolean;
|
|
57
|
+
canWrite: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface EffectiveResourceContext {
|
|
60
|
+
path: string;
|
|
61
|
+
effectiveResource: ResourceMeta | null;
|
|
62
|
+
effectiveScope: ResourceInheritanceScope | null;
|
|
63
|
+
layers: EffectiveResourceLayer[];
|
|
64
|
+
}
|
|
47
65
|
/**
|
|
48
66
|
* Seed personal AGENTS.md and LEARNINGS.md for a user if they don't exist.
|
|
49
67
|
* Called when listing resources or from the agent chat plugin.
|
|
@@ -56,6 +74,7 @@ export declare function resourceDelete(id: string): Promise<boolean>;
|
|
|
56
74
|
export declare function resourceDeleteByPath(owner: string, path: string): Promise<boolean>;
|
|
57
75
|
export declare function resourceList(owner: string, pathPrefix?: string, options?: ResourceListOptions): Promise<ResourceMeta[]>;
|
|
58
76
|
export declare function resourceListAccessible(userEmail: string, pathPrefix?: string, options?: ResourceListOptions): Promise<ResourceMeta[]>;
|
|
77
|
+
export declare function resourceEffectiveContext(userEmail: string, path: string): Promise<EffectiveResourceContext>;
|
|
59
78
|
/**
|
|
60
79
|
* List all resources matching a path prefix across ALL owners.
|
|
61
80
|
* Used by the recurring jobs scheduler to find all job resources.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/resources/store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,YAAY,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/resources/store.ts"],"names":[],"mappings":"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"}
|
package/dist/resources/store.js
CHANGED
|
@@ -2,6 +2,7 @@ import { getDbExec, isPostgres, intType, retryOnDdlRace, } from "../db/client.js
|
|
|
2
2
|
import { emitResourceChange, emitResourceDelete } from "./emitter.js";
|
|
3
3
|
import crypto from "crypto";
|
|
4
4
|
export const SHARED_OWNER = "__shared__";
|
|
5
|
+
export const WORKSPACE_OWNER = "__workspace__";
|
|
5
6
|
let _initPromise;
|
|
6
7
|
let _lastScratchCleanupAt = 0;
|
|
7
8
|
const AGENT_SCRATCH_TTL_MS = 24 * 60 * 60 * 1000;
|
|
@@ -101,6 +102,10 @@ const DEFAULT_AGENTS_SHARED_MD = `# Agent Instructions
|
|
|
101
102
|
|
|
102
103
|
This file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.
|
|
103
104
|
|
|
105
|
+
Workspace-level resources managed from Dispatch are inherited before this file.
|
|
106
|
+
Use this shared app/organization file to override or narrow those defaults for
|
|
107
|
+
this app or team.
|
|
108
|
+
|
|
104
109
|
## What to put here
|
|
105
110
|
|
|
106
111
|
- **Preferences** — Tone, style, verbosity, response format
|
|
@@ -118,6 +123,14 @@ You can create skill files to give the agent specialized knowledge for specific
|
|
|
118
123
|
|
|
119
124
|
The agent will read the relevant skill file when performing that type of task.
|
|
120
125
|
|
|
126
|
+
## Global instructions
|
|
127
|
+
|
|
128
|
+
Put 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.
|
|
129
|
+
|
|
130
|
+
## Shared reference resources
|
|
131
|
+
|
|
132
|
+
Put 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.
|
|
133
|
+
|
|
121
134
|
## Workspace files
|
|
122
135
|
|
|
123
136
|
Workspace 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.
|
|
@@ -409,8 +422,11 @@ const _personalSeeded = new Set();
|
|
|
409
422
|
* Called when listing resources or from the agent chat plugin.
|
|
410
423
|
*/
|
|
411
424
|
export async function ensurePersonalDefaults(owner) {
|
|
412
|
-
if (owner === SHARED_OWNER ||
|
|
425
|
+
if (owner === SHARED_OWNER ||
|
|
426
|
+
owner === WORKSPACE_OWNER ||
|
|
427
|
+
_personalSeeded.has(owner)) {
|
|
413
428
|
return;
|
|
429
|
+
}
|
|
414
430
|
_personalSeeded.add(owner);
|
|
415
431
|
await ensureTable();
|
|
416
432
|
const client = getDbExec();
|
|
@@ -520,6 +536,10 @@ function rowToMeta(row) {
|
|
|
520
536
|
metadata: nullableString(row.metadata),
|
|
521
537
|
};
|
|
522
538
|
}
|
|
539
|
+
function resourceToMeta(resource) {
|
|
540
|
+
const { content: _content, ...meta } = resource;
|
|
541
|
+
return meta;
|
|
542
|
+
}
|
|
523
543
|
export async function resourceGet(id) {
|
|
524
544
|
await ensureTable();
|
|
525
545
|
const client = getDbExec();
|
|
@@ -689,19 +709,82 @@ export async function resourceListAccessible(userEmail, pathPrefix, options) {
|
|
|
689
709
|
const { rows } = await client.execute({
|
|
690
710
|
sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ? AND path LIKE ?${visibilitySql}
|
|
691
711
|
UNION
|
|
712
|
+
SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ? AND path LIKE ?${visibilitySql}
|
|
713
|
+
UNION
|
|
692
714
|
SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ? AND path LIKE ?${visibilitySql}`,
|
|
693
|
-
args: [
|
|
715
|
+
args: [
|
|
716
|
+
userEmail,
|
|
717
|
+
pathPrefix + "%",
|
|
718
|
+
SHARED_OWNER,
|
|
719
|
+
pathPrefix + "%",
|
|
720
|
+
WORKSPACE_OWNER,
|
|
721
|
+
pathPrefix + "%",
|
|
722
|
+
],
|
|
694
723
|
});
|
|
695
724
|
return rows.map(rowToMeta);
|
|
696
725
|
}
|
|
697
726
|
const { rows } = await client.execute({
|
|
698
727
|
sql: `SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ?${visibilitySql}
|
|
728
|
+
UNION
|
|
729
|
+
SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ?${visibilitySql}
|
|
699
730
|
UNION
|
|
700
731
|
SELECT ${RESOURCE_META_SELECT} FROM resources WHERE owner = ?${visibilitySql}`,
|
|
701
|
-
args: [userEmail, SHARED_OWNER],
|
|
732
|
+
args: [userEmail, SHARED_OWNER, WORKSPACE_OWNER],
|
|
702
733
|
});
|
|
703
734
|
return rows.map(rowToMeta);
|
|
704
735
|
}
|
|
736
|
+
export async function resourceEffectiveContext(userEmail, path) {
|
|
737
|
+
await ensureTable();
|
|
738
|
+
const workspace = await resourceGetByPath(WORKSPACE_OWNER, path);
|
|
739
|
+
const shared = await resourceGetByPath(SHARED_OWNER, path);
|
|
740
|
+
const personal = await resourceGetByPath(userEmail, path);
|
|
741
|
+
const effective = personal ?? shared ?? workspace ?? null;
|
|
742
|
+
const effectiveScope = personal
|
|
743
|
+
? "personal"
|
|
744
|
+
: shared
|
|
745
|
+
? "shared"
|
|
746
|
+
: workspace
|
|
747
|
+
? "workspace"
|
|
748
|
+
: null;
|
|
749
|
+
const layerDefs = [
|
|
750
|
+
{
|
|
751
|
+
scope: "workspace",
|
|
752
|
+
label: "Workspace default",
|
|
753
|
+
owner: WORKSPACE_OWNER,
|
|
754
|
+
resource: workspace,
|
|
755
|
+
canWrite: false,
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
scope: "shared",
|
|
759
|
+
label: "Organization/app override",
|
|
760
|
+
owner: SHARED_OWNER,
|
|
761
|
+
resource: shared,
|
|
762
|
+
canWrite: true,
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
scope: "personal",
|
|
766
|
+
label: "Personal override",
|
|
767
|
+
owner: userEmail,
|
|
768
|
+
resource: personal,
|
|
769
|
+
canWrite: true,
|
|
770
|
+
},
|
|
771
|
+
];
|
|
772
|
+
return {
|
|
773
|
+
path,
|
|
774
|
+
effectiveResource: effective ? resourceToMeta(effective) : null,
|
|
775
|
+
effectiveScope,
|
|
776
|
+
layers: layerDefs.map((layer) => ({
|
|
777
|
+
scope: layer.scope,
|
|
778
|
+
label: layer.label,
|
|
779
|
+
owner: layer.owner,
|
|
780
|
+
resource: layer.resource ? resourceToMeta(layer.resource) : null,
|
|
781
|
+
exists: !!layer.resource,
|
|
782
|
+
effective: !!layer.resource && layer.resource.id === effective?.id,
|
|
783
|
+
overridden: !!layer.resource && layer.resource.id !== effective?.id,
|
|
784
|
+
canWrite: layer.canWrite,
|
|
785
|
+
})),
|
|
786
|
+
};
|
|
787
|
+
}
|
|
705
788
|
/**
|
|
706
789
|
* List all resources matching a path prefix across ALL owners.
|
|
707
790
|
* Used by the recurring jobs scheduler to find all job resources.
|