@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,202 @@
|
|
|
1
|
+
import type { Router, RequestHandler } from 'express';
|
|
2
|
+
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
3
|
+
import type { IToolRegistry, UtcpTool } from '../tool-registry/tool.contract.js';
|
|
4
|
+
import type { ToolContext } from '../tool-helpers/tool.contract.js';
|
|
5
|
+
import { toolDef } from '../tool-helpers/tool-def.js';
|
|
6
|
+
import type { ToolHandlerFactory } from '../tool-helpers/tool-handler.js';
|
|
7
|
+
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
8
|
+
import { workspaceIdForBranch } from '../workspace/workspace.service.js';
|
|
9
|
+
import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
|
|
10
|
+
import type { IToolManualService } from './tool-manuals.contract.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* What `list_tool_setup` needs from the secrets vault (structurally satisfied
|
|
14
|
+
* by `ISecretsVaultService.statusFor`). A local port keeps this module free of
|
|
15
|
+
* a secrets-vault import — the same decoupling discipline as
|
|
16
|
+
* `McpAuthDiscoveryPort` in the service.
|
|
17
|
+
*/
|
|
18
|
+
export interface VariableStatusPort {
|
|
19
|
+
statusFor(
|
|
20
|
+
userId: string,
|
|
21
|
+
keys: string[],
|
|
22
|
+
): Promise<{ key: string; adminConfigured: boolean; userConfigured: boolean; userAuthorized?: boolean }[]>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Registers the tool-manual catalog tools (both surfaces) and hosts their
|
|
27
|
+
* endpoints:
|
|
28
|
+
*
|
|
29
|
+
* - `list_local_tools` — local-only manuals (`remote: false`) the remote proxy
|
|
30
|
+
* can't serve; the agent reads their `.tool` path and self-configures.
|
|
31
|
+
* - `list_tool_setup` — configuration status of every accessible manual, so an
|
|
32
|
+
* agent can EXPLAIN the remaining setup to the admin. Deliberately
|
|
33
|
+
* read-only: secret VALUES are never set (or returned) through a tool — the
|
|
34
|
+
* admin pastes them into the tool editor; users sign in on /connect.
|
|
35
|
+
*/
|
|
36
|
+
export function registerToolManualsTools(
|
|
37
|
+
registry: IToolRegistry,
|
|
38
|
+
router: Router,
|
|
39
|
+
toolAuth: RequestHandler,
|
|
40
|
+
toolHandler: ToolHandlerFactory,
|
|
41
|
+
toolManualService: IToolManualService,
|
|
42
|
+
deps: {
|
|
43
|
+
accessControl: IAccessControl;
|
|
44
|
+
variableStatus: VariableStatusPort;
|
|
45
|
+
},
|
|
46
|
+
): void {
|
|
47
|
+
registry.registerExternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
|
|
48
|
+
registry.registerInternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
|
|
49
|
+
|
|
50
|
+
router.post(
|
|
51
|
+
'/agent/tools/list_local_tools',
|
|
52
|
+
toolAuth,
|
|
53
|
+
toolHandler(async (_args, ctx: ToolContext) => ({
|
|
54
|
+
tools: await toolManualService.listLocalOnly(ctx.user.email),
|
|
55
|
+
})),
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const defaultWs = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
59
|
+
const varKey = (manualName: string, varName: string) => utcpNamespacedKey(manualName, varName);
|
|
60
|
+
|
|
61
|
+
const listSetupDef = toolDef({
|
|
62
|
+
name: 'list_tool_setup',
|
|
63
|
+
description:
|
|
64
|
+
'Configuration status of every `.tool` the current user can access: what each tool needs set up and ' +
|
|
65
|
+
'what is already configured. Results are scoped to the caller — a `.tool` the caller cannot READ is ' +
|
|
66
|
+
'absent entirely, and all status flags reflect the caller\'s own state. Per tool: `setup` describes ' +
|
|
67
|
+
'an MCP server\'s sign-in requirement (`open` = none; `oauth-auto` = sign-in was configured ' +
|
|
68
|
+
'automatically; `oauth-manual` = the provider does not support automatic registration, so a writer ' +
|
|
69
|
+
'must declare the OAuth provider in the `.tool` file and paste its client secret into the tool ' +
|
|
70
|
+
'editor). Per variable: whether the shared (admin) value is set, whether the CURRENT user has ' +
|
|
71
|
+
'set/authorized their own, and whether it is an OAuth sign-in (users authorize those on the /connect ' +
|
|
72
|
+
'page, never by typing a value). `canWrite` = the caller may write THAT `.tool` FILE (per-file access ' +
|
|
73
|
+
'from its frontmatter `write:`/`owner:` verbs and the access.md chain — NOT a platform role), which ' +
|
|
74
|
+
'is exactly what gates setting its shared secrets: the people who manage the file configure the tool. ' +
|
|
75
|
+
'Secret VALUES are never returned and can never be set through a tool — an admin enters them in the ' +
|
|
76
|
+
'tool editor; users sign in on /connect.',
|
|
77
|
+
path: '/api/agent/tools/list_tool_setup',
|
|
78
|
+
inputs: { type: 'object', properties: {}, required: [], additionalProperties: false },
|
|
79
|
+
outputs: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
tools: {
|
|
83
|
+
type: 'array',
|
|
84
|
+
items: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
slug: { type: 'string' },
|
|
88
|
+
name: { type: 'string', description: 'The manual id — the namespace secrets bind to.' },
|
|
89
|
+
path: { type: 'string' },
|
|
90
|
+
type: { type: 'string' },
|
|
91
|
+
setup: {
|
|
92
|
+
type: ['object', 'null'],
|
|
93
|
+
description: 'MCP auto-discovery setup requirement; null for non-mcp tools.',
|
|
94
|
+
properties: { kind: { type: 'string' }, reason: { type: 'string' } },
|
|
95
|
+
},
|
|
96
|
+
canWrite: { type: 'boolean' },
|
|
97
|
+
variables: {
|
|
98
|
+
type: 'array',
|
|
99
|
+
items: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
name: { type: 'string' },
|
|
103
|
+
scope: { type: 'string', description: '`admin` (one shared value) or `user` (per user).' },
|
|
104
|
+
label: { type: ['string', 'null'] },
|
|
105
|
+
oauth: { type: 'boolean', description: 'Filled by signing in on /connect, not by a value.' },
|
|
106
|
+
adminConfigured: {
|
|
107
|
+
type: 'boolean',
|
|
108
|
+
description:
|
|
109
|
+
'Shared value set (plain admin vars), or the owner finished provider setup (OAuth vars).',
|
|
110
|
+
},
|
|
111
|
+
userConfigured: { type: 'boolean' },
|
|
112
|
+
authorized: { type: ['boolean', 'null'], description: 'OAuth vars: current user signed in.' },
|
|
113
|
+
},
|
|
114
|
+
required: ['name', 'scope', 'oauth', 'adminConfigured', 'userConfigured'],
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
required: ['slug', 'name', 'path', 'type', 'canWrite', 'variables'],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
required: ['tools'],
|
|
123
|
+
},
|
|
124
|
+
tags: ['tools'],
|
|
125
|
+
});
|
|
126
|
+
registry.registerInternalTool(listSetupDef);
|
|
127
|
+
registry.registerExternalTool(listSetupDef);
|
|
128
|
+
router.post(
|
|
129
|
+
'/agent/tools/list_tool_setup',
|
|
130
|
+
toolAuth,
|
|
131
|
+
toolHandler(async (_args, ctx: ToolContext) => {
|
|
132
|
+
const manuals = await toolManualService.listAccessible(ctx.user.email);
|
|
133
|
+
const allKeys = manuals.flatMap((m) => (m.variables ?? []).map((v) => varKey(m.name, v.name)));
|
|
134
|
+
const status = await deps.variableStatus.statusFor(ctx.user.id, allKeys);
|
|
135
|
+
const statusByKey = new Map(status.map((s) => [s.key, s]));
|
|
136
|
+
const tools = await Promise.all(
|
|
137
|
+
manuals.map(async (m) => ({
|
|
138
|
+
slug: m.slug,
|
|
139
|
+
name: m.name,
|
|
140
|
+
path: m.path,
|
|
141
|
+
type: m.type,
|
|
142
|
+
setup: m.setup ?? null,
|
|
143
|
+
canWrite: await deps.accessControl.canWrite(defaultWs, ctx.user.email, m.path),
|
|
144
|
+
variables: (m.variables ?? []).map((v) => {
|
|
145
|
+
const st = statusByKey.get(varKey(m.name, v.name));
|
|
146
|
+
const isOAuth = v.oauth != null;
|
|
147
|
+
return {
|
|
148
|
+
name: v.name,
|
|
149
|
+
scope: v.scope,
|
|
150
|
+
label: v.label ?? null,
|
|
151
|
+
oauth: isOAuth,
|
|
152
|
+
adminConfigured: st?.adminConfigured ?? false,
|
|
153
|
+
userConfigured: st?.userConfigured ?? false,
|
|
154
|
+
authorized: isOAuth ? (st?.userAuthorized ?? false) : null,
|
|
155
|
+
};
|
|
156
|
+
}),
|
|
157
|
+
})),
|
|
158
|
+
);
|
|
159
|
+
return { tools };
|
|
160
|
+
}),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** "Local-only tools configured for you: `a`, `b`." (or a none note), filtered to what the caller may read. */
|
|
165
|
+
async function localToolsLine(svc: IToolManualService, userEmail?: string): Promise<string> {
|
|
166
|
+
if (!userEmail) return 'No local-only tools are currently configured.';
|
|
167
|
+
const tools = await svc.listLocalOnly(userEmail);
|
|
168
|
+
if (tools.length === 0) return 'No local-only tools are currently configured.';
|
|
169
|
+
return `Local-only tools configured for you: ${tools.map((t) => `\`${t.name}\``).join(', ')}.`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function buildListLocalToolsDef(svc: IToolManualService, userEmail?: string): Promise<UtcpTool> {
|
|
173
|
+
return toolDef({
|
|
174
|
+
name: 'list_local_tools',
|
|
175
|
+
description:
|
|
176
|
+
'List tools your workspace admins configured that run ONLY in a local environment ' +
|
|
177
|
+
'(e.g. a self-hosted MCP server on localhost) and therefore cannot be called through this ' +
|
|
178
|
+
'remote endpoint. Each entry gives the tool’s name and its `.tool` file path in the knowledge ' +
|
|
179
|
+
'base — read that file with `read_file` and configure the tool yourself in your local setup ' +
|
|
180
|
+
'(e.g. add the MCP server to your client). ' +
|
|
181
|
+
(await localToolsLine(svc, userEmail)),
|
|
182
|
+
path: '/api/agent/tools/list_local_tools',
|
|
183
|
+
inputs: { type: 'object', properties: {}, additionalProperties: false },
|
|
184
|
+
outputs: {
|
|
185
|
+
type: 'object',
|
|
186
|
+
properties: {
|
|
187
|
+
tools: {
|
|
188
|
+
type: 'array',
|
|
189
|
+
description: 'Local-only tools (name + KB path).',
|
|
190
|
+
items: {
|
|
191
|
+
type: 'object',
|
|
192
|
+
properties: {
|
|
193
|
+
name: { type: 'string' },
|
|
194
|
+
path: { type: 'string', description: 'KB path of the `.tool` file (read it with read_file).' },
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
tags: ['tools'],
|
|
201
|
+
});
|
|
202
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ToolRegistry } from '../tool-registry.js';
|
|
3
|
+
import type { UtcpTool } from '../tool.contract.js';
|
|
4
|
+
|
|
5
|
+
function fakeTool(name: string): UtcpTool {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
description: `the ${name} tool`,
|
|
9
|
+
inputs: { type: 'object', properties: {} },
|
|
10
|
+
outputs: { type: 'object', properties: {} },
|
|
11
|
+
tags: [],
|
|
12
|
+
tool_call_template: { call_template_type: 'http' } as never,
|
|
13
|
+
} as UtcpTool;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('ToolRegistry', () => {
|
|
17
|
+
it('keeps external and internal catalogs separate', async () => {
|
|
18
|
+
const r = new ToolRegistry();
|
|
19
|
+
r.registerExternalTool(fakeTool('ask'));
|
|
20
|
+
r.registerInternalTool(fakeTool('commit_change'));
|
|
21
|
+
expect((await r.listExternal()).map((t) => t.name)).toEqual(['ask']);
|
|
22
|
+
expect((await r.listInternal()).map((t) => t.name)).toEqual(['commit_change']);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('a `both` tool registers into both catalogs', async () => {
|
|
26
|
+
const r = new ToolRegistry();
|
|
27
|
+
const t = fakeTool('list_branches');
|
|
28
|
+
r.registerExternalTool(t);
|
|
29
|
+
r.registerInternalTool(t);
|
|
30
|
+
expect((await r.listExternal()).map((x) => x.name)).toContain('list_branches');
|
|
31
|
+
expect((await r.listInternal()).map((x) => x.name)).toContain('list_branches');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('resolves a ToolProvider lazily and appends it after static tools', async () => {
|
|
35
|
+
const r = new ToolRegistry();
|
|
36
|
+
r.registerExternalTool(fakeTool('ask'));
|
|
37
|
+
r.registerExternalTool(() => fakeTool('list_skills'));
|
|
38
|
+
expect((await r.listExternal()).map((t) => t.name)).toEqual(['ask', 'list_skills']);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('resolves an async (Promise-returning) ToolProvider', async () => {
|
|
42
|
+
const r = new ToolRegistry();
|
|
43
|
+
r.registerExternalTool(async () => fakeTool('list_skills'));
|
|
44
|
+
expect((await r.listExternal()).map((t) => t.name)).toEqual(['list_skills']);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('passes the ToolManualContext through to providers', async () => {
|
|
48
|
+
const r = new ToolRegistry();
|
|
49
|
+
let received: { userEmail?: string } | undefined;
|
|
50
|
+
r.registerExternalTool((ctx) => {
|
|
51
|
+
received = ctx;
|
|
52
|
+
return fakeTool('list_skills');
|
|
53
|
+
});
|
|
54
|
+
await r.listExternal({ userEmail: 'a@b.eu' });
|
|
55
|
+
expect(received).toEqual({ userEmail: 'a@b.eu' });
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('throws on a duplicate name within a surface, but not across surfaces', () => {
|
|
59
|
+
const r = new ToolRegistry();
|
|
60
|
+
r.registerExternalTool(fakeTool('ask'));
|
|
61
|
+
expect(() => r.registerExternalTool(fakeTool('ask'))).toThrow(/Duplicate external/);
|
|
62
|
+
expect(() => r.registerInternalTool(fakeTool('ask'))).not.toThrow();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import express, { type Request, type RequestHandler } from 'express';
|
|
2
|
+
import { UtcpManualSerializer } from '@utcp/sdk';
|
|
3
|
+
import type { IToolRegistry, ToolManualContext, UtcpTool } from './tool.contract.js';
|
|
4
|
+
import { requireInternalSource } from '../tool-auth/tool-auth.middleware.js';
|
|
5
|
+
|
|
6
|
+
/** Resolve a connection-key/internal-token user id to its email (for per-caller provider defs). */
|
|
7
|
+
export type ResolveUserEmail = (userId: string) => Promise<string | undefined>;
|
|
8
|
+
|
|
9
|
+
const manualSerializer = new UtcpManualSerializer();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Serialize a catalog slice into a UTCP manual. The manual is the registry's
|
|
13
|
+
* exposure format, so the version pins (`utcp_version` / `manual_version`) live
|
|
14
|
+
* right here at the endpoint — bump them when the served spec format changes.
|
|
15
|
+
* Each tool already carries its own `tool_call_template`, so this is otherwise a
|
|
16
|
+
* thin wrapper.
|
|
17
|
+
*/
|
|
18
|
+
function toManual(tools: UtcpTool[]) {
|
|
19
|
+
return manualSerializer.validateDict({
|
|
20
|
+
utcp_version: '1.1.0',
|
|
21
|
+
manual_version: '1.0.0',
|
|
22
|
+
tools,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The two discovery endpoints — dynamically-built UTCP specs over the catalog:
|
|
28
|
+
* GET /agent/utcp — external tools (pipeline-agent, MCP proxy)
|
|
29
|
+
* GET /agent/internal/utcp — internal tools (our agent's code-mode client)
|
|
30
|
+
*
|
|
31
|
+
* Both are gated by `manualAuth` — a read-only superset of `toolAuth` that also
|
|
32
|
+
* accepts a browser JWT (`source: 'session'`) so a logged-in user can browse the
|
|
33
|
+
* catalog with their session; tool EXECUTION routes keep the strict `toolAuth`,
|
|
34
|
+
* so a JWT can read the manual but never invoke a tool. The internal catalog
|
|
35
|
+
* additionally requires `requireInternalSource`, so neither an external
|
|
36
|
+
* connection key nor a browser session can enumerate the internal tool surface.
|
|
37
|
+
* Both must mount BEFORE the JWT-protected `/api` mounts (Express fires the outer
|
|
38
|
+
* JWT middleware before route matching otherwise). The catalog is resolved **per
|
|
39
|
+
* request** (`registry.list*` awaits any `ToolProvider`s), so a tool whose def is
|
|
40
|
+
* built lazily — e.g. the skill tools, whose description names the current skills
|
|
41
|
+
* — stays current without a restart. Static tools resolve to the same def every
|
|
42
|
+
* time, so this is cheap.
|
|
43
|
+
*
|
|
44
|
+
* The internal catalog is ALSO scope-filtered: a read-scoped caller (e.g. a
|
|
45
|
+
* consumer persona's internal token) is served only the tools it can actually
|
|
46
|
+
* invoke — write-tagged tools are dropped so its `list_tools`/manual never
|
|
47
|
+
* advertises a tool that would 403 at call time. The call-time write-scope
|
|
48
|
+
* refusal in `toolHandler` stays as the enforcement; this is least-information
|
|
49
|
+
* on top of it. (External callers are always write-scoped, so the external
|
|
50
|
+
* manual needs no variant.)
|
|
51
|
+
*/
|
|
52
|
+
function isWriteTool(tool: { tags?: string[] }): boolean {
|
|
53
|
+
return (tool.tags ?? []).includes('write');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function createManualRoutes(
|
|
57
|
+
registry: IToolRegistry,
|
|
58
|
+
manualAuth: RequestHandler,
|
|
59
|
+
resolveUserEmail?: ResolveUserEmail,
|
|
60
|
+
): express.Router {
|
|
61
|
+
const router = express.Router();
|
|
62
|
+
|
|
63
|
+
// Build the per-caller context once per request: resolve the caller's email
|
|
64
|
+
// so a `ToolProvider` (e.g. the skill tools) can tailor its def to who's
|
|
65
|
+
// asking. Best-effort — a failure just yields an empty (global) context.
|
|
66
|
+
async function context(req: Request): Promise<ToolManualContext> {
|
|
67
|
+
const userId = req.toolAuth?.userId;
|
|
68
|
+
if (!userId) return {};
|
|
69
|
+
if (!resolveUserEmail) return { userId };
|
|
70
|
+
try {
|
|
71
|
+
return { userId, userEmail: await resolveUserEmail(userId) };
|
|
72
|
+
} catch {
|
|
73
|
+
return { userId };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
router.get('/agent/utcp', manualAuth, async (req, res) => {
|
|
78
|
+
res.json(toManual(await registry.listExternal(await context(req))));
|
|
79
|
+
});
|
|
80
|
+
router.get('/agent/internal/utcp', manualAuth, requireInternalSource, async (req, res) => {
|
|
81
|
+
const internal = await registry.listInternal(await context(req));
|
|
82
|
+
const tools = req.toolAuth?.scope === 'read' ? internal.filter((t) => !isWriteTool(t)) : internal;
|
|
83
|
+
res.json(toManual(tools));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return router;
|
|
87
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
IToolRegistry,
|
|
3
|
+
ToolListProvider,
|
|
4
|
+
ToolManualContext,
|
|
5
|
+
ToolProvider,
|
|
6
|
+
UtcpTool,
|
|
7
|
+
} from './tool.contract.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The tool catalog. Modules call `registerExternalTool` / `registerInternalTool`
|
|
11
|
+
* (both, for a `both` tool) with a self-describing UTCP `Tool` def, or a
|
|
12
|
+
* `ToolProvider` callable for a tool whose def is built lazily at list time. The
|
|
13
|
+
* catalog only aggregates and lists them — the two manual endpoints serialize
|
|
14
|
+
* each list per request. Insertion order is preserved (static tools first, then
|
|
15
|
+
* provider-built ones); a duplicate static name within a surface throws.
|
|
16
|
+
*/
|
|
17
|
+
export class ToolRegistry implements IToolRegistry {
|
|
18
|
+
private readonly external = new Map<string, UtcpTool>();
|
|
19
|
+
private readonly internal = new Map<string, UtcpTool>();
|
|
20
|
+
private readonly externalProviders: ToolProvider[] = [];
|
|
21
|
+
private readonly internalProviders: ToolProvider[] = [];
|
|
22
|
+
private readonly internalListProviders: ToolListProvider[] = [];
|
|
23
|
+
|
|
24
|
+
registerExternalTool(tool: UtcpTool | ToolProvider): void {
|
|
25
|
+
if (typeof tool === 'function') this.externalProviders.push(tool);
|
|
26
|
+
else this.add(this.external, tool, 'external');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
registerInternalTool(tool: UtcpTool | ToolProvider): void {
|
|
30
|
+
if (typeof tool === 'function') this.internalProviders.push(tool);
|
|
31
|
+
else this.add(this.internal, tool, 'internal');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
registerInternalTools(provider: ToolListProvider): void {
|
|
35
|
+
this.internalListProviders.push(provider);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async listExternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
|
|
39
|
+
const dynamic = await Promise.all(this.externalProviders.map((p) => p(ctx)));
|
|
40
|
+
return [...this.external.values(), ...dynamic];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async listInternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
|
|
44
|
+
const dynamic = await Promise.all(this.internalProviders.map((p) => p(ctx)));
|
|
45
|
+
const lists = await Promise.all(this.internalListProviders.map((p) => p(ctx)));
|
|
46
|
+
return [...this.internal.values(), ...dynamic, ...lists.flat()];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private add(into: Map<string, UtcpTool>, tool: UtcpTool, surface: string): void {
|
|
50
|
+
if (into.has(tool.name)) {
|
|
51
|
+
throw new Error(`Duplicate ${surface} tool name: "${tool.name}"`);
|
|
52
|
+
}
|
|
53
|
+
into.set(tool.name, tool);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { JsonSchema, Tool as UtcpTool } from '@utcp/sdk';
|
|
2
|
+
|
|
3
|
+
export type { JsonSchema, UtcpTool };
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Per-request context handed to a `ToolProvider` when the manual is built, so a
|
|
7
|
+
* provider can tailor its def to the caller (e.g. the skill tools name only the
|
|
8
|
+
* skills THIS user may read).
|
|
9
|
+
*/
|
|
10
|
+
export interface ToolManualContext {
|
|
11
|
+
/** The requesting user's email, when it could be resolved. */
|
|
12
|
+
userEmail?: string;
|
|
13
|
+
/** The requesting user's id, when it could be resolved (for per-user gating). */
|
|
14
|
+
userId?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A lazy tool definition: a callable that produces a UTCP `Tool` at list time.
|
|
19
|
+
* Use it for a tool whose def must reflect live state when the manual is built
|
|
20
|
+
* (e.g. the skill tools, whose description names the currently-available
|
|
21
|
+
* skills). Resolved on every `listExternal`/`listInternal` call, so the manual
|
|
22
|
+
* stays current without a restart. Static tools are passed as a plain `UtcpTool`.
|
|
23
|
+
*/
|
|
24
|
+
export type ToolProvider = (ctx: ToolManualContext) => UtcpTool | Promise<UtcpTool>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A lazy provider that yields ZERO OR MORE tool defs at list time. Unlike
|
|
28
|
+
* {@link ToolProvider} (exactly one tool), a list provider can return `[]` to
|
|
29
|
+
* contribute nothing — the mechanism a Connector uses to expose its tool family
|
|
30
|
+
* only while it is enabled + configured, and hide it otherwise, with no restart.
|
|
31
|
+
*/
|
|
32
|
+
export type ToolListProvider = (ctx: ToolManualContext) => UtcpTool[] | Promise<UtcpTool[]>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The registry is a pure CATALOG of self-describing UTCP `Tool` defs (each
|
|
36
|
+
* carries its own `tool_call_template`). It never knows how a tool executes —
|
|
37
|
+
* the owning module hosts the endpoint. `external`/`internal` are two separate
|
|
38
|
+
* lists; a tool that's both is registered into both. A tool is registered as a
|
|
39
|
+
* plain `UtcpTool` (static) or a `ToolProvider` (resolved per list call).
|
|
40
|
+
*/
|
|
41
|
+
export interface IToolRegistry {
|
|
42
|
+
registerExternalTool(tool: UtcpTool | ToolProvider): void;
|
|
43
|
+
registerInternalTool(tool: UtcpTool | ToolProvider): void;
|
|
44
|
+
/**
|
|
45
|
+
* Register a provider that contributes zero-or-more INTERNAL tools per list
|
|
46
|
+
* call. Used by the connector host to expose a connector's tool family only
|
|
47
|
+
* while it is enabled + configured.
|
|
48
|
+
*/
|
|
49
|
+
registerInternalTools(provider: ToolListProvider): void;
|
|
50
|
+
listExternal(ctx?: ToolManualContext): Promise<UtcpTool[]>;
|
|
51
|
+
listInternal(ctx?: ToolManualContext): Promise<UtcpTool[]>;
|
|
52
|
+
}
|