@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,198 @@
|
|
|
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
|
+
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
|
|
13
|
+
async function mkTmpRoot(): Promise<string> {
|
|
14
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'bevel-git-list-'));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function runGit(cwd: string, args: string[]): Promise<void> {
|
|
18
|
+
await execFileAsync('git', args, {
|
|
19
|
+
cwd,
|
|
20
|
+
env: { ...process.env, GIT_AUTHOR_NAME: 'Test', GIT_AUTHOR_EMAIL: 't@x.com', GIT_COMMITTER_NAME: 'Test', GIT_COMMITTER_EMAIL: 't@x.com' },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Seeds a bare upstream repo with protected + draft branches, then clones it
|
|
26
|
+
* into `<root>/<workspaceId>/knowledge-base` to match the layout GitService
|
|
27
|
+
* expects via `workspaceService.getWorkspacePath`.
|
|
28
|
+
*/
|
|
29
|
+
async function seedWorkspace(root: string, workspaceId: string): Promise<{ upstream: string; repo: string }> {
|
|
30
|
+
const upstream = path.join(root, 'upstream.git');
|
|
31
|
+
await runGit(root, ['init', '--bare', '-b', 'current-company-state', upstream]);
|
|
32
|
+
|
|
33
|
+
// A scratch clone to create the initial branches, then push them upstream.
|
|
34
|
+
// Can't pass `-b current-company-state` because the bare repo has no refs yet;
|
|
35
|
+
// instead we init a regular repo on that branch and wire up origin manually.
|
|
36
|
+
const seed = path.join(root, '.seed');
|
|
37
|
+
await fs.mkdir(seed);
|
|
38
|
+
await runGit(seed, ['init', '-b', 'current-company-state']);
|
|
39
|
+
await runGit(seed, ['remote', 'add', 'origin', upstream]);
|
|
40
|
+
await runGit(seed, ['commit', '--allow-empty', '-m', 'init']);
|
|
41
|
+
await runGit(seed, ['branch', 'target-company-state']);
|
|
42
|
+
await runGit(seed, ['branch', 'alice/draft-one']);
|
|
43
|
+
await runGit(seed, [
|
|
44
|
+
'push', 'origin',
|
|
45
|
+
'current-company-state', 'target-company-state', 'alice/draft-one',
|
|
46
|
+
]);
|
|
47
|
+
// Point upstream's HEAD at current-company-state so a fresh clone checks it out.
|
|
48
|
+
await runGit(upstream, ['symbolic-ref', 'HEAD', 'refs/heads/current-company-state']);
|
|
49
|
+
|
|
50
|
+
// Per-user clone — matches what workspace.service.ts does in prod.
|
|
51
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
52
|
+
const repo = path.join(workspaceDir, 'knowledge-base');
|
|
53
|
+
await fs.mkdir(workspaceDir, { recursive: true });
|
|
54
|
+
await runGit(root, ['clone', upstream, repo]);
|
|
55
|
+
return { upstream, repo };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
function stubWorkspaceService(workspaceId: string, workspaceDir: string): WorkspaceService {
|
|
60
|
+
return {
|
|
61
|
+
getWorkspacePath: async (id: string) => {
|
|
62
|
+
if (id !== workspaceId) throw new Error(`unexpected workspace ${id}`);
|
|
63
|
+
return workspaceDir;
|
|
64
|
+
},
|
|
65
|
+
} as unknown as WorkspaceService;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
describe('GitService.listBranches', () => {
|
|
69
|
+
let root: string;
|
|
70
|
+
const workspaceId = 'ws-list-1';
|
|
71
|
+
|
|
72
|
+
beforeEach(async () => {
|
|
73
|
+
root = await mkTmpRoot();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
afterEach(async () => {
|
|
77
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('unions local heads with refs/remotes/origin so target-company-state and pushed drafts appear', async () => {
|
|
81
|
+
await seedWorkspace(root, workspaceId);
|
|
82
|
+
const svc = new GitService(
|
|
83
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
84
|
+
new WorkflowHooks(),
|
|
85
|
+
'knowledge-base',
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const branches = await svc.listBranches(workspaceId);
|
|
89
|
+
const names = branches.map((b) => b.name).sort();
|
|
90
|
+
expect(names).toEqual(['alice/draft-one', 'current-company-state', 'target-company-state']);
|
|
91
|
+
|
|
92
|
+
const protectedBranches = branches.filter((b) => b.isProtected).map((b) => b.name).sort();
|
|
93
|
+
expect(protectedBranches).toEqual(['current-company-state', 'target-company-state']);
|
|
94
|
+
// Under the per-branch workspace model `BranchInfo` no longer carries an
|
|
95
|
+
// `isCurrent` flag — the workspace's identity IS the current branch.
|
|
96
|
+
// Consumers derive it as `branch.name === decodeURIComponent(workspaceId)`.
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('skips the origin/HEAD symbolic ref instead of surfacing it as a branch named "origin"', async () => {
|
|
100
|
+
await seedWorkspace(root, workspaceId);
|
|
101
|
+
const svc = new GitService(
|
|
102
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
103
|
+
new WorkflowHooks(),
|
|
104
|
+
'knowledge-base',
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const branches = await svc.listBranches(workspaceId);
|
|
108
|
+
expect(branches.find((b) => b.name === 'origin')).toBeUndefined();
|
|
109
|
+
expect(branches.find((b) => b.name === 'HEAD')).toBeUndefined();
|
|
110
|
+
expect(branches.find((b) => b.name === 'origin/HEAD')).toBeUndefined();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('picks up a branch pushed to upstream after the first listBranches call (auto-fetch)', async () => {
|
|
114
|
+
const { upstream } = await seedWorkspace(root, workspaceId);
|
|
115
|
+
const svc = new GitService(
|
|
116
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
117
|
+
new WorkflowHooks(),
|
|
118
|
+
'knowledge-base',
|
|
119
|
+
);
|
|
120
|
+
// Prime the cache: first call fetches and populates lastImplicitFetchAt.
|
|
121
|
+
await svc.listBranches(workspaceId);
|
|
122
|
+
|
|
123
|
+
// Push a new branch to upstream via a throwaway clone (bypass the debounce
|
|
124
|
+
// by constructing a fresh GitService instance — separate in-memory state).
|
|
125
|
+
const pusher = path.join(root, '.pusher');
|
|
126
|
+
await runGit(root, ['clone', upstream, pusher]);
|
|
127
|
+
await runGit(pusher, ['checkout', '-b', 'bob/draft-two']);
|
|
128
|
+
await runGit(pusher, ['commit', '--allow-empty', '-m', 'bob change']);
|
|
129
|
+
await runGit(pusher, ['push', 'origin', 'bob/draft-two']);
|
|
130
|
+
|
|
131
|
+
const freshSvc = new GitService(
|
|
132
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
133
|
+
new WorkflowHooks(),
|
|
134
|
+
'knowledge-base',
|
|
135
|
+
);
|
|
136
|
+
const branches = await freshSvc.listBranches(workspaceId);
|
|
137
|
+
expect(branches.map((b) => b.name)).toContain('bob/draft-two');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('serves the known branch list when origin is unreachable (fetch failure is swallowed)', async () => {
|
|
141
|
+
const { upstream } = await seedWorkspace(root, workspaceId);
|
|
142
|
+
// Nuke upstream so fetch fails; remote-tracking refs already in the consumer clone survive.
|
|
143
|
+
await fs.rm(upstream, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
144
|
+
|
|
145
|
+
const svc = new GitService(
|
|
146
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
147
|
+
new WorkflowHooks(),
|
|
148
|
+
'knowledge-base',
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Should not throw and should return the refs we already had on disk.
|
|
152
|
+
const branches = await svc.listBranches(workspaceId);
|
|
153
|
+
const names = branches.map((b) => b.name).sort();
|
|
154
|
+
expect(names).toEqual(['alice/draft-one', 'current-company-state', 'target-company-state']);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('returns local branches before remote-only ones, order preserved through parallel ahead/behind', async () => {
|
|
158
|
+
await seedWorkspace(root, workspaceId);
|
|
159
|
+
const svc = new GitService(
|
|
160
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
161
|
+
new WorkflowHooks(),
|
|
162
|
+
'knowledge-base',
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
// current-company-state is the workspace clone's checked-out branch (the
|
|
166
|
+
// only local head); the rest are remote-only. The result order must be
|
|
167
|
+
// local-first then alphabetical — `listBranches` now computes ahead/behind
|
|
168
|
+
// with `Promise.all`, so this pins that the mapping preserves row order.
|
|
169
|
+
const branches = await svc.listBranches(workspaceId);
|
|
170
|
+
expect(branches.map((b) => b.name)).toEqual([
|
|
171
|
+
'current-company-state',
|
|
172
|
+
'alice/draft-one',
|
|
173
|
+
'target-company-state',
|
|
174
|
+
]);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('skips the implicit fetch after noteWorkspaceFetched (a fresh clone already has every ref)', async () => {
|
|
178
|
+
const { upstream } = await seedWorkspace(root, workspaceId);
|
|
179
|
+
const svc = new GitService(
|
|
180
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
181
|
+
new WorkflowHooks(),
|
|
182
|
+
'knowledge-base',
|
|
183
|
+
);
|
|
184
|
+
// Simulate a just-completed clone — the workspace is freshly fetched.
|
|
185
|
+
svc.noteWorkspaceFetched(workspaceId);
|
|
186
|
+
|
|
187
|
+
// Push a new branch upstream. A normal listBranches would fetch and see
|
|
188
|
+
// it; with the implicit fetch skipped it must not appear yet.
|
|
189
|
+
const pusher = path.join(root, '.pusher');
|
|
190
|
+
await runGit(root, ['clone', upstream, pusher]);
|
|
191
|
+
await runGit(pusher, ['checkout', '-b', 'carol/draft-three']);
|
|
192
|
+
await runGit(pusher, ['commit', '--allow-empty', '-m', 'carol change']);
|
|
193
|
+
await runGit(pusher, ['push', 'origin', 'carol/draft-three']);
|
|
194
|
+
|
|
195
|
+
const branches = await svc.listBranches(workspaceId);
|
|
196
|
+
expect(branches.map((b) => b.name)).not.toContain('carol/draft-three');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
const PROCESS_MAP_DIR = 'knowledge-base';
|
|
13
|
+
|
|
14
|
+
async function mkTmpRoot(): Promise<string> {
|
|
15
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'bevel-tracked-files-'));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function runGit(cwd: string, args: string[]): Promise<void> {
|
|
19
|
+
await execFileAsync('git', args, {
|
|
20
|
+
cwd,
|
|
21
|
+
env: {
|
|
22
|
+
...process.env,
|
|
23
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
24
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
25
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
26
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function seedWorkspace(root: string, workspaceId: string): Promise<{ repo: string }> {
|
|
32
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
33
|
+
const repo = path.join(workspaceDir, PROCESS_MAP_DIR);
|
|
34
|
+
await fs.mkdir(repo, { recursive: true });
|
|
35
|
+
await runGit(repo, ['init', '-b', 'current-company-state']);
|
|
36
|
+
return { repo };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function writeFile(repo: string, relativePath: string, contents: string): Promise<void> {
|
|
40
|
+
const absolutePath = path.join(repo, relativePath);
|
|
41
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
42
|
+
await fs.writeFile(absolutePath, contents);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function commitFile(repo: string, relativePath: string, contents: string, subject: string): Promise<void> {
|
|
46
|
+
await writeFile(repo, relativePath, contents);
|
|
47
|
+
await runGit(repo, ['add', relativePath]);
|
|
48
|
+
await runGit(repo, ['commit', '-m', subject]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
function stubWorkspaceService(workspaceId: string, workspaceDir: string): WorkspaceService {
|
|
53
|
+
return {
|
|
54
|
+
getWorkspacePath: async (id: string) => {
|
|
55
|
+
if (id !== workspaceId) throw new Error(`unexpected workspace ${id}`);
|
|
56
|
+
return workspaceDir;
|
|
57
|
+
},
|
|
58
|
+
} as unknown as WorkspaceService;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function makeSvc(root: string, workspaceId: string) {
|
|
62
|
+
const { repo } = await seedWorkspace(root, workspaceId);
|
|
63
|
+
const svc = new GitService(
|
|
64
|
+
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
65
|
+
new WorkflowHooks(),
|
|
66
|
+
'knowledge-base',
|
|
67
|
+
);
|
|
68
|
+
return { svc, repo };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
describe('GitService.listTrackedFiles', () => {
|
|
72
|
+
let root: string;
|
|
73
|
+
const workspaceId = 'ws-tracked-1';
|
|
74
|
+
|
|
75
|
+
beforeEach(async () => {
|
|
76
|
+
root = await mkTmpRoot();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
afterEach(async () => {
|
|
80
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('lists committed tracked files', async () => {
|
|
84
|
+
const { svc, repo } = await makeSvc(root, workspaceId);
|
|
85
|
+
await commitFile(repo, 'Knowledge/A.md', 'a\n', 'add a');
|
|
86
|
+
await commitFile(repo, 'Knowledge/Sub/B.md', 'b\n', 'add b');
|
|
87
|
+
|
|
88
|
+
expect((await svc.listTrackedFiles(workspaceId)).sort()).toEqual([
|
|
89
|
+
'Knowledge/A.md',
|
|
90
|
+
'Knowledge/Sub/B.md',
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('excludes untracked files — an untracked scratch doc is never listed', async () => {
|
|
95
|
+
const { svc, repo } = await makeSvc(root, workspaceId);
|
|
96
|
+
await commitFile(repo, 'Knowledge/A.md', 'a\n', 'add a');
|
|
97
|
+
await writeFile(repo, 'scratch.md', 'untracked\n');
|
|
98
|
+
|
|
99
|
+
const tracked = await svc.listTrackedFiles(workspaceId);
|
|
100
|
+
expect(tracked).toContain('Knowledge/A.md');
|
|
101
|
+
expect(tracked).not.toContain('scratch.md');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('excludes ignored files', async () => {
|
|
105
|
+
const { svc, repo } = await makeSvc(root, workspaceId);
|
|
106
|
+
await commitFile(repo, '.gitignore', 'secret.md\n', 'add ignore');
|
|
107
|
+
await writeFile(repo, 'secret.md', 'shh\n');
|
|
108
|
+
|
|
109
|
+
const tracked = await svc.listTrackedFiles(workspaceId);
|
|
110
|
+
expect(tracked).toContain('.gitignore');
|
|
111
|
+
expect(tracked).not.toContain('secret.md');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('preserves filenames with spaces and bracketed prefixes verbatim', async () => {
|
|
115
|
+
const { svc, repo } = await makeSvc(root, workspaceId);
|
|
116
|
+
await commitFile(repo, '[Approved] hello world.md', 'ok\n', 'add bracketed');
|
|
117
|
+
|
|
118
|
+
expect(await svc.listTrackedFiles(workspaceId)).toEqual(['[Approved] hello world.md']);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('returns an empty list for a repo with no commits', async () => {
|
|
122
|
+
const { svc } = await makeSvc(root, workspaceId);
|
|
123
|
+
expect(await svc.listTrackedFiles(workspaceId)).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
const PROCESS_MAP_DIR = 'knowledge-base';
|
|
13
|
+
|
|
14
|
+
async function mkTmpRoot(): Promise<string> {
|
|
15
|
+
return fs.mkdtemp(path.join(os.tmpdir(), 'bevel-git-log-file-'));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function runGit(cwd: string, args: string[]): Promise<void> {
|
|
19
|
+
await execFileAsync('git', args, {
|
|
20
|
+
cwd,
|
|
21
|
+
env: {
|
|
22
|
+
...process.env,
|
|
23
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
24
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
25
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
26
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function gitStdout(cwd: string, args: string[]): Promise<string> {
|
|
32
|
+
const { stdout } = await execFileAsync('git', args, {
|
|
33
|
+
cwd,
|
|
34
|
+
env: {
|
|
35
|
+
...process.env,
|
|
36
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
37
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
38
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
39
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return stdout.toString().trim();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function seedWorkspace(
|
|
46
|
+
root: string,
|
|
47
|
+
workspaceId: string,
|
|
48
|
+
): Promise<{ workspaceDir: string; repo: string }> {
|
|
49
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
50
|
+
const repo = path.join(workspaceDir, PROCESS_MAP_DIR);
|
|
51
|
+
await fs.mkdir(repo, { recursive: true });
|
|
52
|
+
await runGit(repo, ['init', '-b', 'current-company-state']);
|
|
53
|
+
// CI runners have no global user.email / user.name. The local `runGit`
|
|
54
|
+
// helper sets author/committer via env vars, but `svc.commitFile` spawns
|
|
55
|
+
// its own git process that doesn't see them — so pin identity in the repo
|
|
56
|
+
// config too, otherwise `git commit` fails with "empty ident name" on CI.
|
|
57
|
+
await runGit(repo, ['config', 'user.email', 't@x.com']);
|
|
58
|
+
await runGit(repo, ['config', 'user.name', 'Test']);
|
|
59
|
+
// Disable auto-gc and force any gc that does run to stay in the foreground.
|
|
60
|
+
// The clamp test below makes 150 sequential commits, which crosses git's
|
|
61
|
+
// `gc.autoPackLimit` (default 50) and trips auto-gc mid-loop. With the
|
|
62
|
+
// default `gc.autoDetach=true`, gc runs in a background process that races
|
|
63
|
+
// the next `git commit` ("fatal: unable to read <sha>" when gc packs an
|
|
64
|
+
// object the next commit just referenced) and the afterEach `fs.rm`
|
|
65
|
+
// (`ENOTEMPTY` on Linux, `EBUSY` on Windows when the gc process still has
|
|
66
|
+
// file handles into `.git/objects`).
|
|
67
|
+
await runGit(repo, ['config', 'gc.auto', '0']);
|
|
68
|
+
await runGit(repo, ['config', 'gc.autoDetach', 'false']);
|
|
69
|
+
return { workspaceDir, repo };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function writeFile(repo: string, relativePath: string, contents: string): Promise<void> {
|
|
73
|
+
const absolutePath = path.join(repo, relativePath);
|
|
74
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
75
|
+
await fs.writeFile(absolutePath, contents);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function commitFile(
|
|
79
|
+
repo: string,
|
|
80
|
+
relativePath: string,
|
|
81
|
+
contents: string,
|
|
82
|
+
subject: string,
|
|
83
|
+
): Promise<void> {
|
|
84
|
+
await writeFile(repo, relativePath, contents);
|
|
85
|
+
await runGit(repo, ['add', relativePath]);
|
|
86
|
+
await runGit(repo, ['commit', '-m', subject]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function headSha(repo: string): Promise<string> {
|
|
90
|
+
return gitStdout(repo, ['rev-parse', 'HEAD']);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
function stubWorkspaceService(workspaceId: string, workspaceDir: string): WorkspaceService {
|
|
95
|
+
return {
|
|
96
|
+
getWorkspacePath: async (id: string) => {
|
|
97
|
+
if (id !== workspaceId) throw new Error(`unexpected workspace ${id}`);
|
|
98
|
+
return workspaceDir;
|
|
99
|
+
},
|
|
100
|
+
} as unknown as WorkspaceService;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
describe('GitService.logForFile', () => {
|
|
104
|
+
let root: string;
|
|
105
|
+
const workspaceId = 'ws-log-file-1';
|
|
106
|
+
|
|
107
|
+
beforeEach(async () => {
|
|
108
|
+
root = await mkTmpRoot();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
afterEach(async () => {
|
|
112
|
+
// `maxRetries` covers the residual case where a background git process
|
|
113
|
+
// (index lock, fsmonitor, etc.) still has `.git/` open when the test
|
|
114
|
+
// finishes — `fs.rm` will retry on EBUSY/ENOTEMPTY/EPERM before failing.
|
|
115
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('returns single-commit history with attribution fields', async () => {
|
|
119
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
120
|
+
const svc = new GitService(
|
|
121
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
122
|
+
new WorkflowHooks(),
|
|
123
|
+
'knowledge-base',
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'one\n', 'first save');
|
|
127
|
+
const sha = await headSha(repo);
|
|
128
|
+
|
|
129
|
+
const history = await svc.logForFile(workspaceId, 'Knowledge/Foo.md', 20);
|
|
130
|
+
expect(history).toHaveLength(1);
|
|
131
|
+
expect(history[0].sha).toBe(sha);
|
|
132
|
+
expect(history[0].authorName).toBe('Test');
|
|
133
|
+
expect(history[0].authorEmail).toBe('t@x.com');
|
|
134
|
+
expect(history[0].subject).toBe('first save');
|
|
135
|
+
expect(history[0].committedAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('includes parent-branch and feature-branch commits in newest-first order', async () => {
|
|
139
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
140
|
+
const svc = new GitService(
|
|
141
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
142
|
+
new WorkflowHooks(),
|
|
143
|
+
'knowledge-base',
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'base\n', 'base edit');
|
|
147
|
+
const baseSha = await headSha(repo);
|
|
148
|
+
await runGit(repo, ['checkout', '-b', 'alice/edit']);
|
|
149
|
+
await commitFile(repo, 'Knowledge/Foo.md', 'base\nfeature\n', 'feature edit');
|
|
150
|
+
const featureSha = await headSha(repo);
|
|
151
|
+
|
|
152
|
+
const history = await svc.logForFile(workspaceId, 'Knowledge/Foo.md', 20);
|
|
153
|
+
expect(history.map((c) => c.sha)).toEqual([featureSha, baseSha]);
|
|
154
|
+
expect(history.map((c) => c.subject)).toEqual(['feature edit', 'base edit']);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('returns an empty list when the file has never been committed', async () => {
|
|
158
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
159
|
+
const svc = new GitService(
|
|
160
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
161
|
+
new WorkflowHooks(),
|
|
162
|
+
'knowledge-base',
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
166
|
+
await writeFile(repo, 'Knowledge/Untracked.md', 'draft content\n');
|
|
167
|
+
|
|
168
|
+
const history = await svc.logForFile(workspaceId, 'Knowledge/Untracked.md', 20);
|
|
169
|
+
expect(history).toEqual([]);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('clamps history length to 100 max and respects smaller limits', async () => {
|
|
173
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
174
|
+
const svc = new GitService(
|
|
175
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
176
|
+
new WorkflowHooks(),
|
|
177
|
+
'knowledge-base',
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// 110 commits is the minimum that still proves "clamped to 100" — going
|
|
181
|
+
// higher just multiplies process-spawn cost on Windows (`git add` + `git
|
|
182
|
+
// commit` per iteration, ~80 ms each) without strengthening the assertion.
|
|
183
|
+
const COMMITS = 110;
|
|
184
|
+
for (let i = 1; i <= COMMITS; i += 1) {
|
|
185
|
+
await commitFile(repo, 'Knowledge/Foo.md', `value ${i}\n`, `commit ${i}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const clamped = await svc.logForFile(workspaceId, 'Knowledge/Foo.md', 200);
|
|
189
|
+
expect(clamped).toHaveLength(100);
|
|
190
|
+
|
|
191
|
+
const limited = await svc.logForFile(workspaceId, 'Knowledge/Foo.md', 5);
|
|
192
|
+
expect(limited).toHaveLength(5);
|
|
193
|
+
// Timeout is generous because Windows process-spawn dominates here — on
|
|
194
|
+
// Linux CI this finishes in ~3 s.
|
|
195
|
+
}, 60000);
|
|
196
|
+
|
|
197
|
+
// Regression: pathspec literal handling. `git log -- '[Approved] foo.md'`
|
|
198
|
+
// would otherwise interpret `[Approved]` as a character-class glob and
|
|
199
|
+
// return zero commits even though the file has a real history. Routes the
|
|
200
|
+
// SETUP commit through `svc.commitFile` (which carries the env var) rather
|
|
201
|
+
// than the local `runGit` helper, since the helper does not.
|
|
202
|
+
it('returns history for a bracketed filename — pathspec literal regression', async () => {
|
|
203
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
204
|
+
const svc = new GitService(
|
|
205
|
+
stubWorkspaceService(workspaceId, workspaceDir),
|
|
206
|
+
new WorkflowHooks(),
|
|
207
|
+
'knowledge-base',
|
|
208
|
+
);
|
|
209
|
+
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
210
|
+
const user = { id: 'u', name: 'Test', email: 't@x.com' };
|
|
211
|
+
const relPath = 'Purchasing/[Approved] memo.md';
|
|
212
|
+
await writeFile(repo, relPath, 'first content\n');
|
|
213
|
+
await svc.commitFile(workspaceId, user, relPath, 'add bracketed memo');
|
|
214
|
+
|
|
215
|
+
const history = await svc.logForFile(workspaceId, relPath, 20);
|
|
216
|
+
expect(history).toHaveLength(1);
|
|
217
|
+
expect(history[0].subject).toBe('add bracketed memo');
|
|
218
|
+
});
|
|
219
|
+
});
|