@bevel-software/platform-core-backend 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/dist/assets.d.ts +5 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +23 -0
- package/dist/assets.js.map +1 -0
- package/dist/core/core-ports.d.ts +83 -0
- package/dist/core/core-ports.d.ts.map +1 -0
- package/dist/core/core-ports.js +12 -0
- package/dist/core/core-ports.js.map +1 -0
- package/dist/core/create-core-server.d.ts +62 -0
- package/dist/core/create-core-server.d.ts.map +1 -0
- package/dist/core/create-core-server.js +204 -0
- package/dist/core/create-core-server.js.map +1 -0
- package/dist/core/create-core-services.d.ts +95 -0
- package/dist/core/create-core-services.d.ts.map +1 -0
- package/dist/core/create-core-services.js +352 -0
- package/dist/core/create-core-services.js.map +1 -0
- package/dist/core-config.d.ts +119 -0
- package/dist/core-config.d.ts.map +1 -0
- package/dist/core-config.js +240 -0
- package/dist/core-config.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/access/access-control.interface.d.ts +348 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -0
- package/dist/modules/access/access-control.interface.js +2 -0
- package/dist/modules/access/access-control.interface.js.map +1 -0
- package/dist/modules/access/access-control.service.d.ts +323 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -0
- package/dist/modules/access/access-control.service.js +1431 -0
- package/dist/modules/access/access-control.service.js.map +1 -0
- package/dist/modules/access/access-errors.d.ts +34 -0
- package/dist/modules/access/access-errors.d.ts.map +1 -0
- package/dist/modules/access/access-errors.js +40 -0
- package/dist/modules/access/access-errors.js.map +1 -0
- package/dist/modules/access/access-mutation.service.d.ts +176 -0
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -0
- package/dist/modules/access/access-mutation.service.js +307 -0
- package/dist/modules/access/access-mutation.service.js.map +1 -0
- package/dist/modules/access/access-splice.d.ts +98 -0
- package/dist/modules/access/access-splice.d.ts.map +1 -0
- package/dist/modules/access/access-splice.js +346 -0
- package/dist/modules/access/access-splice.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +10 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -0
- package/dist/modules/access/access.routes.js +757 -0
- package/dist/modules/access/access.routes.js.map +1 -0
- package/dist/modules/access/creator-access.d.ts +113 -0
- package/dist/modules/access/creator-access.d.ts.map +1 -0
- package/dist/modules/access/creator-access.js +212 -0
- package/dist/modules/access/creator-access.js.map +1 -0
- package/dist/modules/access/kb-read-filter.d.ts +41 -0
- package/dist/modules/access/kb-read-filter.d.ts.map +1 -0
- package/dist/modules/access/kb-read-filter.js +60 -0
- package/dist/modules/access/kb-read-filter.js.map +1 -0
- package/dist/modules/access/roles-admin.service.d.ts +240 -0
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -0
- package/dist/modules/access/roles-admin.service.js +630 -0
- package/dist/modules/access/roles-admin.service.js.map +1 -0
- package/dist/modules/access/roles-edit.d.ts +91 -0
- package/dist/modules/access/roles-edit.d.ts.map +1 -0
- package/dist/modules/access/roles-edit.js +232 -0
- package/dist/modules/access/roles-edit.js.map +1 -0
- package/dist/modules/access/roles-yaml-guard.d.ts +56 -0
- package/dist/modules/access/roles-yaml-guard.d.ts.map +1 -0
- package/dist/modules/access/roles-yaml-guard.js +79 -0
- package/dist/modules/access/roles-yaml-guard.js.map +1 -0
- package/dist/modules/admin/admin-access.routes.d.ts +18 -0
- package/dist/modules/admin/admin-access.routes.d.ts.map +1 -0
- package/dist/modules/admin/admin-access.routes.js +26 -0
- package/dist/modules/admin/admin-access.routes.js.map +1 -0
- package/dist/modules/admin/admin-access.service.d.ts +24 -0
- package/dist/modules/admin/admin-access.service.d.ts.map +1 -0
- package/dist/modules/admin/admin-access.service.js +41 -0
- package/dist/modules/admin/admin-access.service.js.map +1 -0
- package/dist/modules/admin/admin.interface.d.ts +11 -0
- package/dist/modules/admin/admin.interface.d.ts.map +1 -0
- package/dist/modules/admin/admin.interface.js +2 -0
- package/dist/modules/admin/admin.interface.js.map +1 -0
- package/dist/modules/auth/account-erasure.service.d.ts +80 -0
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -0
- package/dist/modules/auth/account-erasure.service.js +91 -0
- package/dist/modules/auth/account-erasure.service.js.map +1 -0
- package/dist/modules/auth/auth.middleware.d.ts +23 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -0
- package/dist/modules/auth/auth.middleware.js +68 -0
- package/dist/modules/auth/auth.middleware.js.map +1 -0
- package/dist/modules/auth/auth.routes.d.ts +25 -0
- package/dist/modules/auth/auth.routes.d.ts.map +1 -0
- package/dist/modules/auth/auth.routes.js +72 -0
- package/dist/modules/auth/auth.routes.js.map +1 -0
- package/dist/modules/auth/auth.service.d.ts +76 -0
- package/dist/modules/auth/auth.service.d.ts.map +1 -0
- package/dist/modules/auth/auth.service.js +168 -0
- package/dist/modules/auth/auth.service.js.map +1 -0
- package/dist/modules/code-mode/code-mode-names.d.ts +16 -0
- package/dist/modules/code-mode/code-mode-names.d.ts.map +1 -0
- package/dist/modules/code-mode/code-mode-names.js +30 -0
- package/dist/modules/code-mode/code-mode-names.js.map +1 -0
- package/dist/modules/code-mode/code-mode.tool.d.ts +13 -0
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -0
- package/dist/modules/code-mode/code-mode.tool.js +112 -0
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -0
- package/dist/modules/code-mode/index.d.ts +3 -0
- package/dist/modules/code-mode/index.d.ts.map +1 -0
- package/dist/modules/code-mode/index.js +3 -0
- package/dist/modules/code-mode/index.js.map +1 -0
- package/dist/modules/database/connection.d.ts +6 -0
- package/dist/modules/database/connection.d.ts.map +1 -0
- package/dist/modules/database/connection.js +12 -0
- package/dist/modules/database/connection.js.map +1 -0
- package/dist/modules/database/core-schema.d.ts +2273 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -0
- package/dist/modules/database/core-schema.js +413 -0
- package/dist/modules/database/core-schema.js.map +1 -0
- package/dist/modules/database/migrate.d.ts +10 -0
- package/dist/modules/database/migrate.d.ts.map +1 -0
- package/dist/modules/database/migrate.js +40 -0
- package/dist/modules/database/migrate.js.map +1 -0
- package/dist/modules/database/schema.d.ts +12 -0
- package/dist/modules/database/schema.d.ts.map +1 -0
- package/dist/modules/database/schema.js +12 -0
- package/dist/modules/database/schema.js.map +1 -0
- package/dist/modules/diff/diff-paths.d.ts +2 -0
- package/dist/modules/diff/diff-paths.d.ts.map +1 -0
- package/dist/modules/diff/diff-paths.js +9 -0
- package/dist/modules/diff/diff-paths.js.map +1 -0
- package/dist/modules/diff/diff.config.d.ts +8 -0
- package/dist/modules/diff/diff.config.d.ts.map +1 -0
- package/dist/modules/diff/diff.config.js +13 -0
- package/dist/modules/diff/diff.config.js.map +1 -0
- package/dist/modules/diff/diff.interface.d.ts +73 -0
- package/dist/modules/diff/diff.interface.d.ts.map +1 -0
- package/dist/modules/diff/diff.interface.js +2 -0
- package/dist/modules/diff/diff.interface.js.map +1 -0
- package/dist/modules/diff/diff.routes.d.ts +35 -0
- package/dist/modules/diff/diff.routes.d.ts.map +1 -0
- package/dist/modules/diff/diff.routes.js +228 -0
- package/dist/modules/diff/diff.routes.js.map +1 -0
- package/dist/modules/diff/diff.service.d.ts +51 -0
- package/dist/modules/diff/diff.service.d.ts.map +1 -0
- package/dist/modules/diff/diff.service.js +489 -0
- package/dist/modules/diff/diff.service.js.map +1 -0
- package/dist/modules/diff/line-diff.d.ts +16 -0
- package/dist/modules/diff/line-diff.d.ts.map +1 -0
- package/dist/modules/diff/line-diff.js +67 -0
- package/dist/modules/diff/line-diff.js.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +27 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.js +116 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -0
- package/dist/modules/mcp/mcp-session-store.d.ts +74 -0
- package/dist/modules/mcp/mcp-session-store.d.ts.map +1 -0
- package/dist/modules/mcp/mcp-session-store.js +131 -0
- package/dist/modules/mcp/mcp-session-store.js.map +1 -0
- package/dist/modules/mcp/mcp.routes.d.ts +24 -0
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -0
- package/dist/modules/mcp/mcp.routes.js +229 -0
- package/dist/modules/mcp/mcp.routes.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +198 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -0
- package/dist/modules/mcp/mcp.service.js +840 -0
- package/dist/modules/mcp/mcp.service.js.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +76 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +291 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +18 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +52 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -0
- package/dist/modules/mcp/oauth/oauth-state.d.ts +32 -0
- package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -0
- package/dist/modules/mcp/oauth/oauth-state.js +34 -0
- package/dist/modules/mcp/oauth/oauth-state.js.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +92 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +728 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -0
- package/dist/modules/secrets-vault/index.d.ts +7 -0
- package/dist/modules/secrets-vault/index.d.ts.map +1 -0
- package/dist/modules/secrets-vault/index.js +6 -0
- package/dist/modules/secrets-vault/index.js.map +1 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts +63 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +269 -0
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +46 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.js +87 -0
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +210 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js +90 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +30 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.js +490 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -0
- package/dist/modules/skills/index.d.ts +5 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +4 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/skills.contract.d.ts +58 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -0
- package/dist/modules/skills/skills.contract.js +10 -0
- package/dist/modules/skills/skills.contract.js.map +1 -0
- package/dist/modules/skills/skills.routes.d.ts +15 -0
- package/dist/modules/skills/skills.routes.d.ts.map +1 -0
- package/dist/modules/skills/skills.routes.js +34 -0
- package/dist/modules/skills/skills.routes.js.map +1 -0
- package/dist/modules/skills/skills.service.d.ts +21 -0
- package/dist/modules/skills/skills.service.d.ts.map +1 -0
- package/dist/modules/skills/skills.service.js +202 -0
- package/dist/modules/skills/skills.service.js.map +1 -0
- package/dist/modules/skills/skills.tools.d.ts +15 -0
- package/dist/modules/skills/skills.tools.d.ts.map +1 -0
- package/dist/modules/skills/skills.tools.js +96 -0
- package/dist/modules/skills/skills.tools.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.errors.d.ts +14 -0
- package/dist/modules/tool-auth/external-api-key.errors.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.errors.js +23 -0
- package/dist/modules/tool-auth/external-api-key.errors.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +90 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.js +2 -0
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts +25 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -0
- package/dist/modules/tool-auth/external-api-key.service.js +164 -0
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts +62 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -0
- package/dist/modules/tool-auth/internal-token.service.js +85 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -0
- package/dist/modules/tool-auth/llm-usage-meter.d.ts +16 -0
- package/dist/modules/tool-auth/llm-usage-meter.d.ts.map +1 -0
- package/dist/modules/tool-auth/llm-usage-meter.js +6 -0
- package/dist/modules/tool-auth/llm-usage-meter.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +101 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.js +166 -0
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -0
- package/dist/modules/tool-helpers/index.d.ts +19 -0
- package/dist/modules/tool-helpers/index.d.ts.map +1 -0
- package/dist/modules/tool-helpers/index.js +18 -0
- package/dist/modules/tool-helpers/index.js.map +1 -0
- package/dist/modules/tool-helpers/tool-context.d.ts +35 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-context.js +66 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +33 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-def.js +57 -0
- package/dist/modules/tool-helpers/tool-def.js.map +1 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts +19 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool-handler.js +84 -0
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts +64 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -0
- package/dist/modules/tool-helpers/tool.contract.js +24 -0
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -0
- package/dist/modules/tool-helpers/validate-token.d.ts +31 -0
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -0
- package/dist/modules/tool-helpers/validate-token.js +20 -0
- package/dist/modules/tool-helpers/validate-token.js.map +1 -0
- package/dist/modules/tool-manuals/index.d.ts +5 -0
- package/dist/modules/tool-manuals/index.d.ts.map +1 -0
- package/dist/modules/tool-manuals/index.js +5 -0
- package/dist/modules/tool-manuals/index.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +182 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js +19 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +24 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.js +102 -0
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +108 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js +710 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +35 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.js +157 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -0
- package/dist/modules/tool-registry/manual.routes.d.ts +6 -0
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -0
- package/dist/modules/tool-registry/manual.routes.js +76 -0
- package/dist/modules/tool-registry/manual.routes.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +23 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -0
- package/dist/modules/tool-registry/tool-registry.js +46 -0
- package/dist/modules/tool-registry/tool-registry.js.map +1 -0
- package/dist/modules/tool-registry/tool.contract.d.ts +48 -0
- package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -0
- package/dist/modules/tool-registry/tool.contract.js +2 -0
- package/dist/modules/tool-registry/tool.contract.js.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +14 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.js +437 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -0
- package/dist/modules/workflow/event-bus.d.ts +107 -0
- package/dist/modules/workflow/event-bus.d.ts.map +1 -0
- package/dist/modules/workflow/event-bus.js +224 -0
- package/dist/modules/workflow/event-bus.js.map +1 -0
- package/dist/modules/workflow/events.routes.d.ts +80 -0
- package/dist/modules/workflow/events.routes.d.ts.map +1 -0
- package/dist/modules/workflow/events.routes.js +216 -0
- package/dist/modules/workflow/events.routes.js.map +1 -0
- package/dist/modules/workflow/file-change-notifier.d.ts +38 -0
- package/dist/modules/workflow/file-change-notifier.d.ts.map +1 -0
- package/dist/modules/workflow/file-change-notifier.js +22 -0
- package/dist/modules/workflow/file-change-notifier.js.map +1 -0
- package/dist/modules/workflow/file-lock.service.d.ts +57 -0
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -0
- package/dist/modules/workflow/file-lock.service.js +202 -0
- package/dist/modules/workflow/file-lock.service.js.map +1 -0
- package/dist/modules/workflow/git/branch-name.d.ts +10 -0
- package/dist/modules/workflow/git/branch-name.d.ts.map +1 -0
- package/dist/modules/workflow/git/branch-name.js +76 -0
- package/dist/modules/workflow/git/branch-name.js.map +1 -0
- package/dist/modules/workflow/git/clone-config.d.ts +61 -0
- package/dist/modules/workflow/git/clone-config.d.ts.map +1 -0
- package/dist/modules/workflow/git/clone-config.js +69 -0
- package/dist/modules/workflow/git/clone-config.js.map +1 -0
- package/dist/modules/workflow/git/git-version.d.ts +34 -0
- package/dist/modules/workflow/git/git-version.d.ts.map +1 -0
- package/dist/modules/workflow/git/git-version.js +63 -0
- package/dist/modules/workflow/git/git-version.js.map +1 -0
- package/dist/modules/workflow/git/git.service.d.ts +427 -0
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -0
- package/dist/modules/workflow/git/git.service.js +1987 -0
- package/dist/modules/workflow/git/git.service.js.map +1 -0
- package/dist/modules/workflow/git/mutex.d.ts +11 -0
- package/dist/modules/workflow/git/mutex.d.ts.map +1 -0
- package/dist/modules/workflow/git/mutex.js +23 -0
- package/dist/modules/workflow/git/mutex.js.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts +124 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.js +328 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -0
- package/dist/modules/workflow/locking-filesystem.d.ts +133 -0
- package/dist/modules/workflow/locking-filesystem.d.ts.map +1 -0
- package/dist/modules/workflow/locking-filesystem.js +400 -0
- package/dist/modules/workflow/locking-filesystem.js.map +1 -0
- package/dist/modules/workflow/pending-commits.service.d.ts +221 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/workflow/pending-commits.service.js +364 -0
- package/dist/modules/workflow/pending-commits.service.js.map +1 -0
- package/dist/modules/workflow/pending-commits.worker.d.ts +148 -0
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/workflow/pending-commits.worker.js +245 -0
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -0
- package/dist/modules/workflow/read-only-filesystem.d.ts +24 -0
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +1 -0
- package/dist/modules/workflow/read-only-filesystem.js +39 -0
- package/dist/modules/workflow/read-only-filesystem.js.map +1 -0
- package/dist/modules/workflow/recovery-bot.d.ts +31 -0
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -0
- package/dist/modules/workflow/recovery-bot.js +64 -0
- package/dist/modules/workflow/recovery-bot.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +137 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +2 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +26 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +636 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -0
- package/dist/modules/workflow/sanitize-error.d.ts +29 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -0
- package/dist/modules/workflow/sanitize-error.js +60 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -0
- package/dist/modules/workflow/session-ontology.policy.d.ts +52 -0
- package/dist/modules/workflow/session-ontology.policy.d.ts.map +1 -0
- package/dist/modules/workflow/session-ontology.policy.js +62 -0
- package/dist/modules/workflow/session-ontology.policy.js.map +1 -0
- package/dist/modules/workflow/session-ontology.service.d.ts +100 -0
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -0
- package/dist/modules/workflow/session-ontology.service.js +143 -0
- package/dist/modules/workflow/session-ontology.service.js.map +1 -0
- package/dist/modules/workflow/workflow-hooks.d.ts +87 -0
- package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -0
- package/dist/modules/workflow/workflow-hooks.js +35 -0
- package/dist/modules/workflow/workflow-hooks.js.map +1 -0
- package/dist/modules/workflow/workflow.errors.d.ts +171 -0
- package/dist/modules/workflow/workflow.errors.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.errors.js +260 -0
- package/dist/modules/workflow/workflow.errors.js.map +1 -0
- package/dist/modules/workflow/workflow.routes.d.ts +26 -0
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.routes.js +804 -0
- package/dist/modules/workflow/workflow.routes.js.map +1 -0
- package/dist/modules/workflow/workflow.service.d.ts +385 -0
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -0
- package/dist/modules/workflow/workflow.service.js +1155 -0
- package/dist/modules/workflow/workflow.service.js.map +1 -0
- package/dist/modules/workspace/bevel-ignore.d.ts +25 -0
- package/dist/modules/workspace/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/workspace/bevel-ignore.js +57 -0
- package/dist/modules/workspace/bevel-ignore.js.map +1 -0
- package/dist/modules/workspace/kb-seed.interface.d.ts +36 -0
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +1 -0
- package/dist/modules/workspace/kb-seed.interface.js +2 -0
- package/dist/modules/workspace/kb-seed.interface.js.map +1 -0
- package/dist/modules/workspace/kb-seed.service.d.ts +70 -0
- package/dist/modules/workspace/kb-seed.service.d.ts.map +1 -0
- package/dist/modules/workspace/kb-seed.service.js +325 -0
- package/dist/modules/workspace/kb-seed.service.js.map +1 -0
- package/dist/modules/workspace/routine-write-policy.d.ts +49 -0
- package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -0
- package/dist/modules/workspace/routine-write-policy.js +46 -0
- package/dist/modules/workspace/routine-write-policy.js.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts +112 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.js +161 -0
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -0
- package/dist/modules/workspace/session-sink.d.ts +25 -0
- package/dist/modules/workspace/session-sink.d.ts.map +1 -0
- package/dist/modules/workspace/session-sink.js +8 -0
- package/dist/modules/workspace/session-sink.js.map +1 -0
- package/dist/modules/workspace/spill-store.d.ts +24 -0
- package/dist/modules/workspace/spill-store.d.ts.map +1 -0
- package/dist/modules/workspace/spill-store.js +87 -0
- package/dist/modules/workspace/spill-store.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts +25 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.routes.js +1046 -0
- package/dist/modules/workspace/workspace.routes.js.map +1 -0
- package/dist/modules/workspace/workspace.service.d.ts +339 -0
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.service.js +1221 -0
- package/dist/modules/workspace/workspace.service.js.map +1 -0
- package/dist/modules/workspace/workspace.tools.d.ts +19 -0
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -0
- package/dist/modules/workspace/workspace.tools.js +767 -0
- package/dist/modules/workspace/workspace.tools.js.map +1 -0
- package/dist/shared/frontmatter-id.d.ts +35 -0
- package/dist/shared/frontmatter-id.d.ts.map +1 -0
- package/dist/shared/frontmatter-id.js +68 -0
- package/dist/shared/frontmatter-id.js.map +1 -0
- package/dist/shared/fs-walk.d.ts +9 -0
- package/dist/shared/fs-walk.d.ts.map +1 -0
- package/dist/shared/fs-walk.js +34 -0
- package/dist/shared/fs-walk.js.map +1 -0
- package/dist/shared/hash-email.d.ts +11 -0
- package/dist/shared/hash-email.d.ts.map +1 -0
- package/dist/shared/hash-email.js +14 -0
- package/dist/shared/hash-email.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +38 -0
- package/dist/shared/kb-layout.d.ts.map +1 -0
- package/dist/shared/kb-layout.js +102 -0
- package/dist/shared/kb-layout.js.map +1 -0
- package/dist/shared/kb-layout.test.d.ts +2 -0
- package/dist/shared/kb-layout.test.d.ts.map +1 -0
- package/dist/shared/kb-layout.test.js +67 -0
- package/dist/shared/kb-layout.test.js.map +1 -0
- package/dist/shared/ssrf.d.ts +20 -0
- package/dist/shared/ssrf.d.ts.map +1 -0
- package/dist/shared/ssrf.js +89 -0
- package/dist/shared/ssrf.js.map +1 -0
- package/dist/shared/token-crypto.d.ts +16 -0
- package/dist/shared/token-crypto.d.ts.map +1 -0
- package/dist/shared/token-crypto.js +49 -0
- package/dist/shared/token-crypto.js.map +1 -0
- package/dist/shared/ttl-cache.d.ts +16 -0
- package/dist/shared/ttl-cache.d.ts.map +1 -0
- package/dist/shared/ttl-cache.js +27 -0
- package/dist/shared/ttl-cache.js.map +1 -0
- package/dist/shared/utcp-namespace.d.ts +46 -0
- package/dist/shared/utcp-namespace.d.ts.map +1 -0
- package/dist/shared/utcp-namespace.js +82 -0
- package/dist/shared/utcp-namespace.js.map +1 -0
- package/dist/version.d.ts +17 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/kb-template/.bevelignore +21 -0
- package/kb-template/Agents/.gitkeep +0 -0
- package/kb-template/Agents/README.md +38 -0
- package/kb-template/CLAUDE.md +419 -0
- package/kb-template/Data/.gitkeep +0 -0
- package/kb-template/Data/README.md +39 -0
- package/kb-template/KnowledgeBase/.gitkeep +0 -0
- package/kb-template/KnowledgeBase/README.md +37 -0
- package/kb-template/Pipelines/.gitkeep +0 -0
- package/kb-template/Pipelines/README.md +38 -0
- package/kb-template/Skills/.gitkeep +0 -0
- package/kb-template/Skills/README.md +32 -0
- package/kb-template/Tools/.gitkeep +0 -0
- package/kb-template/Tools/README.md +42 -0
- package/kb-template/access.md +36 -0
- package/migrations/0000_core_init.sql +243 -0
- package/migrations/meta/0000_snapshot.json +1480 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +80 -0
- package/src/assets.ts +25 -0
- package/src/core/core-ports.ts +91 -0
- package/src/core/create-core-server.ts +338 -0
- package/src/core/create-core-services.ts +501 -0
- package/src/core-config.ts +257 -0
- package/src/index.ts +69 -0
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +98 -0
- package/src/modules/access/__tests__/access-control.read-batch.test.ts +132 -0
- package/src/modules/access/__tests__/access-control.service.test.ts +1011 -0
- package/src/modules/access/__tests__/access-mutation.service.test.ts +439 -0
- package/src/modules/access/__tests__/access-splice.test.ts +247 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +407 -0
- package/src/modules/access/__tests__/creator-access.test.ts +217 -0
- package/src/modules/access/__tests__/grant-sources.test.ts +204 -0
- package/src/modules/access/__tests__/kb-read-filter.test.ts +70 -0
- package/src/modules/access/__tests__/roles-admin.service.test.ts +469 -0
- package/src/modules/access/__tests__/roles-edit.test.ts +138 -0
- package/src/modules/access/__tests__/roles-yaml-guard.test.ts +70 -0
- package/src/modules/access/__tests__/roles.routes.test.ts +234 -0
- package/src/modules/access/access-control.interface.ts +383 -0
- package/src/modules/access/access-control.service.ts +1794 -0
- package/src/modules/access/access-errors.ts +60 -0
- package/src/modules/access/access-mutation.service.ts +369 -0
- package/src/modules/access/access-splice.ts +413 -0
- package/src/modules/access/access.routes.ts +894 -0
- package/src/modules/access/creator-access.ts +270 -0
- package/src/modules/access/kb-read-filter.ts +76 -0
- package/src/modules/access/roles-admin.service.ts +741 -0
- package/src/modules/access/roles-edit.ts +248 -0
- package/src/modules/access/roles-yaml-guard.ts +89 -0
- package/src/modules/admin/admin-access.routes.ts +29 -0
- package/src/modules/admin/admin-access.service.ts +38 -0
- package/src/modules/admin/admin.interface.ts +10 -0
- package/src/modules/auth/account-erasure.service.ts +183 -0
- package/src/modules/auth/auth.middleware.ts +78 -0
- package/src/modules/auth/auth.routes.ts +97 -0
- package/src/modules/auth/auth.service.ts +199 -0
- package/src/modules/code-mode/code-mode-names.ts +38 -0
- package/src/modules/code-mode/code-mode.tool.ts +117 -0
- package/src/modules/code-mode/index.ts +6 -0
- package/src/modules/database/connection.ts +15 -0
- package/src/modules/database/core-schema.ts +431 -0
- package/src/modules/database/migrate.ts +43 -0
- package/src/modules/database/schema.ts +11 -0
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +87 -0
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +150 -0
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +184 -0
- package/src/modules/diff/__tests__/diff.service.test.ts +202 -0
- package/src/modules/diff/diff-paths.ts +9 -0
- package/src/modules/diff/diff.config.ts +12 -0
- package/src/modules/diff/diff.interface.ts +78 -0
- package/src/modules/diff/diff.routes.ts +277 -0
- package/src/modules/diff/diff.service.ts +508 -0
- package/src/modules/diff/line-diff.ts +79 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +287 -0
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +249 -0
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +253 -0
- package/src/modules/mcp/__tests__/mcp-session-store.test.ts +151 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +150 -0
- package/src/modules/mcp/__tests__/mcp.routes.delete.test.ts +92 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +414 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +126 -0
- package/src/modules/mcp/mcp-session-store.ts +162 -0
- package/src/modules/mcp/mcp.routes.ts +263 -0
- package/src/modules/mcp/mcp.service.ts +973 -0
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +401 -0
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +60 -0
- package/src/modules/mcp/oauth/oauth-state.ts +61 -0
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +277 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +206 -0
- package/src/modules/secrets-vault/__tests__/mcp-oauth-discovery.service.test.ts +178 -0
- package/src/modules/secrets-vault/__tests__/scopes-covered.test.ts +101 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +54 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +143 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +792 -0
- package/src/modules/secrets-vault/index.ts +25 -0
- package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +289 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +104 -0
- package/src/modules/secrets-vault/secrets-vault.contract.ts +270 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +526 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +176 -0
- package/src/modules/skills/index.ts +10 -0
- package/src/modules/skills/skills.contract.ts +54 -0
- package/src/modules/skills/skills.routes.ts +38 -0
- package/src/modules/skills/skills.service.ts +245 -0
- package/src/modules/skills/skills.tools.ts +121 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +358 -0
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +79 -0
- package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +88 -0
- package/src/modules/tool-auth/external-api-key.errors.ts +25 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +99 -0
- package/src/modules/tool-auth/external-api-key.service.ts +209 -0
- package/src/modules/tool-auth/internal-token.service.ts +124 -0
- package/src/modules/tool-auth/llm-usage-meter.ts +19 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +220 -0
- package/src/modules/tool-helpers/__tests__/phase0-loopback-spike.test.ts +129 -0
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +95 -0
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +146 -0
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +75 -0
- package/src/modules/tool-helpers/index.ts +18 -0
- package/src/modules/tool-helpers/tool-context.ts +98 -0
- package/src/modules/tool-helpers/tool-def.ts +73 -0
- package/src/modules/tool-helpers/tool-handler.ts +91 -0
- package/src/modules/tool-helpers/tool.contract.ts +85 -0
- package/src/modules/tool-helpers/validate-token.ts +50 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +200 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +499 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +156 -0
- package/src/modules/tool-manuals/index.ts +12 -0
- package/src/modules/tool-manuals/tool-manuals.contract.ts +183 -0
- package/src/modules/tool-manuals/tool-manuals.routes.ts +110 -0
- package/src/modules/tool-manuals/tool-manuals.service.ts +781 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +202 -0
- package/src/modules/tool-registry/__tests__/tool-registry.test.ts +64 -0
- package/src/modules/tool-registry/manual.routes.ts +87 -0
- package/src/modules/tool-registry/tool-registry.ts +55 -0
- package/src/modules/tool-registry/tool.contract.ts +52 -0
- package/src/modules/workflow/__tests__/event-bus.test.ts +322 -0
- package/src/modules/workflow/__tests__/file-change-notifier.test.ts +51 -0
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +67 -0
- package/src/modules/workflow/__tests__/locking-filesystem.test.ts +445 -0
- package/src/modules/workflow/__tests__/pending-commits.canonical.test.ts +36 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +243 -0
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +308 -0
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +67 -0
- package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +62 -0
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +200 -0
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +232 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +380 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +340 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +192 -0
- package/src/modules/workflow/agent-tools/workflow.tools.ts +502 -0
- package/src/modules/workflow/event-bus.ts +262 -0
- package/src/modules/workflow/events.routes.ts +266 -0
- package/src/modules/workflow/file-change-notifier.ts +54 -0
- package/src/modules/workflow/file-lock.service.ts +269 -0
- package/src/modules/workflow/git/__tests__/branch-name.test.ts +86 -0
- package/src/modules/workflow/git/__tests__/branchAuthor.test.ts +80 -0
- package/src/modules/workflow/git/__tests__/clone-config.test.ts +15 -0
- package/src/modules/workflow/git/__tests__/git-test-helpers.ts +47 -0
- package/src/modules/workflow/git/__tests__/git-version.failure.test.ts +24 -0
- package/src/modules/workflow/git/__tests__/git-version.test.ts +49 -0
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +389 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +105 -0
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +211 -0
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +154 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +320 -0
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +202 -0
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +453 -0
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +198 -0
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +125 -0
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +219 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +145 -0
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +240 -0
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +272 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +232 -0
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +101 -0
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +127 -0
- package/src/modules/workflow/git/__tests__/mutex.test.ts +78 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +225 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +101 -0
- package/src/modules/workflow/git/branch-name.ts +70 -0
- package/src/modules/workflow/git/clone-config.ts +71 -0
- package/src/modules/workflow/git/git-version.ts +70 -0
- package/src/modules/workflow/git/git.service.ts +2248 -0
- package/src/modules/workflow/git/mutex.ts +22 -0
- package/src/modules/workflow/git/pull-request.service.ts +447 -0
- package/src/modules/workflow/locking-filesystem.ts +489 -0
- package/src/modules/workflow/pending-commits.service.ts +444 -0
- package/src/modules/workflow/pending-commits.worker.ts +361 -0
- package/src/modules/workflow/read-only-filesystem.ts +54 -0
- package/src/modules/workflow/recovery-bot.ts +73 -0
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +560 -0
- package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +176 -0
- package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +258 -0
- package/src/modules/workflow/review-workflow/review-workflow.interface.ts +199 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +806 -0
- package/src/modules/workflow/sanitize-error.ts +62 -0
- package/src/modules/workflow/session-ontology.policy.ts +70 -0
- package/src/modules/workflow/session-ontology.service.ts +178 -0
- package/src/modules/workflow/workflow-hooks.ts +101 -0
- package/src/modules/workflow/workflow.errors.ts +285 -0
- package/src/modules/workflow/workflow.routes.ts +858 -0
- package/src/modules/workflow/workflow.service.ts +1555 -0
- package/src/modules/workspace/__tests__/kb-seed.service.test.ts +213 -0
- package/src/modules/workspace/__tests__/routine-write-policy.test.ts +68 -0
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +237 -0
- package/src/modules/workspace/__tests__/spill-store.test.ts +43 -0
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +233 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +176 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +303 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +276 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +120 -0
- package/src/modules/workspace/__tests__/workspace.service.test.ts +565 -0
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +504 -0
- package/src/modules/workspace/bevel-ignore.ts +62 -0
- package/src/modules/workspace/kb-seed.interface.ts +36 -0
- package/src/modules/workspace/kb-seed.service.ts +361 -0
- package/src/modules/workspace/routine-write-policy.ts +79 -0
- package/src/modules/workspace/session-ontology.gate.ts +189 -0
- package/src/modules/workspace/session-sink.ts +25 -0
- package/src/modules/workspace/spill-store.ts +87 -0
- package/src/modules/workspace/workspace.routes.ts +1114 -0
- package/src/modules/workspace/workspace.service.ts +1343 -0
- package/src/modules/workspace/workspace.tools.ts +885 -0
- package/src/shared/__tests__/frontmatter-id.test.ts +88 -0
- package/src/shared/__tests__/fs-walk.test.ts +42 -0
- package/src/shared/__tests__/ssrf.test.ts +53 -0
- package/src/shared/__tests__/utcp-namespace.test.ts +19 -0
- package/src/shared/frontmatter-id.ts +72 -0
- package/src/shared/fs-walk.ts +30 -0
- package/src/shared/hash-email.ts +14 -0
- package/src/shared/kb-layout.test.ts +88 -0
- package/src/shared/kb-layout.ts +101 -0
- package/src/shared/ssrf.ts +78 -0
- package/src/shared/token-crypto.ts +54 -0
- package/src/shared/ttl-cache.ts +27 -0
- package/src/shared/utcp-namespace.ts +88 -0
- package/src/version.ts +19 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import fs from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
8
|
+
import { WorkflowHooks } from '../../workflow-hooks.js';
|
|
9
|
+
import { GitService } from '../git.service.js';
|
|
10
|
+
import { WorkflowValidationError } from '../../workflow.errors.js';
|
|
11
|
+
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
const PROCESS_MAP_DIR = 'knowledge-base';
|
|
14
|
+
|
|
15
|
+
async function mkTmpRoot(): Promise<string> {
|
|
16
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'bevel-git-file-diff-'));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function runGit(cwd: string, args: string[]): Promise<void> {
|
|
20
|
+
await execFileAsync('git', args, {
|
|
21
|
+
cwd,
|
|
22
|
+
env: {
|
|
23
|
+
...process.env,
|
|
24
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
25
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
26
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
27
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function gitStdout(cwd: string, args: string[]): Promise<string> {
|
|
33
|
+
const { stdout } = await execFileAsync('git', args, {
|
|
34
|
+
cwd,
|
|
35
|
+
env: {
|
|
36
|
+
...process.env,
|
|
37
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
38
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
39
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
40
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return stdout.toString().trim();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function seedWorkspace(
|
|
47
|
+
root: string,
|
|
48
|
+
workspaceId: string,
|
|
49
|
+
): Promise<{ workspaceDir: string; repo: string }> {
|
|
50
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
51
|
+
const repo = path.join(workspaceDir, PROCESS_MAP_DIR);
|
|
52
|
+
await fs.mkdir(repo, { recursive: true });
|
|
53
|
+
await runGit(repo, ['init', '-b', 'current-company-state']);
|
|
54
|
+
// CI runners have no global user.email / user.name. The local `runGit`
|
|
55
|
+
// helper sets author/committer via env vars, but `svc.commitFile` spawns
|
|
56
|
+
// its own git process that doesn't see them — so pin identity in the repo
|
|
57
|
+
// config too, otherwise `git commit` fails with "empty ident name" on CI.
|
|
58
|
+
await runGit(repo, ['config', 'user.email', 't@x.com']);
|
|
59
|
+
await runGit(repo, ['config', 'user.name', 'Test']);
|
|
60
|
+
return { workspaceDir, repo };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function writeFile(repo: string, relativePath: string, contents: string): Promise<void> {
|
|
64
|
+
const absolutePath = path.join(repo, relativePath);
|
|
65
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
66
|
+
await fs.writeFile(absolutePath, contents);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function commitFile(
|
|
70
|
+
repo: string,
|
|
71
|
+
relativePath: string,
|
|
72
|
+
contents: string,
|
|
73
|
+
subject: string,
|
|
74
|
+
): Promise<void> {
|
|
75
|
+
await writeFile(repo, relativePath, contents);
|
|
76
|
+
await runGit(repo, ['add', relativePath]);
|
|
77
|
+
await runGit(repo, ['commit', '-m', subject]);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function headSha(repo: string): Promise<string> {
|
|
81
|
+
return gitStdout(repo, ['rev-parse', 'HEAD']);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
function stubWorkspaceService(workspaceId: string, workspaceDir: string): WorkspaceService {
|
|
86
|
+
return {
|
|
87
|
+
getWorkspacePath: async (id: string) => {
|
|
88
|
+
if (id !== workspaceId) throw new Error(`unexpected workspace ${id}`);
|
|
89
|
+
return workspaceDir;
|
|
90
|
+
},
|
|
91
|
+
} as unknown as WorkspaceService;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
describe('GitService.diffFileAtCommit', () => {
|
|
95
|
+
let root: string;
|
|
96
|
+
const workspaceId = 'ws-file-diff-1';
|
|
97
|
+
|
|
98
|
+
beforeEach(async () => {
|
|
99
|
+
root = await mkTmpRoot();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
afterEach(async () => {
|
|
103
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('returns the patch for the selected commit when the file changed', async () => {
|
|
107
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
108
|
+
const svc = new GitService(
|
|
109
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
110
|
+
new WorkflowHooks(),
|
|
111
|
+
'knowledge-base',
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'line one\n', 'A');
|
|
115
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'line one\nline two\n', 'B');
|
|
116
|
+
const shaB = await headSha(repo);
|
|
117
|
+
|
|
118
|
+
const patch = await svc.diffFileAtCommit(workspaceId, 'Knowledge/Foo.md', shaB);
|
|
119
|
+
expect(patch).toContain('diff --git a/Knowledge/Foo.md b/Knowledge/Foo.md');
|
|
120
|
+
expect(patch).toContain('+line two');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('returns additions for a root commit that created the file', async () => {
|
|
124
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
125
|
+
const svc = new GitService(
|
|
126
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
127
|
+
new WorkflowHooks(),
|
|
128
|
+
'knowledge-base',
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'root line\n', 'root');
|
|
132
|
+
const rootSha = await headSha(repo);
|
|
133
|
+
|
|
134
|
+
const patch = await svc.diffFileAtCommit(workspaceId, 'Knowledge/Foo.md', rootSha);
|
|
135
|
+
expect(patch).toContain('diff --git a/Knowledge/Foo.md b/Knowledge/Foo.md');
|
|
136
|
+
expect(patch).toContain('+root line');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("returns an empty diff when the selected commit didn't touch the file", async () => {
|
|
140
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
141
|
+
const svc = new GitService(
|
|
142
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
143
|
+
new WorkflowHooks(),
|
|
144
|
+
'knowledge-base',
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
await commitFile(repo, 'Knowledge/file2.md', 'base\n', 'add file2');
|
|
148
|
+
await commitFile(repo, 'Knowledge/file1.md', 'change\n', 'touch file1');
|
|
149
|
+
const sha = await headSha(repo);
|
|
150
|
+
|
|
151
|
+
const patch = await svc.diffFileAtCommit(workspaceId, 'Knowledge/file2.md', sha);
|
|
152
|
+
expect(patch).toBe('');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('rejects an invalid commit sha before invoking git', async () => {
|
|
156
|
+
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
157
|
+
const svc = new GitService(
|
|
158
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
159
|
+
new WorkflowHooks(),
|
|
160
|
+
'knowledge-base',
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
await expect(
|
|
164
|
+
svc.diffFileAtCommit(workspaceId, 'Knowledge/Foo.md', 'not-a-sha'),
|
|
165
|
+
).rejects.toThrow('invalid commit sha');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('rejects an invalid relative path', async () => {
|
|
169
|
+
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
170
|
+
const svc = new GitService(
|
|
171
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
172
|
+
new WorkflowHooks(),
|
|
173
|
+
'knowledge-base',
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
await expect(
|
|
177
|
+
svc.diffFileAtCommit(workspaceId, '../etc/passwd', 'abcdef1'),
|
|
178
|
+
).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Regression: pathspec literal handling. `git show <sha> -- '[New] memo.md'`
|
|
182
|
+
// would interpret the brackets as a character-class glob and emit no diff
|
|
183
|
+
// even when the path is real. Routes the SETUP commit through
|
|
184
|
+
// `svc.commitFile` so the bracketed `git add` runs under the env var.
|
|
185
|
+
it('renders a diff for a bracketed filename — pathspec literal regression', async () => {
|
|
186
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
187
|
+
const svc = new GitService(
|
|
188
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
189
|
+
new WorkflowHooks(),
|
|
190
|
+
'knowledge-base',
|
|
191
|
+
);
|
|
192
|
+
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
193
|
+
const user = { id: 'u', name: 'Test', email: 't@x.com' };
|
|
194
|
+
const relPath = '[New] memo.md';
|
|
195
|
+
await writeFile(repo, relPath, 'first content\n');
|
|
196
|
+
await svc.commitFile(workspaceId, user, relPath, 'add bracketed memo');
|
|
197
|
+
const sha = await headSha(repo);
|
|
198
|
+
|
|
199
|
+
const diff = await svc.diffFileAtCommit(workspaceId, relPath, sha);
|
|
200
|
+
expect(diff).toContain('first content');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import fs from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
8
|
+
import { WorkflowHooks } from '../../workflow-hooks.js';
|
|
9
|
+
import { GitService } from '../git.service.js';
|
|
10
|
+
import { WorkflowValidationError, BranchNameError } from '../../workflow.errors.js';
|
|
11
|
+
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
const PROCESS_MAP_DIR = 'knowledge-base';
|
|
14
|
+
|
|
15
|
+
async function mkTmpRoot(): Promise<string> {
|
|
16
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'bevel-git-compare-'));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function runGit(cwd: string, args: string[]): Promise<void> {
|
|
20
|
+
await execFileAsync('git', args, {
|
|
21
|
+
cwd,
|
|
22
|
+
env: {
|
|
23
|
+
...process.env,
|
|
24
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
25
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
26
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
27
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function seedWorkspace(
|
|
33
|
+
root: string,
|
|
34
|
+
workspaceId: string,
|
|
35
|
+
): Promise<{ workspaceDir: string; repo: string }> {
|
|
36
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
37
|
+
const repo = path.join(workspaceDir, PROCESS_MAP_DIR);
|
|
38
|
+
await fs.mkdir(repo, { recursive: true });
|
|
39
|
+
await runGit(repo, ['init', '-b', 'current-company-state']);
|
|
40
|
+
// CI runners have no global user.email / user.name. The local `runGit`
|
|
41
|
+
// helper sets author/committer via env vars, but `svc.commitFile` spawns
|
|
42
|
+
// its own git process that doesn't see them — so pin identity in the repo
|
|
43
|
+
// config too, otherwise `git commit` fails with "empty ident name" on CI.
|
|
44
|
+
await runGit(repo, ['config', 'user.email', 't@x.com']);
|
|
45
|
+
await runGit(repo, ['config', 'user.name', 'Test']);
|
|
46
|
+
return { workspaceDir, repo };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function writeFile(repo: string, relativePath: string, contents: string): Promise<void> {
|
|
50
|
+
const absolutePath = path.join(repo, relativePath);
|
|
51
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
52
|
+
await fs.writeFile(absolutePath, contents);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function commitFile(
|
|
56
|
+
repo: string,
|
|
57
|
+
relativePath: string,
|
|
58
|
+
contents: string,
|
|
59
|
+
subject: string,
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
await writeFile(repo, relativePath, contents);
|
|
62
|
+
await runGit(repo, ['add', relativePath]);
|
|
63
|
+
await runGit(repo, ['commit', '-m', subject]);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function deleteFileCommit(
|
|
67
|
+
repo: string,
|
|
68
|
+
relativePath: string,
|
|
69
|
+
subject: string,
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
await runGit(repo, ['rm', relativePath]);
|
|
72
|
+
await runGit(repo, ['commit', '-m', subject]);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
function stubWorkspaceService(workspaceId: string, workspaceDir: string): WorkspaceService {
|
|
77
|
+
return {
|
|
78
|
+
getWorkspacePath: async (id: string) => {
|
|
79
|
+
if (id !== workspaceId) throw new Error(`unexpected workspace ${id}`);
|
|
80
|
+
return workspaceDir;
|
|
81
|
+
},
|
|
82
|
+
} as unknown as WorkspaceService;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
describe('GitService.diffFileBetweenBranches', () => {
|
|
86
|
+
let root: string;
|
|
87
|
+
const workspaceId = 'ws-compare-1';
|
|
88
|
+
|
|
89
|
+
beforeEach(async () => {
|
|
90
|
+
root = await mkTmpRoot();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
afterEach(async () => {
|
|
94
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('returns a unified diff when the file differs between two local branches', async () => {
|
|
98
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
99
|
+
const svc = new GitService(
|
|
100
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
101
|
+
new WorkflowHooks(),
|
|
102
|
+
'knowledge-base',
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'line one\n', 'base');
|
|
106
|
+
await runGit(repo, ['checkout', '-b', 'alice/edit-foo']);
|
|
107
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'line one\nline two\n', 'add line two');
|
|
108
|
+
|
|
109
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
110
|
+
workspaceId,
|
|
111
|
+
'Knowledge/Foo.md',
|
|
112
|
+
'current-company-state',
|
|
113
|
+
'alice/edit-foo',
|
|
114
|
+
);
|
|
115
|
+
expect(diff).toContain('diff --git a/Knowledge/Foo.md b/Knowledge/Foo.md');
|
|
116
|
+
expect(diff).toContain('+line two');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('returns the empty string when the file is identical on both branches', async () => {
|
|
120
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
121
|
+
const svc = new GitService(
|
|
122
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
123
|
+
new WorkflowHooks(),
|
|
124
|
+
'knowledge-base',
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
await commitFile(repo, 'Knowledge/Same.md', 'unchanged\n', 'base');
|
|
128
|
+
await runGit(repo, ['checkout', '-b', 'alice/no-changes']);
|
|
129
|
+
// no edits to Same.md on the new branch
|
|
130
|
+
await commitFile(repo, 'Knowledge/Other.md', 'sidecar\n', 'unrelated edit');
|
|
131
|
+
|
|
132
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
133
|
+
workspaceId,
|
|
134
|
+
'Knowledge/Same.md',
|
|
135
|
+
'current-company-state',
|
|
136
|
+
'alice/no-changes',
|
|
137
|
+
);
|
|
138
|
+
expect(diff).toBe('');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('renders a deleted-file diff when the file only exists on the from branch', async () => {
|
|
142
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
143
|
+
const svc = new GitService(
|
|
144
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
145
|
+
new WorkflowHooks(),
|
|
146
|
+
'knowledge-base',
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
await commitFile(repo, 'Knowledge/Old.md', 'going away\n', 'base');
|
|
150
|
+
await runGit(repo, ['checkout', '-b', 'alice/cleanup']);
|
|
151
|
+
await deleteFileCommit(repo, 'Knowledge/Old.md', 'remove Old.md');
|
|
152
|
+
|
|
153
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
154
|
+
workspaceId,
|
|
155
|
+
'Knowledge/Old.md',
|
|
156
|
+
'current-company-state',
|
|
157
|
+
'alice/cleanup',
|
|
158
|
+
);
|
|
159
|
+
expect(diff).toContain('deleted file mode');
|
|
160
|
+
expect(diff).toContain('-going away');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('renders a new-file diff when the file only exists on the to branch', async () => {
|
|
164
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
165
|
+
const svc = new GitService(
|
|
166
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
167
|
+
new WorkflowHooks(),
|
|
168
|
+
'knowledge-base',
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
await commitFile(repo, 'Knowledge/Seed.md', 'seed\n', 'base');
|
|
172
|
+
await runGit(repo, ['checkout', '-b', 'alice/add-new']);
|
|
173
|
+
await commitFile(repo, 'Knowledge/New.md', 'brand new\n', 'add New.md');
|
|
174
|
+
|
|
175
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
176
|
+
workspaceId,
|
|
177
|
+
'Knowledge/New.md',
|
|
178
|
+
'current-company-state',
|
|
179
|
+
'alice/add-new',
|
|
180
|
+
);
|
|
181
|
+
expect(diff).toContain('new file mode');
|
|
182
|
+
expect(diff).toContain('+brand new');
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('resolves a branch reachable only via origin/<name>', async () => {
|
|
186
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
187
|
+
|
|
188
|
+
// Set up an "origin" remote pointing at a separate bare repo, push
|
|
189
|
+
// target-company-state there, then drop the local head so the only way
|
|
190
|
+
// to reach it is through refs/remotes/origin/target-company-state.
|
|
191
|
+
const remoteDir = path.join(root, 'origin.git');
|
|
192
|
+
await fs.mkdir(remoteDir, { recursive: true });
|
|
193
|
+
await runGit(remoteDir, ['init', '--bare', '-b', 'current-company-state']);
|
|
194
|
+
await runGit(repo, ['remote', 'add', 'origin', remoteDir]);
|
|
195
|
+
|
|
196
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'base\n', 'base');
|
|
197
|
+
await runGit(repo, ['push', '-u', 'origin', 'current-company-state']);
|
|
198
|
+
|
|
199
|
+
await runGit(repo, ['checkout', '-b', 'target-company-state']);
|
|
200
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'target version\n', 'target edit');
|
|
201
|
+
await runGit(repo, ['push', '-u', 'origin', 'target-company-state']);
|
|
202
|
+
|
|
203
|
+
// Move off target so we can delete the local head.
|
|
204
|
+
await runGit(repo, ['checkout', 'current-company-state']);
|
|
205
|
+
await runGit(repo, ['branch', '-D', 'target-company-state']);
|
|
206
|
+
|
|
207
|
+
const svc = new GitService(
|
|
208
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
209
|
+
new WorkflowHooks(),
|
|
210
|
+
'knowledge-base',
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
214
|
+
workspaceId,
|
|
215
|
+
'Knowledge/Foo.md',
|
|
216
|
+
'current-company-state',
|
|
217
|
+
'target-company-state',
|
|
218
|
+
);
|
|
219
|
+
expect(diff).toContain('+target version');
|
|
220
|
+
expect(diff).toContain('-base');
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('accepts a workspace-relative path with the knowledge-base/ prefix', async () => {
|
|
224
|
+
// Regression: the file viewer stores paths workspace-relative
|
|
225
|
+
// ("knowledge-base/Knowledge/Foo.md") because reads/writes go through
|
|
226
|
+
// WorkspaceService which resolves from the workspace root. Git pathspecs
|
|
227
|
+
// are resolved from cwd (the repo dir = workspace/knowledge-base/),
|
|
228
|
+
// so without prefix-stripping `git diff -- knowledge-base/X` looks
|
|
229
|
+
// for `knowledge-base/knowledge-base/X` and silently returns
|
|
230
|
+
// empty — which the UI rendered as "identical".
|
|
231
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
232
|
+
const svc = new GitService(
|
|
233
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
234
|
+
new WorkflowHooks(),
|
|
235
|
+
'knowledge-base',
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'baseline\n', 'base');
|
|
239
|
+
await runGit(repo, ['checkout', '-b', 'alice/edit-foo']);
|
|
240
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'baseline\nedit\n', 'edit');
|
|
241
|
+
|
|
242
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
243
|
+
workspaceId,
|
|
244
|
+
'knowledge-base/Knowledge/Foo.md',
|
|
245
|
+
'current-company-state',
|
|
246
|
+
'alice/edit-foo',
|
|
247
|
+
);
|
|
248
|
+
expect(diff).toContain('+edit');
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('shows uncommitted working-tree edits when "to" is the current branch', async () => {
|
|
252
|
+
// Regression: comparing a saved-but-uncommitted edit against another
|
|
253
|
+
// branch used to return empty because we diffed two HEAD commits and
|
|
254
|
+
// the edit hadn't landed in HEAD yet. Now we diff against the working
|
|
255
|
+
// tree when one side is the checked-out branch.
|
|
256
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
257
|
+
const svc = new GitService(
|
|
258
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
259
|
+
new WorkflowHooks(),
|
|
260
|
+
'knowledge-base',
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'baseline\n', 'base');
|
|
264
|
+
await runGit(repo, ['checkout', '-b', 'alice/edit-foo']);
|
|
265
|
+
// Edit on disk but DO NOT commit — mimics the user typing in the editor
|
|
266
|
+
// and pressing save before sharing.
|
|
267
|
+
await writeFile(repo, 'Knowledge/Foo.md', 'baseline\nfresh edit\n');
|
|
268
|
+
|
|
269
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
270
|
+
workspaceId,
|
|
271
|
+
'Knowledge/Foo.md',
|
|
272
|
+
'current-company-state',
|
|
273
|
+
'alice/edit-foo',
|
|
274
|
+
);
|
|
275
|
+
expect(diff).toContain('+fresh edit');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('renders an added diff for an untracked working-tree file when "to" is the current branch', async () => {
|
|
279
|
+
// Regression: `git diff <ref> -- <path>` ignores untracked files, so a
|
|
280
|
+
// brand-new on-disk file used to render as identical between branches.
|
|
281
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
282
|
+
const svc = new GitService(
|
|
283
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
284
|
+
new WorkflowHooks(),
|
|
285
|
+
'knowledge-base',
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
await commitFile(repo, 'Knowledge/Seed.md', 'seed\n', 'base');
|
|
289
|
+
await runGit(repo, ['checkout', '-b', 'alice/draft']);
|
|
290
|
+
// Brand-new file, never committed — only on disk.
|
|
291
|
+
await writeFile(repo, 'Knowledge/Brandnew.md', 'fresh content\n');
|
|
292
|
+
|
|
293
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
294
|
+
workspaceId,
|
|
295
|
+
'Knowledge/Brandnew.md',
|
|
296
|
+
'current-company-state',
|
|
297
|
+
'alice/draft',
|
|
298
|
+
);
|
|
299
|
+
expect(diff).toContain('new file mode');
|
|
300
|
+
expect(diff).toContain('+fresh content');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('renders a removed diff for an untracked working-tree file when "from" is the current branch', async () => {
|
|
304
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
305
|
+
const svc = new GitService(
|
|
306
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
307
|
+
new WorkflowHooks(),
|
|
308
|
+
'knowledge-base',
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
await commitFile(repo, 'Knowledge/Seed.md', 'seed\n', 'base');
|
|
312
|
+
await runGit(repo, ['checkout', '-b', 'alice/draft']);
|
|
313
|
+
await writeFile(repo, 'Knowledge/Brandnew.md', 'fresh content\n');
|
|
314
|
+
|
|
315
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
316
|
+
workspaceId,
|
|
317
|
+
'Knowledge/Brandnew.md',
|
|
318
|
+
'alice/draft',
|
|
319
|
+
'current-company-state',
|
|
320
|
+
);
|
|
321
|
+
expect(diff).toContain('deleted file mode');
|
|
322
|
+
expect(diff).toContain('-fresh content');
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('reverses the diff direction when "from" is the current branch', async () => {
|
|
326
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
327
|
+
const svc = new GitService(
|
|
328
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
329
|
+
new WorkflowHooks(),
|
|
330
|
+
'knowledge-base',
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'baseline\n', 'base');
|
|
334
|
+
await runGit(repo, ['checkout', '-b', 'alice/edit-foo']);
|
|
335
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'baseline\ndraft edit\n', 'edit on draft');
|
|
336
|
+
// Now compare with "from = current draft" so the working tree (draft
|
|
337
|
+
// version) sits on the from side and current-company-state on the to
|
|
338
|
+
// side. Lines added on current-company-state — i.e. the *removal* of
|
|
339
|
+
// "draft edit" — should appear as `+` on the to side, and "draft edit"
|
|
340
|
+
// should appear as `-`.
|
|
341
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
342
|
+
workspaceId,
|
|
343
|
+
'Knowledge/Foo.md',
|
|
344
|
+
'alice/edit-foo',
|
|
345
|
+
'current-company-state',
|
|
346
|
+
);
|
|
347
|
+
expect(diff).toContain('-draft edit');
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('rejects identical from/to branches', async () => {
|
|
351
|
+
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
352
|
+
const svc = new GitService(
|
|
353
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
354
|
+
new WorkflowHooks(),
|
|
355
|
+
'knowledge-base',
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
await expect(
|
|
359
|
+
svc.diffFileBetweenBranches(
|
|
360
|
+
workspaceId,
|
|
361
|
+
'Knowledge/Foo.md',
|
|
362
|
+
'current-company-state',
|
|
363
|
+
'current-company-state',
|
|
364
|
+
),
|
|
365
|
+
).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
it('rejects an unknown branch', async () => {
|
|
369
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
370
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'base\n', 'base');
|
|
371
|
+
const svc = new GitService(
|
|
372
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
373
|
+
new WorkflowHooks(),
|
|
374
|
+
'knowledge-base',
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
await expect(
|
|
378
|
+
svc.diffFileBetweenBranches(
|
|
379
|
+
workspaceId,
|
|
380
|
+
'Knowledge/Foo.md',
|
|
381
|
+
'current-company-state',
|
|
382
|
+
'does-not-exist',
|
|
383
|
+
),
|
|
384
|
+
).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('rejects a path-traversal attempt', async () => {
|
|
388
|
+
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
389
|
+
const svc = new GitService(
|
|
390
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
391
|
+
new WorkflowHooks(),
|
|
392
|
+
'knowledge-base',
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
await expect(
|
|
396
|
+
svc.diffFileBetweenBranches(
|
|
397
|
+
workspaceId,
|
|
398
|
+
'../etc/passwd',
|
|
399
|
+
'current-company-state',
|
|
400
|
+
'target-company-state',
|
|
401
|
+
),
|
|
402
|
+
).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('rejects a branch name with shell metacharacters', async () => {
|
|
406
|
+
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
407
|
+
const svc = new GitService(
|
|
408
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
409
|
+
new WorkflowHooks(),
|
|
410
|
+
'knowledge-base',
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
await expect(
|
|
414
|
+
svc.diffFileBetweenBranches(
|
|
415
|
+
workspaceId,
|
|
416
|
+
'Knowledge/Foo.md',
|
|
417
|
+
'current-company-state',
|
|
418
|
+
'alice/$(whoami)',
|
|
419
|
+
),
|
|
420
|
+
).rejects.toBeInstanceOf(BranchNameError);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// Regression: pathspec literal handling. `git diff <ref> -- '[Approved] x.md'`
|
|
424
|
+
// would interpret the brackets as a character-class glob and emit no diff.
|
|
425
|
+
// Routes both SETUP commits through `svc.commitFile` so the bracketed
|
|
426
|
+
// `git add` runs under the env var on both branches.
|
|
427
|
+
it('renders a diff for a bracketed filename between branches — pathspec literal regression', async () => {
|
|
428
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
429
|
+
const svc = new GitService(
|
|
430
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
431
|
+
new WorkflowHooks(),
|
|
432
|
+
'knowledge-base',
|
|
433
|
+
);
|
|
434
|
+
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
435
|
+
const user = { id: 'u', name: 'Test', email: 't@x.com' };
|
|
436
|
+
const relPath = '[Approved] design.md';
|
|
437
|
+
|
|
438
|
+
await writeFile(repo, relPath, 'base content\n');
|
|
439
|
+
await svc.commitFile(workspaceId, user, relPath, 'base');
|
|
440
|
+
|
|
441
|
+
await runGit(repo, ['checkout', '-b', 'alice/feature']);
|
|
442
|
+
await writeFile(repo, relPath, 'base content\nfeature edit\n');
|
|
443
|
+
await svc.commitFile(workspaceId, user, relPath, 'feature edit');
|
|
444
|
+
|
|
445
|
+
const diff = await svc.diffFileBetweenBranches(
|
|
446
|
+
workspaceId,
|
|
447
|
+
relPath,
|
|
448
|
+
'current-company-state',
|
|
449
|
+
'alice/feature',
|
|
450
|
+
);
|
|
451
|
+
expect(diff).toContain('feature edit');
|
|
452
|
+
});
|
|
453
|
+
});
|