@bevel-software/platform-core-backend 0.34.0 → 0.36.1
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 -300
- 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 +16 -11
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +66 -0
- package/agent-guide/tool-manuals.md +133 -154
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- 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 +27 -25
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +25 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +75 -60
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +22 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +3 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +76 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +32 -13
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.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 +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +63 -18
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +144 -30
- 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 +45 -31
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +71 -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/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +60 -18
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.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.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +27 -27
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +80 -53
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +635 -74
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +3 -2
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +2 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +205 -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 +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +206 -45
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.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/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.js +1 -1
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- 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.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.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/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +70 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +53 -49
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +2 -2
- package/dist/modules/workspace/agent-access.gate.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +5 -3
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +85 -30
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.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/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.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/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +5 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/hexis-catalog.ts +144 -0
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/real-disk.ts +21 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +31 -0
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +40 -26
- package/src/core/create-core-services.ts +92 -66
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
- package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
- package/src/modules/access/access-control.interface.ts +26 -0
- package/src/modules/access/access-control.service.ts +93 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +34 -15
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/index.ts +1 -1
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +98 -29
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
- 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 +49 -31
- package/src/modules/agent-guide/agent-guide.ts +165 -32
- package/src/modules/agent-guide/guide-budget.ts +77 -0
- package/src/modules/agent-guide/index.ts +12 -0
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +117 -11
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +28 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- 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__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +2 -2
- package/src/modules/kb-fs/locking-filesystem.ts +30 -30
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +93 -62
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +6 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- 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 +728 -118
- package/src/modules/secrets-vault/index.ts +8 -1
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +213 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/oidc-check.ts +5 -18
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.tools.ts +1 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-def.ts +1 -1
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +63 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
- package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +12 -119
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
- package/src/modules/workspace/agent-access.gate.ts +6 -6
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +90 -30
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/pending-proposals.ts +4 -4
- package/src/shared/read-capped.ts +40 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
|
@@ -59,6 +59,7 @@ import {
|
|
|
59
59
|
type ToolProbeTarget,
|
|
60
60
|
type ToolVariableScope,
|
|
61
61
|
type ToolVariableOAuth,
|
|
62
|
+
type LiveDeclaration,
|
|
62
63
|
} from './tool-manuals.contract.js';
|
|
63
64
|
|
|
64
65
|
const CACHE_TTL_MS = 60_000;
|
|
@@ -182,6 +183,19 @@ export function describeManualFault(err: unknown): string {
|
|
|
182
183
|
interface ScanResult {
|
|
183
184
|
manuals: ToolManualDescriptor[];
|
|
184
185
|
invalid: InvalidToolManual[];
|
|
186
|
+
/**
|
|
187
|
+
* Every manual the parse refused whose file still says which manual it is,
|
|
188
|
+
* by slug, with the reason. Not a listing surface (`invalid` is that, by
|
|
189
|
+
* path): it lets a sign-in started on a refused declaration answer why,
|
|
190
|
+
* where the slug alone would otherwise find nothing.
|
|
191
|
+
*/
|
|
192
|
+
refused: RefusedManual[];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
interface RefusedManual {
|
|
196
|
+
slug: string;
|
|
197
|
+
path: string;
|
|
198
|
+
reason: string;
|
|
185
199
|
}
|
|
186
200
|
|
|
187
201
|
/**
|
|
@@ -191,7 +205,7 @@ interface ScanResult {
|
|
|
191
205
|
* convention instance is one push away from every empty scan in the process
|
|
192
206
|
* inheriting another's contents.
|
|
193
207
|
*/
|
|
194
|
-
const emptyScan = (): ScanResult => ({ manuals: [], invalid: [] });
|
|
208
|
+
const emptyScan = (): ScanResult => ({ manuals: [], invalid: [], refused: [] });
|
|
195
209
|
|
|
196
210
|
const manualSerializer = new UtcpManualSerializer();
|
|
197
211
|
const callTemplateSerializer = new CallTemplateSerializer();
|
|
@@ -209,8 +223,8 @@ export interface McpAuthDiscoveryPort {
|
|
|
209
223
|
/**
|
|
210
224
|
* The sign-in endpoints for an OWNER-REGISTERED client: the same metadata
|
|
211
225
|
* walk as `statusFor`, stopping short of dynamic registration — the manual
|
|
212
|
-
* already names its `clientId`. Nothing is persisted;
|
|
213
|
-
*
|
|
226
|
+
* already names its `clientId`. Nothing is persisted; every sign-in start
|
|
227
|
+
* completes the declaration afresh (`liveDeclaration`). Optional so a port that
|
|
214
228
|
* only knows the zero-config path still satisfies the interface.
|
|
215
229
|
*/
|
|
216
230
|
providerForDeclaredClient?(manualName: string, mcpUrl: string, clientId: string): Promise<McpAuthDiscoveryResult>;
|
|
@@ -342,6 +356,38 @@ export class ToolManualService implements IToolManualService {
|
|
|
342
356
|
};
|
|
343
357
|
}
|
|
344
358
|
|
|
359
|
+
async liveDeclaration(
|
|
360
|
+
userEmail: string,
|
|
361
|
+
slug: string,
|
|
362
|
+
varName: string,
|
|
363
|
+
): Promise<LiveDeclaration | null> {
|
|
364
|
+
// The disk walk the catalog's scan is built from, run afresh and never
|
|
365
|
+
// cached: a sign-in must follow the file as it is, and the catalog's scan
|
|
366
|
+
// can be a refresh behind it. The whole walk rather than the one file, so
|
|
367
|
+
// the descriptor comes out of exactly the parse, plugin discovery and
|
|
368
|
+
// namespace dedup the catalog applies — a sign-in start is rare and
|
|
369
|
+
// interactive, and a second, single-file reading of the same files is a
|
|
370
|
+
// second place for those rules to drift. A workspace that cannot be opened
|
|
371
|
+
// is an error here, never an empty answer: "no sign-in declared" would be
|
|
372
|
+
// the wrong diagnosis for a server that could not read its files.
|
|
373
|
+
const { manuals, refused } = await this.readableBy(await this.scanDisk(undefined, 'throw'), userEmail);
|
|
374
|
+
const m = manuals.find((x) => x.slug === slug);
|
|
375
|
+
if (!m) {
|
|
376
|
+
// The file is there and says it is this manual, but the parse refused
|
|
377
|
+
// it — e.g. its sign-in names an http:// or private token endpoint. That
|
|
378
|
+
// reason is the answer; "not found" would hide the one thing to fix.
|
|
379
|
+
const r = refused.find((x) => x.slug === slug);
|
|
380
|
+
return r ? { refused: r.reason } : null;
|
|
381
|
+
}
|
|
382
|
+
const variable = (m.variables ?? []).find((v) => v.name === varName);
|
|
383
|
+
// Completed by the catalog's own decoration, on this one fresh descriptor.
|
|
384
|
+
// Only when THIS variable is a sign-in: then the manual has a declared one,
|
|
385
|
+
// so the pass completes its endpoints from the server's metadata and never
|
|
386
|
+
// probes for (or registers) a zero-config client.
|
|
387
|
+
if (variable?.oauth) await this.decorateMcpOAuth([m]);
|
|
388
|
+
return { manual: toSummary(m), ...(variable ? { variable } : {}) };
|
|
389
|
+
}
|
|
390
|
+
|
|
345
391
|
async listLocalOnly(userEmail: string, within?: ConnectorScope): Promise<{ slug: string; name: string; path: string }[]> {
|
|
346
392
|
const manuals = await this.accessibleManuals(userEmail, within);
|
|
347
393
|
return manuals.filter((m) => m.remote === false).map((m) => ({ slug: m.slug, name: m.name, path: m.path }));
|
|
@@ -408,6 +454,20 @@ export class ToolManualService implements IToolManualService {
|
|
|
408
454
|
}));
|
|
409
455
|
}
|
|
410
456
|
|
|
457
|
+
async sharedSignInKeysForManual(
|
|
458
|
+
manualName: string,
|
|
459
|
+
): Promise<{ key: string; name: string; label: string | null; oauthScopes?: string[] }[]> {
|
|
460
|
+
const manual = (await this.scan()).manuals.find((m) => m.name === manualName);
|
|
461
|
+
return (manual?.variables ?? [])
|
|
462
|
+
.filter((v) => v.scope === 'admin' && v.oauth != null)
|
|
463
|
+
.map((v) => ({
|
|
464
|
+
key: utcpNamespacedKey(manualName, v.name),
|
|
465
|
+
name: v.name,
|
|
466
|
+
label: v.label ?? null,
|
|
467
|
+
oauthScopes: v.oauth?.scopes,
|
|
468
|
+
}));
|
|
469
|
+
}
|
|
470
|
+
|
|
411
471
|
async scopeOfVariable(effectiveKey: string): Promise<ToolVariableScope> {
|
|
412
472
|
// UTCP looks up `<namespace-with-doubled-underscores>_<VAR>`. Find the manual
|
|
413
473
|
// whose namespace prefixes this key; the declared var is the remainder. Match
|
|
@@ -616,11 +676,16 @@ export class ToolManualService implements IToolManualService {
|
|
|
616
676
|
* in. Absent, the answer is the caller's whole readable catalog.
|
|
617
677
|
*/
|
|
618
678
|
private async accessibleScan(userEmail: string, within?: ConnectorScope): Promise<ScanResult> {
|
|
619
|
-
|
|
620
|
-
|
|
679
|
+
return this.readableBy(await this.scan(), userEmail, within);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/** A scan cut to what this caller may read — see {@link accessibleScan}. */
|
|
683
|
+
private async readableBy(scan: ScanResult, userEmail: string, within?: ConnectorScope): Promise<ScanResult> {
|
|
684
|
+
const { manuals, invalid, refused } = scan;
|
|
685
|
+
if (manuals.length === 0 && invalid.length === 0 && refused.length === 0) return emptyScan();
|
|
621
686
|
const wsId = this.kb.defaultWorkspaceId();
|
|
622
687
|
const allowed = await this.accessControl.canReadBatch(wsId, userEmail, [
|
|
623
|
-
...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path)]),
|
|
688
|
+
...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path), ...refused.map((r) => r.path)]),
|
|
624
689
|
]);
|
|
625
690
|
// Fail closed: keep an entry only on an explicit `true` verdict (a missing
|
|
626
691
|
// entry is treated as denied, matching the KB's default-deny read model).
|
|
@@ -631,6 +696,7 @@ export class ToolManualService implements IToolManualService {
|
|
|
631
696
|
return {
|
|
632
697
|
manuals: manuals.filter((m) => inScope(m.path)),
|
|
633
698
|
invalid: invalid.filter((i) => inScope(i.path)),
|
|
699
|
+
refused: refused.filter((r) => inScope(r.path)),
|
|
634
700
|
};
|
|
635
701
|
}
|
|
636
702
|
|
|
@@ -655,14 +721,14 @@ export class ToolManualService implements IToolManualService {
|
|
|
655
721
|
// See `TtlCache.begin`: taken before the read so an `invalidate()` that
|
|
656
722
|
// lands mid-scan discards this result instead of being overwritten by it.
|
|
657
723
|
const token = this.cache.begin();
|
|
658
|
-
const
|
|
724
|
+
const scanned = await this.scanDisk();
|
|
725
|
+
const { manuals } = scanned;
|
|
659
726
|
await this.decorateMcpOAuth(manuals);
|
|
660
727
|
// AFTER the oauth decoration, so an injected `${MCP_OAUTH}` header ref is
|
|
661
728
|
// already declared and isn't re-surfaced as a bare admin key.
|
|
662
729
|
for (const m of manuals) this.surfaceReferencedVariables(m);
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
return result;
|
|
730
|
+
this.cache.set(scanned, token);
|
|
731
|
+
return scanned;
|
|
666
732
|
}
|
|
667
733
|
|
|
668
734
|
/**
|
|
@@ -750,6 +816,10 @@ export class ToolManualService implements IToolManualService {
|
|
|
750
816
|
if (m.type !== 'mcp') continue;
|
|
751
817
|
const oauthVar = (m.variables ?? []).find((v) => v.oauth != null);
|
|
752
818
|
if (oauthVar) {
|
|
819
|
+
// A MANAGED sign-in has nothing for an owner to set up here: its
|
|
820
|
+
// client is the broker's, its endpoints are in the file. No setup
|
|
821
|
+
// kind, so no surface asks for a client secret it does not need.
|
|
822
|
+
if (oauthVar.oauth?.managed) continue;
|
|
753
823
|
// An owner-registered client is `oauth-manual` by definition — whether
|
|
754
824
|
// the declaration is complete or still needs its endpoints discovered.
|
|
755
825
|
// Explicit wins over discovery: never registered over, never probed
|
|
@@ -833,11 +903,12 @@ export class ToolManualService implements IToolManualService {
|
|
|
833
903
|
* (the owner registered an app with a provider that offers no dynamic
|
|
834
904
|
* registration — HubSpot, Google) gets its endpoints, PKCE and resource
|
|
835
905
|
* indicator from the server's own OAuth metadata, exactly as the zero-config
|
|
836
|
-
* path would. The descriptor is completed IN MEMORY
|
|
837
|
-
*
|
|
838
|
-
*
|
|
839
|
-
* incomplete and `setup.reason` says so — the secret
|
|
840
|
-
* with the same reason instead of
|
|
906
|
+
* path would. The descriptor is completed IN MEMORY, for the catalog's scan
|
|
907
|
+
* and for every sign-in start (`liveDeclaration`) alike, so nothing here
|
|
908
|
+
* persists. When the metadata can't be had, the declaration stays
|
|
909
|
+
* incomplete and `setup.reason` says so — the client-secret save and the
|
|
910
|
+
* sign-in start then refuse with the same reason instead of running a
|
|
911
|
+
* provider with no endpoints.
|
|
841
912
|
*/
|
|
842
913
|
private async completeDeclaredOAuth(
|
|
843
914
|
discovery: McpAuthDiscoveryPort,
|
|
@@ -856,8 +927,15 @@ export class ToolManualService implements IToolManualService {
|
|
|
856
927
|
m.setup = { kind: 'oauth-manual', reason: `sign-in endpoint discovery is unavailable — ${declaredByHand}` };
|
|
857
928
|
return;
|
|
858
929
|
}
|
|
930
|
+
// A file-declared sign-in carries its client id unless it is managed, and
|
|
931
|
+
// a managed one has nothing to discover: its endpoints are in the file.
|
|
932
|
+
const clientId = v.oauth?.clientId;
|
|
933
|
+
if (!clientId) {
|
|
934
|
+
m.setup = { kind: 'oauth-manual', reason: `the sign-in names no client id — ${declaredByHand}` };
|
|
935
|
+
return;
|
|
936
|
+
}
|
|
859
937
|
try {
|
|
860
|
-
const found = await discovery.providerForDeclaredClient(m.name, m.url!,
|
|
938
|
+
const found = await discovery.providerForDeclaredClient(m.name, m.url!, clientId);
|
|
861
939
|
if (found.status !== 'oauth') {
|
|
862
940
|
m.setup = {
|
|
863
941
|
kind: 'oauth-manual',
|
|
@@ -896,11 +974,22 @@ export class ToolManualService implements IToolManualService {
|
|
|
896
974
|
* calls: a refusal lives only in the scan it came from, so a fixed file is a
|
|
897
975
|
* valid manual on the very next scan.
|
|
898
976
|
*/
|
|
899
|
-
private async scanDisk(
|
|
977
|
+
private async scanDisk(
|
|
978
|
+
branch: string = this.kb.defaultBranch,
|
|
979
|
+
/**
|
|
980
|
+
* What a workspace that cannot be opened means. For the catalog, an empty
|
|
981
|
+
* scan: a listing surface answers "nothing released" and the next scan
|
|
982
|
+
* tries again. For a sign-in start (`liveDeclaration`), the error itself:
|
|
983
|
+
* an empty answer there would read as "this tool has no sign-in", a
|
|
984
|
+
* misconfiguration, when the server could not read its files at all.
|
|
985
|
+
*/
|
|
986
|
+
workspaceFailure: 'empty' | 'throw' = 'empty',
|
|
987
|
+
): Promise<ScanResult> {
|
|
900
988
|
let wsId: string;
|
|
901
989
|
try {
|
|
902
990
|
wsId = (await this.workspaceService.getOrCreateForBranch(branch)).id;
|
|
903
|
-
} catch {
|
|
991
|
+
} catch (err) {
|
|
992
|
+
if (workspaceFailure === 'throw') throw err;
|
|
904
993
|
return emptyScan();
|
|
905
994
|
}
|
|
906
995
|
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
@@ -921,6 +1010,7 @@ export class ToolManualService implements IToolManualService {
|
|
|
921
1010
|
// The plugins (and their mcp.json text) come from the configured source, so
|
|
922
1011
|
// a dialect that expands servers from a registry lands here unchanged.
|
|
923
1012
|
const parsed: ToolManualDescriptor[] = [];
|
|
1013
|
+
const refused: RefusedManual[] = [];
|
|
924
1014
|
const discovered = await this.source.discover(kbRoot);
|
|
925
1015
|
for (const plugin of discovered.plugins) {
|
|
926
1016
|
if (plugin.mcpJsonText === null) continue; // no servers is the common case, not an error
|
|
@@ -929,7 +1019,9 @@ export class ToolManualService implements IToolManualService {
|
|
|
929
1019
|
// (a URL, a header, an added or dropped server, a `local: true` flip)
|
|
930
1020
|
// moves every server's digest — which is correct, if slightly generous.
|
|
931
1021
|
const from = sourceDigest(plugin.mcpJsonText + '\u0000' + (plugin.manifestText ?? ''));
|
|
932
|
-
|
|
1022
|
+
const onRefused = (slug: string, reason: string, path: string) =>
|
|
1023
|
+
refused.push({ slug, path, reason: describeManualFault(reason) });
|
|
1024
|
+
for (const d of descriptorsFromMcpJson(plugin.relFolder, plugin.mcpJsonText, plugin.manifestText, layout, onRefused)) {
|
|
933
1025
|
d.sourceRevision = from;
|
|
934
1026
|
parsed.push(d);
|
|
935
1027
|
}
|
|
@@ -965,6 +1057,8 @@ export class ToolManualService implements IToolManualService {
|
|
|
965
1057
|
// outage from where the author stands: the tool is gone from every
|
|
966
1058
|
// listing, with nothing anywhere saying which file or why.
|
|
967
1059
|
invalid.push({ path: f.rel, reason: describeManualFault(err) });
|
|
1060
|
+
const slug = refusedToolManualName(baseName(f.rel), content);
|
|
1061
|
+
if (slug !== null) refused.push({ slug, path: f.rel, reason: describeManualFault(err) });
|
|
968
1062
|
continue;
|
|
969
1063
|
}
|
|
970
1064
|
// The route slug IS the id (unique after dedup below, snake_case → URL-safe),
|
|
@@ -1013,7 +1107,7 @@ export class ToolManualService implements IToolManualService {
|
|
|
1013
1107
|
// draft workspace, and a draft's half-written `.tool` is not news about the
|
|
1014
1108
|
// served catalog — it would also flap the log every time an agent saves.
|
|
1015
1109
|
if (branch === this.kb.defaultBranch) this.logInvalidOnChange(invalid);
|
|
1016
|
-
return { manuals, invalid };
|
|
1110
|
+
return { manuals, invalid, refused };
|
|
1017
1111
|
}
|
|
1018
1112
|
}
|
|
1019
1113
|
|
|
@@ -1125,6 +1219,54 @@ function manualName(raw: string): string {
|
|
|
1125
1219
|
return name;
|
|
1126
1220
|
}
|
|
1127
1221
|
|
|
1222
|
+
/**
|
|
1223
|
+
* The object a `.tool` file holds: its `---` block when fenced, the whole file
|
|
1224
|
+
* when not. Throws when that is not an object.
|
|
1225
|
+
*/
|
|
1226
|
+
function toolFileObject(content: string): Record<string, unknown> {
|
|
1227
|
+
const fm = extractFrontmatter(content);
|
|
1228
|
+
const source = fm ? fm.frontmatter : content;
|
|
1229
|
+
const parsed = parseYaml(source) as unknown;
|
|
1230
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
1231
|
+
throw new Error('`.tool` file must be a YAML/JSON object (in the `---` block when fenced)');
|
|
1232
|
+
}
|
|
1233
|
+
return parsed as Record<string, unknown>;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
/**
|
|
1237
|
+
* A `.tool`'s manual name — its UTCP namespace, and the slug the scan serves it
|
|
1238
|
+
* under. An explicit `id` is used VERBATIM, so it must be lowercase snake_case
|
|
1239
|
+
* (UTCP's namespace grammar). With no explicit id, fall back to `name` then the
|
|
1240
|
+
* filename and sanitize (legacy behaviour — keeps existing tools' namespaces).
|
|
1241
|
+
*/
|
|
1242
|
+
function toolManualName(obj: Record<string, unknown>, provisionalSlug: string): string {
|
|
1243
|
+
const explicitId = typeof obj.id === 'string' ? obj.id.trim() : '';
|
|
1244
|
+
if (!explicitId) return manualName(resolveDeclaredId(obj, provisionalSlug));
|
|
1245
|
+
if (!isValidId(explicitId)) {
|
|
1246
|
+
// The rejected id is NOT quoted back — see `describeManualFault`: this
|
|
1247
|
+
// message becomes an `invalid[].reason` on an agent transcript, a browser
|
|
1248
|
+
// and a log, and `id` is a field an author can paste anything into,
|
|
1249
|
+
// including the token they meant for a header. The field name plus the
|
|
1250
|
+
// rule is what the author needs; the value is in front of them.
|
|
1251
|
+
throw new Error('tool `id` must be lowercase snake_case (letters, digits, underscores)');
|
|
1252
|
+
}
|
|
1253
|
+
return explicitId;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
/**
|
|
1257
|
+
* The manual name of a `.tool` the parser REFUSED, when the file still says
|
|
1258
|
+
* which manual it is — by the same rule {@link normalizeToolManual} names a
|
|
1259
|
+
* manual it accepts. `null` when even that cannot be read (unparseable YAML,
|
|
1260
|
+
* a malformed `id`): then nothing can claim the refusal by name.
|
|
1261
|
+
*/
|
|
1262
|
+
function refusedToolManualName(provisionalSlug: string, content: string): string | null {
|
|
1263
|
+
try {
|
|
1264
|
+
return toolManualName(toolFileObject(content), provisionalSlug);
|
|
1265
|
+
} catch {
|
|
1266
|
+
return null;
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1128
1270
|
/**
|
|
1129
1271
|
* Parse + normalize a `.tool` file into a descriptor. THE TOOL IS THE
|
|
1130
1272
|
* FRONTMATTER: a fenced file's single `---` YAML block carries everything —
|
|
@@ -1148,34 +1290,9 @@ export function normalizeToolManual(
|
|
|
1148
1290
|
// finds its verbs inside the fence, the id index finds `id`/`name`, and the
|
|
1149
1291
|
// config keys live in the same object. A fence-less file is the legacy form
|
|
1150
1292
|
// (the whole file is the object) — JSON `.tool`s can't carry fences.
|
|
1151
|
-
const
|
|
1152
|
-
const source = fm ? fm.frontmatter : content;
|
|
1153
|
-
const parsed = parseYaml(source) as unknown;
|
|
1154
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
1155
|
-
throw new Error('`.tool` file must be a YAML/JSON object (in the `---` block when fenced)');
|
|
1156
|
-
}
|
|
1157
|
-
const obj = parsed as Record<string, unknown>;
|
|
1293
|
+
const obj = toolFileObject(content);
|
|
1158
1294
|
const type = normalizeType(obj.type);
|
|
1159
|
-
|
|
1160
|
-
// Identity: an explicit `id` is used VERBATIM as the UTCP manual namespace, so
|
|
1161
|
-
// it must be lowercase snake_case (UTCP's namespace grammar). With no explicit
|
|
1162
|
-
// id, fall back to `name` then the filename and sanitize (legacy behaviour —
|
|
1163
|
-
// keeps existing tools' namespaces).
|
|
1164
|
-
const explicitId = typeof obj.id === 'string' ? obj.id.trim() : '';
|
|
1165
|
-
let name: string;
|
|
1166
|
-
if (explicitId) {
|
|
1167
|
-
if (!isValidId(explicitId)) {
|
|
1168
|
-
// The rejected id is NOT quoted back — see `describeManualFault`: this
|
|
1169
|
-
// message becomes an `invalid[].reason` on an agent transcript, a browser
|
|
1170
|
-
// and a log, and `id` is a field an author can paste anything into,
|
|
1171
|
-
// including the token they meant for a header. The field name plus the
|
|
1172
|
-
// rule is what the author needs; the value is in front of them.
|
|
1173
|
-
throw new Error('tool `id` must be lowercase snake_case (letters, digits, underscores)');
|
|
1174
|
-
}
|
|
1175
|
-
name = explicitId;
|
|
1176
|
-
} else {
|
|
1177
|
-
name = manualName(resolveDeclaredId(obj, provisionalSlug));
|
|
1178
|
-
}
|
|
1295
|
+
const name = toolManualName(obj, provisionalSlug);
|
|
1179
1296
|
|
|
1180
1297
|
// A `.tool` may not reproduce a built-in manual's UTCP namespace — that would
|
|
1181
1298
|
// let it read the loopback creds seeded under that namespace on the agent's
|
|
@@ -1487,8 +1604,11 @@ function normalizeVariables(raw: unknown): ToolVariable[] {
|
|
|
1487
1604
|
const label = typeof e.label === 'string' && e.label.trim() ? e.label.trim() : undefined;
|
|
1488
1605
|
const oauth = normalizeVariableOAuth(at, e.oauth);
|
|
1489
1606
|
// OAuth is inherently per-caller — each user signs in for their own token. An
|
|
1490
|
-
// admin-shared OAuth token would leak one user's token to all callers.
|
|
1491
|
-
|
|
1607
|
+
// admin-shared OAuth token would leak one user's token to all callers. The
|
|
1608
|
+
// one exception is a MANAGED sign-in enabled as a workspace connection:
|
|
1609
|
+
// there the shared token is the point (one CRM account for the company),
|
|
1610
|
+
// and only an owner of the tool can make it.
|
|
1611
|
+
if (oauth && scope !== 'user' && !oauth.managed) {
|
|
1492
1612
|
throw new Error(`${at}\` has \`oauth\`, so its \`scope\` must be \`user\``);
|
|
1493
1613
|
}
|
|
1494
1614
|
return {
|
|
@@ -1548,8 +1668,27 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
|
|
|
1548
1668
|
};
|
|
1549
1669
|
const authorizationUrl = safeUrl(o.authorizationUrl, 'authorizationUrl');
|
|
1550
1670
|
const tokenUrl = safeUrl(o.tokenUrl, 'tokenUrl');
|
|
1671
|
+
// A managed sign-in names the platform connector it goes through instead
|
|
1672
|
+
// of a client id: the client is the broker's. Both parts are ids of OURS
|
|
1673
|
+
// (matched against the catalog later), so the shape check here is all the
|
|
1674
|
+
// file gets — and neither value is repeated in a refusal.
|
|
1675
|
+
let managed: { connectorId: string; scopeSet: string } | undefined;
|
|
1676
|
+
if (o.managed !== undefined) {
|
|
1677
|
+
const m = o.managed as Record<string, unknown> | null;
|
|
1678
|
+
const connectorId = m && typeof m === 'object' && typeof m.connectorId === 'string' ? m.connectorId.trim() : '';
|
|
1679
|
+
const scopeSet = m && typeof m === 'object' && typeof m.scopeSet === 'string' ? m.scopeSet.trim() : '';
|
|
1680
|
+
if (!isValidId(connectorId) || !isValidId(scopeSet)) {
|
|
1681
|
+
throw new Error(`${at}.oauth.managed\` must be { connectorId, scopeSet } (lowercase snake_case ids)`);
|
|
1682
|
+
}
|
|
1683
|
+
managed = { connectorId, scopeSet };
|
|
1684
|
+
}
|
|
1551
1685
|
const clientId = typeof o.clientId === 'string' && o.clientId.trim() ? o.clientId.trim() : '';
|
|
1552
|
-
if (!clientId) throw new Error(`${at}.oauth.clientId\` is required`);
|
|
1686
|
+
if (!clientId && !managed) throw new Error(`${at}.oauth.clientId\` is required`);
|
|
1687
|
+
// One client or the other: a managed sign-in runs with the broker's app, and
|
|
1688
|
+
// a client id beside it would be a declaration two flows claim.
|
|
1689
|
+
if (clientId && managed) {
|
|
1690
|
+
throw new Error(`${at}.oauth\` names both \`managed\` and a \`clientId\`; a managed sign-in has no client of its own`);
|
|
1691
|
+
}
|
|
1553
1692
|
let scopes: string[] | undefined;
|
|
1554
1693
|
if (o.scopes !== undefined) {
|
|
1555
1694
|
if (!Array.isArray(o.scopes) || !o.scopes.every((s) => typeof s === 'string')) {
|
|
@@ -1578,11 +1717,12 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
|
|
|
1578
1717
|
return {
|
|
1579
1718
|
authorizationUrl,
|
|
1580
1719
|
tokenUrl,
|
|
1581
|
-
clientId,
|
|
1720
|
+
...(clientId ? { clientId } : {}),
|
|
1582
1721
|
...(scopes ? { scopes } : {}),
|
|
1583
1722
|
...(authParams ? { authParams } : {}),
|
|
1584
1723
|
...(o.pkce === false ? { pkce: false } : {}),
|
|
1585
1724
|
...(resource ? { resource } : {}),
|
|
1725
|
+
...(managed ? { managed } : {}),
|
|
1586
1726
|
};
|
|
1587
1727
|
}
|
|
1588
1728
|
|
|
@@ -7,18 +7,35 @@ import type { IAccessControl } from '../access/index.js';
|
|
|
7
7
|
import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
|
|
8
8
|
import type { ConnectorScope, IToolManualService } from './tool-manuals.contract.js';
|
|
9
9
|
import type { HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
10
|
+
import { scopesCovered, userSecretGap } from '../secrets-vault/index.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* What `list_tool_setup` needs from the secrets vault (structurally satisfied
|
|
13
14
|
* by `ISecretsVaultService.statusFor`). A local port keeps this module free of
|
|
14
|
-
*
|
|
15
|
-
* `McpAuthDiscoveryPort` in the service.
|
|
15
|
+
* the vault service — the same decoupling discipline as
|
|
16
|
+
* `McpAuthDiscoveryPort` in the service. Only the vault's pure readiness rule
|
|
17
|
+
* (`userSecretGap`, its exported contract) is imported, the one the MCP proxy
|
|
18
|
+
* hides tools by.
|
|
16
19
|
*/
|
|
17
20
|
export interface VariableStatusPort {
|
|
18
21
|
statusFor(
|
|
19
22
|
userId: string,
|
|
20
23
|
keys: string[],
|
|
21
|
-
): Promise<
|
|
24
|
+
): Promise<
|
|
25
|
+
{
|
|
26
|
+
key: string;
|
|
27
|
+
adminConfigured: boolean;
|
|
28
|
+
/** What the owner's row is: a sign-in needs an `oauth` one, not a key left from when the variable was static. */
|
|
29
|
+
adminKind?: 'static' | 'oauth' | null;
|
|
30
|
+
userConfigured: boolean;
|
|
31
|
+
userAuthorized?: boolean;
|
|
32
|
+
/** For a shared (workspace) sign-in: the owner's row holds tokens, and what they were granted. */
|
|
33
|
+
adminAuthorized?: boolean;
|
|
34
|
+
adminGrantedScopes?: string;
|
|
35
|
+
userKind?: 'static' | 'oauth' | null;
|
|
36
|
+
grantedScopes?: string;
|
|
37
|
+
}[]
|
|
38
|
+
>;
|
|
22
39
|
}
|
|
23
40
|
|
|
24
41
|
/**
|
|
@@ -102,18 +119,15 @@ export function registerToolManualsTools(
|
|
|
102
119
|
// hidden tool's entry CONTAINS is on the field below rather than here.
|
|
103
120
|
description:
|
|
104
121
|
'Configuration status of every `.tool` the current user can access: what each needs set up and what is ' +
|
|
105
|
-
'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot ' +
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
'editor; users sign
|
|
109
|
-
'
|
|
110
|
-
'
|
|
111
|
-
'the tool
|
|
112
|
-
'
|
|
113
|
-
'
|
|
114
|
-
'draft is not listed, callable or signed-in-able until it is merged. Pass `branch` (the draft you wrote the ' +
|
|
115
|
-
'declaration on) and `onBranchOnly` names every tool declared there that the default branch does not serve ' +
|
|
116
|
-
'yet — open a change request and ask the user to merge it.',
|
|
122
|
+
'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot READ is ' +
|
|
123
|
+
"absent, and a `user` variable's flags are the caller's own. An `admin` variable with `oauth` is a WORKSPACE " +
|
|
124
|
+
"connection: `authorized` is the owner's connection, which only a writer of the tool can make or remake. " +
|
|
125
|
+
'Secret VALUES are never returned or set through a tool: an admin enters them in the tool editor; users sign ' +
|
|
126
|
+
'in on /connect. Setting shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter verbs and ' +
|
|
127
|
+
'the access.md chain), not by a platform role. `hiddenTools` names the tools Hexis hides for an invalid ' +
|
|
128
|
+
'schema. The listing is the RELEASED catalog (default branch only): a server or `.tool` declared on a draft is ' +
|
|
129
|
+
'not listed, callable or signed-in-able until merged. Pass `branch` and `onBranchOnly` names every tool ' +
|
|
130
|
+
'declared there that the default branch does not serve yet — open a change request and ask the user to merge it.',
|
|
117
131
|
path: '/api/agent/tools/list_tool_setup',
|
|
118
132
|
inputs: {
|
|
119
133
|
type: 'object',
|
|
@@ -197,7 +211,22 @@ export function registerToolManualsTools(
|
|
|
197
211
|
'Shared value set (plain admin vars), or the owner finished provider setup (OAuth vars).',
|
|
198
212
|
},
|
|
199
213
|
userConfigured: { type: 'boolean' },
|
|
200
|
-
authorized: {
|
|
214
|
+
authorized: {
|
|
215
|
+
type: ['boolean', 'null'],
|
|
216
|
+
description:
|
|
217
|
+
'OAuth vars: a token is stored that covers the declared scopes — the current user\'s for a `user` ' +
|
|
218
|
+
'variable, the WORKSPACE connection an owner made for an `admin` one (a managed connector enabled ' +
|
|
219
|
+
'as one shared connection; a reader cannot connect that, a writer of the tool can).',
|
|
220
|
+
},
|
|
221
|
+
managed: {
|
|
222
|
+
type: 'object',
|
|
223
|
+
description:
|
|
224
|
+
'Present when the sign-in goes through a managed connector (the distribution\'s own OAuth app, a ' +
|
|
225
|
+
'broker doing the round-trip): which connector and scope set. Members connect on /connect; an ' +
|
|
226
|
+
'owner needs no client secret for it.',
|
|
227
|
+
properties: { connectorId: { type: 'string' }, scopeSet: { type: 'string' } },
|
|
228
|
+
required: ['connectorId', 'scopeSet'],
|
|
229
|
+
},
|
|
201
230
|
},
|
|
202
231
|
required: ['name', 'scope', 'oauth', 'adminConfigured', 'userConfigured'],
|
|
203
232
|
},
|
|
@@ -240,7 +269,9 @@ export function registerToolManualsTools(
|
|
|
240
269
|
},
|
|
241
270
|
note: {
|
|
242
271
|
type: 'string',
|
|
243
|
-
description:
|
|
272
|
+
description:
|
|
273
|
+
'Present when something is left to do: what it takes for the tools in `onBranchOnly` to go live, and for ' +
|
|
274
|
+
'tools that need your own value or sign-in to work.',
|
|
244
275
|
},
|
|
245
276
|
},
|
|
246
277
|
required: ['tools', 'invalid', 'onBranchOnly'],
|
|
@@ -288,6 +319,16 @@ export function registerToolManualsTools(
|
|
|
288
319
|
variables: (m.variables ?? []).map((v) => {
|
|
289
320
|
const st = statusByKey.get(varKey(m.name, v.name));
|
|
290
321
|
const isOAuth = v.oauth != null;
|
|
322
|
+
// A sign-in counts as authorized when a token is stored AND it
|
|
323
|
+
// still covers what the tool declares — the one readiness rule,
|
|
324
|
+
// so this flag agrees with the sign-in note below. A shared
|
|
325
|
+
// sign-in (a managed workspace connection) reads the owner's
|
|
326
|
+
// row: it is everyone's once an owner has connected it.
|
|
327
|
+
const authorized = isOAuth
|
|
328
|
+
? v.scope === 'admin'
|
|
329
|
+
? st?.adminAuthorized === true && scopesCovered(v.oauth?.scopes, st.adminGrantedScopes)
|
|
330
|
+
: st?.userAuthorized === true && scopesCovered(v.oauth?.scopes, st.grantedScopes)
|
|
331
|
+
: null;
|
|
291
332
|
return {
|
|
292
333
|
name: v.name,
|
|
293
334
|
scope: v.scope,
|
|
@@ -295,24 +336,48 @@ export function registerToolManualsTools(
|
|
|
295
336
|
oauth: isOAuth,
|
|
296
337
|
adminConfigured: st?.adminConfigured ?? false,
|
|
297
338
|
userConfigured: st?.userConfigured ?? false,
|
|
298
|
-
authorized
|
|
339
|
+
authorized,
|
|
340
|
+
...(v.oauth?.managed ? { managed: v.oauth.managed } : {}),
|
|
299
341
|
};
|
|
300
342
|
}),
|
|
301
343
|
};
|
|
302
344
|
}),
|
|
303
345
|
);
|
|
304
346
|
const onBranchOnly = pending.map((p) => ({ ...p, branch: branch! }));
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
invalid,
|
|
309
|
-
onBranchOnly,
|
|
310
|
-
note:
|
|
347
|
+
const notes: string[] = [];
|
|
348
|
+
if (onBranchOnly.length > 0) {
|
|
349
|
+
notes.push(
|
|
311
350
|
`${onBranchOnly.map((p) => `\`${p.name}\``).join(', ')} ${onBranchOnly.length === 1 ? 'is' : 'are'} declared on ` +
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
351
|
+
`\`${branch}\` only. Tools are served from \`${deps.kb.defaultBranch}\`, so ${onBranchOnly.length === 1 ? 'it stays' : 'they stay'} ` +
|
|
352
|
+
'unlisted, uncallable and without a sign-in until that branch is merged: open a change request with ' +
|
|
353
|
+
`\`open_change_request\` (target \`${deps.kb.defaultBranch}\`), then ask the user to review and merge it in the app.`,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
// The person's own part, said where the agent is when a tool "does not work": the
|
|
357
|
+
// reconnect step is the one agents leave out (the agent-guide benchmark, 2026-10-26).
|
|
358
|
+
// By the rule the proxy hides a tool by (`userSecretGap`), so the note
|
|
359
|
+
// names every tool that is hidden for want of the caller's own value. A
|
|
360
|
+
// sign-in waits on the owner's provider setup (an OAuth admin row, not a
|
|
361
|
+
// key left from when the variable was static — the Connect page counts
|
|
362
|
+
// that setup incomplete and the sign-in start refuses it): until then
|
|
363
|
+
// there is nothing to sign in to.
|
|
364
|
+
const needYou = manuals.filter((m) =>
|
|
365
|
+
(m.variables ?? []).some((v) => {
|
|
366
|
+
if (v.scope !== 'user') return false;
|
|
367
|
+
const st = statusByKey.get(varKey(m.name, v.name));
|
|
368
|
+
const gap = userSecretGap({ oauth: v.oauth != null, oauthScopes: v.oauth?.scopes }, st);
|
|
369
|
+
return gap !== null && (v.oauth == null || (st?.adminConfigured === true && st.adminKind === 'oauth'));
|
|
370
|
+
}),
|
|
371
|
+
);
|
|
372
|
+
if (needYou.length > 0) {
|
|
373
|
+
notes.push(
|
|
374
|
+
`${needYou.map((t) => `\`${t.name}\``).join(', ')} ${needYou.length === 1 ? 'needs' : 'need'} your own value or sign-in. ` +
|
|
375
|
+
'Set it yourself on the Connect page, never in the chat; then reconnect your assistant, or start a new chat, ' +
|
|
376
|
+
'so the tool is listed.',
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
if (notes.length === 0) return { tools, invalid, onBranchOnly };
|
|
380
|
+
return { tools, invalid, onBranchOnly, note: notes.join(' ') };
|
|
316
381
|
}),
|
|
317
382
|
);
|
|
318
383
|
}
|
|
@@ -3,8 +3,8 @@ import express from 'express';
|
|
|
3
3
|
import { describe, expect, it } from 'vitest';
|
|
4
4
|
import { inputSchemaDefect } from '@bevel-software/platform-mcp-core';
|
|
5
5
|
import { ToolRegistry } from '../tool-registry.js';
|
|
6
|
-
import {
|
|
7
|
-
import { registerChangeRequestReadTools } from '../../
|
|
6
|
+
import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
|
|
7
|
+
import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
|
|
8
8
|
import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
|
|
9
9
|
import { registerSkillsTools } from '../../skills/skills.tools.js';
|
|
10
10
|
import { registerPluginsTools } from '../../plugins/plugins.tools.js';
|
|
@@ -58,8 +58,8 @@ const CORE_SERVER_SOURCE = new URL('../../../core/create-core-server.ts', import
|
|
|
58
58
|
/** Every tool-registering module, by the name the server calls it under. */
|
|
59
59
|
const MODULES: ReadonlyArray<{ name: string; register: (registry: ToolRegistry) => void }> = [
|
|
60
60
|
{
|
|
61
|
-
name: '
|
|
62
|
-
register: (registry) =>
|
|
61
|
+
name: 'registerVersionControlTools',
|
|
62
|
+
register: (registry) => registerVersionControlTools(registry, express.Router(), pass, handler, testKbContext(), async () => true, { canRead: async () => true, canReadAtRef: async () => true, canReadBatch: async () => new Map(), canReadBatchAtRef: async () => new Map(), canWrite: async () => true } as never, { recoveryBotEmail: 'recovery@x', hooks: { runAgentRead: async () => undefined }, notes: { onChange: () => undefined } } as never),
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
name: 'registerChangeRequestReadTools',
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
createToolHintsRoutes,
|
|
14
14
|
} from '../index.js';
|
|
15
15
|
import { toolDef } from '../../tool-helpers/index.js';
|
|
16
|
-
import {
|
|
17
|
-
import { registerChangeRequestReadTools } from '../../
|
|
16
|
+
import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
|
|
17
|
+
import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
|
|
18
18
|
import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
|
|
19
19
|
import { registerSkillsTools } from '../../skills/index.js';
|
|
20
20
|
import { registerPluginsTools } from '../../plugins/index.js';
|
|
@@ -98,7 +98,7 @@ const INTERNAL_ONLY = new Set(['switch_branch']);
|
|
|
98
98
|
function platformRegistry(): ToolRegistry {
|
|
99
99
|
const registry = new ToolRegistry();
|
|
100
100
|
const kb = testKbContext();
|
|
101
|
-
|
|
101
|
+
registerVersionControlTools(registry, express.Router(), pass, handler, kb, async () => true);
|
|
102
102
|
registerChangeRequestReadTools(registry, express.Router(), pass, handler, nothing, kb);
|
|
103
103
|
registerWorkspaceTools(
|
|
104
104
|
registry,
|