@fideliosai/server 2026.331.0-canary.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/LICENSE +22 -0
- package/dist/adapters/codex-models.d.ts +4 -0
- package/dist/adapters/codex-models.d.ts.map +1 -0
- package/dist/adapters/codex-models.js +98 -0
- package/dist/adapters/codex-models.js.map +1 -0
- package/dist/adapters/cursor-models.d.ts +13 -0
- package/dist/adapters/cursor-models.d.ts.map +1 -0
- package/dist/adapters/cursor-models.js +148 -0
- package/dist/adapters/cursor-models.js.map +1 -0
- package/dist/adapters/http/execute.d.ts +3 -0
- package/dist/adapters/http/execute.d.ts.map +1 -0
- package/dist/adapters/http/execute.js +39 -0
- package/dist/adapters/http/execute.js.map +1 -0
- package/dist/adapters/http/index.d.ts +3 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +20 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/test.d.ts +3 -0
- package/dist/adapters/http/test.d.ts.map +1 -0
- package/dist/adapters/http/test.js +106 -0
- package/dist/adapters/http/test.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/process/execute.d.ts +3 -0
- package/dist/adapters/process/execute.d.ts.map +1 -0
- package/dist/adapters/process/execute.js +63 -0
- package/dist/adapters/process/execute.js.map +1 -0
- package/dist/adapters/process/index.d.ts +3 -0
- package/dist/adapters/process/index.d.ts.map +1 -0
- package/dist/adapters/process/index.js +23 -0
- package/dist/adapters/process/index.js.map +1 -0
- package/dist/adapters/process/test.d.ts +3 -0
- package/dist/adapters/process/test.d.ts.map +1 -0
- package/dist/adapters/process/test.js +77 -0
- package/dist/adapters/process/test.js.map +1 -0
- package/dist/adapters/registry.d.ts +14 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +164 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/utils.d.ts +10 -0
- package/dist/adapters/utils.d.ts.map +1 -0
- package/dist/adapters/utils.js +14 -0
- package/dist/adapters/utils.js.map +1 -0
- package/dist/agent-auth-jwt.d.ts +14 -0
- package/dist/agent-auth-jwt.d.ts.map +1 -0
- package/dist/agent-auth-jwt.js +117 -0
- package/dist/agent-auth-jwt.js.map +1 -0
- package/dist/app.d.ts +25 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +265 -0
- package/dist/app.js.map +1 -0
- package/dist/attachment-types.d.ts +33 -0
- package/dist/attachment-types.d.ts.map +1 -0
- package/dist/attachment-types.js +67 -0
- package/dist/attachment-types.js.map +1 -0
- package/dist/auth/better-auth.d.ts +24 -0
- package/dist/auth/better-auth.d.ts.map +1 -0
- package/dist/auth/better-auth.js +108 -0
- package/dist/auth/better-auth.js.map +1 -0
- package/dist/board-claim.d.ts +23 -0
- package/dist/board-claim.d.ts.map +1 -0
- package/dist/board-claim.js +115 -0
- package/dist/board-claim.js.map +1 -0
- package/dist/config-file.d.ts +3 -0
- package/dist/config-file.d.ts.map +1 -0
- package/dist/config-file.js +16 -0
- package/dist/config-file.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +171 -0
- package/dist/config.js.map +1 -0
- package/dist/dev-server-status.d.ts +27 -0
- package/dist/dev-server-status.d.ts.map +1 -0
- package/dist/dev-server-status.js +70 -0
- package/dist/dev-server-status.js.map +1 -0
- package/dist/dev-watch-ignore.d.ts +2 -0
- package/dist/dev-watch-ignore.d.ts.map +1 -0
- package/dist/dev-watch-ignore.js +33 -0
- package/dist/dev-watch-ignore.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/home-paths.d.ts +17 -0
- package/dist/home-paths.d.ts.map +1 -0
- package/dist/home-paths.js +75 -0
- package/dist/home-paths.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +642 -0
- package/dist/index.js.map +1 -0
- package/dist/log-redaction.d.ts +11 -0
- package/dist/log-redaction.d.ts.map +1 -0
- package/dist/log-redaction.js +118 -0
- package/dist/log-redaction.js.map +1 -0
- package/dist/middleware/auth.d.ts +12 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +144 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/board-mutation-guard.d.ts +3 -0
- package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
- package/dist/middleware/board-mutation-guard.js +59 -0
- package/dist/middleware/board-mutation-guard.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +17 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +37 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logger.d.ts +4 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +87 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/private-hostname-guard.d.ts +11 -0
- package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
- package/dist/middleware/private-hostname-guard.js +78 -0
- package/dist/middleware/private-hostname-guard.js.map +1 -0
- package/dist/middleware/validate.d.ts +4 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/middleware/validate.js +7 -0
- package/dist/middleware/validate.js.map +1 -0
- package/dist/onboarding-assets/ceo/AGENTS.md +54 -0
- package/dist/onboarding-assets/ceo/HEARTBEAT.md +72 -0
- package/dist/onboarding-assets/ceo/SOUL.md +33 -0
- package/dist/onboarding-assets/ceo/TOOLS.md +3 -0
- package/dist/onboarding-assets/default/AGENTS.md +3 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +31 -0
- package/dist/paths.js.map +1 -0
- package/dist/realtime/live-events-ws.d.ts +28 -0
- package/dist/realtime/live-events-ws.d.ts.map +1 -0
- package/dist/realtime/live-events-ws.js +187 -0
- package/dist/realtime/live-events-ws.js.map +1 -0
- package/dist/redaction.d.ts +4 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +63 -0
- package/dist/redaction.js.map +1 -0
- package/dist/routes/access.d.ts +61 -0
- package/dist/routes/access.d.ts.map +1 -0
- package/dist/routes/access.js +2265 -0
- package/dist/routes/access.js.map +1 -0
- package/dist/routes/activity.d.ts +3 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +78 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +1828 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/approvals.d.ts +3 -0
- package/dist/routes/approvals.d.ts.map +1 -0
- package/dist/routes/approvals.js +275 -0
- package/dist/routes/approvals.js.map +1 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +309 -0
- package/dist/routes/assets.js.map +1 -0
- package/dist/routes/authz.d.ts +16 -0
- package/dist/routes/authz.d.ts.map +1 -0
- package/dist/routes/authz.js +47 -0
- package/dist/routes/authz.js.map +1 -0
- package/dist/routes/companies.d.ts +4 -0
- package/dist/routes/companies.d.ts.map +1 -0
- package/dist/routes/companies.js +303 -0
- package/dist/routes/companies.js.map +1 -0
- package/dist/routes/company-skills.d.ts +3 -0
- package/dist/routes/company-skills.d.ts.map +1 -0
- package/dist/routes/company-skills.js +228 -0
- package/dist/routes/company-skills.js.map +1 -0
- package/dist/routes/costs.d.ts +3 -0
- package/dist/routes/costs.d.ts.map +1 -0
- package/dist/routes/costs.js +268 -0
- package/dist/routes/costs.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +15 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/execution-workspaces.d.ts +3 -0
- package/dist/routes/execution-workspaces.d.ts.map +1 -0
- package/dist/routes/execution-workspaces.js +165 -0
- package/dist/routes/execution-workspaces.js.map +1 -0
- package/dist/routes/goals.d.ts +3 -0
- package/dist/routes/goals.d.ts.map +1 -0
- package/dist/routes/goals.js +95 -0
- package/dist/routes/goals.js.map +1 -0
- package/dist/routes/health.d.ts +9 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +69 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +18 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +18 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/instance-settings.d.ts +3 -0
- package/dist/routes/instance-settings.d.ts.map +1 -0
- package/dist/routes/instance-settings.js +71 -0
- package/dist/routes/instance-settings.js.map +1 -0
- package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
- package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
- package/dist/routes/issues-checkout-wakeup.js +12 -0
- package/dist/routes/issues-checkout-wakeup.js.map +1 -0
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +1520 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/llms.d.ts +3 -0
- package/dist/routes/llms.d.ts.map +1 -0
- package/dist/routes/llms.js +78 -0
- package/dist/routes/llms.js.map +1 -0
- package/dist/routes/org-chart-svg.d.ts +25 -0
- package/dist/routes/org-chart-svg.d.ts.map +1 -0
- package/dist/routes/org-chart-svg.js +657 -0
- package/dist/routes/org-chart-svg.js.map +1 -0
- package/dist/routes/plugin-ui-static.d.ts +69 -0
- package/dist/routes/plugin-ui-static.d.ts.map +1 -0
- package/dist/routes/plugin-ui-static.js +411 -0
- package/dist/routes/plugin-ui-static.js.map +1 -0
- package/dist/routes/plugins.d.ts +120 -0
- package/dist/routes/plugins.d.ts.map +1 -0
- package/dist/routes/plugins.js +1784 -0
- package/dist/routes/plugins.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +257 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/routines.d.ts +3 -0
- package/dist/routes/routines.d.ts.map +1 -0
- package/dist/routes/routines.js +277 -0
- package/dist/routes/routines.js.map +1 -0
- package/dist/routes/secrets.d.ts +3 -0
- package/dist/routes/secrets.d.ts.map +1 -0
- package/dist/routes/secrets.js +128 -0
- package/dist/routes/secrets.js.map +1 -0
- package/dist/routes/sidebar-badges.d.ts +3 -0
- package/dist/routes/sidebar-badges.d.ts.map +1 -0
- package/dist/routes/sidebar-badges.js +45 -0
- package/dist/routes/sidebar-badges.js.map +1 -0
- package/dist/secrets/external-stub-providers.d.ts +5 -0
- package/dist/secrets/external-stub-providers.d.ts.map +1 -0
- package/dist/secrets/external-stub-providers.js +21 -0
- package/dist/secrets/external-stub-providers.js.map +1 -0
- package/dist/secrets/local-encrypted-provider.d.ts +3 -0
- package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
- package/dist/secrets/local-encrypted-provider.js +116 -0
- package/dist/secrets/local-encrypted-provider.js.map +1 -0
- package/dist/secrets/provider-registry.d.ts +5 -0
- package/dist/secrets/provider-registry.d.ts.map +1 -0
- package/dist/secrets/provider-registry.js +20 -0
- package/dist/secrets/provider-registry.js.map +1 -0
- package/dist/secrets/types.d.ts +21 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +2 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/services/access.d.ts +113 -0
- package/dist/services/access.d.ts.map +1 -0
- package/dist/services/access.js +247 -0
- package/dist/services/access.js.map +1 -0
- package/dist/services/activity-log.d.ts +17 -0
- package/dist/services/activity-log.d.ts.map +1 -0
- package/dist/services/activity-log.js +74 -0
- package/dist/services/activity-log.js.map +1 -0
- package/dist/services/activity.d.ts +764 -0
- package/dist/services/activity.d.ts.map +1 -0
- package/dist/services/activity.js +105 -0
- package/dist/services/activity.js.map +1 -0
- package/dist/services/agent-instructions.d.ts +91 -0
- package/dist/services/agent-instructions.d.ts.map +1 -0
- package/dist/services/agent-instructions.js +580 -0
- package/dist/services/agent-instructions.js.map +1 -0
- package/dist/services/agent-permissions.d.ts +6 -0
- package/dist/services/agent-permissions.d.ts.map +1 -0
- package/dist/services/agent-permissions.js +18 -0
- package/dist/services/agent-permissions.js.map +1 -0
- package/dist/services/agents.d.ts +1670 -0
- package/dist/services/agents.d.ts.map +1 -0
- package/dist/services/agents.js +566 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/approvals.d.ts +546 -0
- package/dist/services/approvals.d.ts.map +1 -0
- package/dist/services/approvals.js +212 -0
- package/dist/services/approvals.js.map +1 -0
- package/dist/services/assets.d.ts +33 -0
- package/dist/services/assets.d.ts.map +1 -0
- package/dist/services/assets.js +17 -0
- package/dist/services/assets.js.map +1 -0
- package/dist/services/board-auth.d.ts +234 -0
- package/dist/services/board-auth.d.ts.map +1 -0
- package/dist/services/board-auth.js +295 -0
- package/dist/services/board-auth.js.map +1 -0
- package/dist/services/budgets.d.ts +38 -0
- package/dist/services/budgets.d.ts.map +1 -0
- package/dist/services/budgets.js +784 -0
- package/dist/services/budgets.js.map +1 -0
- package/dist/services/companies.d.ts +124 -0
- package/dist/services/companies.d.ts.map +1 -0
- package/dist/services/companies.js +256 -0
- package/dist/services/companies.js.map +1 -0
- package/dist/services/company-export-readme.d.ts +17 -0
- package/dist/services/company-export-readme.d.ts.map +1 -0
- package/dist/services/company-export-readme.js +148 -0
- package/dist/services/company-export-readme.js.map +1 -0
- package/dist/services/company-portability.d.ts +23 -0
- package/dist/services/company-portability.d.ts.map +1 -0
- package/dist/services/company-portability.js +3739 -0
- package/dist/services/company-portability.js.map +1 -0
- package/dist/services/company-skills.d.ts +77 -0
- package/dist/services/company-skills.d.ts.map +1 -0
- package/dist/services/company-skills.js +2042 -0
- package/dist/services/company-skills.js.map +1 -0
- package/dist/services/costs.d.ts +114 -0
- package/dist/services/costs.d.ts.map +1 -0
- package/dist/services/costs.js +294 -0
- package/dist/services/costs.js.map +1 -0
- package/dist/services/cron.d.ts +80 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +300 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/dashboard.d.ts +26 -0
- package/dist/services/dashboard.d.ts.map +1 -0
- package/dist/services/dashboard.js +98 -0
- package/dist/services/dashboard.js.map +1 -0
- package/dist/services/default-agent-instructions.d.ts +9 -0
- package/dist/services/default-agent-instructions.d.ts.map +1 -0
- package/dist/services/default-agent-instructions.js +20 -0
- package/dist/services/default-agent-instructions.js.map +1 -0
- package/dist/services/documents.d.ts +164 -0
- package/dist/services/documents.d.ts.map +1 -0
- package/dist/services/documents.js +382 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/execution-workspace-policy.d.ts +21 -0
- package/dist/services/execution-workspace-policy.d.ts.map +1 -0
- package/dist/services/execution-workspace-policy.js +177 -0
- package/dist/services/execution-workspace-policy.js.map +1 -0
- package/dist/services/execution-workspaces.d.ts +19 -0
- package/dist/services/execution-workspaces.d.ts.map +1 -0
- package/dist/services/execution-workspaces.js +87 -0
- package/dist/services/execution-workspaces.js.map +1 -0
- package/dist/services/finance.d.ts +93 -0
- package/dist/services/finance.d.ts.map +1 -0
- package/dist/services/finance.js +120 -0
- package/dist/services/finance.js.map +1 -0
- package/dist/services/goals.d.ts +433 -0
- package/dist/services/goals.d.ts.map +1 -0
- package/dist/services/goals.js +54 -0
- package/dist/services/goals.js.map +1 -0
- package/dist/services/heartbeat-run-summary.d.ts +2 -0
- package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
- package/dist/services/heartbeat-run-summary.js +30 -0
- package/dist/services/heartbeat-run-summary.js.map +1 -0
- package/dist/services/heartbeat.d.ts +812 -0
- package/dist/services/heartbeat.d.ts.map +1 -0
- package/dist/services/heartbeat.js +3156 -0
- package/dist/services/heartbeat.js.map +1 -0
- package/dist/services/hire-hook.d.ts +14 -0
- package/dist/services/hire-hook.d.ts.map +1 -0
- package/dist/services/hire-hook.js +85 -0
- package/dist/services/hire-hook.js.map +1 -0
- package/dist/services/index.d.ts +33 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +33 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/instance-settings.d.ts +11 -0
- package/dist/services/instance-settings.d.ts.map +1 -0
- package/dist/services/instance-settings.js +116 -0
- package/dist/services/instance-settings.js.map +1 -0
- package/dist/services/issue-approvals.d.ts +56 -0
- package/dist/services/issue-approvals.d.ts.map +1 -0
- package/dist/services/issue-approvals.js +153 -0
- package/dist/services/issue-approvals.js.map +1 -0
- package/dist/services/issue-assignment-wakeup.d.ts +29 -0
- package/dist/services/issue-assignment-wakeup.d.ts.map +1 -0
- package/dist/services/issue-assignment-wakeup.js +22 -0
- package/dist/services/issue-assignment-wakeup.js.map +1 -0
- package/dist/services/issue-goal-fallback.d.ts +18 -0
- package/dist/services/issue-goal-fallback.d.ts.map +1 -0
- package/dist/services/issue-goal-fallback.js +33 -0
- package/dist/services/issue-goal-fallback.js.map +1 -0
- package/dist/services/issues.d.ts +560 -0
- package/dist/services/issues.d.ts.map +1 -0
- package/dist/services/issues.js +1478 -0
- package/dist/services/issues.js.map +1 -0
- package/dist/services/live-events.d.ts +17 -0
- package/dist/services/live-events.d.ts.map +1 -0
- package/dist/services/live-events.js +33 -0
- package/dist/services/live-events.js.map +1 -0
- package/dist/services/plugin-capability-validator.d.ts +108 -0
- package/dist/services/plugin-capability-validator.d.ts.map +1 -0
- package/dist/services/plugin-capability-validator.js +268 -0
- package/dist/services/plugin-capability-validator.js.map +1 -0
- package/dist/services/plugin-config-validator.d.ts +26 -0
- package/dist/services/plugin-config-validator.d.ts.map +1 -0
- package/dist/services/plugin-config-validator.js +41 -0
- package/dist/services/plugin-config-validator.js.map +1 -0
- package/dist/services/plugin-dev-watcher.d.ts +30 -0
- package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
- package/dist/services/plugin-dev-watcher.js +241 -0
- package/dist/services/plugin-dev-watcher.js.map +1 -0
- package/dist/services/plugin-event-bus.d.ts +149 -0
- package/dist/services/plugin-event-bus.d.ts.map +1 -0
- package/dist/services/plugin-event-bus.js +258 -0
- package/dist/services/plugin-event-bus.js.map +1 -0
- package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
- package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
- package/dist/services/plugin-host-service-cleanup.js +37 -0
- package/dist/services/plugin-host-service-cleanup.js.map +1 -0
- package/dist/services/plugin-host-services.d.ts +13 -0
- package/dist/services/plugin-host-services.d.ts.map +1 -0
- package/dist/services/plugin-host-services.js +969 -0
- package/dist/services/plugin-host-services.js.map +1 -0
- package/dist/services/plugin-job-coordinator.d.ts +81 -0
- package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
- package/dist/services/plugin-job-coordinator.js +172 -0
- package/dist/services/plugin-job-coordinator.js.map +1 -0
- package/dist/services/plugin-job-scheduler.d.ts +163 -0
- package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
- package/dist/services/plugin-job-scheduler.js +454 -0
- package/dist/services/plugin-job-scheduler.js.map +1 -0
- package/dist/services/plugin-job-store.d.ts +208 -0
- package/dist/services/plugin-job-store.d.ts.map +1 -0
- package/dist/services/plugin-job-store.js +350 -0
- package/dist/services/plugin-job-store.js.map +1 -0
- package/dist/services/plugin-lifecycle.d.ts +203 -0
- package/dist/services/plugin-lifecycle.d.ts.map +1 -0
- package/dist/services/plugin-lifecycle.js +476 -0
- package/dist/services/plugin-lifecycle.js.map +1 -0
- package/dist/services/plugin-loader.d.ts +441 -0
- package/dist/services/plugin-loader.d.ts.map +1 -0
- package/dist/services/plugin-loader.js +1192 -0
- package/dist/services/plugin-loader.js.map +1 -0
- package/dist/services/plugin-log-retention.d.ts +20 -0
- package/dist/services/plugin-log-retention.d.ts.map +1 -0
- package/dist/services/plugin-log-retention.js +63 -0
- package/dist/services/plugin-log-retention.js.map +1 -0
- package/dist/services/plugin-manifest-validator.d.ts +79 -0
- package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
- package/dist/services/plugin-manifest-validator.js +84 -0
- package/dist/services/plugin-manifest-validator.js.map +1 -0
- package/dist/services/plugin-registry.d.ts +2542 -0
- package/dist/services/plugin-registry.d.ts.map +1 -0
- package/dist/services/plugin-registry.js +539 -0
- package/dist/services/plugin-registry.js.map +1 -0
- package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
- package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
- package/dist/services/plugin-runtime-sandbox.js +154 -0
- package/dist/services/plugin-runtime-sandbox.js.map +1 -0
- package/dist/services/plugin-secrets-handler.d.ts +81 -0
- package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
- package/dist/services/plugin-secrets-handler.js +275 -0
- package/dist/services/plugin-secrets-handler.js.map +1 -0
- package/dist/services/plugin-state-store.d.ts +92 -0
- package/dist/services/plugin-state-store.d.ts.map +1 -0
- package/dist/services/plugin-state-store.js +190 -0
- package/dist/services/plugin-state-store.js.map +1 -0
- package/dist/services/plugin-stream-bus.d.ts +29 -0
- package/dist/services/plugin-stream-bus.d.ts.map +1 -0
- package/dist/services/plugin-stream-bus.js +48 -0
- package/dist/services/plugin-stream-bus.js.map +1 -0
- package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
- package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
- package/dist/services/plugin-tool-dispatcher.js +224 -0
- package/dist/services/plugin-tool-dispatcher.js.map +1 -0
- package/dist/services/plugin-tool-registry.d.ts +192 -0
- package/dist/services/plugin-tool-registry.d.ts.map +1 -0
- package/dist/services/plugin-tool-registry.js +224 -0
- package/dist/services/plugin-tool-registry.js.map +1 -0
- package/dist/services/plugin-worker-manager.d.ts +260 -0
- package/dist/services/plugin-worker-manager.d.ts.map +1 -0
- package/dist/services/plugin-worker-manager.js +835 -0
- package/dist/services/plugin-worker-manager.js.map +1 -0
- package/dist/services/projects.d.ts +87 -0
- package/dist/services/projects.d.ts.map +1 -0
- package/dist/services/projects.js +656 -0
- package/dist/services/projects.js.map +1 -0
- package/dist/services/quota-windows.d.ts +9 -0
- package/dist/services/quota-windows.d.ts.map +1 -0
- package/dist/services/quota-windows.js +56 -0
- package/dist/services/quota-windows.js.map +1 -0
- package/dist/services/routines.d.ts +135 -0
- package/dist/services/routines.d.ts.map +1 -0
- package/dist/services/routines.js +1105 -0
- package/dist/services/routines.js.map +1 -0
- package/dist/services/run-log-store.d.ts +34 -0
- package/dist/services/run-log-store.d.ts.map +1 -0
- package/dist/services/run-log-store.js +109 -0
- package/dist/services/run-log-store.js.map +1 -0
- package/dist/services/secrets.d.ts +511 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +289 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/sidebar-badges.d.ts +9 -0
- package/dist/services/sidebar-badges.d.ts.map +1 -0
- package/dist/services/sidebar-badges.js +33 -0
- package/dist/services/sidebar-badges.js.map +1 -0
- package/dist/services/work-products.d.ts +14 -0
- package/dist/services/work-products.d.ts.map +1 -0
- package/dist/services/work-products.js +100 -0
- package/dist/services/work-products.js.map +1 -0
- package/dist/services/workspace-operation-log-store.d.ts +33 -0
- package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
- package/dist/services/workspace-operation-log-store.js +110 -0
- package/dist/services/workspace-operation-log-store.js.map +1 -0
- package/dist/services/workspace-operations.d.ts +44 -0
- package/dist/services/workspace-operations.d.ts.map +1 -0
- package/dist/services/workspace-operations.js +211 -0
- package/dist/services/workspace-operations.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +164 -0
- package/dist/services/workspace-runtime.d.ts.map +1 -0
- package/dist/services/workspace-runtime.js +1235 -0
- package/dist/services/workspace-runtime.js.map +1 -0
- package/dist/startup-banner.d.ts +31 -0
- package/dist/startup-banner.d.ts.map +1 -0
- package/dist/startup-banner.js +117 -0
- package/dist/startup-banner.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +29 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-disk-provider.d.ts +3 -0
- package/dist/storage/local-disk-provider.d.ts.map +1 -0
- package/dist/storage/local-disk-provider.js +79 -0
- package/dist/storage/local-disk-provider.js.map +1 -0
- package/dist/storage/provider-registry.d.ts +4 -0
- package/dist/storage/provider-registry.d.ts.map +1 -0
- package/dist/storage/provider-registry.js +15 -0
- package/dist/storage/provider-registry.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +11 -0
- package/dist/storage/s3-provider.d.ts.map +1 -0
- package/dist/storage/s3-provider.js +123 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/service.d.ts +3 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +120 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/types.d.ts +55 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/ui-branding.d.ts +13 -0
- package/dist/ui-branding.d.ts.map +1 -0
- package/dist/ui-branding.js +188 -0
- package/dist/ui-branding.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/worktree-config.d.ts +19 -0
- package/dist/worktree-config.d.ts.map +1 -0
- package/dist/worktree-config.js +365 -0
- package/dist/worktree-config.js.map +1 -0
- package/package.json +90 -0
- package/skills/fidelios/SKILL.md +365 -0
- package/skills/fidelios/references/api-reference.md +647 -0
- package/skills/fidelios/references/company-skills.md +193 -0
- package/skills/fidelios-create-agent/SKILL.md +142 -0
- package/skills/fidelios-create-agent/references/api-reference.md +105 -0
- package/skills/fidelios-create-plugin/SKILL.md +101 -0
- package/skills/para-memory-files/SKILL.md +104 -0
- package/skills/para-memory-files/references/schemas.md +35 -0
- package/ui-dist/android-chrome-192x192.png +0 -0
- package/ui-dist/android-chrome-512x512.png +0 -0
- package/ui-dist/apple-touch-icon.png +0 -0
- package/ui-dist/assets/_basePickBy-DDS8rFE9.js +1 -0
- package/ui-dist/assets/_baseUniq-BTIdqnfJ.js +1 -0
- package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
- package/ui-dist/assets/arc-CER6ytAf.js +1 -0
- package/ui-dist/assets/architectureDiagram-VXUJARFQ-CrJvVSPh.js +36 -0
- package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
- package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
- package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
- package/ui-dist/assets/blockDiagram-VD42YOAC-p-DB7nkA.js +122 -0
- package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/ui-dist/assets/c4Diagram-YG6GDRKO-D1K75fYz.js +10 -0
- package/ui-dist/assets/channel-B1viE-VZ.js +1 -0
- package/ui-dist/assets/chunk-4BX2VUAB-C1J-fCaK.js +1 -0
- package/ui-dist/assets/chunk-55IACEB6-CjEOgVYA.js +1 -0
- package/ui-dist/assets/chunk-B4BG7PRW-CGZwFaze.js +165 -0
- package/ui-dist/assets/chunk-DI55MBZ5-Dp2ZahPN.js +220 -0
- package/ui-dist/assets/chunk-FMBD7UC4-nXC1OkzD.js +15 -0
- package/ui-dist/assets/chunk-QN33PNHL-D_uFCkMK.js +1 -0
- package/ui-dist/assets/chunk-QZHKN3VN-CG3WK_AN.js +1 -0
- package/ui-dist/assets/chunk-TZMSLE5B-COlBSWdP.js +1 -0
- package/ui-dist/assets/classDiagram-2ON5EDUG-Cs4NEMXI.js +1 -0
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-Cs4NEMXI.js +1 -0
- package/ui-dist/assets/clike-B9uivgTg.js +1 -0
- package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
- package/ui-dist/assets/clone-CGwZV8ud.js +1 -0
- package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
- package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
- package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
- package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
- package/ui-dist/assets/cose-bilkent-S5V4N54A-B9XYqCMb.js +1 -0
- package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
- package/ui-dist/assets/css-BnMrqG3P.js +1 -0
- package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
- package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
- package/ui-dist/assets/d-pRatUO7H.js +1 -0
- package/ui-dist/assets/dagre-6UL2VRFP-DcCdBLC7.js +4 -0
- package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/ui-dist/assets/diagram-PSM6KHXK-np1kLquy.js +24 -0
- package/ui-dist/assets/diagram-QEK2KX5R-C-b4qIN1.js +43 -0
- package/ui-dist/assets/diagram-S2PKOQOG-Ba-173Ug.js +24 -0
- package/ui-dist/assets/diff-DbItnlRl.js +1 -0
- package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
- package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
- package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
- package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
- package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
- package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
- package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
- package/ui-dist/assets/erDiagram-Q2GNP2WA-BBmkHiJP.js +60 -0
- package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
- package/ui-dist/assets/factor-kuTfRLto.js +1 -0
- package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
- package/ui-dist/assets/flowDiagram-NV44I4VS-Dj_iTDkp.js +162 -0
- package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
- package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
- package/ui-dist/assets/ganttDiagram-JELNMOA3-Bn1hanTg.js +267 -0
- package/ui-dist/assets/gas-Bneqetm1.js +1 -0
- package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
- package/ui-dist/assets/gitGraphDiagram-V2S2FVAM-BjmRpty0.js +65 -0
- package/ui-dist/assets/graph-CWBOAGTW.js +1 -0
- package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
- package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
- package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
- package/ui-dist/assets/http-DBlCnlav.js +1 -0
- package/ui-dist/assets/idl-BEugSyMb.js +1 -0
- package/ui-dist/assets/index-B52MtqBm.js +1 -0
- package/ui-dist/assets/index-BEBYIFOJ.js +1 -0
- package/ui-dist/assets/index-BIvl9YFB.js +1 -0
- package/ui-dist/assets/index-BNyP1gwD.js +1 -0
- package/ui-dist/assets/index-BRW6bV_B.js +6 -0
- package/ui-dist/assets/index-BcQTWaKH.js +1 -0
- package/ui-dist/assets/index-BfKYbH5T.js +13 -0
- package/ui-dist/assets/index-BhX49pA0.js +1 -0
- package/ui-dist/assets/index-BoFaTgOC.js +2 -0
- package/ui-dist/assets/index-C-Es83iE.js +7 -0
- package/ui-dist/assets/index-C3LG8kvr.js +1 -0
- package/ui-dist/assets/index-C5Z9j0rD.js +1 -0
- package/ui-dist/assets/index-CFlEF-gp.js +1 -0
- package/ui-dist/assets/index-Cjm12V39.js +1 -0
- package/ui-dist/assets/index-Cp84QmJD.css +1 -0
- package/ui-dist/assets/index-D2t01AH0.js +1 -0
- package/ui-dist/assets/index-DEt1jkxJ.js +1 -0
- package/ui-dist/assets/index-DeAKBJuz.js +3 -0
- package/ui-dist/assets/index-Du65R_Zq.js +1 -0
- package/ui-dist/assets/index-WUHteAuP.js +1 -0
- package/ui-dist/assets/index-Y_jO6IK_.js +1180 -0
- package/ui-dist/assets/index-ZQU9QA5y.js +1 -0
- package/ui-dist/assets/index-f6wRGThx.js +1 -0
- package/ui-dist/assets/index-hMuLlvYa.js +1 -0
- package/ui-dist/assets/infoDiagram-HS3SLOUP-CVMKJlmV.js +2 -0
- package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
- package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
- package/ui-dist/assets/journeyDiagram-XKPGCS4Q-FrNTHHMi.js +139 -0
- package/ui-dist/assets/julia-DuME0IfC.js +1 -0
- package/ui-dist/assets/kanban-definition-3W4ZIXB7-BQYKwdVh.js +89 -0
- package/ui-dist/assets/katex-O9d3_IXG.js +261 -0
- package/ui-dist/assets/layout-BxccZ6zb.js +1 -0
- package/ui-dist/assets/linear-Db-Yv5jO.js +1 -0
- package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
- package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
- package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
- package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
- package/ui-dist/assets/mermaid.core-BCE9tDOe.js +256 -0
- package/ui-dist/assets/mindmap-definition-VGOIOE7T-ZWLuqirD.js +68 -0
- package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
- package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
- package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
- package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
- package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
- package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
- package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
- package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
- package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
- package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
- package/ui-dist/assets/pascal--L3eBynH.js +1 -0
- package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
- package/ui-dist/assets/pieDiagram-ADFJNKIX-D01HRHJF.js +30 -0
- package/ui-dist/assets/pig-CevX1Tat.js +1 -0
- package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
- package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
- package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
- package/ui-dist/assets/pug-DeIclll2.js +1 -0
- package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
- package/ui-dist/assets/python-BuPzkPfP.js +1 -0
- package/ui-dist/assets/q-pXgVlZs6.js +1 -0
- package/ui-dist/assets/quadrantDiagram-AYHSOK5B-lAmOPnB4.js +7 -0
- package/ui-dist/assets/r-B6wPVr8A.js +1 -0
- package/ui-dist/assets/requirementDiagram-UZGBJVZJ-ByNWbh-O.js +64 -0
- package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
- package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
- package/ui-dist/assets/sankeyDiagram-TZEHDZUN-Cf_Gq84u.js +10 -0
- package/ui-dist/assets/sas-B4kiWyti.js +1 -0
- package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
- package/ui-dist/assets/sequenceDiagram-WL72ISMW-Bx2VZbdr.js +145 -0
- package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
- package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
- package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
- package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
- package/ui-dist/assets/solr-DehyRSwq.js +1 -0
- package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
- package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/ui-dist/assets/sql-D0XecflT.js +1 -0
- package/ui-dist/assets/stateDiagram-FKZM4ZOC-vP7G7A65.js +1 -0
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-C2xpsAAO.js +1 -0
- package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
- package/ui-dist/assets/stylus-B533Al4x.js +1 -0
- package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
- package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
- package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
- package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
- package/ui-dist/assets/timeline-definition-IT6M3QCI-BJww-sEp.js +61 -0
- package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
- package/ui-dist/assets/treemap-GDKQZRPO-DUux14NY.js +162 -0
- package/ui-dist/assets/troff-wAsdV37c.js +1 -0
- package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
- package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
- package/ui-dist/assets/vb-CmGdzxic.js +1 -0
- package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
- package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
- package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
- package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
- package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
- package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
- package/ui-dist/assets/xychartDiagram-PRI3JC2R-AU5ZOwAw.js +7 -0
- package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
- package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
- package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
- package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
- package/ui-dist/favicon-16x16.png +0 -0
- package/ui-dist/favicon-32x32.png +0 -0
- package/ui-dist/favicon-96x96.png +0 -0
- package/ui-dist/favicon.ico +0 -0
- package/ui-dist/favicon.svg +3 -0
- package/ui-dist/index.html +48 -0
- package/ui-dist/site.webmanifest +21 -0
- package/ui-dist/sw.js +42 -0
- package/ui-dist/worktree-favicon-16x16.png +0 -0
- package/ui-dist/worktree-favicon-32x32.png +0 -0
- package/ui-dist/worktree-favicon.ico +0 -0
- package/ui-dist/worktree-favicon.svg +3 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import vm from "node:vm";
|
|
4
|
+
export class PluginSandboxError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "PluginSandboxError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const DEFAULT_TIMEOUT_MS = 2_000;
|
|
11
|
+
const MODULE_PATH_SUFFIXES = ["", ".js", ".mjs", ".cjs", "/index.js", "/index.mjs", "/index.cjs"];
|
|
12
|
+
const DEFAULT_GLOBALS = {
|
|
13
|
+
console,
|
|
14
|
+
setTimeout,
|
|
15
|
+
clearTimeout,
|
|
16
|
+
setInterval,
|
|
17
|
+
clearInterval,
|
|
18
|
+
URL,
|
|
19
|
+
URLSearchParams,
|
|
20
|
+
TextEncoder,
|
|
21
|
+
TextDecoder,
|
|
22
|
+
AbortController,
|
|
23
|
+
AbortSignal,
|
|
24
|
+
};
|
|
25
|
+
export function createCapabilityScopedInvoker(manifest, validator) {
|
|
26
|
+
return {
|
|
27
|
+
async invoke(operation, fn) {
|
|
28
|
+
validator.assertOperation(manifest, operation);
|
|
29
|
+
return await fn();
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load a CommonJS plugin module in a VM context with explicit module import allow-listing.
|
|
35
|
+
*
|
|
36
|
+
* Security properties:
|
|
37
|
+
* - no implicit access to host globals like `process`
|
|
38
|
+
* - no unrestricted built-in module imports
|
|
39
|
+
* - relative imports are resolved only inside the plugin root directory
|
|
40
|
+
*/
|
|
41
|
+
export async function loadPluginModuleInSandbox(options) {
|
|
42
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
43
|
+
const allowedSpecifiers = options.allowedModuleSpecifiers ?? new Set();
|
|
44
|
+
const entrypointPath = path.resolve(options.entrypointPath);
|
|
45
|
+
const pluginRoot = path.dirname(entrypointPath);
|
|
46
|
+
const context = vm.createContext({
|
|
47
|
+
...DEFAULT_GLOBALS,
|
|
48
|
+
...options.allowedGlobals,
|
|
49
|
+
});
|
|
50
|
+
const moduleCache = new Map();
|
|
51
|
+
const allowedModules = options.allowedModules ?? {};
|
|
52
|
+
const realPluginRoot = realpathSync(pluginRoot);
|
|
53
|
+
const loadModuleSync = (modulePath) => {
|
|
54
|
+
const resolvedPath = resolveModulePathSync(path.resolve(modulePath));
|
|
55
|
+
const realPath = realpathSync(resolvedPath);
|
|
56
|
+
if (!isWithinRoot(realPath, realPluginRoot)) {
|
|
57
|
+
throw new PluginSandboxError(`Import '${modulePath}' escapes plugin root and is not allowed`);
|
|
58
|
+
}
|
|
59
|
+
const cached = moduleCache.get(realPath);
|
|
60
|
+
if (cached)
|
|
61
|
+
return cached;
|
|
62
|
+
const code = readModuleSourceSync(realPath);
|
|
63
|
+
if (looksLikeEsm(code)) {
|
|
64
|
+
throw new PluginSandboxError("Sandbox loader only supports CommonJS modules. Build plugin worker entrypoints as CJS for sandboxed loading.");
|
|
65
|
+
}
|
|
66
|
+
const module = { exports: {} };
|
|
67
|
+
// Cache the module before execution to preserve CommonJS cycle semantics.
|
|
68
|
+
moduleCache.set(realPath, module.exports);
|
|
69
|
+
const requireInSandbox = (specifier) => {
|
|
70
|
+
if (!specifier.startsWith(".") && !specifier.startsWith("/")) {
|
|
71
|
+
if (!allowedSpecifiers.has(specifier)) {
|
|
72
|
+
throw new PluginSandboxError(`Import denied for module '${specifier}'. Add an explicit sandbox allow-list entry.`);
|
|
73
|
+
}
|
|
74
|
+
const binding = allowedModules[specifier];
|
|
75
|
+
if (!binding) {
|
|
76
|
+
throw new PluginSandboxError(`Bare module '${specifier}' is allow-listed but no host binding is registered.`);
|
|
77
|
+
}
|
|
78
|
+
return binding;
|
|
79
|
+
}
|
|
80
|
+
const candidatePath = path.resolve(path.dirname(realPath), specifier);
|
|
81
|
+
return loadModuleSync(candidatePath);
|
|
82
|
+
};
|
|
83
|
+
// Inject the CJS module arguments into the context so the script can call
|
|
84
|
+
// the wrapper immediately. This is critical: the timeout in runInContext
|
|
85
|
+
// only applies during script evaluation. By including the self-invocation
|
|
86
|
+
// `(fn)(exports, module, ...)` in the script text, the timeout also covers
|
|
87
|
+
// the actual module body execution — preventing infinite loops from hanging.
|
|
88
|
+
const sandboxArgs = {
|
|
89
|
+
__fidelios_exports: module.exports,
|
|
90
|
+
__fidelios_module: module,
|
|
91
|
+
__fidelios_require: requireInSandbox,
|
|
92
|
+
__fidelios_filename: realPath,
|
|
93
|
+
__fidelios_dirname: path.dirname(realPath),
|
|
94
|
+
};
|
|
95
|
+
// Temporarily inject args into the context, run, then remove to avoid pollution.
|
|
96
|
+
Object.assign(context, sandboxArgs);
|
|
97
|
+
const wrapped = `(function (exports, module, require, __filename, __dirname) {\n${code}\n})(__fidelios_exports, __fidelios_module, __fidelios_require, __fidelios_filename, __fidelios_dirname)`;
|
|
98
|
+
const script = new vm.Script(wrapped, { filename: realPath });
|
|
99
|
+
try {
|
|
100
|
+
script.runInContext(context, { timeout: timeoutMs });
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
for (const key of Object.keys(sandboxArgs)) {
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
105
|
+
delete context[key];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const normalizedExports = normalizeModuleExports(module.exports);
|
|
109
|
+
moduleCache.set(realPath, normalizedExports);
|
|
110
|
+
return normalizedExports;
|
|
111
|
+
};
|
|
112
|
+
const entryExports = loadModuleSync(entrypointPath);
|
|
113
|
+
return {
|
|
114
|
+
namespace: { ...entryExports },
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function resolveModulePathSync(candidatePath) {
|
|
118
|
+
for (const suffix of MODULE_PATH_SUFFIXES) {
|
|
119
|
+
const fullPath = `${candidatePath}${suffix}`;
|
|
120
|
+
if (existsSync(fullPath)) {
|
|
121
|
+
return fullPath;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new PluginSandboxError(`Unable to resolve module import at path '${candidatePath}'`);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* True when `targetPath` is inside `rootPath` (or equals rootPath), false otherwise.
|
|
128
|
+
* Uses `path.relative` so sibling-prefix paths (e.g. `/root-a` vs `/root`) cannot bypass checks.
|
|
129
|
+
*/
|
|
130
|
+
function isWithinRoot(targetPath, rootPath) {
|
|
131
|
+
const relative = path.relative(rootPath, targetPath);
|
|
132
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
133
|
+
}
|
|
134
|
+
function readModuleSourceSync(modulePath) {
|
|
135
|
+
try {
|
|
136
|
+
return readFileSync(modulePath, "utf8");
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new PluginSandboxError(`Failed to read sandbox module '${modulePath}': ${error instanceof Error ? error.message : String(error)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function normalizeModuleExports(exportsValue) {
|
|
143
|
+
if (typeof exportsValue === "object" && exportsValue !== null) {
|
|
144
|
+
return exportsValue;
|
|
145
|
+
}
|
|
146
|
+
return { default: exportsValue };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Lightweight guard to reject ESM syntax in the VM CommonJS loader.
|
|
150
|
+
*/
|
|
151
|
+
function looksLikeEsm(code) {
|
|
152
|
+
return /(^|\n)\s*import\s+/m.test(code) || /(^|\n)\s*export\s+/m.test(code);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=plugin-runtime-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-runtime-sandbox.js","sourceRoot":"","sources":["../../src/services/plugin-runtime-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin secrets host-side handler — resolves secret references through the
|
|
3
|
+
* FideliOS secret provider system.
|
|
4
|
+
*
|
|
5
|
+
* When a plugin worker calls `ctx.secrets.resolve(secretRef)`, the JSON-RPC
|
|
6
|
+
* request arrives at the host with `{ secretRef }`. This module provides the
|
|
7
|
+
* concrete `HostServices.secrets` adapter that:
|
|
8
|
+
*
|
|
9
|
+
* 1. Parses the `secretRef` string to identify the secret.
|
|
10
|
+
* 2. Looks up the secret record and its latest version in the database.
|
|
11
|
+
* 3. Delegates to the configured `SecretProviderModule` to decrypt /
|
|
12
|
+
* resolve the raw value.
|
|
13
|
+
* 4. Returns the resolved plaintext value to the worker.
|
|
14
|
+
*
|
|
15
|
+
* ## Secret Reference Format
|
|
16
|
+
*
|
|
17
|
+
* A `secretRef` is a **secret UUID** — the primary key (`id`) of a row in
|
|
18
|
+
* the `company_secrets` table. Operators place these UUIDs into plugin
|
|
19
|
+
* config values; plugin workers resolve them at execution time via
|
|
20
|
+
* `ctx.secrets.resolve(secretId)`.
|
|
21
|
+
*
|
|
22
|
+
* ## Security Invariants
|
|
23
|
+
*
|
|
24
|
+
* - Resolved values are **never** logged, persisted, or included in error
|
|
25
|
+
* messages (per PLUGIN_SPEC.md §22).
|
|
26
|
+
* - The handler is capability-gated: only plugins with `secrets.read-ref`
|
|
27
|
+
* declared in their manifest may call it (enforced by `host-client-factory`).
|
|
28
|
+
* - The host handler itself does not cache resolved values. Each call goes
|
|
29
|
+
* through the secret provider to honour rotation.
|
|
30
|
+
*
|
|
31
|
+
* @see PLUGIN_SPEC.md §22 — Secrets
|
|
32
|
+
* @see host-client-factory.ts — capability gating
|
|
33
|
+
* @see services/secrets.ts — secretService used by agent env bindings
|
|
34
|
+
*/
|
|
35
|
+
import type { Db } from "@fideliosai/db";
|
|
36
|
+
/**
|
|
37
|
+
* Extract secret reference UUIDs from a plugin's configJson, scoped to only
|
|
38
|
+
* the fields annotated with `format: "secret-ref"` in the schema.
|
|
39
|
+
*
|
|
40
|
+
* When no schema is provided, falls back to collecting all UUID-shaped strings
|
|
41
|
+
* (backwards-compatible for plugins without a declared instanceConfigSchema).
|
|
42
|
+
*/
|
|
43
|
+
export declare function extractSecretRefsFromConfig(configJson: unknown, schema?: Record<string, unknown> | null): Set<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Input shape for the `secrets.resolve` handler.
|
|
46
|
+
*
|
|
47
|
+
* Matches `WorkerToHostMethods["secrets.resolve"][0]` from `protocol.ts`.
|
|
48
|
+
*/
|
|
49
|
+
export interface PluginSecretsResolveParams {
|
|
50
|
+
/** The secret reference string (a secret UUID). */
|
|
51
|
+
secretRef: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for creating the plugin secrets handler.
|
|
55
|
+
*/
|
|
56
|
+
export interface PluginSecretsHandlerOptions {
|
|
57
|
+
/** Database connection. */
|
|
58
|
+
db: Db;
|
|
59
|
+
/**
|
|
60
|
+
* The plugin ID using this handler.
|
|
61
|
+
* Used for logging context only; never included in error payloads
|
|
62
|
+
* that reach the plugin worker.
|
|
63
|
+
*/
|
|
64
|
+
pluginId: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The `HostServices.secrets` adapter for the plugin host-client factory.
|
|
68
|
+
*/
|
|
69
|
+
export interface PluginSecretsService {
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a secret reference to its current plaintext value.
|
|
72
|
+
*
|
|
73
|
+
* @param params - Contains the `secretRef` (UUID of the secret)
|
|
74
|
+
* @returns The resolved secret value
|
|
75
|
+
* @throws {Error} If the secret is not found, has no versions, or
|
|
76
|
+
* the provider fails to resolve
|
|
77
|
+
*/
|
|
78
|
+
resolve(params: PluginSecretsResolveParams): Promise<string>;
|
|
79
|
+
}
|
|
80
|
+
export declare function createPluginSecretsHandler(options: PluginSecretsHandlerOptions): PluginSecretsService;
|
|
81
|
+
//# sourceMappingURL=plugin-secrets-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-secrets-handler.d.ts","sourceRoot":"","sources":["../../src/services/plugin-secrets-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AA8EzC;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACtC,GAAG,CAAC,MAAM,CAAC,CAqCb;AAMD;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,2BAA2B;IAC3B,EAAE,EAAE,EAAE,CAAC;IACP;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AA0CD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAyGtB"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin secrets host-side handler — resolves secret references through the
|
|
3
|
+
* FideliOS secret provider system.
|
|
4
|
+
*
|
|
5
|
+
* When a plugin worker calls `ctx.secrets.resolve(secretRef)`, the JSON-RPC
|
|
6
|
+
* request arrives at the host with `{ secretRef }`. This module provides the
|
|
7
|
+
* concrete `HostServices.secrets` adapter that:
|
|
8
|
+
*
|
|
9
|
+
* 1. Parses the `secretRef` string to identify the secret.
|
|
10
|
+
* 2. Looks up the secret record and its latest version in the database.
|
|
11
|
+
* 3. Delegates to the configured `SecretProviderModule` to decrypt /
|
|
12
|
+
* resolve the raw value.
|
|
13
|
+
* 4. Returns the resolved plaintext value to the worker.
|
|
14
|
+
*
|
|
15
|
+
* ## Secret Reference Format
|
|
16
|
+
*
|
|
17
|
+
* A `secretRef` is a **secret UUID** — the primary key (`id`) of a row in
|
|
18
|
+
* the `company_secrets` table. Operators place these UUIDs into plugin
|
|
19
|
+
* config values; plugin workers resolve them at execution time via
|
|
20
|
+
* `ctx.secrets.resolve(secretId)`.
|
|
21
|
+
*
|
|
22
|
+
* ## Security Invariants
|
|
23
|
+
*
|
|
24
|
+
* - Resolved values are **never** logged, persisted, or included in error
|
|
25
|
+
* messages (per PLUGIN_SPEC.md §22).
|
|
26
|
+
* - The handler is capability-gated: only plugins with `secrets.read-ref`
|
|
27
|
+
* declared in their manifest may call it (enforced by `host-client-factory`).
|
|
28
|
+
* - The host handler itself does not cache resolved values. Each call goes
|
|
29
|
+
* through the secret provider to honour rotation.
|
|
30
|
+
*
|
|
31
|
+
* @see PLUGIN_SPEC.md §22 — Secrets
|
|
32
|
+
* @see host-client-factory.ts — capability gating
|
|
33
|
+
* @see services/secrets.ts — secretService used by agent env bindings
|
|
34
|
+
*/
|
|
35
|
+
import { eq, and } from "drizzle-orm";
|
|
36
|
+
import { companySecrets, companySecretVersions, pluginConfig } from "@fideliosai/db";
|
|
37
|
+
import { getSecretProvider } from "../secrets/provider-registry.js";
|
|
38
|
+
import { pluginRegistryService } from "./plugin-registry.js";
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Error helpers
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Create a sanitised error that never leaks secret material.
|
|
44
|
+
* Only the ref identifier is included; never the resolved value.
|
|
45
|
+
*/
|
|
46
|
+
function secretNotFound(secretRef) {
|
|
47
|
+
const err = new Error(`Secret not found: ${secretRef}`);
|
|
48
|
+
err.name = "SecretNotFoundError";
|
|
49
|
+
return err;
|
|
50
|
+
}
|
|
51
|
+
function secretVersionNotFound(secretRef) {
|
|
52
|
+
const err = new Error(`No version found for secret: ${secretRef}`);
|
|
53
|
+
err.name = "SecretVersionNotFoundError";
|
|
54
|
+
return err;
|
|
55
|
+
}
|
|
56
|
+
function invalidSecretRef(secretRef) {
|
|
57
|
+
const err = new Error(`Invalid secret reference: ${secretRef}`);
|
|
58
|
+
err.name = "InvalidSecretRefError";
|
|
59
|
+
return err;
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Validation
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/** UUID v4 regex for validating secretRef format. */
|
|
65
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
66
|
+
/**
|
|
67
|
+
* Check whether a secretRef looks like a valid UUID.
|
|
68
|
+
*/
|
|
69
|
+
function isUuid(value) {
|
|
70
|
+
return UUID_RE.test(value);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Collect the property paths (dot-separated keys) whose schema node declares
|
|
74
|
+
* `format: "secret-ref"`. Only top-level and nested `properties` are walked —
|
|
75
|
+
* this mirrors the flat/nested object shapes that `JsonSchemaForm` renders.
|
|
76
|
+
*/
|
|
77
|
+
function collectSecretRefPaths(schema) {
|
|
78
|
+
const paths = new Set();
|
|
79
|
+
if (!schema || typeof schema !== "object")
|
|
80
|
+
return paths;
|
|
81
|
+
function walk(node, prefix) {
|
|
82
|
+
const props = node.properties;
|
|
83
|
+
if (!props || typeof props !== "object")
|
|
84
|
+
return;
|
|
85
|
+
for (const [key, propSchema] of Object.entries(props)) {
|
|
86
|
+
if (!propSchema || typeof propSchema !== "object")
|
|
87
|
+
continue;
|
|
88
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
89
|
+
if (propSchema.format === "secret-ref") {
|
|
90
|
+
paths.add(path);
|
|
91
|
+
}
|
|
92
|
+
// Recurse into nested object schemas
|
|
93
|
+
if (propSchema.type === "object") {
|
|
94
|
+
walk(propSchema, path);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
walk(schema, "");
|
|
99
|
+
return paths;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extract secret reference UUIDs from a plugin's configJson, scoped to only
|
|
103
|
+
* the fields annotated with `format: "secret-ref"` in the schema.
|
|
104
|
+
*
|
|
105
|
+
* When no schema is provided, falls back to collecting all UUID-shaped strings
|
|
106
|
+
* (backwards-compatible for plugins without a declared instanceConfigSchema).
|
|
107
|
+
*/
|
|
108
|
+
export function extractSecretRefsFromConfig(configJson, schema) {
|
|
109
|
+
const refs = new Set();
|
|
110
|
+
if (configJson == null || typeof configJson !== "object")
|
|
111
|
+
return refs;
|
|
112
|
+
const secretPaths = collectSecretRefPaths(schema);
|
|
113
|
+
// If schema declares secret-ref paths, extract only those values.
|
|
114
|
+
if (secretPaths.size > 0) {
|
|
115
|
+
for (const dotPath of secretPaths) {
|
|
116
|
+
const keys = dotPath.split(".");
|
|
117
|
+
let current = configJson;
|
|
118
|
+
for (const k of keys) {
|
|
119
|
+
if (current == null || typeof current !== "object") {
|
|
120
|
+
current = undefined;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
current = current[k];
|
|
124
|
+
}
|
|
125
|
+
if (typeof current === "string" && isUuid(current)) {
|
|
126
|
+
refs.add(current);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return refs;
|
|
130
|
+
}
|
|
131
|
+
// Fallback: no schema or no secret-ref annotations — collect all UUIDs.
|
|
132
|
+
// This preserves backwards compatibility for plugins that omit
|
|
133
|
+
// instanceConfigSchema.
|
|
134
|
+
function walkAll(value) {
|
|
135
|
+
if (typeof value === "string") {
|
|
136
|
+
if (isUuid(value))
|
|
137
|
+
refs.add(value);
|
|
138
|
+
}
|
|
139
|
+
else if (Array.isArray(value)) {
|
|
140
|
+
for (const item of value)
|
|
141
|
+
walkAll(item);
|
|
142
|
+
}
|
|
143
|
+
else if (value !== null && typeof value === "object") {
|
|
144
|
+
for (const v of Object.values(value))
|
|
145
|
+
walkAll(v);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
walkAll(configJson);
|
|
149
|
+
return refs;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a `HostServices.secrets` adapter for a specific plugin.
|
|
153
|
+
*
|
|
154
|
+
* The returned service looks up secrets by UUID, fetches the latest version
|
|
155
|
+
* material, and delegates to the appropriate `SecretProviderModule` for
|
|
156
|
+
* decryption.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```ts
|
|
160
|
+
* const secretsHandler = createPluginSecretsHandler({ db, pluginId });
|
|
161
|
+
* const handlers = createHostClientHandlers({
|
|
162
|
+
* pluginId,
|
|
163
|
+
* capabilities: manifest.capabilities,
|
|
164
|
+
* services: {
|
|
165
|
+
* secrets: secretsHandler,
|
|
166
|
+
* // ...
|
|
167
|
+
* },
|
|
168
|
+
* });
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @param options - Database connection and plugin identity
|
|
172
|
+
* @returns A `PluginSecretsService` suitable for `HostServices.secrets`
|
|
173
|
+
*/
|
|
174
|
+
/** Simple sliding-window rate limiter for secret resolution attempts. */
|
|
175
|
+
function createRateLimiter(maxAttempts, windowMs) {
|
|
176
|
+
const attempts = new Map();
|
|
177
|
+
return {
|
|
178
|
+
check(key) {
|
|
179
|
+
const now = Date.now();
|
|
180
|
+
const windowStart = now - windowMs;
|
|
181
|
+
const existing = (attempts.get(key) ?? []).filter((ts) => ts > windowStart);
|
|
182
|
+
if (existing.length >= maxAttempts)
|
|
183
|
+
return false;
|
|
184
|
+
existing.push(now);
|
|
185
|
+
attempts.set(key, existing);
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export function createPluginSecretsHandler(options) {
|
|
191
|
+
const { db, pluginId } = options;
|
|
192
|
+
const registry = pluginRegistryService(db);
|
|
193
|
+
// Rate limit: max 30 resolution attempts per plugin per minute
|
|
194
|
+
const rateLimiter = createRateLimiter(30, 60_000);
|
|
195
|
+
let cachedAllowedRefs = null;
|
|
196
|
+
let cachedAllowedRefsExpiry = 0;
|
|
197
|
+
const CONFIG_CACHE_TTL_MS = 30_000; // 30 seconds, matches event bus TTL
|
|
198
|
+
return {
|
|
199
|
+
async resolve(params) {
|
|
200
|
+
const { secretRef } = params;
|
|
201
|
+
// ---------------------------------------------------------------
|
|
202
|
+
// 0. Rate limiting — prevent brute-force UUID enumeration
|
|
203
|
+
// ---------------------------------------------------------------
|
|
204
|
+
if (!rateLimiter.check(pluginId)) {
|
|
205
|
+
const err = new Error("Rate limit exceeded for secret resolution");
|
|
206
|
+
err.name = "RateLimitExceededError";
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
// ---------------------------------------------------------------
|
|
210
|
+
// 1. Validate the ref format
|
|
211
|
+
// ---------------------------------------------------------------
|
|
212
|
+
if (!secretRef || typeof secretRef !== "string" || secretRef.trim().length === 0) {
|
|
213
|
+
throw invalidSecretRef(secretRef ?? "<empty>");
|
|
214
|
+
}
|
|
215
|
+
const trimmedRef = secretRef.trim();
|
|
216
|
+
if (!isUuid(trimmedRef)) {
|
|
217
|
+
throw invalidSecretRef(trimmedRef);
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------
|
|
220
|
+
// 1b. Scope check — only allow secrets referenced in this plugin's config
|
|
221
|
+
// ---------------------------------------------------------------
|
|
222
|
+
const now = Date.now();
|
|
223
|
+
if (!cachedAllowedRefs || now > cachedAllowedRefsExpiry) {
|
|
224
|
+
const [configRow, plugin] = await Promise.all([
|
|
225
|
+
db
|
|
226
|
+
.select()
|
|
227
|
+
.from(pluginConfig)
|
|
228
|
+
.where(eq(pluginConfig.pluginId, pluginId))
|
|
229
|
+
.then((rows) => rows[0] ?? null),
|
|
230
|
+
registry.getById(pluginId),
|
|
231
|
+
]);
|
|
232
|
+
const schema = plugin?.manifestJson
|
|
233
|
+
?.instanceConfigSchema;
|
|
234
|
+
cachedAllowedRefs = extractSecretRefsFromConfig(configRow?.configJson, schema);
|
|
235
|
+
cachedAllowedRefsExpiry = now + CONFIG_CACHE_TTL_MS;
|
|
236
|
+
}
|
|
237
|
+
if (!cachedAllowedRefs.has(trimmedRef)) {
|
|
238
|
+
// Return "not found" to avoid leaking whether the secret exists
|
|
239
|
+
throw secretNotFound(trimmedRef);
|
|
240
|
+
}
|
|
241
|
+
// ---------------------------------------------------------------
|
|
242
|
+
// 2. Look up the secret record by UUID
|
|
243
|
+
// ---------------------------------------------------------------
|
|
244
|
+
const secret = await db
|
|
245
|
+
.select()
|
|
246
|
+
.from(companySecrets)
|
|
247
|
+
.where(eq(companySecrets.id, trimmedRef))
|
|
248
|
+
.then((rows) => rows[0] ?? null);
|
|
249
|
+
if (!secret) {
|
|
250
|
+
throw secretNotFound(trimmedRef);
|
|
251
|
+
}
|
|
252
|
+
// ---------------------------------------------------------------
|
|
253
|
+
// 3. Fetch the latest version's material
|
|
254
|
+
// ---------------------------------------------------------------
|
|
255
|
+
const versionRow = await db
|
|
256
|
+
.select()
|
|
257
|
+
.from(companySecretVersions)
|
|
258
|
+
.where(and(eq(companySecretVersions.secretId, secret.id), eq(companySecretVersions.version, secret.latestVersion)))
|
|
259
|
+
.then((rows) => rows[0] ?? null);
|
|
260
|
+
if (!versionRow) {
|
|
261
|
+
throw secretVersionNotFound(trimmedRef);
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------
|
|
264
|
+
// 4. Resolve through the appropriate secret provider
|
|
265
|
+
// ---------------------------------------------------------------
|
|
266
|
+
const provider = getSecretProvider(secret.provider);
|
|
267
|
+
const resolved = await provider.resolveVersion({
|
|
268
|
+
material: versionRow.material,
|
|
269
|
+
externalRef: secret.externalRef,
|
|
270
|
+
});
|
|
271
|
+
return resolved;
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=plugin-secrets-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-secrets-handler.js","sourceRoot":"","sources":["../../src/services/plugin-secrets-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAQ,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IACxD,GAAG,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;IACnE,GAAG,CAAC,IAAI,GAAG,4BAA4B,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,qDAAqD;AACrD,MAAM,OAAO,GACX,iEAAiE,CAAC;AAEpE;;GAEG;AACH,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,MAAkD;IAElD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAExD,SAAS,IAAI,CAAC,IAA6B,EAAE,MAAc;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAiE,CAAC;QACrF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;gBAAE,SAAS;YAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACvC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YACD,qCAAqC;YACrC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAmB,EACnB,MAAuC;IAEvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,UAAU,IAAI,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEtE,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAElD,kEAAkE;IAClE,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,OAAO,GAAY,UAAU,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAAC,OAAO,GAAG,SAAS,CAAC;oBAAC,MAAM;gBAAC,CAAC;gBACnF,OAAO,GAAI,OAAmC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,+DAA+D;IAC/D,wBAAwB;IACxB,SAAS,OAAO,CAAC,KAAc;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AA6CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,yEAAyE;AACzE,SAAS,iBAAiB,CAAC,WAAmB,EAAE,QAAgB;IAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,OAAO;QACL,KAAK,CAAC,GAAW;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,GAAG,QAAQ,CAAC;YACnC,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;YAC5E,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW;gBAAE,OAAO,KAAK,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAAoC;IAEpC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAE3C,+DAA+D;IAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,iBAAiB,GAAuB,IAAI,CAAC;IACjD,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAChC,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,oCAAoC;IAExE,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAkC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;YAE7B,kEAAkE;YAClE,0DAA0D;YAC1D,kEAAkE;YAClE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBACnE,GAAG,CAAC,IAAI,GAAG,wBAAwB,CAAC;gBACpC,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,kEAAkE;YAClE,6BAA6B;YAC7B,kEAAkE;YAClE,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjF,MAAM,gBAAgB,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;YAEpC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxB,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;YAED,kEAAkE;YAClE,0EAA0E;YAC1E,kEAAkE;YAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG,uBAAuB,EAAE,CAAC;gBACxD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC5C,EAAE;yBACC,MAAM,EAAE;yBACR,IAAI,CAAC,YAAY,CAAC;yBAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;yBAC1C,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;oBAClC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;iBAC3B,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAI,MAAM,EAAE,YAA0D;oBAChF,EAAE,oBAA2D,CAAC;gBAChE,iBAAiB,GAAG,2BAA2B,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC/E,uBAAuB,GAAG,GAAG,GAAG,mBAAmB,CAAC;YACtD,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,gEAAgE;gBAChE,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAED,kEAAkE;YAClE,uCAAuC;YACvC,kEAAkE;YAClE,MAAM,MAAM,GAAG,MAAM,EAAE;iBACpB,MAAM,EAAE;iBACR,IAAI,CAAC,cAAc,CAAC;iBACpB,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;iBACxC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAED,kEAAkE;YAClE,yCAAyC;YACzC,kEAAkE;YAClE,MAAM,UAAU,GAAG,MAAM,EAAE;iBACxB,MAAM,EAAE;iBACR,IAAI,CAAC,qBAAqB,CAAC;iBAC3B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,EAC7C,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CACxD,CACF;iBACA,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;YAED,kEAAkE;YAClE,qDAAqD;YACrD,kEAAkE;YAClE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAA0B,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC;gBAC7C,QAAQ,EAAE,UAAU,CAAC,QAAmC;gBACxD,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { Db } from "@fideliosai/db";
|
|
2
|
+
import { pluginState } from "@fideliosai/db";
|
|
3
|
+
import type { PluginStateScopeKind, SetPluginState, ListPluginState } from "@fideliosai/shared";
|
|
4
|
+
/**
|
|
5
|
+
* Plugin State Store — scoped key-value persistence for plugin workers.
|
|
6
|
+
*
|
|
7
|
+
* Provides `get`, `set`, `delete`, and `list` operations over the
|
|
8
|
+
* `plugin_state` table. Each plugin's data is strictly namespaced by
|
|
9
|
+
* `pluginId` so plugins cannot read or write each other's state.
|
|
10
|
+
*
|
|
11
|
+
* This service implements the server-side backing for the `ctx.state` SDK
|
|
12
|
+
* client exposed to plugin workers. The host is responsible for:
|
|
13
|
+
* - enforcing `plugin.state.read` capability before calling `get` / `list`
|
|
14
|
+
* - enforcing `plugin.state.write` capability before calling `set` / `delete`
|
|
15
|
+
*
|
|
16
|
+
* @see PLUGIN_SPEC.md §14 — SDK Surface (`ctx.state`)
|
|
17
|
+
* @see PLUGIN_SPEC.md §15.1 — Capabilities: Plugin State
|
|
18
|
+
* @see PLUGIN_SPEC.md §21.3 — `plugin_state` table
|
|
19
|
+
*/
|
|
20
|
+
export declare function pluginStateStore(db: Db): {
|
|
21
|
+
/**
|
|
22
|
+
* Read a state value.
|
|
23
|
+
*
|
|
24
|
+
* Returns the stored JSON value, or `null` if no entry exists for the
|
|
25
|
+
* given scope and key.
|
|
26
|
+
*
|
|
27
|
+
* Requires `plugin.state.read` capability (enforced by the caller).
|
|
28
|
+
*
|
|
29
|
+
* @param pluginId - UUID of the owning plugin
|
|
30
|
+
* @param scopeKind - Granularity of the scope
|
|
31
|
+
* @param scopeId - Identifier for the scoped entity (null for `instance` scope)
|
|
32
|
+
* @param stateKey - The key to read
|
|
33
|
+
* @param namespace - Sub-namespace (defaults to `"default"`)
|
|
34
|
+
*/
|
|
35
|
+
get: (pluginId: string, scopeKind: PluginStateScopeKind, stateKey: string, { scopeId, namespace, }?: {
|
|
36
|
+
scopeId?: string;
|
|
37
|
+
namespace?: string;
|
|
38
|
+
}) => Promise<unknown>;
|
|
39
|
+
/**
|
|
40
|
+
* Write (create or replace) a state value.
|
|
41
|
+
*
|
|
42
|
+
* Uses an upsert so the caller does not need to check for prior existence.
|
|
43
|
+
* On conflict (same composite key) the existing row's `value_json` and
|
|
44
|
+
* `updated_at` are overwritten.
|
|
45
|
+
*
|
|
46
|
+
* Requires `plugin.state.write` capability (enforced by the caller).
|
|
47
|
+
*
|
|
48
|
+
* @param pluginId - UUID of the owning plugin
|
|
49
|
+
* @param input - Scope key and value to store
|
|
50
|
+
*/
|
|
51
|
+
set: (pluginId: string, input: SetPluginState) => Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete a state value.
|
|
54
|
+
*
|
|
55
|
+
* No-ops silently if the entry does not exist (idempotent by design).
|
|
56
|
+
*
|
|
57
|
+
* Requires `plugin.state.write` capability (enforced by the caller).
|
|
58
|
+
*
|
|
59
|
+
* @param pluginId - UUID of the owning plugin
|
|
60
|
+
* @param scopeKind - Granularity of the scope
|
|
61
|
+
* @param stateKey - The key to delete
|
|
62
|
+
* @param scopeId - Identifier for the scoped entity (null for `instance` scope)
|
|
63
|
+
* @param namespace - Sub-namespace (defaults to `"default"`)
|
|
64
|
+
*/
|
|
65
|
+
delete: (pluginId: string, scopeKind: PluginStateScopeKind, stateKey: string, { scopeId, namespace, }?: {
|
|
66
|
+
scopeId?: string;
|
|
67
|
+
namespace?: string;
|
|
68
|
+
}) => Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* List all state entries for a plugin, optionally filtered by scope.
|
|
71
|
+
*
|
|
72
|
+
* Returns all matching rows as `PluginStateRecord`-shaped objects.
|
|
73
|
+
* The `valueJson` field contains the stored value.
|
|
74
|
+
*
|
|
75
|
+
* Requires `plugin.state.read` capability (enforced by the caller).
|
|
76
|
+
*
|
|
77
|
+
* @param pluginId - UUID of the owning plugin
|
|
78
|
+
* @param filter - Optional scope filters (scopeKind, scopeId, namespace)
|
|
79
|
+
*/
|
|
80
|
+
list: (pluginId: string, filter?: ListPluginState) => Promise<(typeof pluginState.$inferSelect)[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete all state entries owned by a plugin.
|
|
83
|
+
*
|
|
84
|
+
* Called during plugin uninstall when `removeData = true`. Also useful
|
|
85
|
+
* for resetting a plugin's state during testing.
|
|
86
|
+
*
|
|
87
|
+
* @param pluginId - UUID of the owning plugin
|
|
88
|
+
*/
|
|
89
|
+
deleteAll: (pluginId: string) => Promise<void>;
|
|
90
|
+
};
|
|
91
|
+
export type PluginStateStore = ReturnType<typeof pluginStateStore>;
|
|
92
|
+
//# sourceMappingURL=plugin-state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-state-store.d.ts","sourceRoot":"","sources":["../../src/services/plugin-state-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAW,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,eAAe,EAChB,MAAM,oBAAoB,CAAC;AA6C5B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE;IAoBnC;;;;;;;;;;;;;OAaG;oBAES,MAAM,aACL,oBAAoB,YACrB,MAAM,4BAIb;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC1C,OAAO,CAAC,OAAO,CAAC;IASnB;;;;;;;;;;;OAWG;oBACmB,MAAM,SAAS,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;IAgCnE;;;;;;;;;;;;OAYG;uBAES,MAAM,aACL,oBAAoB,YACrB,MAAM,4BAIb;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC1C,OAAO,CAAC,IAAI,CAAC;IAMhB;;;;;;;;;;OAUG;qBACoB,MAAM,WAAU,eAAe,KAAQ,OAAO,CAAC,CAAA,OAAO,WAAW,CAAC,YAAY,GAAE,CAAC;IAmBxG;;;;;;;OAOG;0BACyB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAMrD;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|