@bevel-software/platform-core-backend 0.1.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 +202 -0
- package/dist/assets.d.ts +5 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +23 -0
- package/dist/assets.js.map +1 -0
- package/dist/core/core-ports.d.ts +83 -0
- package/dist/core/core-ports.d.ts.map +1 -0
- package/dist/core/core-ports.js +12 -0
- package/dist/core/core-ports.js.map +1 -0
- package/dist/core/create-core-server.d.ts +62 -0
- package/dist/core/create-core-server.d.ts.map +1 -0
- package/dist/core/create-core-server.js +204 -0
- package/dist/core/create-core-server.js.map +1 -0
- package/dist/core/create-core-services.d.ts +95 -0
- package/dist/core/create-core-services.d.ts.map +1 -0
- package/dist/core/create-core-services.js +352 -0
- package/dist/core/create-core-services.js.map +1 -0
- package/dist/core-config.d.ts +119 -0
- package/dist/core-config.d.ts.map +1 -0
- package/dist/core-config.js +240 -0
- package/dist/core-config.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/access/access-control.interface.d.ts +348 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -0
- package/dist/modules/access/access-control.interface.js +2 -0
- package/dist/modules/access/access-control.interface.js.map +1 -0
- package/dist/modules/access/access-control.service.d.ts +323 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -0
- package/dist/modules/access/access-control.service.js +1431 -0
- package/dist/modules/access/access-control.service.js.map +1 -0
- package/dist/modules/access/access-errors.d.ts +34 -0
- package/dist/modules/access/access-errors.d.ts.map +1 -0
- package/dist/modules/access/access-errors.js +40 -0
- package/dist/modules/access/access-errors.js.map +1 -0
- package/dist/modules/access/access-mutation.service.d.ts +176 -0
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -0
- package/dist/modules/access/access-mutation.service.js +307 -0
- package/dist/modules/access/access-mutation.service.js.map +1 -0
- package/dist/modules/access/access-splice.d.ts +98 -0
- package/dist/modules/access/access-splice.d.ts.map +1 -0
- package/dist/modules/access/access-splice.js +346 -0
- package/dist/modules/access/access-splice.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +10 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -0
- package/dist/modules/access/access.routes.js +757 -0
- package/dist/modules/access/access.routes.js.map +1 -0
- package/dist/modules/access/creator-access.d.ts +113 -0
- package/dist/modules/access/creator-access.d.ts.map +1 -0
- package/dist/modules/access/creator-access.js +212 -0
- package/dist/modules/access/creator-access.js.map +1 -0
- package/dist/modules/access/kb-read-filter.d.ts +41 -0
- package/dist/modules/access/kb-read-filter.d.ts.map +1 -0
- package/dist/modules/access/kb-read-filter.js +60 -0
- package/dist/modules/access/kb-read-filter.js.map +1 -0
- package/dist/modules/access/roles-admin.service.d.ts +240 -0
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -0
- package/dist/modules/access/roles-admin.service.js +630 -0
- package/dist/modules/access/roles-admin.service.js.map +1 -0
- package/dist/modules/access/roles-edit.d.ts +91 -0
- package/dist/modules/access/roles-edit.d.ts.map +1 -0
- package/dist/modules/access/roles-edit.js +232 -0
- package/dist/modules/access/roles-edit.js.map +1 -0
- package/dist/modules/access/roles-yaml-guard.d.ts +56 -0
- package/dist/modules/access/roles-yaml-guard.d.ts.map +1 -0
- package/dist/modules/access/roles-yaml-guard.js +79 -0
- package/dist/modules/access/roles-yaml-guard.js.map +1 -0
- package/dist/modules/admin/admin-access.routes.d.ts +18 -0
- package/dist/modules/admin/admin-access.routes.d.ts.map +1 -0
- package/dist/modules/admin/admin-access.routes.js +26 -0
- package/dist/modules/admin/admin-access.routes.js.map +1 -0
- package/dist/modules/admin/admin-access.service.d.ts +24 -0
- package/dist/modules/admin/admin-access.service.d.ts.map +1 -0
- package/dist/modules/admin/admin-access.service.js +41 -0
- package/dist/modules/admin/admin-access.service.js.map +1 -0
- package/dist/modules/admin/admin.interface.d.ts +11 -0
- package/dist/modules/admin/admin.interface.d.ts.map +1 -0
- package/dist/modules/admin/admin.interface.js +2 -0
- package/dist/modules/admin/admin.interface.js.map +1 -0
- package/dist/modules/auth/account-erasure.service.d.ts +80 -0
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -0
- package/dist/modules/auth/account-erasure.service.js +91 -0
- package/dist/modules/auth/account-erasure.service.js.map +1 -0
- package/dist/modules/auth/auth.middleware.d.ts +23 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -0
- package/dist/modules/auth/auth.middleware.js +68 -0
- package/dist/modules/auth/auth.middleware.js.map +1 -0
- package/dist/modules/auth/auth.routes.d.ts +25 -0
- package/dist/modules/auth/auth.routes.d.ts.map +1 -0
- package/dist/modules/auth/auth.routes.js +72 -0
- package/dist/modules/auth/auth.routes.js.map +1 -0
- package/dist/modules/auth/auth.service.d.ts +76 -0
- package/dist/modules/auth/auth.service.d.ts.map +1 -0
- package/dist/modules/auth/auth.service.js +168 -0
- package/dist/modules/auth/auth.service.js.map +1 -0
- package/dist/modules/code-mode/code-mode-names.d.ts +16 -0
- package/dist/modules/code-mode/code-mode-names.d.ts.map +1 -0
- package/dist/modules/code-mode/code-mode-names.js +30 -0
- package/dist/modules/code-mode/code-mode-names.js.map +1 -0
- package/dist/modules/code-mode/code-mode.tool.d.ts +13 -0
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -0
- package/dist/modules/code-mode/code-mode.tool.js +112 -0
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -0
- package/dist/modules/code-mode/index.d.ts +3 -0
- package/dist/modules/code-mode/index.d.ts.map +1 -0
- package/dist/modules/code-mode/index.js +3 -0
- package/dist/modules/code-mode/index.js.map +1 -0
- package/dist/modules/database/connection.d.ts +6 -0
- package/dist/modules/database/connection.d.ts.map +1 -0
- package/dist/modules/database/connection.js +12 -0
- package/dist/modules/database/connection.js.map +1 -0
- package/dist/modules/database/core-schema.d.ts +2273 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -0
- package/dist/modules/database/core-schema.js +413 -0
- package/dist/modules/database/core-schema.js.map +1 -0
- package/dist/modules/database/migrate.d.ts +10 -0
- package/dist/modules/database/migrate.d.ts.map +1 -0
- package/dist/modules/database/migrate.js +40 -0
- package/dist/modules/database/migrate.js.map +1 -0
- package/dist/modules/database/schema.d.ts +12 -0
- package/dist/modules/database/schema.d.ts.map +1 -0
- package/dist/modules/database/schema.js +12 -0
- package/dist/modules/database/schema.js.map +1 -0
- package/dist/modules/diff/diff-paths.d.ts +2 -0
- package/dist/modules/diff/diff-paths.d.ts.map +1 -0
- package/dist/modules/diff/diff-paths.js +9 -0
- package/dist/modules/diff/diff-paths.js.map +1 -0
- package/dist/modules/diff/diff.config.d.ts +8 -0
- package/dist/modules/diff/diff.config.d.ts.map +1 -0
- package/dist/modules/diff/diff.config.js +13 -0
- package/dist/modules/diff/diff.config.js.map +1 -0
- package/dist/modules/diff/diff.interface.d.ts +73 -0
- package/dist/modules/diff/diff.interface.d.ts.map +1 -0
- package/dist/modules/diff/diff.interface.js +2 -0
- package/dist/modules/diff/diff.interface.js.map +1 -0
- package/dist/modules/diff/diff.routes.d.ts +35 -0
- package/dist/modules/diff/diff.routes.d.ts.map +1 -0
- package/dist/modules/diff/diff.routes.js +228 -0
- package/dist/modules/diff/diff.routes.js.map +1 -0
- package/dist/modules/diff/diff.service.d.ts +51 -0
- package/dist/modules/diff/diff.service.d.ts.map +1 -0
- package/dist/modules/diff/diff.service.js +489 -0
- package/dist/modules/diff/diff.service.js.map +1 -0
- package/dist/modules/diff/line-diff.d.ts +16 -0
- package/dist/modules/diff/line-diff.d.ts.map +1 -0
- package/dist/modules/diff/line-diff.js +67 -0
- package/dist/modules/diff/line-diff.js.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +27 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.js +116 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -0
- package/dist/modules/mcp/mcp-session-store.d.ts +74 -0
- package/dist/modules/mcp/mcp-session-store.d.ts.map +1 -0
- package/dist/modules/mcp/mcp-session-store.js +131 -0
- package/dist/modules/mcp/mcp-session-store.js.map +1 -0
- package/dist/modules/mcp/mcp.routes.d.ts +24 -0
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -0
- package/dist/modules/mcp/mcp.routes.js +229 -0
- package/dist/modules/mcp/mcp.routes.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +198 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -0
- package/dist/modules/mcp/mcp.service.js +840 -0
- package/dist/modules/mcp/mcp.service.js.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +76 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +291 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +18 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +52 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -0
- package/dist/modules/mcp/oauth/oauth-state.d.ts +32 -0
- package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/oauth-state.js +34 -0
- package/dist/modules/mcp/oauth/oauth-state.js.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +92 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +728 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -0
- package/dist/modules/secrets-vault/index.d.ts +7 -0
- package/dist/modules/secrets-vault/index.d.ts.map +1 -0
- package/dist/modules/secrets-vault/index.js +6 -0
- package/dist/modules/secrets-vault/index.js.map +1 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts +63 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +269 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +46 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.js +87 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +210 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js +90 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +30 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.js +490 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -0
- package/dist/modules/skills/index.d.ts +5 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +4 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/skills.contract.d.ts +58 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -0
- package/dist/modules/skills/skills.contract.js +10 -0
- package/dist/modules/skills/skills.contract.js.map +1 -0
- package/dist/modules/skills/skills.routes.d.ts +15 -0
- package/dist/modules/skills/skills.routes.d.ts.map +1 -0
- package/dist/modules/skills/skills.routes.js +34 -0
- package/dist/modules/skills/skills.routes.js.map +1 -0
- package/dist/modules/skills/skills.service.d.ts +21 -0
- package/dist/modules/skills/skills.service.d.ts.map +1 -0
- package/dist/modules/skills/skills.service.js +202 -0
- package/dist/modules/skills/skills.service.js.map +1 -0
- package/dist/modules/skills/skills.tools.d.ts +15 -0
- package/dist/modules/skills/skills.tools.d.ts.map +1 -0
- package/dist/modules/skills/skills.tools.js +96 -0
- package/dist/modules/skills/skills.tools.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.errors.d.ts +14 -0
- package/dist/modules/tool-auth/external-api-key.errors.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.errors.js +23 -0
- package/dist/modules/tool-auth/external-api-key.errors.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +90 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.js +2 -0
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts +25 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.service.js +164 -0
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts +62 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -0
- package/dist/modules/tool-auth/internal-token.service.js +85 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -0
- package/dist/modules/tool-auth/llm-usage-meter.d.ts +16 -0
- package/dist/modules/tool-auth/llm-usage-meter.d.ts.map +1 -0
- package/dist/modules/tool-auth/llm-usage-meter.js +6 -0
- package/dist/modules/tool-auth/llm-usage-meter.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +101 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.js +166 -0
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -0
- package/dist/modules/tool-helpers/index.d.ts +19 -0
- package/dist/modules/tool-helpers/index.d.ts.map +1 -0
- package/dist/modules/tool-helpers/index.js +18 -0
- package/dist/modules/tool-helpers/index.js.map +1 -0
- package/dist/modules/tool-helpers/tool-context.d.ts +35 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-context.js +66 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +33 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-def.js +57 -0
- package/dist/modules/tool-helpers/tool-def.js.map +1 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts +19 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-handler.js +84 -0
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts +64 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool.contract.js +24 -0
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -0
- package/dist/modules/tool-helpers/validate-token.d.ts +31 -0
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -0
- package/dist/modules/tool-helpers/validate-token.js +20 -0
- package/dist/modules/tool-helpers/validate-token.js.map +1 -0
- package/dist/modules/tool-manuals/index.d.ts +5 -0
- package/dist/modules/tool-manuals/index.d.ts.map +1 -0
- package/dist/modules/tool-manuals/index.js +5 -0
- package/dist/modules/tool-manuals/index.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +182 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js +19 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +24 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.js +102 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +108 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js +710 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +35 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.js +157 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -0
- package/dist/modules/tool-registry/manual.routes.d.ts +6 -0
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -0
- package/dist/modules/tool-registry/manual.routes.js +76 -0
- package/dist/modules/tool-registry/manual.routes.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +23 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -0
- package/dist/modules/tool-registry/tool-registry.js +46 -0
- package/dist/modules/tool-registry/tool-registry.js.map +1 -0
- package/dist/modules/tool-registry/tool.contract.d.ts +48 -0
- package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -0
- package/dist/modules/tool-registry/tool.contract.js +2 -0
- package/dist/modules/tool-registry/tool.contract.js.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +14 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.js +437 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -0
- package/dist/modules/workflow/event-bus.d.ts +107 -0
- package/dist/modules/workflow/event-bus.d.ts.map +1 -0
- package/dist/modules/workflow/event-bus.js +224 -0
- package/dist/modules/workflow/event-bus.js.map +1 -0
- package/dist/modules/workflow/events.routes.d.ts +80 -0
- package/dist/modules/workflow/events.routes.d.ts.map +1 -0
- package/dist/modules/workflow/events.routes.js +216 -0
- package/dist/modules/workflow/events.routes.js.map +1 -0
- package/dist/modules/workflow/file-change-notifier.d.ts +38 -0
- package/dist/modules/workflow/file-change-notifier.d.ts.map +1 -0
- package/dist/modules/workflow/file-change-notifier.js +22 -0
- package/dist/modules/workflow/file-change-notifier.js.map +1 -0
- package/dist/modules/workflow/file-lock.service.d.ts +57 -0
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -0
- package/dist/modules/workflow/file-lock.service.js +202 -0
- package/dist/modules/workflow/file-lock.service.js.map +1 -0
- package/dist/modules/workflow/git/branch-name.d.ts +10 -0
- package/dist/modules/workflow/git/branch-name.d.ts.map +1 -0
- package/dist/modules/workflow/git/branch-name.js +76 -0
- package/dist/modules/workflow/git/branch-name.js.map +1 -0
- package/dist/modules/workflow/git/clone-config.d.ts +61 -0
- package/dist/modules/workflow/git/clone-config.d.ts.map +1 -0
- package/dist/modules/workflow/git/clone-config.js +69 -0
- package/dist/modules/workflow/git/clone-config.js.map +1 -0
- package/dist/modules/workflow/git/git-version.d.ts +34 -0
- package/dist/modules/workflow/git/git-version.d.ts.map +1 -0
- package/dist/modules/workflow/git/git-version.js +63 -0
- package/dist/modules/workflow/git/git-version.js.map +1 -0
- package/dist/modules/workflow/git/git.service.d.ts +427 -0
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -0
- package/dist/modules/workflow/git/git.service.js +1987 -0
- package/dist/modules/workflow/git/git.service.js.map +1 -0
- package/dist/modules/workflow/git/mutex.d.ts +11 -0
- package/dist/modules/workflow/git/mutex.d.ts.map +1 -0
- package/dist/modules/workflow/git/mutex.js +23 -0
- package/dist/modules/workflow/git/mutex.js.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts +124 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.js +328 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -0
- package/dist/modules/workflow/locking-filesystem.d.ts +133 -0
- package/dist/modules/workflow/locking-filesystem.d.ts.map +1 -0
- package/dist/modules/workflow/locking-filesystem.js +400 -0
- package/dist/modules/workflow/locking-filesystem.js.map +1 -0
- package/dist/modules/workflow/pending-commits.service.d.ts +221 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/workflow/pending-commits.service.js +364 -0
- package/dist/modules/workflow/pending-commits.service.js.map +1 -0
- package/dist/modules/workflow/pending-commits.worker.d.ts +148 -0
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/workflow/pending-commits.worker.js +245 -0
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -0
- package/dist/modules/workflow/read-only-filesystem.d.ts +24 -0
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +1 -0
- package/dist/modules/workflow/read-only-filesystem.js +39 -0
- package/dist/modules/workflow/read-only-filesystem.js.map +1 -0
- package/dist/modules/workflow/recovery-bot.d.ts +31 -0
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -0
- package/dist/modules/workflow/recovery-bot.js +64 -0
- package/dist/modules/workflow/recovery-bot.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +137 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +2 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +26 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +636 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -0
- package/dist/modules/workflow/sanitize-error.d.ts +29 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -0
- package/dist/modules/workflow/sanitize-error.js +60 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -0
- package/dist/modules/workflow/session-ontology.policy.d.ts +52 -0
- package/dist/modules/workflow/session-ontology.policy.d.ts.map +1 -0
- package/dist/modules/workflow/session-ontology.policy.js +62 -0
- package/dist/modules/workflow/session-ontology.policy.js.map +1 -0
- package/dist/modules/workflow/session-ontology.service.d.ts +100 -0
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -0
- package/dist/modules/workflow/session-ontology.service.js +143 -0
- package/dist/modules/workflow/session-ontology.service.js.map +1 -0
- package/dist/modules/workflow/workflow-hooks.d.ts +87 -0
- package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -0
- package/dist/modules/workflow/workflow-hooks.js +35 -0
- package/dist/modules/workflow/workflow-hooks.js.map +1 -0
- package/dist/modules/workflow/workflow.errors.d.ts +171 -0
- package/dist/modules/workflow/workflow.errors.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.errors.js +260 -0
- package/dist/modules/workflow/workflow.errors.js.map +1 -0
- package/dist/modules/workflow/workflow.routes.d.ts +26 -0
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.routes.js +804 -0
- package/dist/modules/workflow/workflow.routes.js.map +1 -0
- package/dist/modules/workflow/workflow.service.d.ts +385 -0
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.service.js +1155 -0
- package/dist/modules/workflow/workflow.service.js.map +1 -0
- package/dist/modules/workspace/bevel-ignore.d.ts +25 -0
- package/dist/modules/workspace/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/workspace/bevel-ignore.js +57 -0
- package/dist/modules/workspace/bevel-ignore.js.map +1 -0
- package/dist/modules/workspace/kb-seed.interface.d.ts +36 -0
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +1 -0
- package/dist/modules/workspace/kb-seed.interface.js +2 -0
- package/dist/modules/workspace/kb-seed.interface.js.map +1 -0
- package/dist/modules/workspace/kb-seed.service.d.ts +70 -0
- package/dist/modules/workspace/kb-seed.service.d.ts.map +1 -0
- package/dist/modules/workspace/kb-seed.service.js +325 -0
- package/dist/modules/workspace/kb-seed.service.js.map +1 -0
- package/dist/modules/workspace/routine-write-policy.d.ts +49 -0
- package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -0
- package/dist/modules/workspace/routine-write-policy.js +46 -0
- package/dist/modules/workspace/routine-write-policy.js.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts +112 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.js +161 -0
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -0
- package/dist/modules/workspace/session-sink.d.ts +25 -0
- package/dist/modules/workspace/session-sink.d.ts.map +1 -0
- package/dist/modules/workspace/session-sink.js +8 -0
- package/dist/modules/workspace/session-sink.js.map +1 -0
- package/dist/modules/workspace/spill-store.d.ts +24 -0
- package/dist/modules/workspace/spill-store.d.ts.map +1 -0
- package/dist/modules/workspace/spill-store.js +87 -0
- package/dist/modules/workspace/spill-store.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts +25 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.routes.js +1046 -0
- package/dist/modules/workspace/workspace.routes.js.map +1 -0
- package/dist/modules/workspace/workspace.service.d.ts +339 -0
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.service.js +1221 -0
- package/dist/modules/workspace/workspace.service.js.map +1 -0
- package/dist/modules/workspace/workspace.tools.d.ts +19 -0
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.tools.js +767 -0
- package/dist/modules/workspace/workspace.tools.js.map +1 -0
- package/dist/shared/frontmatter-id.d.ts +35 -0
- package/dist/shared/frontmatter-id.d.ts.map +1 -0
- package/dist/shared/frontmatter-id.js +68 -0
- package/dist/shared/frontmatter-id.js.map +1 -0
- package/dist/shared/fs-walk.d.ts +9 -0
- package/dist/shared/fs-walk.d.ts.map +1 -0
- package/dist/shared/fs-walk.js +34 -0
- package/dist/shared/fs-walk.js.map +1 -0
- package/dist/shared/hash-email.d.ts +11 -0
- package/dist/shared/hash-email.d.ts.map +1 -0
- package/dist/shared/hash-email.js +14 -0
- package/dist/shared/hash-email.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +38 -0
- package/dist/shared/kb-layout.d.ts.map +1 -0
- package/dist/shared/kb-layout.js +102 -0
- package/dist/shared/kb-layout.js.map +1 -0
- package/dist/shared/kb-layout.test.d.ts +2 -0
- package/dist/shared/kb-layout.test.d.ts.map +1 -0
- package/dist/shared/kb-layout.test.js +67 -0
- package/dist/shared/kb-layout.test.js.map +1 -0
- package/dist/shared/ssrf.d.ts +20 -0
- package/dist/shared/ssrf.d.ts.map +1 -0
- package/dist/shared/ssrf.js +89 -0
- package/dist/shared/ssrf.js.map +1 -0
- package/dist/shared/token-crypto.d.ts +16 -0
- package/dist/shared/token-crypto.d.ts.map +1 -0
- package/dist/shared/token-crypto.js +49 -0
- package/dist/shared/token-crypto.js.map +1 -0
- package/dist/shared/ttl-cache.d.ts +16 -0
- package/dist/shared/ttl-cache.d.ts.map +1 -0
- package/dist/shared/ttl-cache.js +27 -0
- package/dist/shared/ttl-cache.js.map +1 -0
- package/dist/shared/utcp-namespace.d.ts +46 -0
- package/dist/shared/utcp-namespace.d.ts.map +1 -0
- package/dist/shared/utcp-namespace.js +82 -0
- package/dist/shared/utcp-namespace.js.map +1 -0
- package/dist/version.d.ts +17 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/kb-template/.bevelignore +21 -0
- package/kb-template/Agents/.gitkeep +0 -0
- package/kb-template/Agents/README.md +38 -0
- package/kb-template/CLAUDE.md +419 -0
- package/kb-template/Data/.gitkeep +0 -0
- package/kb-template/Data/README.md +39 -0
- package/kb-template/KnowledgeBase/.gitkeep +0 -0
- package/kb-template/KnowledgeBase/README.md +37 -0
- package/kb-template/Pipelines/.gitkeep +0 -0
- package/kb-template/Pipelines/README.md +38 -0
- package/kb-template/Skills/.gitkeep +0 -0
- package/kb-template/Skills/README.md +32 -0
- package/kb-template/Tools/.gitkeep +0 -0
- package/kb-template/Tools/README.md +42 -0
- package/kb-template/access.md +36 -0
- package/migrations/0000_core_init.sql +243 -0
- package/migrations/meta/0000_snapshot.json +1480 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +80 -0
- package/src/assets.ts +25 -0
- package/src/core/core-ports.ts +91 -0
- package/src/core/create-core-server.ts +338 -0
- package/src/core/create-core-services.ts +501 -0
- package/src/core-config.ts +257 -0
- package/src/index.ts +69 -0
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +98 -0
- package/src/modules/access/__tests__/access-control.read-batch.test.ts +132 -0
- package/src/modules/access/__tests__/access-control.service.test.ts +1011 -0
- package/src/modules/access/__tests__/access-mutation.service.test.ts +439 -0
- package/src/modules/access/__tests__/access-splice.test.ts +247 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +407 -0
- package/src/modules/access/__tests__/creator-access.test.ts +217 -0
- package/src/modules/access/__tests__/grant-sources.test.ts +204 -0
- package/src/modules/access/__tests__/kb-read-filter.test.ts +70 -0
- package/src/modules/access/__tests__/roles-admin.service.test.ts +469 -0
- package/src/modules/access/__tests__/roles-edit.test.ts +138 -0
- package/src/modules/access/__tests__/roles-yaml-guard.test.ts +70 -0
- package/src/modules/access/__tests__/roles.routes.test.ts +234 -0
- package/src/modules/access/access-control.interface.ts +383 -0
- package/src/modules/access/access-control.service.ts +1794 -0
- package/src/modules/access/access-errors.ts +60 -0
- package/src/modules/access/access-mutation.service.ts +369 -0
- package/src/modules/access/access-splice.ts +413 -0
- package/src/modules/access/access.routes.ts +894 -0
- package/src/modules/access/creator-access.ts +270 -0
- package/src/modules/access/kb-read-filter.ts +76 -0
- package/src/modules/access/roles-admin.service.ts +741 -0
- package/src/modules/access/roles-edit.ts +248 -0
- package/src/modules/access/roles-yaml-guard.ts +89 -0
- package/src/modules/admin/admin-access.routes.ts +29 -0
- package/src/modules/admin/admin-access.service.ts +38 -0
- package/src/modules/admin/admin.interface.ts +10 -0
- package/src/modules/auth/account-erasure.service.ts +183 -0
- package/src/modules/auth/auth.middleware.ts +78 -0
- package/src/modules/auth/auth.routes.ts +97 -0
- package/src/modules/auth/auth.service.ts +199 -0
- package/src/modules/code-mode/code-mode-names.ts +38 -0
- package/src/modules/code-mode/code-mode.tool.ts +117 -0
- package/src/modules/code-mode/index.ts +6 -0
- package/src/modules/database/connection.ts +15 -0
- package/src/modules/database/core-schema.ts +431 -0
- package/src/modules/database/migrate.ts +43 -0
- package/src/modules/database/schema.ts +11 -0
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +87 -0
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +150 -0
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +184 -0
- package/src/modules/diff/__tests__/diff.service.test.ts +202 -0
- package/src/modules/diff/diff-paths.ts +9 -0
- package/src/modules/diff/diff.config.ts +12 -0
- package/src/modules/diff/diff.interface.ts +78 -0
- package/src/modules/diff/diff.routes.ts +277 -0
- package/src/modules/diff/diff.service.ts +508 -0
- package/src/modules/diff/line-diff.ts +79 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +287 -0
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +249 -0
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +253 -0
- package/src/modules/mcp/__tests__/mcp-session-store.test.ts +151 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +150 -0
- package/src/modules/mcp/__tests__/mcp.routes.delete.test.ts +92 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +414 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +126 -0
- package/src/modules/mcp/mcp-session-store.ts +162 -0
- package/src/modules/mcp/mcp.routes.ts +263 -0
- package/src/modules/mcp/mcp.service.ts +973 -0
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +401 -0
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +60 -0
- package/src/modules/mcp/oauth/oauth-state.ts +61 -0
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +277 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +206 -0
- package/src/modules/secrets-vault/__tests__/mcp-oauth-discovery.service.test.ts +178 -0
- package/src/modules/secrets-vault/__tests__/scopes-covered.test.ts +101 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +54 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +143 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +792 -0
- package/src/modules/secrets-vault/index.ts +25 -0
- package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +289 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +104 -0
- package/src/modules/secrets-vault/secrets-vault.contract.ts +270 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +526 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +176 -0
- package/src/modules/skills/index.ts +10 -0
- package/src/modules/skills/skills.contract.ts +54 -0
- package/src/modules/skills/skills.routes.ts +38 -0
- package/src/modules/skills/skills.service.ts +245 -0
- package/src/modules/skills/skills.tools.ts +121 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +358 -0
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +79 -0
- package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +88 -0
- package/src/modules/tool-auth/external-api-key.errors.ts +25 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +99 -0
- package/src/modules/tool-auth/external-api-key.service.ts +209 -0
- package/src/modules/tool-auth/internal-token.service.ts +124 -0
- package/src/modules/tool-auth/llm-usage-meter.ts +19 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +220 -0
- package/src/modules/tool-helpers/__tests__/phase0-loopback-spike.test.ts +129 -0
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +95 -0
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +146 -0
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +75 -0
- package/src/modules/tool-helpers/index.ts +18 -0
- package/src/modules/tool-helpers/tool-context.ts +98 -0
- package/src/modules/tool-helpers/tool-def.ts +73 -0
- package/src/modules/tool-helpers/tool-handler.ts +91 -0
- package/src/modules/tool-helpers/tool.contract.ts +85 -0
- package/src/modules/tool-helpers/validate-token.ts +50 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +200 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +499 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +156 -0
- package/src/modules/tool-manuals/index.ts +12 -0
- package/src/modules/tool-manuals/tool-manuals.contract.ts +183 -0
- package/src/modules/tool-manuals/tool-manuals.routes.ts +110 -0
- package/src/modules/tool-manuals/tool-manuals.service.ts +781 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +202 -0
- package/src/modules/tool-registry/__tests__/tool-registry.test.ts +64 -0
- package/src/modules/tool-registry/manual.routes.ts +87 -0
- package/src/modules/tool-registry/tool-registry.ts +55 -0
- package/src/modules/tool-registry/tool.contract.ts +52 -0
- package/src/modules/workflow/__tests__/event-bus.test.ts +322 -0
- package/src/modules/workflow/__tests__/file-change-notifier.test.ts +51 -0
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +67 -0
- package/src/modules/workflow/__tests__/locking-filesystem.test.ts +445 -0
- package/src/modules/workflow/__tests__/pending-commits.canonical.test.ts +36 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +243 -0
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +308 -0
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +67 -0
- package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +62 -0
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +200 -0
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +232 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +380 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +340 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +192 -0
- package/src/modules/workflow/agent-tools/workflow.tools.ts +502 -0
- package/src/modules/workflow/event-bus.ts +262 -0
- package/src/modules/workflow/events.routes.ts +266 -0
- package/src/modules/workflow/file-change-notifier.ts +54 -0
- package/src/modules/workflow/file-lock.service.ts +269 -0
- package/src/modules/workflow/git/__tests__/branch-name.test.ts +86 -0
- package/src/modules/workflow/git/__tests__/branchAuthor.test.ts +80 -0
- package/src/modules/workflow/git/__tests__/clone-config.test.ts +15 -0
- package/src/modules/workflow/git/__tests__/git-test-helpers.ts +47 -0
- package/src/modules/workflow/git/__tests__/git-version.failure.test.ts +24 -0
- package/src/modules/workflow/git/__tests__/git-version.test.ts +49 -0
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +389 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +105 -0
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +211 -0
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +154 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +320 -0
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +202 -0
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +453 -0
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +198 -0
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +125 -0
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +219 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +145 -0
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +240 -0
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +272 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +232 -0
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +101 -0
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +127 -0
- package/src/modules/workflow/git/__tests__/mutex.test.ts +78 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +225 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +101 -0
- package/src/modules/workflow/git/branch-name.ts +70 -0
- package/src/modules/workflow/git/clone-config.ts +71 -0
- package/src/modules/workflow/git/git-version.ts +70 -0
- package/src/modules/workflow/git/git.service.ts +2248 -0
- package/src/modules/workflow/git/mutex.ts +22 -0
- package/src/modules/workflow/git/pull-request.service.ts +447 -0
- package/src/modules/workflow/locking-filesystem.ts +489 -0
- package/src/modules/workflow/pending-commits.service.ts +444 -0
- package/src/modules/workflow/pending-commits.worker.ts +361 -0
- package/src/modules/workflow/read-only-filesystem.ts +54 -0
- package/src/modules/workflow/recovery-bot.ts +73 -0
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +560 -0
- package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +176 -0
- package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +258 -0
- package/src/modules/workflow/review-workflow/review-workflow.interface.ts +199 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +806 -0
- package/src/modules/workflow/sanitize-error.ts +62 -0
- package/src/modules/workflow/session-ontology.policy.ts +70 -0
- package/src/modules/workflow/session-ontology.service.ts +178 -0
- package/src/modules/workflow/workflow-hooks.ts +101 -0
- package/src/modules/workflow/workflow.errors.ts +285 -0
- package/src/modules/workflow/workflow.routes.ts +858 -0
- package/src/modules/workflow/workflow.service.ts +1555 -0
- package/src/modules/workspace/__tests__/kb-seed.service.test.ts +213 -0
- package/src/modules/workspace/__tests__/routine-write-policy.test.ts +68 -0
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +237 -0
- package/src/modules/workspace/__tests__/spill-store.test.ts +43 -0
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +233 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +176 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +303 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +276 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +120 -0
- package/src/modules/workspace/__tests__/workspace.service.test.ts +565 -0
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +504 -0
- package/src/modules/workspace/bevel-ignore.ts +62 -0
- package/src/modules/workspace/kb-seed.interface.ts +36 -0
- package/src/modules/workspace/kb-seed.service.ts +361 -0
- package/src/modules/workspace/routine-write-policy.ts +79 -0
- package/src/modules/workspace/session-ontology.gate.ts +189 -0
- package/src/modules/workspace/session-sink.ts +25 -0
- package/src/modules/workspace/spill-store.ts +87 -0
- package/src/modules/workspace/workspace.routes.ts +1114 -0
- package/src/modules/workspace/workspace.service.ts +1343 -0
- package/src/modules/workspace/workspace.tools.ts +885 -0
- package/src/shared/__tests__/frontmatter-id.test.ts +88 -0
- package/src/shared/__tests__/fs-walk.test.ts +42 -0
- package/src/shared/__tests__/ssrf.test.ts +53 -0
- package/src/shared/__tests__/utcp-namespace.test.ts +19 -0
- package/src/shared/frontmatter-id.ts +72 -0
- package/src/shared/fs-walk.ts +30 -0
- package/src/shared/hash-email.ts +14 -0
- package/src/shared/kb-layout.test.ts +88 -0
- package/src/shared/kb-layout.ts +101 -0
- package/src/shared/ssrf.ts +78 -0
- package/src/shared/token-crypto.ts +54 -0
- package/src/shared/ttl-cache.ts +27 -0
- package/src/shared/utcp-namespace.ts +88 -0
- package/src/version.ts +19 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { DbSecretsVaultService } from './db-secrets-vault.service.js';
|
|
2
|
+
export { McpOAuthDiscoveryService, type McpAuthDiscovery } from './mcp-oauth-discovery.service.js';
|
|
3
|
+
export {
|
|
4
|
+
createSecretsVaultRoutes,
|
|
5
|
+
createSecretsVaultPublicRoutes,
|
|
6
|
+
type SecretsVaultRoutesDeps,
|
|
7
|
+
} from './secrets-vault.routes.js';
|
|
8
|
+
export type {
|
|
9
|
+
ISecretsVaultService,
|
|
10
|
+
SecretSummary,
|
|
11
|
+
SecretKind,
|
|
12
|
+
OAuthProviderConfig,
|
|
13
|
+
PutStaticSecretInput,
|
|
14
|
+
CreateOAuthSecretInput,
|
|
15
|
+
} from './secrets-vault.contract.js';
|
|
16
|
+
export {
|
|
17
|
+
InvalidSecretError,
|
|
18
|
+
SecretNotFoundError,
|
|
19
|
+
SecretOAuthError,
|
|
20
|
+
} from './secrets-vault.contract.js';
|
|
21
|
+
export {
|
|
22
|
+
registerBevelSecretsVariableLoader,
|
|
23
|
+
bevelSecretsLoaderConfig,
|
|
24
|
+
BEVEL_SECRETS_LOADER_TYPE,
|
|
25
|
+
} from './secrets-variable-loader.js';
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import type { ISecretsVaultService, OAuthProviderConfig } from './secrets-vault.contract.js';
|
|
2
|
+
import { assertSafeFetchUrl } from '../../shared/ssrf.js';
|
|
3
|
+
import { utcpNamespacedKey, MCP_OAUTH_VAR } from '../../shared/utcp-namespace.js';
|
|
4
|
+
|
|
5
|
+
export type McpAuthDiscovery =
|
|
6
|
+
/** The server answered without demanding auth — nothing to configure. */
|
|
7
|
+
| { status: 'open' }
|
|
8
|
+
/** OAuth discovered (or already registered); per-user sign-in via the vault. */
|
|
9
|
+
| { status: 'oauth'; provider: OAuthProviderConfig }
|
|
10
|
+
/** The server wants auth but the spec chain didn't complete — leave the tool as-is. */
|
|
11
|
+
| { status: 'unsupported'; reason: string };
|
|
12
|
+
|
|
13
|
+
const FETCH_TIMEOUT_MS = 5_000;
|
|
14
|
+
/** Re-probe an open/unsupported server after this long (it may grow/lose auth). */
|
|
15
|
+
const NEGATIVE_TTL_MS = 5 * 60_000;
|
|
16
|
+
/** A discovered provider is durable (shared vault row); cache is just DB-pressure relief. */
|
|
17
|
+
const OAUTH_TTL_MS = 60 * 60_000;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Zero-config OAuth for `type: mcp` `.tool`s — the MCP authorization spec makes
|
|
21
|
+
* everything a bare `url` needs discoverable, so a tool file shouldn't have to
|
|
22
|
+
* declare any of it. Given a manual that points at a remote MCP server:
|
|
23
|
+
*
|
|
24
|
+
* 1. probe the server — no 401 ⇒ it's open, done;
|
|
25
|
+
* 2. on 401, follow RFC 9728: the protected-resource metadata (from the
|
|
26
|
+
* `WWW-Authenticate: resource_metadata` pointer or the well-known paths)
|
|
27
|
+
* names the authorization server;
|
|
28
|
+
* 3. fetch the AS metadata, dynamically register (RFC 7591) as a PUBLIC
|
|
29
|
+
* client — PKCE only, no client secret — with our existing secrets-vault
|
|
30
|
+
* callback as the redirect URI;
|
|
31
|
+
* 4. persist the discovered provider as the SHARED vault row under the
|
|
32
|
+
* synthetic key `<manual>_MCP_OAUTH`.
|
|
33
|
+
*
|
|
34
|
+
* From there the standard tool-OAuth machinery takes over unchanged: /connect
|
|
35
|
+
* shows an Authorize button (the manual is decorated with a synthetic
|
|
36
|
+
* user-scoped oauth variable), `beginToolOAuthByKey` provisions the caller's
|
|
37
|
+
* row from the shared one, and the UTCP variable loader injects the fresh
|
|
38
|
+
* access token into the manual's `Authorization` header at call time.
|
|
39
|
+
*
|
|
40
|
+
* Every fetch is SSRF-guarded (https-only, no redirects, bounded) — these URLs
|
|
41
|
+
* originate from user-authored `.tool` files and remote servers' own metadata.
|
|
42
|
+
*/
|
|
43
|
+
export class McpOAuthDiscoveryService {
|
|
44
|
+
private readonly cache = new Map<string, { result: McpAuthDiscovery; expiresAt: number }>();
|
|
45
|
+
private readonly inflight = new Map<string, Promise<McpAuthDiscovery>>();
|
|
46
|
+
|
|
47
|
+
constructor(
|
|
48
|
+
private readonly deps: {
|
|
49
|
+
secretsVault: ISecretsVaultService;
|
|
50
|
+
/** Our OAuth callback (`<publicBackendUrl>/api/secrets/oauth/callback`) — the DCR redirect_uri. */
|
|
51
|
+
redirectUri: string;
|
|
52
|
+
now?: () => number;
|
|
53
|
+
fetchFn?: typeof fetch;
|
|
54
|
+
},
|
|
55
|
+
) {}
|
|
56
|
+
|
|
57
|
+
private now(): number {
|
|
58
|
+
return (this.deps.now ?? Date.now)();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The vault key the discovered provider (and each user's tokens) live under. */
|
|
62
|
+
static keyFor(manualName: string): string {
|
|
63
|
+
return utcpNamespacedKey(manualName, MCP_OAUTH_VAR);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async statusFor(manualName: string, mcpUrl: string): Promise<McpAuthDiscovery> {
|
|
67
|
+
const key = McpOAuthDiscoveryService.keyFor(manualName);
|
|
68
|
+
const cached = this.cache.get(key);
|
|
69
|
+
if (cached && cached.expiresAt > this.now()) return cached.result;
|
|
70
|
+
let pending = this.inflight.get(key);
|
|
71
|
+
if (!pending) {
|
|
72
|
+
pending = this.discover(key, manualName, mcpUrl).finally(() => this.inflight.delete(key));
|
|
73
|
+
this.inflight.set(key, pending);
|
|
74
|
+
}
|
|
75
|
+
return pending;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private remember(key: string, result: McpAuthDiscovery): McpAuthDiscovery {
|
|
79
|
+
const ttl = result.status === 'oauth' ? OAUTH_TTL_MS : NEGATIVE_TTL_MS;
|
|
80
|
+
this.cache.set(key, { result, expiresAt: this.now() + ttl });
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async discover(key: string, manualName: string, mcpUrl: string): Promise<McpAuthDiscovery> {
|
|
85
|
+
// A prior discovery (any replica, any boot) already registered a client —
|
|
86
|
+
// NEVER re-register: a new client_id would orphan every user's tokens.
|
|
87
|
+
// Fail CLOSED on a lookup error: a vault/DB blip must not read as "no
|
|
88
|
+
// provider exists", or we'd fall through to fresh RFC 7591 registration
|
|
89
|
+
// and orphan those tokens. Returned uncached so the next call retries
|
|
90
|
+
// once the store recovers.
|
|
91
|
+
let existing;
|
|
92
|
+
try {
|
|
93
|
+
existing = await this.deps.secretsVault.getSharedOAuthProvider(key);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
const reason = `provider lookup failed (not re-registering): ${err instanceof Error ? err.message : String(err)}`;
|
|
96
|
+
console.warn(`[mcp-oauth-discovery] "${manualName}" (${mcpUrl}): ${reason}`);
|
|
97
|
+
return { status: 'unsupported', reason };
|
|
98
|
+
}
|
|
99
|
+
if (existing) return this.remember(key, { status: 'oauth', provider: existing });
|
|
100
|
+
|
|
101
|
+
let result: McpAuthDiscovery;
|
|
102
|
+
try {
|
|
103
|
+
result = await this.discoverFresh(manualName, key, mcpUrl);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
result = {
|
|
106
|
+
status: 'unsupported',
|
|
107
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (result.status === 'unsupported') {
|
|
111
|
+
console.warn(`[mcp-oauth-discovery] "${manualName}" (${mcpUrl}): ${result.reason}`);
|
|
112
|
+
}
|
|
113
|
+
return this.remember(key, result);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private async discoverFresh(manualName: string, key: string, mcpUrl: string): Promise<McpAuthDiscovery> {
|
|
117
|
+
// 1. Probe: an unauthenticated initialize. A 401/403, or ANY response
|
|
118
|
+
// carrying a `WWW-Authenticate` challenge, means the server wants OAuth;
|
|
119
|
+
// a redirect to a login page (fetch throws under `redirect:'error'`)
|
|
120
|
+
// counts too. Anything else means it served us without auth — nothing to
|
|
121
|
+
// configure. `allow401` short-circuits `fetchRaw`'s ok/redirect handling
|
|
122
|
+
// so the challenge itself is inspected rather than thrown.
|
|
123
|
+
let probe: Response;
|
|
124
|
+
try {
|
|
125
|
+
probe = await this.fetchRaw(mcpUrl, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Content-Type': 'application/json',
|
|
129
|
+
Accept: 'application/json, text/event-stream',
|
|
130
|
+
},
|
|
131
|
+
body: JSON.stringify({
|
|
132
|
+
jsonrpc: '2.0',
|
|
133
|
+
id: 0,
|
|
134
|
+
method: 'initialize',
|
|
135
|
+
params: {
|
|
136
|
+
protocolVersion: '2025-03-26',
|
|
137
|
+
capabilities: {},
|
|
138
|
+
clientInfo: { name: 'bevel-discovery', version: '0.0.0' },
|
|
139
|
+
},
|
|
140
|
+
}),
|
|
141
|
+
});
|
|
142
|
+
} catch (err) {
|
|
143
|
+
// A redirect to a login page (or a network refusal) — treat a redirect as
|
|
144
|
+
// "auth wanted" and keep going from the well-known metadata; a genuine
|
|
145
|
+
// network failure surfaces as unsupported.
|
|
146
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
147
|
+
if (!/redirect/i.test(msg)) return { status: 'unsupported', reason: `probe failed: ${msg}` };
|
|
148
|
+
probe = new Response(null, { status: 401 });
|
|
149
|
+
}
|
|
150
|
+
// 2. Protected-resource metadata (RFC 9728): prefer the server's own
|
|
151
|
+
// pointer in the challenge, else the well-known locations. Fetch this
|
|
152
|
+
// BEFORE deciding — a server can require OAuth for tool CALLS while
|
|
153
|
+
// letting an unauthenticated `initialize` through (Google's gmail/
|
|
154
|
+
// calendar MCP return 200 to initialize but still publish a PRM doc), so
|
|
155
|
+
// the probe status alone is not a reliable "needs auth" signal.
|
|
156
|
+
const prmUrl =
|
|
157
|
+
parseResourceMetadataUrl(probe.headers.get('www-authenticate')) ??
|
|
158
|
+
undefined;
|
|
159
|
+
const base = new URL(mcpUrl);
|
|
160
|
+
const prmCandidates = prmUrl
|
|
161
|
+
? [prmUrl]
|
|
162
|
+
: [
|
|
163
|
+
new URL(`/.well-known/oauth-protected-resource${base.pathname === '/' ? '' : base.pathname}`, base).toString(),
|
|
164
|
+
new URL('/.well-known/oauth-protected-resource', base).toString(),
|
|
165
|
+
];
|
|
166
|
+
let prm: Record<string, unknown> | null = null;
|
|
167
|
+
for (const candidate of prmCandidates) {
|
|
168
|
+
prm = await this.fetchJson(candidate);
|
|
169
|
+
if (prm) break;
|
|
170
|
+
}
|
|
171
|
+
// Wants OAuth iff the probe demanded it (401/403/challenge) OR the server
|
|
172
|
+
// publishes protected-resource metadata. Neither → genuinely open.
|
|
173
|
+
const wantsAuth =
|
|
174
|
+
probe.status === 401 ||
|
|
175
|
+
probe.status === 403 ||
|
|
176
|
+
probe.headers.get('www-authenticate') != null ||
|
|
177
|
+
prm != null;
|
|
178
|
+
if (!wantsAuth) return { status: 'open' };
|
|
179
|
+
const authServers = Array.isArray(prm?.authorization_servers)
|
|
180
|
+
? prm!.authorization_servers.filter((s): s is string => typeof s === 'string')
|
|
181
|
+
: [];
|
|
182
|
+
// MCP pre-RFC9728 fallback: the resource server's own origin is the AS.
|
|
183
|
+
const issuer = authServers[0] ?? base.origin;
|
|
184
|
+
const resource = typeof prm?.resource === 'string' ? prm.resource : mcpUrl;
|
|
185
|
+
const scopes = Array.isArray(prm?.scopes_supported) ? prm!.scopes_supported.map(String) : undefined;
|
|
186
|
+
|
|
187
|
+
// 3. Authorization-server metadata (RFC 8414; OIDC discovery as fallback).
|
|
188
|
+
const issuerUrl = new URL(issuer);
|
|
189
|
+
const issuerPath = issuerUrl.pathname === '/' ? '' : issuerUrl.pathname;
|
|
190
|
+
const asCandidates = [
|
|
191
|
+
new URL(`/.well-known/oauth-authorization-server${issuerPath}`, issuerUrl).toString(),
|
|
192
|
+
new URL(`${issuerPath}/.well-known/openid-configuration`, issuerUrl).toString(),
|
|
193
|
+
];
|
|
194
|
+
let asMeta: Record<string, unknown> | null = null;
|
|
195
|
+
for (const candidate of asCandidates) {
|
|
196
|
+
asMeta = await this.fetchJson(candidate);
|
|
197
|
+
if (asMeta) break;
|
|
198
|
+
}
|
|
199
|
+
if (!asMeta) {
|
|
200
|
+
return { status: 'unsupported', reason: `no authorization-server metadata at ${issuer}` };
|
|
201
|
+
}
|
|
202
|
+
const authorizationUrl = typeof asMeta.authorization_endpoint === 'string' ? asMeta.authorization_endpoint : '';
|
|
203
|
+
const tokenUrl = typeof asMeta.token_endpoint === 'string' ? asMeta.token_endpoint : '';
|
|
204
|
+
const registrationUrl = typeof asMeta.registration_endpoint === 'string' ? asMeta.registration_endpoint : '';
|
|
205
|
+
if (!authorizationUrl || !tokenUrl) {
|
|
206
|
+
return { status: 'unsupported', reason: 'authorization-server metadata is missing endpoints' };
|
|
207
|
+
}
|
|
208
|
+
if (!registrationUrl) {
|
|
209
|
+
return {
|
|
210
|
+
status: 'unsupported',
|
|
211
|
+
reason:
|
|
212
|
+
'server requires sign-in but does not support automatic client registration — declare the oauth provider in the .tool file instead',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 4. Dynamic client registration (RFC 7591), as a PUBLIC client: PKCE
|
|
217
|
+
// carries the proof, no secret to store or leak.
|
|
218
|
+
assertSafeFetchUrl(registrationUrl, { requireHttps: true, label: 'registration_endpoint' });
|
|
219
|
+
const regRes = await this.fetchRaw(registrationUrl, {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
222
|
+
body: JSON.stringify({
|
|
223
|
+
client_name: 'Bevel Knowledge Base',
|
|
224
|
+
redirect_uris: [this.deps.redirectUri],
|
|
225
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
226
|
+
response_types: ['code'],
|
|
227
|
+
token_endpoint_auth_method: 'none',
|
|
228
|
+
}),
|
|
229
|
+
});
|
|
230
|
+
if (!regRes.ok) {
|
|
231
|
+
return { status: 'unsupported', reason: `client registration failed: HTTP ${regRes.status}` };
|
|
232
|
+
}
|
|
233
|
+
const reg = (await regRes.json().catch(() => null)) as Record<string, unknown> | null;
|
|
234
|
+
const clientId = typeof reg?.client_id === 'string' ? reg.client_id : '';
|
|
235
|
+
if (!clientId) {
|
|
236
|
+
return { status: 'unsupported', reason: 'client registration returned no client_id' };
|
|
237
|
+
}
|
|
238
|
+
const clientSecret = typeof reg?.client_secret === 'string' && reg.client_secret ? reg.client_secret : undefined;
|
|
239
|
+
|
|
240
|
+
const provider: OAuthProviderConfig = {
|
|
241
|
+
authorizationUrl,
|
|
242
|
+
tokenUrl,
|
|
243
|
+
clientId,
|
|
244
|
+
clientSecret,
|
|
245
|
+
scopes,
|
|
246
|
+
pkce: true,
|
|
247
|
+
publicClient: !clientSecret,
|
|
248
|
+
resource,
|
|
249
|
+
};
|
|
250
|
+
await this.deps.secretsVault.putSharedOAuthProvider({
|
|
251
|
+
key,
|
|
252
|
+
label: `${manualName} sign-in`,
|
|
253
|
+
provider,
|
|
254
|
+
});
|
|
255
|
+
// Return the stored (public) shape — no secret rides in cache entries.
|
|
256
|
+
const publicProvider = { ...provider };
|
|
257
|
+
delete publicProvider.clientSecret;
|
|
258
|
+
return { status: 'oauth', provider: publicProvider };
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private async fetchRaw(url: string, init: RequestInit): Promise<Response> {
|
|
262
|
+
assertSafeFetchUrl(url, { requireHttps: true, label: 'mcp discovery url' });
|
|
263
|
+
const fetchFn = this.deps.fetchFn ?? fetch;
|
|
264
|
+
return fetchFn(url, {
|
|
265
|
+
...init,
|
|
266
|
+
redirect: 'error',
|
|
267
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** GET a metadata document; null on any failure (fall through to the next candidate). */
|
|
272
|
+
private async fetchJson(url: string): Promise<Record<string, unknown> | null> {
|
|
273
|
+
try {
|
|
274
|
+
const res = await this.fetchRaw(url, { method: 'GET', headers: { Accept: 'application/json' } });
|
|
275
|
+
if (!res.ok) return null;
|
|
276
|
+
const json = (await res.json()) as unknown;
|
|
277
|
+
return json && typeof json === 'object' ? (json as Record<string, unknown>) : null;
|
|
278
|
+
} catch {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Extract `resource_metadata="…"` from a WWW-Authenticate challenge (RFC 9728 §5.1). */
|
|
285
|
+
function parseResourceMetadataUrl(header: string | null): string | null {
|
|
286
|
+
if (!header) return null;
|
|
287
|
+
const match = /resource_metadata\s*=\s*"([^"]+)"/i.exec(header);
|
|
288
|
+
return match ? match[1] : null;
|
|
289
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type VariableLoader, VariableLoaderSerializer, Serializer } from '@utcp/sdk';
|
|
2
|
+
import type { ISecretsVaultService } from './secrets-vault.contract.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The `bevel-secrets` UTCP variable loader — the swappable seam that lets any
|
|
6
|
+
* UTCP client resolve `${VAR}` placeholders from the Secrets Vault at tool-call
|
|
7
|
+
* time (lazily, so OAuth tokens are refreshed on demand).
|
|
8
|
+
*
|
|
9
|
+
* UTCP resolves a variable in three tiers (see `DefaultVariableSubstitutor`):
|
|
10
|
+
* `config.variables` (exact) → each `config.load_variables_from` loader's
|
|
11
|
+
* async `get()` → `process.env`. We seed a per-user loader instance here so any
|
|
12
|
+
* tool var not already in `config.variables` (the reserved `API_URL` /
|
|
13
|
+
* `CONNECTION_KEY`) is resolved from this user's secrets.
|
|
14
|
+
*
|
|
15
|
+
* The `UtcpClient.create` path re-validates the whole config through the
|
|
16
|
+
* serializer registry, so a loader can't be handed in as a bare live object — it
|
|
17
|
+
* must round-trip through a registered serializer. We therefore put a plain
|
|
18
|
+
* descriptor `{ variable_loader_type, user_id }` in `load_variables_from` (via
|
|
19
|
+
* {@link bevelSecretsLoaderConfig}) and let the registered serializer rebuild a
|
|
20
|
+
* live loader bound to the process-wide vault. Swapping the vault backend (e.g.
|
|
21
|
+
* to a client's external secret manager) is just a different
|
|
22
|
+
* `ISecretsVaultService` passed to {@link registerBevelSecretsVariableLoader}.
|
|
23
|
+
*/
|
|
24
|
+
export const BEVEL_SECRETS_LOADER_TYPE = 'bevel_secrets';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Process-wide vault the reconstructed loaders read through. Set once at
|
|
28
|
+
* composition time (before any client is built) so the serializer — which only
|
|
29
|
+
* receives a plain dict — can bind live loaders to it.
|
|
30
|
+
*/
|
|
31
|
+
let sharedSecretsVault: ISecretsVaultService | null = null;
|
|
32
|
+
|
|
33
|
+
export class BevelSecretsVariableLoader implements VariableLoader {
|
|
34
|
+
readonly variable_loader_type = BEVEL_SECRETS_LOADER_TYPE;
|
|
35
|
+
readonly user_id: string;
|
|
36
|
+
// VariableLoader is an open shape; allow arbitrary extra props.
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
|
|
39
|
+
constructor(userId: string) {
|
|
40
|
+
this.user_id = userId;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Resolve `effectiveKey` — the UTCP-namespaced `<manual>_<VAR>` — against the
|
|
45
|
+
* vault VERBATIM. Preserving the manual prefix binds a secret to exactly ONE
|
|
46
|
+
* manual: another manual referencing the same bare `${VAR}` forms a different
|
|
47
|
+
* key and misses. This is the per-manual isolation UTCP's namespacing gives us
|
|
48
|
+
* — we intentionally do NOT strip the prefix, so a malicious `.tool` can't
|
|
49
|
+
* harvest a secret the user configured for a different manual.
|
|
50
|
+
*/
|
|
51
|
+
async get(effectiveKey: string): Promise<string | null> {
|
|
52
|
+
if (!sharedSecretsVault || !this.user_id) return null;
|
|
53
|
+
try {
|
|
54
|
+
return await sharedSecretsVault.resolve(this.user_id, effectiveKey);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
// Log the fault so a backend failure is distinguishable from a merely
|
|
57
|
+
// unset secret (resolve returning null) when troubleshooting.
|
|
58
|
+
console.error(
|
|
59
|
+
`[secrets-vault] resolve failed for user=${this.user_id} key=${effectiveKey}:`,
|
|
60
|
+
err instanceof Error ? err.message : String(err),
|
|
61
|
+
);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
class BevelSecretsVariableLoaderSerializer extends Serializer<VariableLoader> {
|
|
68
|
+
toDict(obj: VariableLoader): Record<string, unknown> {
|
|
69
|
+
return {
|
|
70
|
+
variable_loader_type: BEVEL_SECRETS_LOADER_TYPE,
|
|
71
|
+
user_id: (obj as BevelSecretsVariableLoader).user_id ?? '',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
validateDict(obj: Record<string, unknown>): VariableLoader {
|
|
76
|
+
const userId = typeof obj.user_id === 'string' ? obj.user_id : '';
|
|
77
|
+
return new BevelSecretsVariableLoader(userId);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Register the serializer on module load so a `{ variable_loader_type:
|
|
82
|
+
// 'bevel_secrets' }` descriptor round-trips through `UtcpClient.create` as soon
|
|
83
|
+
// as this module is imported — independent of whether a vault has been bound
|
|
84
|
+
// yet. Until `registerBevelSecretsVariableLoader` binds a vault, loaders simply
|
|
85
|
+
// resolve to null (no secrets available), so `create` never throws for lack of
|
|
86
|
+
// registration. Idempotent (safe under tsx hot-reload).
|
|
87
|
+
VariableLoaderSerializer.registerVariableLoader(
|
|
88
|
+
BEVEL_SECRETS_LOADER_TYPE,
|
|
89
|
+
new BevelSecretsVariableLoaderSerializer(),
|
|
90
|
+
true,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Bind the process-wide vault the reconstructed loaders read through. Called
|
|
95
|
+
* once at composition time; before it runs, loaders resolve to null.
|
|
96
|
+
*/
|
|
97
|
+
export function registerBevelSecretsVariableLoader(secretsVault: ISecretsVaultService): void {
|
|
98
|
+
sharedSecretsVault = secretsVault;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The plain descriptor to place in a `UtcpClientConfig.load_variables_from` for a given user. */
|
|
102
|
+
export function bevelSecretsLoaderConfig(userId: string): Record<string, unknown> {
|
|
103
|
+
return { variable_loader_type: BEVEL_SECRETS_LOADER_TYPE, user_id: userId };
|
|
104
|
+
}
|