@bevel-software/platform-core-backend 0.33.0 → 0.35.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/agent-guide/access-control.md +146 -289
- package/agent-guide/conventions.md +23 -25
- package/agent-guide/directory-structure.md +72 -120
- package/agent-guide/drafts-and-change-requests.md +92 -0
- package/agent-guide/for-git-users.md +47 -0
- package/agent-guide/glossary.md +36 -0
- package/agent-guide/how-agents-find-things.md +49 -0
- package/agent-guide/html-views.md +239 -8
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +65 -0
- package/agent-guide/tool-manuals.md +133 -155
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- package/dist/core/catalog-revision.d.ts +12 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +23 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +41 -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.map +1 -1
- package/dist/core/create-core-server.js +15 -8
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +22 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +44 -16
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -0
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +12 -2
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +39 -9
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +15 -3
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +239 -75
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +22 -24
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +48 -51
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-view.d.ts.map +1 -1
- package/dist/modules/access/access-view.js +12 -11
- package/dist/modules/access/access-view.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +3 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +58 -33
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.routes.js +4 -2
- package/dist/modules/access/groups-admin.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +44 -13
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +80 -38
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/groups-edit.d.ts +1 -1
- package/dist/modules/access/groups-edit.d.ts.map +1 -1
- package/dist/modules/access/groups-edit.js +1 -1
- package/dist/modules/access/groups-edit.js.map +1 -1
- package/dist/modules/access/index.d.ts +1 -1
- package/dist/modules/access/index.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +116 -24
- package/dist/modules/access/reference-scan.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.js +305 -44
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +17 -8
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +32 -23
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +35 -10
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +60 -20
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/access-splice.d.ts +22 -18
- package/dist/modules/access-model/access-splice.d.ts.map +1 -1
- package/dist/modules/access-model/access-splice.js +20 -14
- package/dist/modules/access-model/access-splice.js.map +1 -1
- package/dist/modules/access-model/group-files.d.ts +1 -0
- package/dist/modules/access-model/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +5 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +47 -7
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +103 -13
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +46 -22
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +48 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +67 -0
- package/dist/modules/agent-guide/guide-budget.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +2 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +2 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +3 -1
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +7 -1
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +26 -9
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
- package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
- package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
- package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
- package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
- package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
- package/dist/modules/agent-scope/connection-scope.js +165 -0
- package/dist/modules/agent-scope/connection-scope.js.map +1 -0
- package/dist/modules/agent-scope/index.d.ts +3 -0
- package/dist/modules/agent-scope/index.d.ts.map +1 -0
- package/dist/modules/agent-scope/index.js +3 -0
- package/dist/modules/agent-scope/index.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +2 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/audit.contract.d.ts +6 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +12 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -1
- package/dist/modules/auth/account-admission.js +15 -0
- package/dist/modules/auth/account-admission.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +27 -1
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +42 -4
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts +13 -9
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +35 -29
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +55 -6
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +128 -34
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -1
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/auth/index.js +1 -1
- package/dist/modules/auth/index.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +2 -9
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +2 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -38
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +68 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +33 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts +8 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
- package/dist/modules/embed/embed.tools.d.ts.map +1 -1
- package/dist/modules/embed/embed.tools.js +5 -0
- package/dist/modules/embed/embed.tools.js.map +1 -1
- package/dist/modules/kb-fs/index.d.ts +2 -0
- package/dist/modules/kb-fs/index.d.ts.map +1 -1
- package/dist/modules/kb-fs/index.js +1 -0
- package/dist/modules/kb-fs/index.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +7 -1
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +26 -6
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +22 -7
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
- package/dist/modules/kb-fs/tmp-ref.js +76 -0
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +7 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +14 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +7 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +39 -4
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +74 -48
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +45 -10
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +9 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +34 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.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.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +18 -2
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +5 -1
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +32 -5
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +11 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +159 -24
- package/dist/modules/secrets-vault/db-secrets-vault.service.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-vault.contract.d.ts +53 -11
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +9 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +100 -42
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/oidc-check.d.ts.map +1 -1
- package/dist/modules/settings/oidc-check.js +5 -17
- package/dist/modules/settings/oidc-check.js.map +1 -1
- package/dist/modules/skills/index.d.ts +3 -3
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +0 -2
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +16 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +6 -1
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +25 -13
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
- 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 +4 -1
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/index.d.ts +1 -1
- package/dist/modules/tool-auth/index.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +9 -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 +27 -3
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +32 -6
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +7 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +3 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +1 -1
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +15 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +19 -0
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +10 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-helpers/validate-token.d.ts +3 -1
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +1 -1
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +3 -3
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +0 -2
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +46 -6
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +7 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +41 -4
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +24 -13
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +138 -59
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +8 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +56 -20
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/manual.routes.d.ts +8 -1
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
- package/dist/modules/tool-registry/manual.routes.js +27 -7
- package/dist/modules/tool-registry/manual.routes.js.map +1 -1
- package/dist/modules/tool-registry/tool.contract.d.ts +7 -0
- package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool.contract.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +36 -27
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +2 -2
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +20 -35
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +2 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +3 -0
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +1 -1
- package/dist/modules/workspace/agent-access.gate.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +28 -4
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +61 -40
- package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
- package/dist/modules/workspace/index.d.ts +8 -0
- package/dist/modules/workspace/index.d.ts.map +1 -1
- package/dist/modules/workspace/index.js +8 -0
- package/dist/modules/workspace/index.js.map +1 -1
- package/dist/modules/workspace/nul-scan.d.ts +19 -0
- package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
- package/dist/modules/workspace/nul-scan.js +55 -0
- package/dist/modules/workspace/nul-scan.js.map +1 -0
- package/dist/modules/workspace/pattern-matcher.contract.d.ts +110 -27
- package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.js +30 -13
- package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
- package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
- package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-search.js +657 -0
- package/dist/modules/workspace/ripgrep-search.js.map +1 -0
- package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
- package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-version.js +31 -0
- package/dist/modules/workspace/ripgrep-version.js.map +1 -0
- package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
- package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
- package/dist/modules/workspace/startup/beside-checkout.js +14 -5
- package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
- package/dist/modules/workspace/worker-pool.d.ts +3 -4
- package/dist/modules/workspace/worker-pool.d.ts.map +1 -1
- package/dist/modules/workspace/worker-pool.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
- package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
- package/dist/modules/workspace/workspace-tmp.js +435 -0
- package/dist/modules/workspace/workspace-tmp.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +5 -26
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +47 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +86 -6
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +3 -2
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +531 -137
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/oauth-token-error.d.ts +23 -0
- package/dist/shared/oauth-token-error.d.ts.map +1 -0
- package/dist/shared/oauth-token-error.js +47 -0
- package/dist/shared/oauth-token-error.js.map +1 -0
- package/dist/shared/path-order.d.ts +28 -8
- package/dist/shared/path-order.d.ts.map +1 -1
- package/dist/shared/path-order.js +37 -8
- package/dist/shared/path-order.js.map +1 -1
- package/dist/shared/read-capped.d.ts +19 -0
- package/dist/shared/read-capped.d.ts.map +1 -0
- package/dist/shared/read-capped.js +45 -0
- package/dist/shared/read-capped.js.map +1 -0
- package/migrations/0022_session_version.sql +6 -0
- package/migrations/0023_agent_path.sql +3 -0
- package/migrations/meta/0022_snapshot.json +2360 -0
- package/migrations/meta/0023_snapshot.json +2378 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -3
- package/src/__tests__/hexis-catalog.ts +144 -0
- package/src/__tests__/pg-scratch.test.ts +69 -0
- package/src/__tests__/pg-scratch.ts +31 -0
- package/src/__tests__/real-disk.ts +21 -0
- package/src/__tests__/slow-ripgrep.ts +65 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +25 -0
- package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
- package/src/core/__tests__/catalog-revision.test.ts +89 -0
- package/src/core/__tests__/damaged-document.tools.test.ts +2 -2
- package/src/core/__tests__/gated-boot.test.ts +8 -1
- package/src/core/__tests__/lifecycle.test.ts +46 -13
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- package/src/core/catalog-revision.ts +24 -2
- package/src/core/core-ports.ts +42 -0
- package/src/core/create-core-server.ts +14 -1
- package/src/core/create-core-services.ts +62 -15
- package/src/core/lifecycle.ts +26 -2
- package/src/index.ts +1 -1
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
- package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
- package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
- package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
- package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
- package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
- package/src/modules/access/__tests__/access-groups.test.ts +55 -22
- package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
- package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
- package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +52 -10
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
- package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
- package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
- package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
- package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
- package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
- package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
- package/src/modules/access/access-control.interface.ts +43 -10
- package/src/modules/access/access-control.service.ts +250 -72
- package/src/modules/access/access-mutation.service.ts +48 -53
- package/src/modules/access/access-view.ts +12 -10
- package/src/modules/access/access.routes.ts +66 -37
- package/src/modules/access/groups-admin.routes.ts +4 -2
- package/src/modules/access/groups-admin.service.ts +114 -44
- package/src/modules/access/groups-edit.ts +1 -1
- package/src/modules/access/index.ts +1 -1
- package/src/modules/access/reference-scan.ts +319 -46
- package/src/modules/access/roles-admin.service.ts +43 -26
- package/src/modules/access/synced-groups-writer.ts +1 -1
- package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
- package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
- package/src/modules/access-model/access-grammar.ts +65 -20
- package/src/modules/access-model/access-splice.ts +31 -23
- package/src/modules/access-model/group-files.ts +5 -0
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +110 -25
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +38 -11
- package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
- package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
- package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
- package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +51 -22
- package/src/modules/agent-guide/agent-guide.ts +120 -13
- package/src/modules/agent-guide/guide-budget.ts +73 -0
- package/src/modules/agent-guide/index.ts +12 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +5 -4
- package/src/modules/agent-instructions/compose.ts +7 -1
- package/src/modules/agent-instructions/shared-file-rules.ts +27 -9
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
- package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
- package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
- package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
- package/src/modules/agent-scope/connection-scope.ts +199 -0
- package/src/modules/agent-scope/index.ts +15 -0
- package/src/modules/audit/agent-audit.service.ts +2 -0
- package/src/modules/audit/audit.contract.ts +6 -0
- package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
- package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
- package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
- package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
- package/src/modules/auth/account-admission.ts +19 -0
- package/src/modules/auth/auth.middleware.ts +45 -4
- package/src/modules/auth/auth.routes.ts +46 -29
- package/src/modules/auth/auth.service.ts +135 -34
- package/src/modules/auth/index.ts +2 -0
- package/src/modules/auth/oidc-auth-provider.ts +2 -9
- package/src/modules/code-mode/code-mode.tool.ts +2 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
- package/src/modules/connection-probe/connection-probe.service.ts +1 -34
- package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
- package/src/modules/database/core-schema.ts +33 -0
- package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
- package/src/modules/declared-variables/declared-variables.routes.ts +12 -1
- package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
- package/src/modules/embed/embed.tools.ts +5 -0
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
- package/src/modules/kb-fs/index.ts +2 -0
- package/src/modules/kb-fs/locking-filesystem.ts +7 -1
- package/src/modules/kb-fs/repo-path.ts +33 -7
- package/src/modules/kb-fs/tmp-ref.ts +81 -0
- package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
- package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
- package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
- package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +19 -2
- package/src/modules/mcp/mcp.routes.ts +39 -3
- package/src/modules/mcp/mcp.service.ts +112 -52
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +46 -8
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +41 -1
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/plugin-links.ts +19 -2
- package/src/modules/plugins/plugins.routes.ts +35 -4
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +430 -3
- package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
- package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +170 -27
- package/src/modules/secrets-vault/index.ts +1 -1
- package/src/modules/secrets-vault/secrets-vault.contract.ts +61 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +114 -42
- package/src/modules/settings/oidc-check.ts +5 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
- package/src/modules/skills/index.ts +7 -2
- package/src/modules/skills/skills.contract.ts +17 -0
- package/src/modules/skills/skills.service.ts +5 -1
- package/src/modules/skills/skills.tools.ts +45 -14
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
- package/src/modules/tool-auth/external-api-key.service.ts +5 -2
- package/src/modules/tool-auth/index.ts +1 -1
- package/src/modules/tool-auth/internal-token.service.ts +10 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +45 -3
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +19 -11
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -1
- package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
- package/src/modules/tool-helpers/tool-context.ts +10 -0
- package/src/modules/tool-helpers/tool-def.ts +1 -1
- package/src/modules/tool-helpers/tool-handler.ts +34 -0
- package/src/modules/tool-helpers/tool.contract.ts +10 -0
- package/src/modules/tool-helpers/validate-token.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +99 -8
- package/src/modules/tool-manuals/index.ts +6 -2
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- package/src/modules/tool-manuals/tool-manuals.contract.ts +40 -6
- package/src/modules/tool-manuals/tool-manuals.routes.ts +40 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +169 -61
- package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -25
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -113
- package/src/modules/tool-registry/manual.routes.ts +26 -5
- package/src/modules/tool-registry/tool.contract.ts +7 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +1 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +54 -3
- package/src/modules/workflow/agent-tools/workflow.tools.ts +36 -27
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
- package/src/modules/workflow/git/git.service.ts +29 -48
- package/src/modules/workflow/workflow.service.ts +5 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -2
- package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
- package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -12
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +22 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +549 -162
- package/src/modules/workspace/agent-access.gate.ts +1 -1
- package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +10 -0
- package/src/modules/workspace/file-readers/doc-extract.service.ts +71 -38
- package/src/modules/workspace/index.ts +20 -0
- package/src/modules/workspace/nul-scan.ts +50 -0
- package/src/modules/workspace/pattern-matcher.contract.ts +123 -32
- package/src/modules/workspace/ripgrep-search.ts +715 -0
- package/src/modules/workspace/ripgrep-version.ts +35 -0
- package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
- package/src/modules/workspace/startup/beside-checkout.ts +13 -5
- package/src/modules/workspace/worker-pool.ts +3 -4
- package/src/modules/workspace/workspace-tmp.ts +457 -0
- package/src/modules/workspace/workspace.routes.ts +6 -27
- package/src/modules/workspace/workspace.service.ts +92 -15
- package/src/modules/workspace/workspace.tools.ts +574 -176
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/path-order.ts +37 -8
- package/src/shared/read-capped.ts +40 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
- package/starter-packs/general/Plugins/general-starter/access.md +1 -1
- package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
- package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
- package/starter-packs/support/Plugins/support-starter/access.md +1 -1
- package/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- package/dist/modules/workspace/bounded-matcher.d.ts +0 -73
- package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
- package/dist/modules/workspace/bounded-matcher.js +0 -200
- package/dist/modules/workspace/bounded-matcher.js.map +0 -1
- package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
- package/src/modules/workspace/bounded-matcher.ts +0 -271
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
* provider then; a second write surface would fragment org management —
|
|
13
13
|
* which is the thing the mode model exists to prevent.
|
|
14
14
|
* - COLLISION GATE: create/rename refuse a name whose canonical form is a
|
|
15
|
-
* roles.yaml role
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* precedence then resolves
|
|
15
|
+
* roles.yaml role — a group sharing a role's name is reachable only as
|
|
16
|
+
* `group/<name>` and is far more likely a mistake than an intent. The IdP
|
|
17
|
+
* (or a hand-edited groups.yaml) can still produce collisions, which
|
|
18
|
+
* precedence then resolves: the bare name is the ROLE, `group/<name>` the
|
|
19
|
+
* group. The roster names every rule that spells such a group bare
|
|
20
|
+
* (`bareNameResolvesToRole`) so an Admin can rewrite it.
|
|
19
21
|
* - DEGRADE LOUDLY: a broken groups source never fails access resolution
|
|
20
22
|
* closed — groups contribute nothing and the model carries a
|
|
21
23
|
* `groupsHealth` marker, which the roster exposes so the Groups & Members page can
|
|
@@ -29,14 +31,19 @@ import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
|
29
31
|
import type { WorkflowEventBus } from '../workflow/index.js';
|
|
30
32
|
import type { AuthUser, IWorkspaceService, IWorkflowService } from '@bevel-software/platform-shared';
|
|
31
33
|
import { WorkflowDomainError } from '../../shared/domain-errors.js';
|
|
34
|
+
import type { ITreeWalker } from '../../shared/fs.contract.js';
|
|
32
35
|
import type { IAccessControl } from './access-control.interface.js';
|
|
33
36
|
import {
|
|
34
37
|
GROUP_REF_PREFIX,
|
|
38
|
+
GROUP_TOKEN_PREFIX,
|
|
35
39
|
canonicalRoleName,
|
|
36
40
|
hasAccessFrontmatterExtension,
|
|
41
|
+
GROUPS_YAML,
|
|
42
|
+
SYNCED_GROUPS_YAML,
|
|
43
|
+
validateGroupsFile,
|
|
44
|
+
makeRolesYamlWriteValidator,
|
|
37
45
|
} from '../access-model/index.js';
|
|
38
46
|
import { loadActiveGroups, type GroupsHealth } from './access-control.service.js';
|
|
39
|
-
import { GROUPS_YAML, SYNCED_GROUPS_YAML, validateGroupsFile, makeRolesYamlWriteValidator } from '../access-model/index.js';
|
|
40
47
|
import { parseRolesModel, removeGroupRefsEverywhere, renameGroupRefs, isGroupRefMember } from './roles-edit.js';
|
|
41
48
|
import {
|
|
42
49
|
GroupsEditError,
|
|
@@ -49,7 +56,7 @@ import {
|
|
|
49
56
|
type GroupsEditResult,
|
|
50
57
|
} from './groups-edit.js';
|
|
51
58
|
import { AdminLockedCommits, type LockedWrite } from './admin-locked-commit.js';
|
|
52
|
-
import { KbReferenceScanner } from './reference-scan.js';
|
|
59
|
+
import { KbReferenceScanner, readableReferences, translateRewriteWriteRefusal } from './reference-scan.js';
|
|
53
60
|
|
|
54
61
|
/** Where role→group assignments live (`group:<canonical>` member entries). */
|
|
55
62
|
const ROLES_YAML = 'roles.yaml';
|
|
@@ -69,8 +76,20 @@ export interface GroupRosterEntry {
|
|
|
69
76
|
canonical: string;
|
|
70
77
|
displayName: string;
|
|
71
78
|
members: string[];
|
|
72
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Every access rule referencing this group — same scan the rename uses —
|
|
81
|
+
* in a file the roster's viewer can read (see `getRoster`).
|
|
82
|
+
*/
|
|
73
83
|
referencedBy: { path: string; verb: string }[];
|
|
84
|
+
/**
|
|
85
|
+
* The access rules that name this group's name BARE while a ROLE of the same
|
|
86
|
+
* name exists. A bare name is the role, so these rules grant the role, not
|
|
87
|
+
* this group — rules written while bare names still meant the group change
|
|
88
|
+
* meaning here. An Admin rewrites each as `group/<Name>` if the group was
|
|
89
|
+
* meant. Empty when no role shares the name. Only files the roster's
|
|
90
|
+
* viewer can read are listed (see `getRoster`).
|
|
91
|
+
*/
|
|
92
|
+
bareNameResolvesToRole: { path: string; verb: string }[];
|
|
74
93
|
/**
|
|
75
94
|
* Canonical names of roles carrying a `group:<canonical>` assignment to
|
|
76
95
|
* this group — so the delete confirm can warn that those roles will lose
|
|
@@ -101,6 +120,8 @@ export class GroupsAdminService {
|
|
|
101
120
|
private readonly workspaceService: IWorkspaceService,
|
|
102
121
|
private readonly workflowService: IWorkflowService,
|
|
103
122
|
private readonly accessControl: IAccessControl,
|
|
123
|
+
/** The composition root's walk — the one the resolver finds access rules with. */
|
|
124
|
+
disk: ITreeWalker,
|
|
104
125
|
private readonly kbDirName: string,
|
|
105
126
|
/** Live-binding thunk — see RolesAdminService's identical note. */
|
|
106
127
|
private readonly defaultBranchOf: () => string,
|
|
@@ -121,7 +142,7 @@ export class GroupsAdminService {
|
|
|
121
142
|
// The event bus keeps the roster's `referencedBy` fresh: a share-dialog
|
|
122
143
|
// grant/revoke on any access.md happens outside this service, and the
|
|
123
144
|
// scanner invalidates its cache on those writes' events (TTL as backstop).
|
|
124
|
-
this.references = new KbReferenceScanner(workspaceService, kbDirName, eventBus);
|
|
145
|
+
this.references = new KbReferenceScanner(workspaceService, disk, kbDirName, eventBus);
|
|
125
146
|
}
|
|
126
147
|
|
|
127
148
|
private get defaultBranch(): string {
|
|
@@ -166,8 +187,13 @@ export class GroupsAdminService {
|
|
|
166
187
|
* fallback to manual, which would resurrect retired groups).
|
|
167
188
|
* - Manual mode, broken groups.yaml: 422 with the parse message — the
|
|
168
189
|
* repair path must show the operator what to fix, never a dead page.
|
|
190
|
+
*
|
|
191
|
+
* `viewerEmail` is who the roster is for: `referencedBy` and
|
|
192
|
+
* `bareNameResolvesToRole` name only the files that viewer can read. Being
|
|
193
|
+
* an Admin is not read access to every file, and a path is itself a
|
|
194
|
+
* disclosure.
|
|
169
195
|
*/
|
|
170
|
-
async getRoster(): Promise<GroupsRoster> {
|
|
196
|
+
async getRoster(viewerEmail: string): Promise<GroupsRoster> {
|
|
171
197
|
const workspaceId = await this.ensureWorkspace();
|
|
172
198
|
const active = await loadActiveGroups((f) => this.locked.readKbFile(workspaceId, f));
|
|
173
199
|
if (active.sourceFile === GROUPS_YAML && !active.health.ok) {
|
|
@@ -177,7 +203,7 @@ export class GroupsAdminService {
|
|
|
177
203
|
reason: active.health.reason,
|
|
178
204
|
});
|
|
179
205
|
}
|
|
180
|
-
const [referencesByToken, assignedByGroup] = await Promise.all([
|
|
206
|
+
const [referencesByToken, { byGroup: assignedByGroup, roles }] = await Promise.all([
|
|
181
207
|
this.references.scan(workspaceId),
|
|
182
208
|
this.rolesReferencingGroups(workspaceId),
|
|
183
209
|
]);
|
|
@@ -190,19 +216,44 @@ export class GroupsAdminService {
|
|
|
190
216
|
// IdP members render sorted (machine-generated file, no author order
|
|
191
217
|
// to honour); manual members keep file order (the editor's view).
|
|
192
218
|
members: mode === 'idp' ? [...def.emails].sort() : [...def.emails],
|
|
193
|
-
// A group's references are its
|
|
194
|
-
//
|
|
195
|
-
//
|
|
196
|
-
//
|
|
197
|
-
// only `role/<name>`). Explicit `role/<name>` hits are never a group
|
|
219
|
+
// A group's references are its `group/<name>` hits, plus its BARE
|
|
220
|
+
// hits while no role shares the name — a bare name is the role when
|
|
221
|
+
// one exists (the roles roster is the mirror image: it counts the
|
|
222
|
+
// bare hits then). Explicit `role/<name>` hits are never a group
|
|
198
223
|
// reference.
|
|
199
|
-
referencedBy:
|
|
224
|
+
referencedBy: [
|
|
225
|
+
...(referencesByToken.get(`${GROUP_TOKEN_PREFIX}${canonical}`) ?? []),
|
|
226
|
+
...(roles.has(canonical) ? [] : referencesByToken.get(canonical) ?? []),
|
|
227
|
+
],
|
|
228
|
+
bareNameResolvesToRole: roles.has(canonical) ? referencesByToken.get(canonical) ?? [] : [],
|
|
200
229
|
assignedToRoles: assignedByGroup.get(canonical) ?? [],
|
|
201
230
|
});
|
|
202
231
|
}
|
|
232
|
+
await this.keepReadableReferences(workspaceId, viewerEmail, groups);
|
|
203
233
|
return { mode, groups, groupsHealth: active.health };
|
|
204
234
|
}
|
|
205
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Drop every `referencedBy` and `bareNameResolvesToRole` row whose file the
|
|
238
|
+
* viewer cannot read. Dropped, not counted: Admin status does not grant
|
|
239
|
+
* read, so a count of rules in unreadable content would be a disclosure.
|
|
240
|
+
*/
|
|
241
|
+
private async keepReadableReferences(
|
|
242
|
+
workspaceId: string,
|
|
243
|
+
viewerEmail: string,
|
|
244
|
+
groups: GroupRosterEntry[],
|
|
245
|
+
): Promise<void> {
|
|
246
|
+
const paths = [
|
|
247
|
+
...new Set(groups.flatMap((g) => [...g.referencedBy, ...g.bareNameResolvesToRole].map((r) => r.path))),
|
|
248
|
+
];
|
|
249
|
+
if (paths.length === 0) return;
|
|
250
|
+
const readable = await this.accessControl.canReadBatch(workspaceId, viewerEmail, paths);
|
|
251
|
+
for (const g of groups) {
|
|
252
|
+
g.referencedBy = readableReferences(g.referencedBy, readable);
|
|
253
|
+
g.bareNameResolvesToRole = readableReferences(g.bareNameResolvesToRole, readable);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
206
257
|
/**
|
|
207
258
|
* Display names from the ACTIVE group source (synced in IdP mode, manual
|
|
208
259
|
* otherwise). Malformed files degrade to an empty list, matching the
|
|
@@ -230,7 +281,7 @@ export class GroupsAdminService {
|
|
|
230
281
|
await this.assertManualMode(await this.ensureWorkspace());
|
|
231
282
|
await this.assertRoleNameFree(displayName);
|
|
232
283
|
await this.runEdit(actor, (text) => editCreateGroup(text, displayName));
|
|
233
|
-
return this.getRoster();
|
|
284
|
+
return this.getRoster(actor.email);
|
|
234
285
|
}
|
|
235
286
|
|
|
236
287
|
/**
|
|
@@ -280,17 +331,17 @@ export class GroupsAdminService {
|
|
|
280
331
|
);
|
|
281
332
|
this.afterWrite(workspaceId, actor, files.map((f) => f.repoRel));
|
|
282
333
|
});
|
|
283
|
-
return this.getRoster();
|
|
334
|
+
return this.getRoster(actor.email);
|
|
284
335
|
}
|
|
285
336
|
|
|
286
337
|
async addMember(actor: AuthUser, canonical: string, email: string): Promise<GroupsRoster> {
|
|
287
338
|
await this.runEdit(actor, (text) => editAddMember(text, canonical, email));
|
|
288
|
-
return this.getRoster();
|
|
339
|
+
return this.getRoster(actor.email);
|
|
289
340
|
}
|
|
290
341
|
|
|
291
342
|
async removeMember(actor: AuthUser, canonical: string, email: string): Promise<GroupsRoster> {
|
|
292
343
|
await this.runEdit(actor, (text) => editRemoveMember(text, canonical, email));
|
|
293
|
-
return this.getRoster();
|
|
344
|
+
return this.getRoster(actor.email);
|
|
294
345
|
}
|
|
295
346
|
|
|
296
347
|
/**
|
|
@@ -310,7 +361,7 @@ export class GroupsAdminService {
|
|
|
310
361
|
await this.locked.withFileLocks(workspaceId, actor, [GROUPS_YAML, ROLES_YAML], () =>
|
|
311
362
|
this.renameGroupLocked(workspaceId, actor, canonical, newCanonical, newDisplayName),
|
|
312
363
|
);
|
|
313
|
-
return this.getRoster();
|
|
364
|
+
return this.getRoster(actor.email);
|
|
314
365
|
}
|
|
315
366
|
|
|
316
367
|
private async renameGroupLocked(
|
|
@@ -328,16 +379,20 @@ export class GroupsAdminService {
|
|
|
328
379
|
files.push({ repoRel: GROUPS_YAML, content: groupsEdit.text, original: text });
|
|
329
380
|
}
|
|
330
381
|
if (newCanonical !== canonical) {
|
|
331
|
-
// Grant references (
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
382
|
+
// Grant references (`group/<name>` tokens in access.md + node
|
|
383
|
+
// frontmatter, and the bare name while no role owns it), rewritten to
|
|
384
|
+
// the explicit `group/<New Name>`. The rewrite returns each file's
|
|
385
|
+
// ORIGINAL text alongside the new content, so the rollback snapshots
|
|
386
|
+
// reuse the read it already did — no second full-KB pass. Explicit
|
|
387
|
+
// `role/<name>` tokens, and a bare name a role owns, are untouched by
|
|
388
|
+
// design: they reference the ROLE, not this group.
|
|
389
|
+
const { roles } = await this.rolesReferencingGroups(workspaceId);
|
|
336
390
|
const refWrites = await this.references.rewriteReferences(
|
|
337
391
|
workspaceId,
|
|
338
|
-
canonical,
|
|
339
|
-
newDisplayName.trim()
|
|
392
|
+
[`${GROUP_TOKEN_PREFIX}${canonical}`, ...(roles.has(canonical) ? [] : [canonical])],
|
|
393
|
+
`${GROUP_TOKEN_PREFIX}${newDisplayName.trim()}`,
|
|
340
394
|
(message, cause) => new GroupsAdminError(message, 422, { cause }),
|
|
395
|
+
(paths) => this.accessControl.canReadBatch(workspaceId, actor.email, paths),
|
|
341
396
|
);
|
|
342
397
|
for (const w of refWrites) {
|
|
343
398
|
files.push({ repoRel: w.repoRelativePath, content: w.content, original: w.original });
|
|
@@ -373,12 +428,22 @@ export class GroupsAdminService {
|
|
|
373
428
|
// Roster locks are already ours (withFileLocks; strict same-user acquire
|
|
374
429
|
// forbids LockingFilesystem here). Grant-reference candidates are written
|
|
375
430
|
// unlocked — same exposure every reference rewrite has always had.
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
431
|
+
// The commit gates every file on the actor's write rules and restores all
|
|
432
|
+
// of them on a refusal; a refused file the actor may not read goes unnamed.
|
|
433
|
+
try {
|
|
434
|
+
await this.locked.writeAndCommitLocked(
|
|
435
|
+
workspaceId,
|
|
436
|
+
actor,
|
|
437
|
+
files,
|
|
438
|
+
`Rename group ${canonical} → ${newDisplayName.trim()}`,
|
|
439
|
+
);
|
|
440
|
+
} catch (err) {
|
|
441
|
+
throw await translateRewriteWriteRefusal(
|
|
442
|
+
err,
|
|
443
|
+
(paths) => this.accessControl.canReadBatch(workspaceId, actor.email, paths),
|
|
444
|
+
(message) => new GroupsAdminError(message, 422),
|
|
445
|
+
);
|
|
446
|
+
}
|
|
382
447
|
this.afterWrite(workspaceId, actor, files.map((f) => f.repoRel));
|
|
383
448
|
}
|
|
384
449
|
|
|
@@ -441,12 +506,12 @@ export class GroupsAdminService {
|
|
|
441
506
|
}
|
|
442
507
|
|
|
443
508
|
/**
|
|
444
|
-
* Refuse a group name that IS a role. Bare-name precedence (
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
* far more likely
|
|
448
|
-
* collisions still happen (the sync writer doesn't consult
|
|
449
|
-
* precedence resolves them.
|
|
509
|
+
* Refuse a group name that IS a role. Bare-name precedence (role-first)
|
|
510
|
+
* keeps the role safe either way, so this is deliberate FRICTION, not a
|
|
511
|
+
* correctness need: a group named after a role is reachable only as
|
|
512
|
+
* `group/<name>`, which is far more likely a surprise than an intent.
|
|
513
|
+
* IdP-sourced collisions still happen (the sync writer doesn't consult
|
|
514
|
+
* roles.yaml) and precedence resolves them.
|
|
450
515
|
*/
|
|
451
516
|
private async assertRoleNameFree(displayName: string): Promise<void> {
|
|
452
517
|
const workspaceId = await this.ensureWorkspace();
|
|
@@ -462,7 +527,7 @@ export class GroupsAdminService {
|
|
|
462
527
|
}
|
|
463
528
|
if (roles.some((r) => canonicalRoleName(r.displayName) === canonical)) {
|
|
464
529
|
throw new GroupsAdminError(
|
|
465
|
-
`'${displayName.trim()}' is a role name — name the group something else (
|
|
530
|
+
`'${displayName.trim()}' is a role name — name the group something else (in access rules the bare name '${displayName.trim()}' means the role).`,
|
|
466
531
|
422,
|
|
467
532
|
);
|
|
468
533
|
}
|
|
@@ -473,17 +538,22 @@ export class GroupsAdminService {
|
|
|
473
538
|
* Advisory (feeds the roster's `assignedToRoles` warning field): a broken
|
|
474
539
|
* roles.yaml yields an empty map rather than failing the roster.
|
|
475
540
|
*/
|
|
476
|
-
private async rolesReferencingGroups(
|
|
541
|
+
private async rolesReferencingGroups(
|
|
542
|
+
workspaceId: string,
|
|
543
|
+
): Promise<{ byGroup: Map<string, string[]>; roles: Set<string> }> {
|
|
477
544
|
const rolesText = (await this.locked.readKbFile(workspaceId, ROLES_YAML)) ?? '';
|
|
478
545
|
const byGroup = new Map<string, string[]>();
|
|
546
|
+
// Every role's canonical name — who owns a bare name (role-first).
|
|
547
|
+
const roleNames = new Set<string>();
|
|
479
548
|
let roles;
|
|
480
549
|
try {
|
|
481
550
|
roles = parseRolesModel(rolesText);
|
|
482
551
|
} catch {
|
|
483
|
-
return byGroup;
|
|
552
|
+
return { byGroup, roles: roleNames };
|
|
484
553
|
}
|
|
485
554
|
for (const role of roles) {
|
|
486
555
|
const roleCanonical = canonicalRoleName(role.displayName);
|
|
556
|
+
roleNames.add(roleCanonical);
|
|
487
557
|
for (const member of role.members) {
|
|
488
558
|
if (!isGroupRefMember(member)) continue;
|
|
489
559
|
const groupCanonical = canonicalRoleName(member.slice(GROUP_REF_PREFIX.length));
|
|
@@ -495,7 +565,7 @@ export class GroupsAdminService {
|
|
|
495
565
|
}
|
|
496
566
|
}
|
|
497
567
|
}
|
|
498
|
-
return byGroup;
|
|
568
|
+
return { byGroup, roles: roleNames };
|
|
499
569
|
}
|
|
500
570
|
|
|
501
571
|
private async runEdit(actor: AuthUser, pre: (text: string) => GroupsEditResult): Promise<void> {
|
|
@@ -48,7 +48,7 @@ export interface GroupsEditResult {
|
|
|
48
48
|
|
|
49
49
|
/** Thin assert wrapper over the SHARED name-safety predicate (`group-files.ts`
|
|
50
50
|
* `unsafeNameReason`) — one namespace, one set of rules, including the
|
|
51
|
-
* reserved `role/`
|
|
51
|
+
* reserved `role/` and `group/` prefixes. */
|
|
52
52
|
export function assertSafeGroupDisplayName(displayName: string): void {
|
|
53
53
|
const reason = unsafeNameReason(displayName);
|
|
54
54
|
if (reason) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export type { IAccessControl } from './access-control.interface.js';
|
|
7
7
|
// Reached by other modules; exported here so they stop importing the files.
|
|
8
|
-
export type { AccessDecisionSource, AccessTargetKind } from './access-control.interface.js';
|
|
8
|
+
export type { AccessDecisionSource, AccessTargetKind, HolderChange, HolderChanges } from './access-control.interface.js';
|
|
9
9
|
export { accessMdPathForFolder, fileCarriesAccessRules, governingFolderOf } from './access-mutation.service.js';
|
|
10
10
|
export type { AccessMutationService, IAccessMutation, TargetKind } from './access-mutation.service.js';
|
|
11
11
|
export { folderTarget, rulesFileFor } from './access-requests.contract.js';
|