@dharma-ai-labs/agent-fabric 0.2.49 → 0.2.51
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/dist/index.d.ts +88 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +840 -175
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +2 -2
- package/dist/repositoryCandidateSync.d.ts +55 -0
- package/dist/repositoryCandidateSync.d.ts.map +1 -0
- package/dist/repositoryCandidateSync.js +177 -0
- package/dist/repositoryCandidateSync.js.map +1 -0
- package/dist/repositoryCandidateSync.test.d.ts +2 -0
- package/dist/repositoryCandidateSync.test.d.ts.map +1 -0
- package/dist/repositoryCandidateSync.test.js +141 -0
- package/dist/repositoryCandidateSync.test.js.map +1 -0
- package/dist/repositoryInstalledKnowledge.d.ts +13 -0
- package/dist/repositoryInstalledKnowledge.d.ts.map +1 -0
- package/dist/repositoryInstalledKnowledge.js +25 -0
- package/dist/repositoryInstalledKnowledge.js.map +1 -0
- package/dist/repositoryInstallerFiles.d.ts +6 -0
- package/dist/repositoryInstallerFiles.d.ts.map +1 -0
- package/dist/repositoryInstallerFiles.js +113 -0
- package/dist/repositoryInstallerFiles.js.map +1 -0
- package/dist/repositoryKnowledge.d.ts +119 -0
- package/dist/repositoryKnowledge.d.ts.map +1 -0
- package/dist/repositoryKnowledge.js +462 -0
- package/dist/repositoryKnowledge.js.map +1 -0
- package/dist/repositoryKnowledge.test.d.ts +2 -0
- package/dist/repositoryKnowledge.test.d.ts.map +1 -0
- package/dist/repositoryKnowledge.test.js +245 -0
- package/dist/repositoryKnowledge.test.js.map +1 -0
- package/dist/repositoryKnowledgeRetention.test.d.ts +2 -0
- package/dist/repositoryKnowledgeRetention.test.d.ts.map +1 -0
- package/dist/repositoryKnowledgeRetention.test.js +386 -0
- package/dist/repositoryKnowledgeRetention.test.js.map +1 -0
- package/dist/repositoryOnboardingCaller.test.d.ts +2 -0
- package/dist/repositoryOnboardingCaller.test.d.ts.map +1 -0
- package/dist/repositoryOnboardingCaller.test.js +216 -0
- package/dist/repositoryOnboardingCaller.test.js.map +1 -0
- package/dist/repositoryOnboardingFlow.test.d.ts +2 -0
- package/dist/repositoryOnboardingFlow.test.d.ts.map +1 -0
- package/dist/repositoryOnboardingFlow.test.js +47 -0
- package/dist/repositoryOnboardingFlow.test.js.map +1 -0
- package/dist/repositoryPackage.d.ts +115 -0
- package/dist/repositoryPackage.d.ts.map +1 -0
- package/dist/repositoryPackage.js +1095 -0
- package/dist/repositoryPackage.js.map +1 -0
- package/dist/repositoryPackage.test.d.ts +2 -0
- package/dist/repositoryPackage.test.d.ts.map +1 -0
- package/dist/repositoryPackage.test.js +709 -0
- package/dist/repositoryPackage.test.js.map +1 -0
- package/dist/repositoryPackageDelivery.d.ts +29 -0
- package/dist/repositoryPackageDelivery.d.ts.map +1 -0
- package/dist/repositoryPackageDelivery.js +140 -0
- package/dist/repositoryPackageDelivery.js.map +1 -0
- package/dist/repositoryPackageDelivery.test.d.ts +2 -0
- package/dist/repositoryPackageDelivery.test.d.ts.map +1 -0
- package/dist/repositoryPackageDelivery.test.js +787 -0
- package/dist/repositoryPackageDelivery.test.js.map +1 -0
- package/dist/repositoryPackageDeliveryCaller.test.d.ts +2 -0
- package/dist/repositoryPackageDeliveryCaller.test.d.ts.map +1 -0
- package/dist/repositoryPackageDeliveryCaller.test.js +18 -0
- package/dist/repositoryPackageDeliveryCaller.test.js.map +1 -0
- package/dist/repositoryPackageDeliveryPreflight.test.d.ts +2 -0
- package/dist/repositoryPackageDeliveryPreflight.test.d.ts.map +1 -0
- package/dist/repositoryPackageDeliveryPreflight.test.js +29 -0
- package/dist/repositoryPackageDeliveryPreflight.test.js.map +1 -0
- package/dist/repositoryPackageTransfer.d.ts +85 -0
- package/dist/repositoryPackageTransfer.d.ts.map +1 -0
- package/dist/repositoryPackageTransfer.js +233 -0
- package/dist/repositoryPackageTransfer.js.map +1 -0
- package/dist/repositoryPackageTransfer.test.d.ts +2 -0
- package/dist/repositoryPackageTransfer.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransfer.test.js +173 -0
- package/dist/repositoryPackageTransfer.test.js.map +1 -0
- package/dist/repositoryPackageTransferV2.test.d.ts +2 -0
- package/dist/repositoryPackageTransferV2.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransferV2.test.js +549 -0
- package/dist/repositoryPackageTransferV2.test.js.map +1 -0
- package/dist/repositoryPackageTransferV2Schema.test.d.ts +2 -0
- package/dist/repositoryPackageTransferV2Schema.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransferV2Schema.test.js +48 -0
- package/dist/repositoryPackageTransferV2Schema.test.js.map +1 -0
- package/dist/repositoryReleaseMetadata.d.ts +37 -0
- package/dist/repositoryReleaseMetadata.d.ts.map +1 -0
- package/dist/repositoryReleaseMetadata.js +251 -0
- package/dist/repositoryReleaseMetadata.js.map +1 -0
- package/dist/repositoryReleaseMetadata.test.d.ts +2 -0
- package/dist/repositoryReleaseMetadata.test.d.ts.map +1 -0
- package/dist/repositoryReleaseMetadata.test.js +297 -0
- package/dist/repositoryReleaseMetadata.test.js.map +1 -0
- package/dist/repositoryRoleDerivation.d.ts +11 -0
- package/dist/repositoryRoleDerivation.d.ts.map +1 -0
- package/dist/repositoryRoleDerivation.js +59 -0
- package/dist/repositoryRoleDerivation.js.map +1 -0
- package/dist/repositoryRoleDerivation.test.d.ts +2 -0
- package/dist/repositoryRoleDerivation.test.d.ts.map +1 -0
- package/dist/repositoryRoleDerivation.test.js +33 -0
- package/dist/repositoryRoleDerivation.test.js.map +1 -0
- package/dist/repositoryRoleMetadata.d.ts +63 -0
- package/dist/repositoryRoleMetadata.d.ts.map +1 -0
- package/dist/repositoryRoleMetadata.js +203 -0
- package/dist/repositoryRoleMetadata.js.map +1 -0
- package/dist/repositoryRoleMetadata.test.d.ts +2 -0
- package/dist/repositoryRoleMetadata.test.d.ts.map +1 -0
- package/dist/repositoryRoleMetadata.test.js +296 -0
- package/dist/repositoryRoleMetadata.test.js.map +1 -0
- package/dist/repositoryRoleQuestion.d.ts +36 -0
- package/dist/repositoryRoleQuestion.d.ts.map +1 -0
- package/dist/repositoryRoleQuestion.js +68 -0
- package/dist/repositoryRoleQuestion.js.map +1 -0
- package/dist/repositoryRoleQuestion.test.d.ts +2 -0
- package/dist/repositoryRoleQuestion.test.d.ts.map +1 -0
- package/dist/repositoryRoleQuestion.test.js +66 -0
- package/dist/repositoryRoleQuestion.test.js.map +1 -0
- package/dist/repositorySourceAuthorization.d.ts +43 -0
- package/dist/repositorySourceAuthorization.d.ts.map +1 -0
- package/dist/repositorySourceAuthorization.js +164 -0
- package/dist/repositorySourceAuthorization.js.map +1 -0
- package/dist/repositorySourceCapture.test.d.ts +2 -0
- package/dist/repositorySourceCapture.test.d.ts.map +1 -0
- package/dist/repositorySourceCapture.test.js +303 -0
- package/dist/repositorySourceCapture.test.js.map +1 -0
- package/dist/repositorySourceSync.d.ts +54 -0
- package/dist/repositorySourceSync.d.ts.map +1 -0
- package/dist/repositorySourceSync.js +88 -0
- package/dist/repositorySourceSync.js.map +1 -0
- package/dist/repositorySourceSync.test.d.ts +2 -0
- package/dist/repositorySourceSync.test.d.ts.map +1 -0
- package/dist/repositorySourceSync.test.js +218 -0
- package/dist/repositorySourceSync.test.js.map +1 -0
- package/dist/schemas/repository-knowledge-retention-v1.schema.json +26 -0
- package/dist/schemas/repository-knowledge-v2.schema.json +74 -0
- package/dist/schemas/repository-knowledge.schema.json +63 -0
- package/dist/schemas/repository-package-chunk-v2.schema.json +15 -0
- package/dist/schemas/repository-package-chunk.schema.json +18 -0
- package/dist/schemas/repository-package-delivery-v1.schema.json +51 -0
- package/dist/schemas/repository-package-envelope-v1.schema.json +16 -0
- package/dist/schemas/repository-package-transfer-v2.schema.json +36 -0
- package/dist/schemas/repository-package-transfer.schema.json +34 -0
- package/dist/schemas/repository-package-v2.schema.json +491 -0
- package/dist/schemas/repository-package-v3.schema.json +36 -0
- package/dist/schemas/repository-package.schema.json +94 -0
- package/dist/schemas/repository-release-manifest.schema.json +34 -0
- package/dist/schemas/repository-role-metadata.schema.json +82 -0
- package/dist/schemas/skill-preparation-pointer-v1.schema.json +28 -0
- package/dist/schemas/skill-preparation-v1.schema.json +32 -0
- package/dist/skillPollResponse.test.d.ts +2 -0
- package/dist/skillPollResponse.test.d.ts.map +1 -0
- package/dist/skillPollResponse.test.js +37 -0
- package/dist/skillPollResponse.test.js.map +1 -0
- package/dist/skillPreparation.test.d.ts +2 -0
- package/dist/skillPreparation.test.d.ts.map +1 -0
- package/dist/skillPreparation.test.js +163 -0
- package/dist/skillPreparation.test.js.map +1 -0
- package/dist/skillPreparationCache.d.ts +34 -0
- package/dist/skillPreparationCache.d.ts.map +1 -0
- package/dist/skillPreparationCache.js +371 -0
- package/dist/skillPreparationCache.js.map +1 -0
- package/dist/skillPreparationCache.test.d.ts +2 -0
- package/dist/skillPreparationCache.test.d.ts.map +1 -0
- package/dist/skillPreparationCache.test.js +316 -0
- package/dist/skillPreparationCache.test.js.map +1 -0
- package/dist/skillPreparationCaller.test.d.ts +2 -0
- package/dist/skillPreparationCaller.test.d.ts.map +1 -0
- package/dist/skillPreparationCaller.test.js +32 -0
- package/dist/skillPreparationCaller.test.js.map +1 -0
- package/dist/skillPreparationPump.d.ts +11 -0
- package/dist/skillPreparationPump.d.ts.map +1 -0
- package/dist/skillPreparationPump.js +41 -0
- package/dist/skillPreparationPump.js.map +1 -0
- package/dist/skillPreparationPump.test.d.ts +2 -0
- package/dist/skillPreparationPump.test.d.ts.map +1 -0
- package/dist/skillPreparationPump.test.js +87 -0
- package/dist/skillPreparationPump.test.js.map +1 -0
- package/dist/skillPreparationRecord.d.ts +2 -0
- package/dist/skillPreparationRecord.d.ts.map +1 -0
- package/dist/skillPreparationRecord.js +36 -0
- package/dist/skillPreparationRecord.js.map +1 -0
- package/dist/skillPreparationTransaction.d.ts +13 -0
- package/dist/skillPreparationTransaction.d.ts.map +1 -0
- package/dist/skillPreparationTransaction.js +236 -0
- package/dist/skillPreparationTransaction.js.map +1 -0
- package/dist/skillPreparationTransaction.test.d.ts +2 -0
- package/dist/skillPreparationTransaction.test.d.ts.map +1 -0
- package/dist/skillPreparationTransaction.test.js +181 -0
- package/dist/skillPreparationTransaction.test.js.map +1 -0
- package/dist/skillSyncPolicy.test.d.ts +2 -0
- package/dist/skillSyncPolicy.test.d.ts.map +1 -0
- package/dist/skillSyncPolicy.test.js +156 -0
- package/dist/skillSyncPolicy.test.js.map +1 -0
- package/dist/usage.d.ts +1 -1
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +1 -1
- package/dist/usage.js.map +1 -1
- package/dist/windowsProcessPortability.test.d.ts +2 -0
- package/dist/windowsProcessPortability.test.d.ts.map +1 -0
- package/dist/windowsProcessPortability.test.js +14 -0
- package/dist/windowsProcessPortability.test.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryKnowledge.test.d.ts","sourceRoot":"","sources":["../src/repositoryKnowledge.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, rename, rm, symlink, unlink, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { dirname, resolve } from 'node:path';
|
|
7
|
+
import test from 'node:test';
|
|
8
|
+
import { initializeRepositoryKnowledge, readRepositoryKnowledge, validateRepositoryKnowledgeCatalog, REPOSITORY_KNOWLEDGE_CATALOG_PATH, REPOSITORY_KNOWLEDGE_INIT_PATH, } from './repositoryKnowledge.js';
|
|
9
|
+
const root = '.agents/skills/dharma-agent-fabric';
|
|
10
|
+
const now = new Date('2026-09-17T00:00:00.000Z');
|
|
11
|
+
async function fixture(t) {
|
|
12
|
+
const workspace = await mkdtemp(resolve(tmpdir(), 'repository-knowledge-'));
|
|
13
|
+
t.after(() => rm(workspace, { recursive: true, force: true }));
|
|
14
|
+
const put = async (path, value) => {
|
|
15
|
+
await mkdir(dirname(resolve(workspace, path)), { recursive: true });
|
|
16
|
+
await writeFile(resolve(workspace, path), value);
|
|
17
|
+
};
|
|
18
|
+
await put(`${root}/.dharma-agent-fabric.json`, JSON.stringify({ managedBy: 'dharma-agent-fabric', workspaceId: 'device-local' }));
|
|
19
|
+
return { workspace, organizationId: 'org_fixture', repositoryAgentId: 'repository-agent-fixture', now, put };
|
|
20
|
+
}
|
|
21
|
+
function canonical(value) {
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
24
|
+
if (value && typeof value === 'object')
|
|
25
|
+
return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)
|
|
26
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(',')}}`;
|
|
27
|
+
return JSON.stringify(value);
|
|
28
|
+
}
|
|
29
|
+
function rehash(catalog) {
|
|
30
|
+
const { catalogHash: _hash, ...content } = catalog;
|
|
31
|
+
return { ...content, catalogHash: `sha256:${createHash('sha256').update(canonical(content)).digest('hex')}` };
|
|
32
|
+
}
|
|
33
|
+
test('knowledge initialization and reads permit system ancestor aliases but not workspace aliases', async (t) => {
|
|
34
|
+
const f = await fixture(t);
|
|
35
|
+
const parent = await mkdtemp(resolve(tmpdir(), 'knowledge-system-alias-'));
|
|
36
|
+
t.after(() => rm(parent, { recursive: true, force: true }));
|
|
37
|
+
const alias = resolve(parent, 'system-alias');
|
|
38
|
+
await symlink(dirname(f.workspace), alias, process.platform === 'win32' ? 'junction' : 'dir');
|
|
39
|
+
const workspace = resolve(alias, f.workspace.slice(dirname(f.workspace).length + 1));
|
|
40
|
+
const first = await initializeRepositoryKnowledge({ ...f, workspace });
|
|
41
|
+
assert.equal(first.disposition, 'initialized');
|
|
42
|
+
assert.deepEqual(await readRepositoryKnowledge({ ...f, workspace }), await readRepositoryKnowledge(f));
|
|
43
|
+
assert.equal((await initializeRepositoryKnowledge(f)).disposition, 'reused');
|
|
44
|
+
const linkedWorkspace = resolve(parent, 'workspace-alias');
|
|
45
|
+
await symlink(f.workspace, linkedWorkspace, process.platform === 'win32' ? 'junction' : 'dir');
|
|
46
|
+
await assert.rejects(initializeRepositoryKnowledge({ ...f, workspace: linkedWorkspace }), /symlink/);
|
|
47
|
+
await assert.rejects(readRepositoryKnowledge({ ...f, workspace: linkedWorkspace }), /symlink/);
|
|
48
|
+
});
|
|
49
|
+
test('initializes only local unsigned empty knowledge with deterministic shared repository identity', async (t) => {
|
|
50
|
+
const a = await fixture(t);
|
|
51
|
+
const b = await fixture(t);
|
|
52
|
+
await a.put('.env', 'API_KEY=never-collect-this-secret');
|
|
53
|
+
const first = await initializeRepositoryKnowledge(a);
|
|
54
|
+
const second = await initializeRepositoryKnowledge({ ...b, now: new Date('2026-09-18T00:00:00.000Z') });
|
|
55
|
+
assert.equal(first.disposition, 'initialized');
|
|
56
|
+
assert.equal(first.relativePath, REPOSITORY_KNOWLEDGE_CATALOG_PATH);
|
|
57
|
+
assert.equal(first.catalog.knowledgeBaseId, second.catalog.knowledgeBaseId);
|
|
58
|
+
assert.deepEqual(first.catalog.concepts, []);
|
|
59
|
+
assert.deepEqual(first.catalog.provenance, { origin: 'locally_initialized', authority: 'unsigned', serverReleaseId: null });
|
|
60
|
+
assert.deepEqual(first.catalog.repoAtlas, { association: 'local_scope_only', findingsState: 'not_observed',
|
|
61
|
+
organizationId: a.organizationId, repositoryAgentId: a.repositoryAgentId });
|
|
62
|
+
const bytes = await readFile(resolve(a.workspace, first.relativePath), 'utf8');
|
|
63
|
+
assert.ok(!bytes.includes(a.workspace));
|
|
64
|
+
assert.ok(!bytes.includes('never-collect-this-secret'));
|
|
65
|
+
assert.ok(!bytes.includes('device-local'));
|
|
66
|
+
assert.equal(validateRepositoryKnowledgeCatalog(JSON.parse(bytes), a).knowledgeBaseId, first.catalog.knowledgeBaseId);
|
|
67
|
+
});
|
|
68
|
+
test('reads without creating anything and offers an explicit dry-run initialization', async (t) => {
|
|
69
|
+
const f = await fixture(t);
|
|
70
|
+
assert.equal(await readRepositoryKnowledge(f), null);
|
|
71
|
+
const plan = await initializeRepositoryKnowledge({ ...f, dryRun: true });
|
|
72
|
+
assert.equal(plan.disposition, 'planned');
|
|
73
|
+
await assert.rejects(readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_INIT_PATH)), { code: 'ENOENT' });
|
|
74
|
+
await assert.rejects(readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH)), { code: 'ENOENT' });
|
|
75
|
+
});
|
|
76
|
+
test('replay preserves existing concepts and exact catalog bytes, not the new clock', async (t) => {
|
|
77
|
+
const f = await fixture(t);
|
|
78
|
+
const first = await initializeRepositoryKnowledge(f);
|
|
79
|
+
const updated = rehash({ ...first.catalog, concepts: [{ conceptId: 'concept_review',
|
|
80
|
+
relativePath: 'concepts/review.md', sha256: `sha256:${'a'.repeat(64)}` }] });
|
|
81
|
+
const staged = resolve(f.workspace, `${root}/updated.json`);
|
|
82
|
+
const bytes = `${canonical(updated)}\n`;
|
|
83
|
+
await writeFile(staged, bytes);
|
|
84
|
+
await rename(staged, resolve(f.workspace, first.relativePath));
|
|
85
|
+
const replay = await initializeRepositoryKnowledge({ ...f, now: new Date('2026-09-19T00:00:00.000Z') });
|
|
86
|
+
assert.equal(replay.disposition, 'reused');
|
|
87
|
+
assert.deepEqual(replay.catalog, updated);
|
|
88
|
+
assert.equal(await readFile(resolve(f.workspace, first.relativePath), 'utf8'), bytes);
|
|
89
|
+
});
|
|
90
|
+
test('concurrent first creation publishes one complete catalog and reuses it', async (t) => {
|
|
91
|
+
const f = await fixture(t);
|
|
92
|
+
const results = await Promise.all(Array.from({ length: 12 }, () => initializeRepositoryKnowledge(f)));
|
|
93
|
+
assert.equal(results.filter(result => result.disposition === 'initialized').length, 1);
|
|
94
|
+
assert.ok(results.every(result => canonical(result.catalog) === canonical(results[0].catalog)));
|
|
95
|
+
assert.deepEqual(await readRepositoryKnowledge(f), results[0].catalog);
|
|
96
|
+
});
|
|
97
|
+
test('competing organizations cannot share or replace a first initialization', async (t) => {
|
|
98
|
+
const f = await fixture(t);
|
|
99
|
+
const inputs = [f, { ...f, organizationId: 'org_other' }];
|
|
100
|
+
const results = await Promise.allSettled(inputs.map(input => initializeRepositoryKnowledge(input)));
|
|
101
|
+
assert.equal(results.filter(result => result.status === 'fulfilled').length, 1);
|
|
102
|
+
assert.equal(results.filter(result => result.status === 'rejected').length, 1);
|
|
103
|
+
const winner = results.findIndex(result => result.status === 'fulfilled');
|
|
104
|
+
const catalog = await readRepositoryKnowledge(inputs[winner]);
|
|
105
|
+
assert.equal(catalog?.organizationId, inputs[winner].organizationId);
|
|
106
|
+
await assert.rejects(readRepositoryKnowledge(inputs[1 - winner]));
|
|
107
|
+
});
|
|
108
|
+
test('resumes interruption after durable intent publication with or without the empty directory', async (t) => {
|
|
109
|
+
for (const emptyDirectory of [false, true]) {
|
|
110
|
+
const f = await fixture(t);
|
|
111
|
+
const first = await initializeRepositoryKnowledge(f);
|
|
112
|
+
await unlink(resolve(f.workspace, first.relativePath));
|
|
113
|
+
if (!emptyDirectory)
|
|
114
|
+
await rm(resolve(f.workspace, `${root}/knowledge`), { recursive: true });
|
|
115
|
+
assert.equal(await readRepositoryKnowledge(f), null);
|
|
116
|
+
const recovered = await initializeRepositoryKnowledge(f);
|
|
117
|
+
assert.deepEqual(recovered.catalog, first.catalog);
|
|
118
|
+
assert.equal(recovered.disposition, 'initialized');
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
test('ignores but never deletes an interrupted private staging file', async (t) => {
|
|
122
|
+
const f = await fixture(t);
|
|
123
|
+
const path = `${root}/.knowledge-init-00000000-0000-4000-8000-000000000000.tmp`;
|
|
124
|
+
await f.put(path, 'incomplete private staging');
|
|
125
|
+
await initializeRepositoryKnowledge(f);
|
|
126
|
+
assert.equal(await readFile(resolve(f.workspace, path), 'utf8'), 'incomplete private staging');
|
|
127
|
+
});
|
|
128
|
+
test('fails closed on a corrupt or foreign initialization record without publishing a catalog', async (t) => {
|
|
129
|
+
const f = await fixture(t);
|
|
130
|
+
const { catalog } = await initializeRepositoryKnowledge({ ...f, dryRun: true });
|
|
131
|
+
for (const bytes of ['{', canonical(rehash({ ...catalog, organizationId: 'org_other' }))]) {
|
|
132
|
+
await f.put(REPOSITORY_KNOWLEDGE_INIT_PATH, bytes);
|
|
133
|
+
await assert.rejects(initializeRepositoryKnowledge(f), /invalid|identity|scope/i);
|
|
134
|
+
await assert.rejects(readRepositoryKnowledge(f), /invalid|identity|scope/i);
|
|
135
|
+
await assert.rejects(readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH)), { code: 'ENOENT' });
|
|
136
|
+
assert.equal(await readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_INIT_PATH), 'utf8'), bytes);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
test('rejects other organization and repository identities, including valid rehashed foreign scopes', async (t) => {
|
|
140
|
+
const f = await fixture(t);
|
|
141
|
+
const result = await initializeRepositoryKnowledge(f);
|
|
142
|
+
for (const input of [{ ...f, organizationId: 'org_other' }, { ...f, repositoryAgentId: 'another-agent' }]) {
|
|
143
|
+
await assert.rejects(initializeRepositoryKnowledge(input), /identity|scope/i);
|
|
144
|
+
await assert.rejects(readRepositoryKnowledge(input), /identity|scope/i);
|
|
145
|
+
}
|
|
146
|
+
const foreign = rehash({ ...result.catalog, repoAtlas: { ...result.catalog.repoAtlas, repositoryAgentId: 'another-agent' } });
|
|
147
|
+
assert.throws(() => validateRepositoryKnowledgeCatalog(foreign, f), /identity|scope/i);
|
|
148
|
+
});
|
|
149
|
+
test('rejects unmanaged skill roots, knowledge directories, and pre-existing catalogs without overwriting', async (t) => {
|
|
150
|
+
for (const variant of ['marker', 'empty', 'file']) {
|
|
151
|
+
const f = await fixture(t);
|
|
152
|
+
if (variant === 'marker')
|
|
153
|
+
await unlink(resolve(f.workspace, `${root}/.dharma-agent-fabric.json`));
|
|
154
|
+
if (variant === 'empty')
|
|
155
|
+
await mkdir(resolve(f.workspace, `${root}/knowledge`));
|
|
156
|
+
if (variant === 'file')
|
|
157
|
+
await f.put(REPOSITORY_KNOWLEDGE_CATALOG_PATH, '{"customerOwned":true}');
|
|
158
|
+
await assert.rejects(initializeRepositoryKnowledge(f), /unmanaged|invalid/i);
|
|
159
|
+
await assert.rejects(readRepositoryKnowledge(f), /unmanaged|invalid/i);
|
|
160
|
+
if (variant === 'file')
|
|
161
|
+
assert.equal(await readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH), 'utf8'), '{"customerOwned":true}');
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
test('does not adopt unmanaged files during initialization recovery', async (t) => {
|
|
165
|
+
const f = await fixture(t);
|
|
166
|
+
await initializeRepositoryKnowledge(f);
|
|
167
|
+
await unlink(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH));
|
|
168
|
+
await f.put(`${root}/knowledge/customer.md`, 'customer content');
|
|
169
|
+
await assert.rejects(initializeRepositoryKnowledge(f), /unmanaged/i);
|
|
170
|
+
assert.equal(await readFile(resolve(f.workspace, `${root}/knowledge/customer.md`), 'utf8'), 'customer content');
|
|
171
|
+
});
|
|
172
|
+
test('rejects static symlinks at every managed boundary and the workspace itself', async (t) => {
|
|
173
|
+
for (const path of ['.agents', `${root}/knowledge`, REPOSITORY_KNOWLEDGE_CATALOG_PATH,
|
|
174
|
+
REPOSITORY_KNOWLEDGE_INIT_PATH, `${root}/.dharma-agent-fabric.json`]) {
|
|
175
|
+
const f = await fixture(t);
|
|
176
|
+
const outside = await fixture(t);
|
|
177
|
+
const target = resolve(f.workspace, path);
|
|
178
|
+
await mkdir(dirname(target), { recursive: true });
|
|
179
|
+
await rm(target, { recursive: true, force: true });
|
|
180
|
+
const isFile = path.endsWith('.json');
|
|
181
|
+
await symlink(isFile ? resolve(outside.workspace, `${root}/.dharma-agent-fabric.json`) : outside.workspace, target, isFile ? 'file' : process.platform === 'win32' ? 'junction' : 'dir');
|
|
182
|
+
await assert.rejects(initializeRepositoryKnowledge(f), /symlink/i);
|
|
183
|
+
await assert.rejects(readRepositoryKnowledge(f), /symlink/i);
|
|
184
|
+
}
|
|
185
|
+
const f = await fixture(t);
|
|
186
|
+
const alias = `${f.workspace}-alias`;
|
|
187
|
+
t.after(() => rm(alias, { force: true }));
|
|
188
|
+
await symlink(f.workspace, alias, process.platform === 'win32' ? 'junction' : 'dir');
|
|
189
|
+
await assert.rejects(initializeRepositoryKnowledge({ ...f, workspace: alias }), /symlink/i);
|
|
190
|
+
});
|
|
191
|
+
test('fails closed on corrupt, oversized, forged provenance and invalid integrity catalogs', async (t) => {
|
|
192
|
+
const f = await fixture(t);
|
|
193
|
+
const result = await initializeRepositoryKnowledge(f);
|
|
194
|
+
for (const bytes of ['{', 'x'.repeat(1_048_577), canonical({ ...result.catalog, catalogHash: `sha256:${'0'.repeat(64)}` }),
|
|
195
|
+
canonical(rehash({ ...result.catalog, provenance: { ...result.catalog.provenance, authority: 'signed' } }))]) {
|
|
196
|
+
await writeFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH), bytes);
|
|
197
|
+
await assert.rejects(readRepositoryKnowledge(f), /invalid|limit|integrity/i);
|
|
198
|
+
await assert.rejects(initializeRepositoryKnowledge(f), /invalid|limit|integrity/i);
|
|
199
|
+
assert.equal(await readFile(resolve(f.workspace, REPOSITORY_KNOWLEDGE_CATALOG_PATH), 'utf8'), bytes);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
test('rejects unsafe POSIX/Windows concept paths, environment/secret references and invalid shared identities', async (t) => {
|
|
203
|
+
const f = await fixture(t);
|
|
204
|
+
const { catalog } = await initializeRepositoryKnowledge(f);
|
|
205
|
+
for (const relativePath of ['../secret.md', '/etc/passwd', 'C:\\private\\file.md', '\\\\host\\share\\file.md',
|
|
206
|
+
'concepts/../escape.md', 'concepts/.env', 'concepts/secrets.md', 'concepts/credentials.json',
|
|
207
|
+
'concepts/CON.md', 'concepts/readme.md:stream', 'concepts/guide./file.md']) {
|
|
208
|
+
const value = rehash({ ...catalog, concepts: [{ conceptId: 'concept_safe', relativePath, sha256: `sha256:${'a'.repeat(64)}` }] });
|
|
209
|
+
assert.throws(() => validateRepositoryKnowledgeCatalog(value, f), /invalid|unsafe/i);
|
|
210
|
+
}
|
|
211
|
+
for (const repositoryAgentId of ['../repo', 'C:\\repo', 'repo/child', 'repo:stream', ' repo', '', undefined, null]) {
|
|
212
|
+
await assert.rejects(initializeRepositoryKnowledge({ ...f, repositoryAgentId: repositoryAgentId }), /identity/i);
|
|
213
|
+
}
|
|
214
|
+
const injected = rehash({ ...catalog, password: 'never-retain-this-secret' });
|
|
215
|
+
assert.throws(() => validateRepositoryKnowledgeCatalog(injected, f), /invalid/i);
|
|
216
|
+
});
|
|
217
|
+
test('JSON schema and runtime validator agree on catalog structure and unsigned provenance', async (t) => {
|
|
218
|
+
const f = await fixture(t);
|
|
219
|
+
const { catalog } = await initializeRepositoryKnowledge(f);
|
|
220
|
+
const require = createRequire(import.meta.url);
|
|
221
|
+
const Ajv2020 = require('ajv/dist/2020.js').default;
|
|
222
|
+
const addFormats = require('ajv-formats').default;
|
|
223
|
+
const schema = JSON.parse(await readFile(new URL('../../../schemas/repository-knowledge.schema.json', import.meta.url), 'utf8'));
|
|
224
|
+
const ajv = new Ajv2020({ strict: true });
|
|
225
|
+
addFormats(ajv);
|
|
226
|
+
const validate = ajv.compile(schema);
|
|
227
|
+
assert.equal(validate(catalog), true, JSON.stringify(validate.errors));
|
|
228
|
+
for (const invalid of [{ ...catalog, workspaceId: 'not-shared' },
|
|
229
|
+
{ ...catalog, initializedAt: '2026-02-31T00:00:00.000Z' },
|
|
230
|
+
{ ...catalog, provenance: { ...catalog.provenance, serverReleaseId: 'invented-server-release' } },
|
|
231
|
+
{ ...catalog, concepts: [{ conceptId: 'concept_bad', relativePath: '../secret.md', sha256: 'invalid' }] }]) {
|
|
232
|
+
assert.equal(validate(invalid), false);
|
|
233
|
+
assert.throws(() => validateRepositoryKnowledgeCatalog(invalid, f));
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
test('rejects duplicate concept identities and Windows case-colliding paths without rewriting', async (t) => {
|
|
237
|
+
const f = await fixture(t);
|
|
238
|
+
const { catalog } = await initializeRepositoryKnowledge(f);
|
|
239
|
+
const concept = { conceptId: 'concept_review', relativePath: 'concepts/Review.md', sha256: `sha256:${'a'.repeat(64)}` };
|
|
240
|
+
for (const second of [{ ...concept, relativePath: 'concepts/Other.md' },
|
|
241
|
+
{ ...concept, conceptId: 'concept_other', relativePath: 'concepts/review.md' }]) {
|
|
242
|
+
assert.throws(() => validateRepositoryKnowledgeCatalog(rehash({ ...catalog, concepts: [concept, second] }), f), /invalid|unsafe/i);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=repositoryKnowledge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryKnowledge.test.js","sourceRoot":"","sources":["../src/repositoryKnowledge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryKnowledgeRetention.test.d.ts","sourceRoot":"","sources":["../src/repositoryKnowledgeRetention.test.ts"],"names":[],"mappings":""}
|