@bevel-software/platform-core-backend 0.19.0 → 0.21.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/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +45 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +33 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +146 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +414 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +99 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +6 -1
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +9 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.js +16 -3
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +32 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +8 -1
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +16 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +52 -9
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +180 -8
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +45 -15
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +22 -10
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +52 -28
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +21 -5
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +22 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +10 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +8 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +35 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +26 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +41 -28
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +69 -31
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/git-internals.d.ts +7 -1
- package/dist/shared/git-internals.d.ts.map +1 -1
- package/dist/shared/git-internals.js +67 -9
- package/dist/shared/git-internals.js.map +1 -1
- package/dist/shared/git.contract.d.ts +52 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -4
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +55 -106
- package/src/core/create-core-services.ts +193 -95
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +33 -1
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/core-schema.ts +104 -0
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/diff/diff.service.ts +6 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/git-guarded-filesystem.ts +16 -3
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -2
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +120 -3
- package/src/modules/mcp/mcp-auth.middleware.ts +31 -0
- package/src/modules/mcp/mcp.routes.ts +11 -1
- package/src/modules/mcp/mcp.service.ts +73 -8
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +184 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +45 -15
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +59 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +68 -28
- package/src/modules/settings/setup.routes.ts +26 -16
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +29 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +22 -5
- package/src/modules/tool-auth/external-api-key.service.ts +25 -8
- package/src/modules/tool-auth/internal-token.service.ts +11 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +17 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +31 -24
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +144 -52
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +39 -27
- package/src/modules/workspace/workspace.tools.ts +68 -31
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/git-internals.test.ts +41 -0
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git-internals.ts +61 -6
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts +0 -30
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js +0 -61
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import '../auth/auth.middleware.js'; // Express Request.userId / userEmail augmentation
|
|
3
|
-
import { DEFAULT_BRANCH, joinBranchFor, } from '@bevel-software/platform-shared';
|
|
4
|
-
import { spliceGrant } from '../access/access-splice.js';
|
|
5
|
-
import { WorkflowDomainError } from '../workflow/workflow.errors.js';
|
|
6
|
-
import { groupsWorkspaceId } from './groups.service.js';
|
|
7
|
-
import { GroupProvisionError } from './group-provision.service.js';
|
|
8
|
-
/**
|
|
9
|
-
* Browser-facing (JWT) group routes, mounted behind `authMiddleware`:
|
|
10
|
-
*
|
|
11
|
-
* GET /api/groups → { groups: GroupSummary[] }
|
|
12
|
-
* DELETE /api/groups/:name → { ok } (owners)
|
|
13
|
-
* POST /api/groups/:name/join-request → { ok, number } (opens a CR)
|
|
14
|
-
* GET /api/groups/:name/join-requests → { requests } (managers)
|
|
15
|
-
* POST /api/groups/:name/join-requests/:n/reconcile → { closed }
|
|
16
|
-
*
|
|
17
|
-
* Enumeration is three verdicts per (caller, group), all of them ordinary
|
|
18
|
-
* access resolution — no special cases, no side tables:
|
|
19
|
-
*
|
|
20
|
-
* member canRead on the group FOLDER
|
|
21
|
-
* manager canWrite on the folder's access.md (admin-rescued)
|
|
22
|
-
* discoverable canRead on the access.md FILE — in the body-governed format
|
|
23
|
-
* its own `read: everyone` frontmatter grants this
|
|
24
|
-
*
|
|
25
|
-
* All three false ⇒ the group is absent from the response entirely.
|
|
26
|
-
*
|
|
27
|
-
* A join request is a plain change request whose branch edits the group's
|
|
28
|
-
* `access.md`. Managers do NOT merge it: they read its individual proposals
|
|
29
|
-
* (see `join-proposals.ts`), grant the ones they accept through the ordinary
|
|
30
|
-
* access path, and the request retires itself once its rules are a subset of
|
|
31
|
-
* the default branch's — reconciled here, lazily on listing and eagerly right
|
|
32
|
-
* after a grant. Nothing about the lifecycle is stored; it is derived from
|
|
33
|
-
* two copies of one file.
|
|
34
|
-
*
|
|
35
|
-
* Auth gating is explicit and uniform: `authMiddleware` at the mount, PLUS a
|
|
36
|
-
* `req.userEmail` check in every handler (the skills-routes pattern) so a
|
|
37
|
-
* middleware change can never silently un-gate one. Nothing here is reachable
|
|
38
|
-
* with an agent connection key or a manual-auth bearer.
|
|
39
|
-
*/
|
|
40
|
-
export function createGroupsRoutes(groupIndex, accessControl, workflow, workspaceService, joinRequests, provision, kbDirName, resolveUser) {
|
|
41
|
-
const router = express.Router();
|
|
42
|
-
/** The folder-chain probe for MEMBERSHIP — the folder itself. */
|
|
43
|
-
const memberProbe = (folder) => folder;
|
|
44
|
-
/** The FILE probe for discovery/management — the folder's access.md. */
|
|
45
|
-
const accessMdOf = (folder) => `${folder}/access.md`;
|
|
46
|
-
const probesFor = (groups) => [
|
|
47
|
-
...new Set(groups.flatMap((g) => g.folders.flatMap((f) => [memberProbe(f), accessMdOf(f)]))),
|
|
48
|
-
];
|
|
49
|
-
/** The caller's open join CR for `group`, or null. */
|
|
50
|
-
const openJoinCr = (mine, email, group) => mine.find((cr) => cr.state === 'open' && cr.branch === joinBranchFor(email, group)) ?? null;
|
|
51
|
-
router.get('/groups', async (req, res) => {
|
|
52
|
-
const email = req.userEmail;
|
|
53
|
-
if (!email) {
|
|
54
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
try {
|
|
58
|
-
const catalog = await groupIndex.catalog();
|
|
59
|
-
if (catalog.length === 0) {
|
|
60
|
-
res.json({ groups: [] });
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const wsId = groupsWorkspaceId();
|
|
64
|
-
const probes = probesFor(catalog);
|
|
65
|
-
const [readable, writable, owned] = await Promise.all([
|
|
66
|
-
accessControl.canReadBatch(wsId, email, probes),
|
|
67
|
-
accessControl.canWriteBatch(wsId, email, probes),
|
|
68
|
-
accessControl.canOwnerBatch(wsId, email, probes),
|
|
69
|
-
]);
|
|
70
|
-
// Fail closed on every verdict: a path missing from the map is denied.
|
|
71
|
-
const any = (map, g, probe) => g.folders.some((f) => map.get(probe(f)) === true);
|
|
72
|
-
// The caller's own open join CRs — drives `hasRequested`. A CR-listing
|
|
73
|
-
// hiccup must not take group enumeration down: degrade to "nothing
|
|
74
|
-
// requested" and let the next load repair it.
|
|
75
|
-
let mine = [];
|
|
76
|
-
try {
|
|
77
|
-
mine = await workflow.listChangeRequestsAuthoredBy(email);
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
console.warn(`[groups] join-request lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
81
|
-
}
|
|
82
|
-
const groups = [];
|
|
83
|
-
for (const g of catalog) {
|
|
84
|
-
const member = any(readable, g, memberProbe);
|
|
85
|
-
const manager = any(writable, g, accessMdOf);
|
|
86
|
-
// The FOLDER verdict, owner-lists-only — the delete gate, mirrored
|
|
87
|
-
// here so the UI shows the verb to exactly the people the DELETE
|
|
88
|
-
// route will let through.
|
|
89
|
-
const owner = any(owned, g, memberProbe);
|
|
90
|
-
const discoverable = member || any(readable, g, accessMdOf);
|
|
91
|
-
if (!member && !manager && !discoverable)
|
|
92
|
-
continue; // absent — fail closed
|
|
93
|
-
const joinCr = member ? null : openJoinCr(mine, email, g.name);
|
|
94
|
-
groups.push({
|
|
95
|
-
name: g.name,
|
|
96
|
-
folders: g.folders,
|
|
97
|
-
canRead: member,
|
|
98
|
-
canWrite: manager,
|
|
99
|
-
isOwner: owner,
|
|
100
|
-
skillCount: g.skillCount,
|
|
101
|
-
toolCount: g.toolCount,
|
|
102
|
-
owners: g.owners,
|
|
103
|
-
writers: g.writers,
|
|
104
|
-
readers: g.readers,
|
|
105
|
-
hasRequested: joinCr !== null,
|
|
106
|
-
requestNumber: joinCr?.number ?? null,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
res.json({ groups });
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
console.error('[groups] failed to list groups:', err);
|
|
113
|
-
res.status(500).json({ error: 'Failed to list groups' });
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
/**
|
|
117
|
-
* Open (or return the existing) join change request for the caller.
|
|
118
|
-
*
|
|
119
|
-
* Idempotent via the deterministic branch name: a second click finds the
|
|
120
|
-
* open CR and returns it. Every step is an existing primitive — branch,
|
|
121
|
-
* splice, commit-and-push, open CR — so the security story is exactly the
|
|
122
|
-
* workflow's: draft branches are ungated, and the merge gate requires an
|
|
123
|
-
* approver who can write the touched access.md.
|
|
124
|
-
*/
|
|
125
|
-
/**
|
|
126
|
-
* Create a group — the ONE door through which `Groups/<name>/` folders come
|
|
127
|
-
* to exist. Any authenticated user may create one; that is the product
|
|
128
|
-
* model (making a group makes you the one who runs it), and the seeded
|
|
129
|
-
* access.md immediately fences the new folder off from everyone else. See
|
|
130
|
-
* `GroupProvisionService` for why this is an endpoint and not a write path.
|
|
131
|
-
*/
|
|
132
|
-
router.post('/groups', async (req, res) => {
|
|
133
|
-
const user = await resolveUser(req);
|
|
134
|
-
if (!user) {
|
|
135
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
// `req.body` is undefined when no JSON body was sent at all — that is a
|
|
139
|
-
// 400, not a destructuring crash.
|
|
140
|
-
const { name } = (req.body ?? {});
|
|
141
|
-
if (typeof name !== 'string') {
|
|
142
|
-
res.status(400).json({ error: 'name is required in body' });
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
try {
|
|
146
|
-
const result = await provision.createGroup(user, name);
|
|
147
|
-
res.status(201).json(result);
|
|
148
|
-
}
|
|
149
|
-
catch (err) {
|
|
150
|
-
if (err instanceof GroupProvisionError) {
|
|
151
|
-
res.status(err.status).json({ error: err.message });
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
console.error('[groups] create failed:', err);
|
|
155
|
-
res.status(500).json({ error: 'Failed to create the group' });
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
/**
|
|
159
|
-
* Ensure the caller's personal folder (`Groups/personal-<id>/`) exists —
|
|
160
|
-
* idempotent; the UI calls it lazily right before the first personal-skill
|
|
161
|
-
* write. Private by construction: its access.md names only the caller.
|
|
162
|
-
*/
|
|
163
|
-
router.post('/groups/personal', async (req, res) => {
|
|
164
|
-
const user = await resolveUser(req);
|
|
165
|
-
if (!user) {
|
|
166
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
try {
|
|
170
|
-
res.json(await provision.ensurePersonalGroup(user));
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
console.error('[groups] personal-folder ensure failed:', err);
|
|
174
|
-
res.status(500).json({ error: 'Failed to prepare your personal folder' });
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
/**
|
|
178
|
-
* Delete a group — the OWNER's verb, and only theirs. Creating a group
|
|
179
|
-
* makes you the one who runs it; deleting it is the other end of that same
|
|
180
|
-
* promise, so the gate is the `owner` verdict on the folder (owner-lists
|
|
181
|
-
* only, no admin rescue) — a manager who merely writes the access.md, and
|
|
182
|
-
* an admin rescued into managing it, do not get it.
|
|
183
|
-
*
|
|
184
|
-
* Fail-closed like every other group surface: an unknown group and a group
|
|
185
|
-
* the caller does not own answer IDENTICALLY, so probing the endpoint can
|
|
186
|
-
* confirm nothing about what exists. The mechanism (park, one commit,
|
|
187
|
-
* rollback on refusal) lives in `GroupProvisionService.deleteGroup`.
|
|
188
|
-
*/
|
|
189
|
-
router.delete('/groups/:name', async (req, res) => {
|
|
190
|
-
const email = req.userEmail;
|
|
191
|
-
if (!email) {
|
|
192
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
try {
|
|
196
|
-
const user = await resolveUser(req);
|
|
197
|
-
if (!user) {
|
|
198
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
// Case-sensitive, like `groupOfPath` — the group name IS the folder name.
|
|
202
|
-
const group = (await groupIndex.catalog()).find((g) => g.name === req.params.name);
|
|
203
|
-
const wsId = groupsWorkspaceId();
|
|
204
|
-
const ownerVerdicts = group
|
|
205
|
-
? await Promise.all(group.folders.map((f) => accessControl.canOwner(wsId, email, memberProbe(f))))
|
|
206
|
-
: [];
|
|
207
|
-
if (!group || !ownerVerdicts.some((v) => v === true)) {
|
|
208
|
-
res.status(404).json({ error: 'Unknown group', kind: 'unknown-group' });
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
await provision.deleteGroup(user, group.name);
|
|
212
|
-
groupIndex.invalidate();
|
|
213
|
-
res.json({ ok: true });
|
|
214
|
-
}
|
|
215
|
-
catch (err) {
|
|
216
|
-
if (err instanceof GroupProvisionError) {
|
|
217
|
-
res.status(err.status).json({ error: err.message });
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
console.error('[groups] delete failed:', err);
|
|
221
|
-
res.status(500).json({ error: 'Failed to delete the group' });
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
router.post('/groups/:name/join-request', async (req, res) => {
|
|
225
|
-
const email = req.userEmail;
|
|
226
|
-
if (!email) {
|
|
227
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
try {
|
|
231
|
-
const user = await resolveUser(req);
|
|
232
|
-
if (!user) {
|
|
233
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
const catalog = await groupIndex.catalog();
|
|
237
|
-
// Case-sensitive, like `groupOfPath` — the group name IS the folder name.
|
|
238
|
-
const group = catalog.find((g) => g.name === req.params.name);
|
|
239
|
-
const wsId = groupsWorkspaceId();
|
|
240
|
-
// Same ANY-folder shape `GET /groups` resolves with, so a group can
|
|
241
|
-
// never be listed as discoverable there and rejected as unknown here.
|
|
242
|
-
const verdicts = group
|
|
243
|
-
? await accessControl.canReadBatch(wsId, email, group.folders.flatMap((f) => [memberProbe(f), accessMdOf(f)]))
|
|
244
|
-
: new Map();
|
|
245
|
-
const any = (probe) => group?.folders.some((f) => verdicts.get(probe(f)) === true) ?? false;
|
|
246
|
-
// Discovery gate, fail-closed: an unknown group and a group the caller
|
|
247
|
-
// cannot discover answer IDENTICALLY, so probing can't confirm existence.
|
|
248
|
-
if (!group || !any(accessMdOf)) {
|
|
249
|
-
res.status(404).json({ error: 'Unknown group', kind: 'unknown-group' });
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
if (any(memberProbe)) {
|
|
253
|
-
// Access landed between page load and click — reload, don't ask.
|
|
254
|
-
res.status(409).json({ error: 'You can already read this group', kind: 'already-readable' });
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
// The grant is written to the group's primary folder — the one the
|
|
258
|
-
// summary's `folders[0]` names and the banner's touched-path check
|
|
259
|
-
// expects.
|
|
260
|
-
const folder = group.folders[0];
|
|
261
|
-
const branch = joinBranchFor(email, group.name);
|
|
262
|
-
const existing = openJoinCr(await workflow.listChangeRequestsAuthoredBy(email), email, group.name);
|
|
263
|
-
if (existing) {
|
|
264
|
-
res.json({ ok: true, number: existing.number });
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
// A leftover branch from a rejected/withdrawn request is reused — the
|
|
268
|
-
// grant commit is already on it and the splice below no-ops.
|
|
269
|
-
try {
|
|
270
|
-
await workflow.createBranch(groupsWorkspaceId(), branch, DEFAULT_BRANCH);
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
// exists (or raced) — proceed against it
|
|
274
|
-
}
|
|
275
|
-
const ws = await workspaceService.getOrCreateForBranch(branch);
|
|
276
|
-
const accessPath = `${kbDirName}/${accessMdOf(folder)}`;
|
|
277
|
-
const current = await workspaceService.readFile(ws.id, accessPath).catch(() => '');
|
|
278
|
-
const spliced = spliceGrant(current, 'read', { kind: 'user', email: user.email, displayName: user.name }, { target: 'folder' });
|
|
279
|
-
if (spliced.changed) {
|
|
280
|
-
await workspaceService.writeFile(ws.id, accessPath, spliced.text);
|
|
281
|
-
await workflow.commitChanges(ws.id, user, `Request access to ${group.name}`);
|
|
282
|
-
}
|
|
283
|
-
const detail = await workflow.openChangeRequest(ws.id, user, {
|
|
284
|
-
sourceBranch: branch,
|
|
285
|
-
targetBranch: DEFAULT_BRANCH,
|
|
286
|
-
title: `Join request: ${group.name}`,
|
|
287
|
-
description: `${user.name} asked to join ${group.name}. A manager of the group accepts by ` +
|
|
288
|
-
`granting the access this branch proposes; the request closes itself once ` +
|
|
289
|
-
`every proposal has landed.`,
|
|
290
|
-
});
|
|
291
|
-
res.json({ ok: true, number: detail.number });
|
|
292
|
-
}
|
|
293
|
-
catch (err) {
|
|
294
|
-
if (err instanceof WorkflowDomainError) {
|
|
295
|
-
res.status(err.status).json({ error: err.message, ...(err.payload ?? {}) });
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
console.error('[groups] failed to open a join request:', err);
|
|
299
|
-
res.status(500).json({ error: 'Failed to request access' });
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
/**
|
|
303
|
-
* Resolve the caller as a MANAGER of `name` — the only role that may see or
|
|
304
|
-
* settle its join requests. Returns the group's primary folder, or null
|
|
305
|
-
* after answering the request.
|
|
306
|
-
*
|
|
307
|
-
* A non-manager gets an empty list rather than a 403 (the frontend asks
|
|
308
|
-
* unconditionally, exactly as it does for every other group surface), and
|
|
309
|
-
* an unknown group is indistinguishable from an unmanaged one.
|
|
310
|
-
*/
|
|
311
|
-
async function requireManager(req, res, onDenied) {
|
|
312
|
-
const email = req.userEmail;
|
|
313
|
-
if (!email) {
|
|
314
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
const group = (await groupIndex.catalog()).find((g) => g.name === req.params.name);
|
|
318
|
-
if (!group) {
|
|
319
|
-
onDenied();
|
|
320
|
-
return null;
|
|
321
|
-
}
|
|
322
|
-
const writable = await accessControl.canWriteBatch(groupsWorkspaceId(), email, group.folders.map(accessMdOf));
|
|
323
|
-
if (!group.folders.some((f) => writable.get(accessMdOf(f)) === true)) {
|
|
324
|
-
onDenied();
|
|
325
|
-
return null;
|
|
326
|
-
}
|
|
327
|
-
const user = await resolveUser(req);
|
|
328
|
-
if (!user) {
|
|
329
|
-
res.status(401).json({ error: 'Unauthenticated' });
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
|
-
return { group, folder: group.folders[0], user };
|
|
333
|
-
}
|
|
334
|
-
router.get('/groups/:name/join-requests', async (req, res) => {
|
|
335
|
-
try {
|
|
336
|
-
const ctx = await requireManager(req, res, () => res.json({ requests: [] }));
|
|
337
|
-
if (!ctx)
|
|
338
|
-
return;
|
|
339
|
-
const crs = await workflow.listChangeRequests();
|
|
340
|
-
res.json({
|
|
341
|
-
requests: await joinRequests.list(ctx.group.name, ctx.folder, crs, ctx.user),
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
catch (err) {
|
|
345
|
-
console.error('[groups] failed to list join requests:', err);
|
|
346
|
-
res.status(500).json({ error: 'Failed to list join requests' });
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
/**
|
|
350
|
-
* Settle one request if its proposals have all landed on the default
|
|
351
|
-
* branch. Called right after a grant so the banner updates in the same
|
|
352
|
-
* round-trip; the listing does the same thing lazily, so skipping this (a
|
|
353
|
-
* dropped response, a closed tab) only delays it.
|
|
354
|
-
*/
|
|
355
|
-
router.post('/groups/:name/join-requests/:number/reconcile', async (req, res) => {
|
|
356
|
-
try {
|
|
357
|
-
const ctx = await requireManager(req, res, () => res.status(404).json({ error: 'Not found' }));
|
|
358
|
-
if (!ctx)
|
|
359
|
-
return;
|
|
360
|
-
const crNumber = Number(req.params.number);
|
|
361
|
-
if (!Number.isSafeInteger(crNumber) || crNumber <= 0) {
|
|
362
|
-
res.status(400).json({ error: 'Invalid change request number' });
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
const cr = await workflow.getChangeRequest(crNumber);
|
|
366
|
-
if (!cr) {
|
|
367
|
-
res.status(404).json({ error: 'Not found' });
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
res.json({ closed: await joinRequests.reconcile(ctx.group.name, ctx.folder, cr, ctx.user) });
|
|
371
|
-
}
|
|
372
|
-
catch (err) {
|
|
373
|
-
console.error('[groups] failed to reconcile a join request:', err);
|
|
374
|
-
res.status(500).json({ error: 'Failed to update the request' });
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
return router;
|
|
378
|
-
}
|
|
379
|
-
//# sourceMappingURL=groups.routes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"groups.routes.js","sourceRoot":"","sources":["../../../src/modules/groups/groups.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
2
|
-
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
3
|
-
import type { ISkillService } from '../skills/skills.contract.js';
|
|
4
|
-
import type { IToolManualService } from '../tool-manuals/tool-manuals.contract.js';
|
|
5
|
-
import type { GroupCatalogEntry, IGroupIndexService } from './groups.contract.js';
|
|
6
|
-
/**
|
|
7
|
-
* The group index: every group folder in the default-branch KB, with its
|
|
8
|
-
* caller-independent totals and access principals.
|
|
9
|
-
*
|
|
10
|
-
* Two decisions worth keeping straight:
|
|
11
|
-
*
|
|
12
|
-
* - **Existence is an `access.md`, counting is not.** A group EXISTS because
|
|
13
|
-
* its folder carries an `access.md` — the file the provisioning endpoint
|
|
14
|
-
* seeds and the one every per-caller verdict (member / manager /
|
|
15
|
-
* discoverable) resolves against. A bare directory under `Groups/` is NOT
|
|
16
|
-
* a group: git cannot record an empty folder, so deleting a group's files
|
|
17
|
-
* leaves its directory behind on live checkouts, and enumerating by
|
|
18
|
-
* directory would resurrect every such ghost. Counts come from the
|
|
19
|
-
* already-cached global catalogs — `skillService.listSkills(undefined)` and
|
|
20
|
-
* `toolManualService.listAllSummaries()` — bucketed by `groupOfPath`. A
|
|
21
|
-
* second `walkFiles` pass would re-read the same tree and could disagree
|
|
22
|
-
* with the catalogs about what counts as a skill.
|
|
23
|
-
* - **Loose files are not groups.** `Groups/slack.tool` sits directly under
|
|
24
|
-
* the root, so it is a file, not a directory — the same ≥3-segment rule
|
|
25
|
-
* `groupOfPath` applies, arrived at from the other side.
|
|
26
|
-
*
|
|
27
|
-
* Cached for {@link CACHE_TTL_MS} and dropped by `invalidate()` from the
|
|
28
|
-
* file-change subscriber, so a grant committed on the default branch is
|
|
29
|
-
* reflected within one round-trip rather than one TTL.
|
|
30
|
-
*/
|
|
31
|
-
export declare class GroupIndexService implements IGroupIndexService {
|
|
32
|
-
private readonly workspaceService;
|
|
33
|
-
private readonly accessControl;
|
|
34
|
-
private readonly skillService;
|
|
35
|
-
private readonly toolManualService;
|
|
36
|
-
private readonly kbDirName;
|
|
37
|
-
private readonly cache;
|
|
38
|
-
constructor(workspaceService: WorkspaceService, accessControl: IAccessControl, skillService: ISkillService, toolManualService: IToolManualService, kbDirName: string, now?: () => number);
|
|
39
|
-
invalidate(): void;
|
|
40
|
-
catalog(): Promise<GroupCatalogEntry[]>;
|
|
41
|
-
/**
|
|
42
|
-
* Degrades on ANY failure rather than throwing. The Library must never break
|
|
43
|
-
* because a group folder can't be read — same philosophy as the skill and
|
|
44
|
-
* tool-manual scanners, and the reason the route's 500 is reserved for the
|
|
45
|
-
* per-caller half.
|
|
46
|
-
*
|
|
47
|
-
* `null` is that degraded case and is deliberately NOT the same value as an
|
|
48
|
-
* empty array: a KB with no group folders returns `[]`, which is true and
|
|
49
|
-
* cacheable, while a failure returns `null`, which `catalog()` serves as `[]`
|
|
50
|
-
* without storing it.
|
|
51
|
-
*/
|
|
52
|
-
private build;
|
|
53
|
-
/** name → repo-relative group folder (always a single-element list). */
|
|
54
|
-
private scanFolders;
|
|
55
|
-
private countSkills;
|
|
56
|
-
private countTools;
|
|
57
|
-
}
|
|
58
|
-
/** The default-branch workspace id every group resolution runs against. */
|
|
59
|
-
export declare function groupsWorkspaceId(): string;
|
|
60
|
-
//# sourceMappingURL=groups.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"groups.service.d.ts","sourceRoot":"","sources":["../../../src/modules/groups/groups.service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAIlF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAIxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAGnC,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,cAAc,EAC7B,YAAY,EAAE,aAAa,EAC3B,iBAAiB,EAAE,kBAAkB,EACrC,SAAS,EAAE,MAAM,EAClC,GAAG,GAAE,MAAM,MAAiB;IAK9B,UAAU,IAAI,IAAI;IAIZ,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkB5C;;;;;;;;;;MAUE;YACW,KAAK;IAyCnB,wEAAwE;YAC1D,WAAW;YAkCX,WAAW;YAMX,UAAU;CAGzB;AAaD,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
import { DEFAULT_BRANCH, GROUPS_DIR, groupOfPath, isPersonalGroupFolder, } from '@bevel-software/platform-shared';
|
|
4
|
-
import { workspaceIdForBranch } from '../workspace/workspace.service.js';
|
|
5
|
-
import { TtlCache } from '../../shared/ttl-cache.js';
|
|
6
|
-
const CACHE_TTL_MS = 60_000;
|
|
7
|
-
/**
|
|
8
|
-
* The group index: every group folder in the default-branch KB, with its
|
|
9
|
-
* caller-independent totals and access principals.
|
|
10
|
-
*
|
|
11
|
-
* Two decisions worth keeping straight:
|
|
12
|
-
*
|
|
13
|
-
* - **Existence is an `access.md`, counting is not.** A group EXISTS because
|
|
14
|
-
* its folder carries an `access.md` — the file the provisioning endpoint
|
|
15
|
-
* seeds and the one every per-caller verdict (member / manager /
|
|
16
|
-
* discoverable) resolves against. A bare directory under `Groups/` is NOT
|
|
17
|
-
* a group: git cannot record an empty folder, so deleting a group's files
|
|
18
|
-
* leaves its directory behind on live checkouts, and enumerating by
|
|
19
|
-
* directory would resurrect every such ghost. Counts come from the
|
|
20
|
-
* already-cached global catalogs — `skillService.listSkills(undefined)` and
|
|
21
|
-
* `toolManualService.listAllSummaries()` — bucketed by `groupOfPath`. A
|
|
22
|
-
* second `walkFiles` pass would re-read the same tree and could disagree
|
|
23
|
-
* with the catalogs about what counts as a skill.
|
|
24
|
-
* - **Loose files are not groups.** `Groups/slack.tool` sits directly under
|
|
25
|
-
* the root, so it is a file, not a directory — the same ≥3-segment rule
|
|
26
|
-
* `groupOfPath` applies, arrived at from the other side.
|
|
27
|
-
*
|
|
28
|
-
* Cached for {@link CACHE_TTL_MS} and dropped by `invalidate()` from the
|
|
29
|
-
* file-change subscriber, so a grant committed on the default branch is
|
|
30
|
-
* reflected within one round-trip rather than one TTL.
|
|
31
|
-
*/
|
|
32
|
-
export class GroupIndexService {
|
|
33
|
-
workspaceService;
|
|
34
|
-
accessControl;
|
|
35
|
-
skillService;
|
|
36
|
-
toolManualService;
|
|
37
|
-
kbDirName;
|
|
38
|
-
cache;
|
|
39
|
-
constructor(workspaceService, accessControl, skillService, toolManualService, kbDirName, now = Date.now) {
|
|
40
|
-
this.workspaceService = workspaceService;
|
|
41
|
-
this.accessControl = accessControl;
|
|
42
|
-
this.skillService = skillService;
|
|
43
|
-
this.toolManualService = toolManualService;
|
|
44
|
-
this.kbDirName = kbDirName;
|
|
45
|
-
this.cache = new TtlCache(CACHE_TTL_MS, now);
|
|
46
|
-
}
|
|
47
|
-
invalidate() {
|
|
48
|
-
this.cache.invalidate();
|
|
49
|
-
}
|
|
50
|
-
async catalog() {
|
|
51
|
-
const cached = this.cache.get();
|
|
52
|
-
if (cached)
|
|
53
|
-
return cached;
|
|
54
|
-
const entries = await this.build();
|
|
55
|
-
// A failed scan and a KB with genuinely no group folders both serve `[]`,
|
|
56
|
-
// but only the second is a fact worth holding for the TTL. Caching the
|
|
57
|
-
// failure would hide every group from every user for the full 60s AFTER
|
|
58
|
-
// the cause is gone — a clone mid-creation, a readdir that raced a
|
|
59
|
-
// checkout — and `invalidate()` only fires on a file-change event that may
|
|
60
|
-
// never arrive in that window. So a degraded read is served, not stored,
|
|
61
|
-
// and the next caller retries.
|
|
62
|
-
if (entries === null)
|
|
63
|
-
return [];
|
|
64
|
-
this.cache.set(entries);
|
|
65
|
-
return entries;
|
|
66
|
-
}
|
|
67
|
-
// --- internal --------------------------------------------------------------
|
|
68
|
-
/**
|
|
69
|
-
* Degrades on ANY failure rather than throwing. The Library must never break
|
|
70
|
-
* because a group folder can't be read — same philosophy as the skill and
|
|
71
|
-
* tool-manual scanners, and the reason the route's 500 is reserved for the
|
|
72
|
-
* per-caller half.
|
|
73
|
-
*
|
|
74
|
-
* `null` is that degraded case and is deliberately NOT the same value as an
|
|
75
|
-
* empty array: a KB with no group folders returns `[]`, which is true and
|
|
76
|
-
* cacheable, while a failure returns `null`, which `catalog()` serves as `[]`
|
|
77
|
-
* without storing it.
|
|
78
|
-
*/
|
|
79
|
-
async build() {
|
|
80
|
-
try {
|
|
81
|
-
const wsId = (await this.workspaceService.getOrCreateForBranch(DEFAULT_BRANCH)).id;
|
|
82
|
-
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
83
|
-
const folders = await this.scanFolders(kbRoot);
|
|
84
|
-
if (folders.size === 0)
|
|
85
|
-
return [];
|
|
86
|
-
const [skillCounts, toolCounts] = await Promise.all([
|
|
87
|
-
this.countSkills(),
|
|
88
|
-
this.countTools(),
|
|
89
|
-
]);
|
|
90
|
-
const entries = [];
|
|
91
|
-
for (const [name, groupFolders] of folders) {
|
|
92
|
-
// One folder, one access boundary — the folder IS the group.
|
|
93
|
-
const [primary] = groupFolders;
|
|
94
|
-
const [owners, writers, readers] = await Promise.all([
|
|
95
|
-
this.accessControl.eligibleOwners(wsId, primary),
|
|
96
|
-
this.accessControl.eligibleWriters(wsId, primary),
|
|
97
|
-
this.accessControl.eligibleReaders(wsId, primary),
|
|
98
|
-
]);
|
|
99
|
-
entries.push({
|
|
100
|
-
name,
|
|
101
|
-
folders: groupFolders,
|
|
102
|
-
skillCount: skillCounts.get(name) ?? 0,
|
|
103
|
-
toolCount: toolCounts.get(name) ?? 0,
|
|
104
|
-
owners,
|
|
105
|
-
writers,
|
|
106
|
-
readers,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
return entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
console.warn(`[groups] group index unavailable: ${err instanceof Error ? err.message : String(err)}`);
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/** name → repo-relative group folder (always a single-element list). */
|
|
117
|
-
async scanFolders(kbRoot) {
|
|
118
|
-
const byName = new Map();
|
|
119
|
-
let children;
|
|
120
|
-
try {
|
|
121
|
-
children = await fs.readdir(path.join(kbRoot, GROUPS_DIR), { withFileTypes: true });
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
return byName; // a KB without a `Groups/` root simply has no groups
|
|
125
|
-
}
|
|
126
|
-
const candidates = children.filter((child) => child.isDirectory() &&
|
|
127
|
-
!child.name.startsWith('.') &&
|
|
128
|
-
// Personal folders live under Groups/ but are not groups: one exists
|
|
129
|
-
// per person, private by construction, and listing them would put a
|
|
130
|
-
// locked row per employee in everyone's index.
|
|
131
|
-
!isPersonalGroupFolder(child.name));
|
|
132
|
-
// A group exists exactly when its folder carries an `access.md` (see the
|
|
133
|
-
// class doc) — stat that file, don't trust the directory.
|
|
134
|
-
const verdicts = await Promise.all(candidates.map(async (child) => {
|
|
135
|
-
try {
|
|
136
|
-
return (await fs.stat(path.join(kbRoot, GROUPS_DIR, child.name, 'access.md'))).isFile();
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
}));
|
|
142
|
-
candidates.forEach((child, i) => {
|
|
143
|
-
if (verdicts[i])
|
|
144
|
-
byName.set(child.name, [`${GROUPS_DIR}/${child.name}`]);
|
|
145
|
-
});
|
|
146
|
-
return byName;
|
|
147
|
-
}
|
|
148
|
-
async countSkills() {
|
|
149
|
-
// `undefined` is the documented GLOBAL, unfiltered mode — counts are a
|
|
150
|
-
// property of the group, not of who is asking.
|
|
151
|
-
return bucketByGroup(await this.skillService.listSkills(undefined));
|
|
152
|
-
}
|
|
153
|
-
async countTools() {
|
|
154
|
-
return bucketByGroup(await this.toolManualService.listAllSummaries());
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/** Count items per group folder name; ungrouped items (`null`) count nowhere. */
|
|
158
|
-
function bucketByGroup(items) {
|
|
159
|
-
const counts = new Map();
|
|
160
|
-
for (const item of items) {
|
|
161
|
-
const group = groupOfPath(item.path);
|
|
162
|
-
if (group === null)
|
|
163
|
-
continue;
|
|
164
|
-
counts.set(group, (counts.get(group) ?? 0) + 1);
|
|
165
|
-
}
|
|
166
|
-
return counts;
|
|
167
|
-
}
|
|
168
|
-
/** The default-branch workspace id every group resolution runs against. */
|
|
169
|
-
export function groupsWorkspaceId() {
|
|
170
|
-
return workspaceIdForBranch(DEFAULT_BRANCH);
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=groups.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"groups.service.js","sourceRoot":"","sources":["../../../src/modules/groups/groups.service.ts"],"names":[],"mappings":"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"}
|