@bevel-software/platform-core-backend 0.7.5 → 0.9.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 -202
- package/THIRD-PARTY-NOTICES.md +428 -454
- package/dist/core/core-ports.d.ts +8 -1
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +75 -18
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +12 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +69 -36
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +8 -7
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +1 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +6 -6
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +5 -5
- package/dist/modules/access/access-declarations.js +3 -3
- package/dist/modules/access/access-mutation.service.d.ts +3 -3
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +3 -3
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-splice.js +4 -4
- package/dist/modules/access/access-splice.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +3 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +22 -20
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +2 -2
- package/dist/modules/access/creator-access.js +5 -5
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access/render-roles-yaml.d.ts +22 -0
- package/dist/modules/access/render-roles-yaml.d.ts.map +1 -0
- package/dist/modules/access/render-roles-yaml.js +56 -0
- package/dist/modules/access/render-roles-yaml.js.map +1 -0
- package/dist/modules/access/roles-admin.service.d.ts +33 -5
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +44 -19
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/code-mode/code-mode-names.d.ts +5 -13
- package/dist/modules/code-mode/code-mode-names.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode-names.js +5 -27
- package/dist/modules/code-mode/code-mode-names.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +29 -7
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -52
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +33 -395
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +7 -0
- package/dist/modules/plugins/index.d.ts.map +1 -0
- package/dist/modules/plugins/index.js +6 -0
- package/dist/modules/plugins/index.js.map +1 -0
- package/dist/modules/plugins/join-proposals.d.ts +53 -0
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -0
- package/dist/modules/plugins/join-proposals.js +67 -0
- package/dist/modules/plugins/join-proposals.js.map +1 -0
- package/dist/modules/plugins/join-requests.service.d.ts +81 -0
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -0
- package/dist/modules/plugins/join-requests.service.js +135 -0
- package/dist/modules/plugins/join-requests.service.js.map +1 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts +134 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-provision.service.js +344 -0
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -0
- package/dist/modules/plugins/plugins.contract.d.ts +106 -0
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -0
- package/dist/modules/plugins/plugins.contract.js +36 -0
- package/dist/modules/plugins/plugins.contract.js.map +1 -0
- package/dist/modules/plugins/plugins.routes.d.ts +42 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -0
- package/dist/modules/plugins/plugins.routes.js +379 -0
- package/dist/modules/plugins/plugins.routes.js.map +1 -0
- package/dist/modules/plugins/plugins.service.d.ts +60 -0
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugins.service.js +172 -0
- package/dist/modules/plugins/plugins.service.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +10 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +111 -6
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +2 -2
- package/dist/modules/skills/pending-skills.service.js +7 -7
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +4 -4
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.contract.js +1 -1
- package/dist/modules/skills/skills.service.js +5 -5
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +65 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.js +276 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -0
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +92 -0
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +328 -0
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +38 -12
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +13 -2
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +233 -2
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +74 -37
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +6 -3
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.js +2 -2
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +2 -2
- package/dist/modules/workspace/kb-seed.service.d.ts.map +1 -1
- package/dist/modules/workspace/kb-seed.service.js +43 -10
- package/dist/modules/workspace/kb-seed.service.js.map +1 -1
- package/dist/modules/workspace/plugins-migration.d.ts +50 -0
- package/dist/modules/workspace/plugins-migration.d.ts.map +1 -0
- package/dist/modules/workspace/plugins-migration.js +379 -0
- package/dist/modules/workspace/plugins-migration.js.map +1 -0
- package/dist/modules/workspace/startup/kb-git.d.ts +23 -0
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -0
- package/dist/modules/workspace/startup/kb-git.js +86 -0
- package/dist/modules/workspace/startup/kb-git.js.map +1 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +74 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -0
- package/dist/modules/workspace/startup/kb-startup-runner.js +528 -0
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -0
- package/dist/modules/workspace/startup/on-server-start.d.ts +105 -0
- package/dist/modules/workspace/startup/on-server-start.d.ts.map +1 -0
- package/dist/modules/workspace/startup/on-server-start.js +21 -0
- package/dist/modules/workspace/startup/on-server-start.js.map +1 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +46 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +492 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts +23 -0
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js +69 -0
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +17 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.js +109 -0
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -0
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +103 -0
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/template-files.step.js +337 -0
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.js +3 -3
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +0 -9
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +2 -30
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/shared/kb-layout.test.js +3 -3
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/utcp-namespace.d.ts +6 -27
- package/dist/shared/utcp-namespace.d.ts.map +1 -1
- package/dist/shared/utcp-namespace.js +6 -63
- package/dist/shared/utcp-namespace.js.map +1 -1
- package/dist/shared/variable-refs.d.ts +42 -0
- package/dist/shared/variable-refs.d.ts.map +1 -0
- package/dist/shared/variable-refs.js +60 -0
- package/dist/shared/variable-refs.js.map +1 -0
- package/kb-template/.bevelignore +1 -1
- package/kb-template/AGENTS.md +88 -35
- package/kb-template/KnowledgeBase/How to get started.md +10 -10
- package/kb-template/access.md +36 -36
- package/kb-template/gitignore.template +16 -0
- package/migrations/meta/0000_snapshot.json +1479 -1479
- package/package.json +5 -4
- package/src/assets.ts +25 -25
- package/src/core/core-ports.ts +113 -106
- package/src/core/create-core-server.ts +85 -20
- package/src/core/create-core-services.ts +83 -42
- package/src/index.ts +69 -69
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +98 -98
- package/src/modules/access/__tests__/access-declarations.test.ts +28 -28
- package/src/modules/access/__tests__/access-md-format.test.ts +18 -18
- package/src/modules/access/__tests__/access-mutation.service.test.ts +5 -5
- package/src/modules/access/__tests__/access-splice.test.ts +2 -2
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +16 -16
- package/src/modules/access/__tests__/grant-sources.test.ts +12 -12
- package/src/modules/access/__tests__/roles-admin.service.test.ts +36 -2
- package/src/modules/access/access-control.interface.ts +8 -7
- package/src/modules/access/access-control.service.ts +7 -7
- package/src/modules/access/access-declarations.ts +5 -5
- package/src/modules/access/access-mutation.service.ts +3 -3
- package/src/modules/access/access-splice.ts +4 -4
- package/src/modules/access/access.routes.ts +23 -20
- package/src/modules/access/creator-access.ts +5 -5
- package/src/modules/access/render-roles-yaml.ts +65 -0
- package/src/modules/access/roles-admin.service.ts +45 -16
- package/src/modules/admin/admin-access.routes.ts +29 -29
- package/src/modules/auth/__tests__/auth.routes.test.ts +91 -91
- package/src/modules/auth/__tests__/rate-limit.test.ts +36 -36
- package/src/modules/auth/rate-limit.ts +45 -45
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +67 -0
- package/src/modules/code-mode/code-mode-names.ts +10 -36
- package/src/modules/code-mode/code-mode.tool.ts +27 -7
- package/src/modules/database/connection.ts +15 -15
- package/src/modules/database/schema.ts +11 -11
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +150 -150
- package/src/modules/mcp/mcp.service.ts +57 -435
- package/src/modules/{groups → plugins}/__tests__/join-proposals.test.ts +1 -1
- package/src/modules/{groups → plugins}/__tests__/join-requests.service.test.ts +7 -7
- package/src/modules/{groups/__tests__/group-index.service.test.ts → plugins/__tests__/plugin-index.service.test.ts} +41 -41
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +312 -0
- package/src/modules/{groups/__tests__/groups.routes.test.ts → plugins/__tests__/plugins.routes.test.ts} +100 -100
- package/src/modules/plugins/index.ts +17 -0
- package/src/modules/{groups → plugins}/join-proposals.ts +2 -2
- package/src/modules/{groups → plugins}/join-requests.service.ts +8 -8
- package/src/modules/{groups/group-provision.service.ts → plugins/plugin-provision.service.ts} +139 -69
- package/src/modules/{groups/groups.contract.ts → plugins/plugins.contract.ts} +26 -26
- package/src/modules/{groups/groups.routes.ts → plugins/plugins.routes.ts} +102 -102
- package/src/modules/{groups/groups.service.ts → plugins/plugins.service.ts} +43 -43
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +143 -143
- package/src/modules/settings/__tests__/setup.routes.test.ts +124 -3
- package/src/modules/settings/setup.routes.ts +112 -5
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +14 -14
- package/src/modules/skills/__tests__/skills.service.test.ts +13 -13
- package/src/modules/skills/pending-skills.service.ts +7 -7
- package/src/modules/skills/skills.contract.ts +4 -4
- package/src/modules/skills/skills.service.ts +5 -5
- package/src/modules/tool-auth/llm-usage-meter.ts +19 -19
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +198 -0
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +346 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +101 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +3 -3
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +27 -27
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +3 -3
- package/src/modules/tool-manuals/mcp-json-discovery.ts +328 -0
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +434 -0
- package/src/modules/tool-manuals/tool-manuals.contract.ts +35 -12
- package/src/modules/tool-manuals/tool-manuals.routes.ts +222 -1
- package/src/modules/tool-manuals/tool-manuals.service.ts +82 -42
- package/src/modules/tool-manuals/tool-manuals.tools.ts +6 -3
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/branch-name.test.ts +3 -3
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +3 -3
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +13 -8
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +1 -1
- package/src/modules/workflow/git/git.service.ts +2 -2
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +1 -1
- package/src/modules/workflow/workflow-hooks.ts +101 -101
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +237 -237
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +236 -236
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +179 -179
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +320 -320
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +337 -337
- package/src/modules/workspace/__tests__/workspace.service.test.ts +27 -0
- package/src/modules/workspace/bevel-ignore.ts +66 -66
- package/src/modules/workspace/session-sink.ts +25 -25
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +495 -0
- package/src/modules/workspace/startup/kb-git.ts +94 -0
- package/src/modules/workspace/startup/kb-startup-runner.ts +597 -0
- package/src/modules/workspace/startup/on-server-start.ts +97 -0
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +636 -0
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +561 -0
- package/src/modules/workspace/startup/steps/roles-yaml.step.ts +71 -0
- package/src/modules/workspace/startup/steps/seed-tree.ts +115 -0
- package/src/modules/workspace/startup/steps/template-files.step.ts +360 -0
- package/src/modules/workspace/workspace.routes.ts +3 -3
- package/src/modules/workspace/workspace.service.ts +2 -35
- package/src/modules/workspace/workspace.tools.ts +922 -922
- package/src/shared/__tests__/join-request.test.ts +13 -13
- package/src/shared/__tests__/kb-layout.plugin.test.ts +45 -0
- package/src/shared/kb-layout.test.ts +3 -3
- package/src/shared/utcp-namespace.ts +10 -68
- package/src/shared/variable-refs.ts +64 -0
- package/src/modules/groups/__tests__/group-provision.service.test.ts +0 -247
- package/src/modules/groups/index.ts +0 -17
- package/src/modules/workspace/__tests__/kb-seed.service.test.ts +0 -444
- package/src/modules/workspace/kb-seed.interface.ts +0 -36
- package/src/modules/workspace/kb-seed.service.ts +0 -555
- package/src/shared/__tests__/kb-layout.group.test.ts +0 -45
- /package/kb-template/{Groups → Plugins}/.gitkeep +0 -0
|
@@ -437,6 +437,33 @@ describe('WorkspaceService — clone bootstrap & sibling reference', () => {
|
|
|
437
437
|
});
|
|
438
438
|
});
|
|
439
439
|
|
|
440
|
+
describe('WorkspaceService.sweepOrphanedWorkspaces', () => {
|
|
441
|
+
let root: string;
|
|
442
|
+
|
|
443
|
+
beforeEach(async () => {
|
|
444
|
+
root = await mkTmpRoot();
|
|
445
|
+
// The fake `.git` in seedBranchWorkspace makes normalizeCloneTracking's
|
|
446
|
+
// git calls fail; that path only warns, which is noise here.
|
|
447
|
+
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
afterEach(async () => {
|
|
451
|
+
vi.restoreAllMocks();
|
|
452
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
it('removes the clone of a branch that is not in the known set', async () => {
|
|
456
|
+
const { workspaceId, workspaceDir } = await seedBranchWorkspace(root, 'target-company-state');
|
|
457
|
+
const svc = new WorkspaceService(root, 'https://github.com/Bevel-Software/knowledge-base.git', 'knowledge-base');
|
|
458
|
+
await svc.getOrCreateForBranch('target-company-state');
|
|
459
|
+
|
|
460
|
+
// The branch vanishes from the known set; the sweep reclaims its clone.
|
|
461
|
+
const { removed } = await svc.sweepOrphanedWorkspaces([]);
|
|
462
|
+
expect(removed).toContain(workspaceId);
|
|
463
|
+
await expect(fs.stat(workspaceDir)).rejects.toThrow();
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
|
|
440
467
|
describe('WorkspaceService.readAllKbFiles', () => {
|
|
441
468
|
let root: string;
|
|
442
469
|
let svc: WorkspaceService;
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import ignore, { type Ignore } from 'ignore';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The ignore file's own name. Exported because the file-tree filter hides it
|
|
7
|
-
* from non-admins, and both places must agree on the spelling.
|
|
8
|
-
*/
|
|
9
|
-
export const IGNORE_FILENAME = '.bevelignore';
|
|
10
|
-
|
|
11
|
-
/** One .bevelignore file's rules, scoped to the directory it lives in. */
|
|
12
|
-
interface IgnoreLayer {
|
|
13
|
-
/** Absolute path of the directory where the .bevelignore lives. */
|
|
14
|
-
readonly root: string;
|
|
15
|
-
readonly matcher: Ignore;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A hierarchical stack of `.bevelignore` rule sets.
|
|
20
|
-
*
|
|
21
|
-
* Each `.bevelignore` file applies to paths beneath the directory it lives in,
|
|
22
|
-
* using standard gitignore syntax (negations, `**`, directory-only patterns, anchoring).
|
|
23
|
-
* Deeper files combine with — and can override — rules from shallower files,
|
|
24
|
-
* mirroring how git layers `.gitignore` files.
|
|
25
|
-
*/
|
|
26
|
-
export class BevelIgnoreStack {
|
|
27
|
-
private constructor(private readonly layers: readonly IgnoreLayer[]) {}
|
|
28
|
-
|
|
29
|
-
static empty(): BevelIgnoreStack {
|
|
30
|
-
return new BevelIgnoreStack([]);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Return a new stack that additionally includes a `.bevelignore` from `dir`
|
|
35
|
-
* (if present). If no `.bevelignore` exists in `dir`, returns this stack unchanged.
|
|
36
|
-
*/
|
|
37
|
-
async extendedWith(dir: string): Promise<BevelIgnoreStack> {
|
|
38
|
-
const file = path.join(dir, IGNORE_FILENAME);
|
|
39
|
-
let contents: string;
|
|
40
|
-
try {
|
|
41
|
-
contents = await fs.readFile(file, 'utf-8');
|
|
42
|
-
} catch {
|
|
43
|
-
return this;
|
|
44
|
-
}
|
|
45
|
-
const matcher = ignore().add(contents);
|
|
46
|
-
return new BevelIgnoreStack([...this.layers, { root: dir, matcher }]);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Whether the given entry should be hidden from the file tree.
|
|
51
|
-
* @param absolutePath absolute path of the entry
|
|
52
|
-
* @param isDirectory needed because gitignore patterns ending in `/` match directories only
|
|
53
|
-
*/
|
|
54
|
-
isIgnored(absolutePath: string, isDirectory: boolean): boolean {
|
|
55
|
-
for (const layer of this.layers) {
|
|
56
|
-
const rel = path.relative(layer.root, absolutePath).replace(/\\/g, '/');
|
|
57
|
-
// Skip entries that aren't under this layer's root (shouldn't happen in normal
|
|
58
|
-
// recursion, but guards against absolute-path quirks on Windows).
|
|
59
|
-
if (!rel || rel.startsWith('..')) continue;
|
|
60
|
-
// Append trailing slash for directories so `foo/`-style rules match correctly.
|
|
61
|
-
const probe = isDirectory ? `${rel}/` : rel;
|
|
62
|
-
if (layer.matcher.ignores(probe)) return true;
|
|
63
|
-
}
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import ignore, { type Ignore } from 'ignore';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The ignore file's own name. Exported because the file-tree filter hides it
|
|
7
|
+
* from non-admins, and both places must agree on the spelling.
|
|
8
|
+
*/
|
|
9
|
+
export const IGNORE_FILENAME = '.bevelignore';
|
|
10
|
+
|
|
11
|
+
/** One .bevelignore file's rules, scoped to the directory it lives in. */
|
|
12
|
+
interface IgnoreLayer {
|
|
13
|
+
/** Absolute path of the directory where the .bevelignore lives. */
|
|
14
|
+
readonly root: string;
|
|
15
|
+
readonly matcher: Ignore;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A hierarchical stack of `.bevelignore` rule sets.
|
|
20
|
+
*
|
|
21
|
+
* Each `.bevelignore` file applies to paths beneath the directory it lives in,
|
|
22
|
+
* using standard gitignore syntax (negations, `**`, directory-only patterns, anchoring).
|
|
23
|
+
* Deeper files combine with — and can override — rules from shallower files,
|
|
24
|
+
* mirroring how git layers `.gitignore` files.
|
|
25
|
+
*/
|
|
26
|
+
export class BevelIgnoreStack {
|
|
27
|
+
private constructor(private readonly layers: readonly IgnoreLayer[]) {}
|
|
28
|
+
|
|
29
|
+
static empty(): BevelIgnoreStack {
|
|
30
|
+
return new BevelIgnoreStack([]);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Return a new stack that additionally includes a `.bevelignore` from `dir`
|
|
35
|
+
* (if present). If no `.bevelignore` exists in `dir`, returns this stack unchanged.
|
|
36
|
+
*/
|
|
37
|
+
async extendedWith(dir: string): Promise<BevelIgnoreStack> {
|
|
38
|
+
const file = path.join(dir, IGNORE_FILENAME);
|
|
39
|
+
let contents: string;
|
|
40
|
+
try {
|
|
41
|
+
contents = await fs.readFile(file, 'utf-8');
|
|
42
|
+
} catch {
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
const matcher = ignore().add(contents);
|
|
46
|
+
return new BevelIgnoreStack([...this.layers, { root: dir, matcher }]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Whether the given entry should be hidden from the file tree.
|
|
51
|
+
* @param absolutePath absolute path of the entry
|
|
52
|
+
* @param isDirectory needed because gitignore patterns ending in `/` match directories only
|
|
53
|
+
*/
|
|
54
|
+
isIgnored(absolutePath: string, isDirectory: boolean): boolean {
|
|
55
|
+
for (const layer of this.layers) {
|
|
56
|
+
const rel = path.relative(layer.root, absolutePath).replace(/\\/g, '/');
|
|
57
|
+
// Skip entries that aren't under this layer's root (shouldn't happen in normal
|
|
58
|
+
// recursion, but guards against absolute-path quirks on Windows).
|
|
59
|
+
if (!rel || rel.startsWith('..')) continue;
|
|
60
|
+
// Append trailing slash for directories so `foo/`-style rules match correctly.
|
|
61
|
+
const probe = isDirectory ? `${rel}/` : rel;
|
|
62
|
+
if (layer.matcher.ignores(probe)) return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Port behind `start_session` (workspace.tools.ts): mints the session id an
|
|
5
|
-
* external agent scopes its ontology boundary under. The workspace module owns
|
|
6
|
-
* the port; WHAT backs the id is the composition root's choice:
|
|
7
|
-
*
|
|
8
|
-
* - Core default ({@link UuidSessionSink}): a bare random id — sufficient for
|
|
9
|
-
* the session-ontology gate, with no app-side session record.
|
|
10
|
-
* - The enterprise app substitutes a sink that mints a REAL chat thread, so the
|
|
11
|
-
* same id also works end to end with `ask` (its sessionId IS a chat thread).
|
|
12
|
-
* See the `start_session` comment in workspace.tools.ts for why that
|
|
13
|
-
* unification matters.
|
|
14
|
-
*/
|
|
15
|
-
export interface ISessionSink {
|
|
16
|
-
/** Mint a session id for an external agent run started at `startedAt`. */
|
|
17
|
-
createSession(userId: string, startedAt: Date): Promise<{ sessionId: string }>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** Core default: a bare random id — no app-side session record. */
|
|
21
|
-
export class UuidSessionSink implements ISessionSink {
|
|
22
|
-
async createSession(): Promise<{ sessionId: string }> {
|
|
23
|
-
return { sessionId: randomUUID() };
|
|
24
|
-
}
|
|
25
|
-
}
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Port behind `start_session` (workspace.tools.ts): mints the session id an
|
|
5
|
+
* external agent scopes its ontology boundary under. The workspace module owns
|
|
6
|
+
* the port; WHAT backs the id is the composition root's choice:
|
|
7
|
+
*
|
|
8
|
+
* - Core default ({@link UuidSessionSink}): a bare random id — sufficient for
|
|
9
|
+
* the session-ontology gate, with no app-side session record.
|
|
10
|
+
* - The enterprise app substitutes a sink that mints a REAL chat thread, so the
|
|
11
|
+
* same id also works end to end with `ask` (its sessionId IS a chat thread).
|
|
12
|
+
* See the `start_session` comment in workspace.tools.ts for why that
|
|
13
|
+
* unification matters.
|
|
14
|
+
*/
|
|
15
|
+
export interface ISessionSink {
|
|
16
|
+
/** Mint a session id for an external agent run started at `startedAt`. */
|
|
17
|
+
createSession(userId: string, startedAt: Date): Promise<{ sessionId: string }>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Core default: a bare random id — no app-side session record. */
|
|
21
|
+
export class UuidSessionSink implements ISessionSink {
|
|
22
|
+
async createSession(): Promise<{ sessionId: string }> {
|
|
23
|
+
return { sessionId: randomUUID() };
|
|
24
|
+
}
|
|
25
|
+
}
|