@dharma-ai-labs/agent-fabric 0.2.94 → 0.2.95
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/demoPackage.d.ts.map +1 -1
- package/dist/demoPackage.js +2 -1
- package/dist/demoPackage.js.map +1 -1
- package/dist/demoPackage.test.js +11 -0
- package/dist/demoPackage.test.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +81 -13
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +2 -2
- package/dist/repositoryCandidateSync.d.ts +2 -0
- package/dist/repositoryCandidateSync.d.ts.map +1 -1
- package/dist/repositoryCandidateSync.js +12 -2
- package/dist/repositoryCandidateSync.js.map +1 -1
- package/dist/repositoryCandidateSync.test.js +27 -0
- package/dist/repositoryCandidateSync.test.js.map +1 -1
- package/dist/repositoryPackage.d.ts +5 -0
- package/dist/repositoryPackage.d.ts.map +1 -1
- package/dist/repositoryPackage.js +19 -1
- package/dist/repositoryPackage.js.map +1 -1
- package/dist/repositorySourceInventoryClient.d.ts +15 -0
- package/dist/repositorySourceInventoryClient.d.ts.map +1 -0
- package/dist/repositorySourceInventoryClient.js +106 -0
- package/dist/repositorySourceInventoryClient.js.map +1 -0
- package/dist/repositorySourceReconciliation.d.ts +16 -0
- package/dist/repositorySourceReconciliation.d.ts.map +1 -0
- package/dist/repositorySourceReconciliation.js +69 -0
- package/dist/repositorySourceReconciliation.js.map +1 -0
- package/dist/repositorySourceReconciliation.test.d.ts +2 -0
- package/dist/repositorySourceReconciliation.test.d.ts.map +1 -0
- package/dist/repositorySourceReconciliation.test.js +153 -0
- package/dist/repositorySourceReconciliation.test.js.map +1 -0
- package/dist/repositorySourceSync.d.ts +34 -1
- package/dist/repositorySourceSync.d.ts.map +1 -1
- package/dist/repositorySourceSync.js +41 -5
- package/dist/repositorySourceSync.js.map +1 -1
- package/dist/repositorySourceSync.test.js +73 -2
- package/dist/repositorySourceSync.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
3
|
+
import { repositorySourcePathAllowed, repositorySourcePathSafe } from './repositorySourceAuthorization.js';
|
|
4
|
+
const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
|
|
5
|
+
const HASH = /^sha256:[a-f0-9]{64}$/;
|
|
6
|
+
const digest = (value) => `sha256:${createHash('sha256').update(value).digest('hex')}`;
|
|
7
|
+
function record(value, label) {
|
|
8
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
9
|
+
throw new Error(`Repository source ${label} is invalid.`);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function checkedInventory(value, scope, authorization) {
|
|
13
|
+
const row = record(value, 'inventory');
|
|
14
|
+
if (!UUID.test(String(row.candidateId)) || !UUID.test(String(row.workspaceId))
|
|
15
|
+
|| !HASH.test(String(row.sourceSnapshotHash)) || !HASH.test(String(row.sourceManifestHash))
|
|
16
|
+
|| !HASH.test(String(row.sourceFingerprint)) || !Array.isArray(row.files)
|
|
17
|
+
|| !Array.isArray(row.skills) || row.files.length > 512 || row.skills.length > 512) {
|
|
18
|
+
throw new Error('Repository source inventory fields are invalid.');
|
|
19
|
+
}
|
|
20
|
+
const files = [];
|
|
21
|
+
const paths = new Set();
|
|
22
|
+
for (const raw of row.files) {
|
|
23
|
+
const file = record(raw, 'file');
|
|
24
|
+
if (typeof file.path !== 'string' || !repositorySourcePathSafe(file.path)
|
|
25
|
+
|| typeof file.sha256 !== 'string' || !HASH.test(file.sha256)
|
|
26
|
+
|| !Number.isSafeInteger(file.sizeBytes) || Number(file.sizeBytes) < 0
|
|
27
|
+
|| Number(file.sizeBytes) > authorization.policy.maximumFileBytes
|
|
28
|
+
|| !['skill', 'dependency', 'approved_output', 'repository_content'].includes(String(file.role))
|
|
29
|
+
|| (file.managedPath !== undefined && typeof file.managedPath !== 'string')
|
|
30
|
+
|| paths.has(file.path.toLowerCase()))
|
|
31
|
+
throw new Error('Repository source file metadata is invalid.');
|
|
32
|
+
const contentClass = file.role === 'approved_output' ? 'approved_outputs'
|
|
33
|
+
: file.role === 'repository_content' ? 'repository_content' : 'repository_skills';
|
|
34
|
+
if (!repositorySourcePathAllowed(authorization, file.path, contentClass)
|
|
35
|
+
&& !(file.role === 'dependency' && (repositorySourcePathAllowed(authorization, file.path, 'repository_content')
|
|
36
|
+
|| repositorySourcePathAllowed(authorization, file.path, 'approved_outputs')))) {
|
|
37
|
+
throw new Error('Repository source file exceeds current policy.');
|
|
38
|
+
}
|
|
39
|
+
paths.add(file.path.toLowerCase());
|
|
40
|
+
files.push(file);
|
|
41
|
+
}
|
|
42
|
+
const skills = row.skills;
|
|
43
|
+
if (skills.some(skill => !skill || typeof skill !== 'object' || Array.isArray(skill)
|
|
44
|
+
|| typeof skill.path !== 'string' || !repositorySourcePathSafe(skill.path)
|
|
45
|
+
|| !Array.isArray(skill.filePaths) || skill.filePaths.length > 512)) {
|
|
46
|
+
throw new Error('Repository source skill metadata is invalid.');
|
|
47
|
+
}
|
|
48
|
+
const fingerprint = digest(canonicalize({ organizationId: scope.organizationId,
|
|
49
|
+
repositoryBindingId: scope.repositoryBindingId, repositoryAgentId: scope.repositoryAgentId,
|
|
50
|
+
generationId: authorization.generationId, policyHash: authorization.policyHash, files, skills }));
|
|
51
|
+
if (fingerprint !== row.sourceFingerprint)
|
|
52
|
+
throw new Error('Repository source fingerprint integrity failed.');
|
|
53
|
+
return { candidateId: String(row.candidateId), workspaceId: String(row.workspaceId),
|
|
54
|
+
sourceSnapshotHash: String(row.sourceSnapshotHash), sourceFingerprint: fingerprint,
|
|
55
|
+
files, skills };
|
|
56
|
+
}
|
|
57
|
+
export async function fetchPublishedRepositorySource(input) {
|
|
58
|
+
const { transport, scope, authorization, local } = input;
|
|
59
|
+
const route = `/agent-fabric/repository-agents/${encodeURIComponent(scope.repositoryAgentId)}/source-inventory`;
|
|
60
|
+
const response = record(await transport.signedGet(`${route}?workspaceId=${encodeURIComponent(scope.workspaceId)}`), 'response');
|
|
61
|
+
if (response.ok !== true || response.organizationId !== scope.organizationId
|
|
62
|
+
|| response.repositoryBindingId !== scope.repositoryBindingId
|
|
63
|
+
|| response.repositoryAgentId !== scope.repositoryAgentId
|
|
64
|
+
|| response.policyGenerationId !== authorization.generationId) {
|
|
65
|
+
throw new Error('Repository source inventory authority does not match this device.');
|
|
66
|
+
}
|
|
67
|
+
if (response.source === null)
|
|
68
|
+
return null;
|
|
69
|
+
const source = checkedInventory(response.source, scope, authorization);
|
|
70
|
+
if (response.workspaceBaseline !== null && response.workspaceBaseline !== undefined) {
|
|
71
|
+
const baseline = checkedInventory(response.workspaceBaseline, scope, authorization);
|
|
72
|
+
if (baseline.workspaceId !== scope.workspaceId || baseline.candidateId === source.candidateId) {
|
|
73
|
+
throw new Error('Repository source workspace baseline is not bound to this device.');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const localHashes = new Set(local.blobs.map(blob => blob.sha256));
|
|
77
|
+
const wanted = new Map(source.files.filter(file => !localHashes.has(file.sha256)).map(file => [file.sha256, file]));
|
|
78
|
+
const pending = [...wanted.values()];
|
|
79
|
+
const fetched = [];
|
|
80
|
+
for (let offset = 0; offset < pending.length; offset += 8) {
|
|
81
|
+
const batch = await Promise.all(pending.slice(offset, offset + 8).map(async (file) => {
|
|
82
|
+
const query = new URLSearchParams({ workspaceId: scope.workspaceId, path: file.path });
|
|
83
|
+
const raw = await transport.signedGet(`${route}/${source.candidateId}/blobs/${encodeURIComponent(file.sha256)}?${query}`);
|
|
84
|
+
const body = record(raw, 'blob response');
|
|
85
|
+
if (body.ok !== true || body.organizationId !== scope.organizationId
|
|
86
|
+
|| body.repositoryBindingId !== scope.repositoryBindingId
|
|
87
|
+
|| body.repositoryAgentId !== scope.repositoryAgentId
|
|
88
|
+
|| body.candidateId !== source.candidateId
|
|
89
|
+
|| body.sourceSnapshotHash !== source.sourceSnapshotHash
|
|
90
|
+
|| body.sourceFingerprint !== source.sourceFingerprint
|
|
91
|
+
|| body.path !== file.path || body.sha256 !== file.sha256 || body.role !== file.role
|
|
92
|
+
|| body.sizeBytes !== file.sizeBytes || typeof body.contentBase64 !== 'string') {
|
|
93
|
+
throw new Error('Repository source blob response does not match the published inventory.');
|
|
94
|
+
}
|
|
95
|
+
const bytes = Buffer.from(body.contentBase64, 'base64');
|
|
96
|
+
if (bytes.toString('base64') !== body.contentBase64 || bytes.length !== file.sizeBytes
|
|
97
|
+
|| digest(bytes) !== file.sha256)
|
|
98
|
+
throw new Error('Repository source blob integrity failed.');
|
|
99
|
+
return { sha256: file.sha256, contentBase64: body.contentBase64 };
|
|
100
|
+
}));
|
|
101
|
+
fetched.push(...batch);
|
|
102
|
+
}
|
|
103
|
+
return { files: source.files, skills: source.skills, blobs: fetched,
|
|
104
|
+
sourceFingerprint: source.sourceFingerprint };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=repositorySourceInventoryClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositorySourceInventoryClient.js","sourceRoot":"","sources":["../src/repositorySourceInventoryClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RepositoryPackageFile, type RepositoryPackageManifest, type RepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
2
|
+
type Skill = RepositoryPackageManifest['skills'][number];
|
|
3
|
+
type Blob = RepositoryPackageSnapshot['blobs'][number];
|
|
4
|
+
export interface PublishedRepositorySource {
|
|
5
|
+
files: RepositoryPackageFile[];
|
|
6
|
+
skills: Skill[];
|
|
7
|
+
blobs: Blob[];
|
|
8
|
+
sourceFingerprint: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function reconcileRepositorySourceSnapshot(input: {
|
|
11
|
+
local: RepositoryPackageSnapshot;
|
|
12
|
+
previousLocal: RepositoryPackageSnapshot | null;
|
|
13
|
+
published: PublishedRepositorySource | null;
|
|
14
|
+
}): RepositoryPackageSnapshot;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=repositorySourceReconciliation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositorySourceReconciliation.d.ts","sourceRoot":"","sources":["../src/repositorySourceReconciliation.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAC1D,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,KAAK,KAAK,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,KAAK,IAAI,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAsCD,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,KAAK,EAAE,yBAAyB,CAAC;IACjC,aAAa,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAChD,SAAS,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC7C,GAAG,yBAAyB,CA6B5B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
2
|
+
import { rebuildRepositoryPackageSnapshot, serializeRepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
3
|
+
function indexed(entries, label) {
|
|
4
|
+
const result = new Map();
|
|
5
|
+
for (const entry of entries) {
|
|
6
|
+
const key = entry.path.toLowerCase();
|
|
7
|
+
if (result.has(key))
|
|
8
|
+
throw new Error(`Repository source ${label} contains a conflicting path.`);
|
|
9
|
+
result.set(key, entry);
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
function same(left, right) {
|
|
14
|
+
return canonicalize(left) === canonicalize(right);
|
|
15
|
+
}
|
|
16
|
+
function reconcileEntries(label, local, previousLocal, published) {
|
|
17
|
+
const localByPath = indexed(local, `${label} local inventory`);
|
|
18
|
+
const baseByPath = indexed(previousLocal, `${label} published local baseline`);
|
|
19
|
+
const publishedByPath = indexed(published, `${label} published inventory`);
|
|
20
|
+
const paths = new Set([...localByPath.keys(), ...baseByPath.keys(), ...publishedByPath.keys()]);
|
|
21
|
+
const result = [];
|
|
22
|
+
for (const path of [...paths].sort()) {
|
|
23
|
+
const current = localByPath.get(path);
|
|
24
|
+
const base = baseByPath.get(path);
|
|
25
|
+
const remote = publishedByPath.get(path);
|
|
26
|
+
const localChanged = !same(current ?? null, base ?? null);
|
|
27
|
+
const remoteChanged = !same(remote ?? null, base ?? null);
|
|
28
|
+
if (localChanged && remoteChanged && !same(current ?? null, remote ?? null)) {
|
|
29
|
+
throw new Error(`Repository source ${label} changed concurrently at ${path}.`);
|
|
30
|
+
}
|
|
31
|
+
const chosen = localChanged ? current : remote;
|
|
32
|
+
if (chosen)
|
|
33
|
+
result.push(chosen);
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
export function reconcileRepositorySourceSnapshot(input) {
|
|
38
|
+
serializeRepositoryPackageSnapshot(input.local);
|
|
39
|
+
if (input.previousLocal) {
|
|
40
|
+
serializeRepositoryPackageSnapshot(input.previousLocal);
|
|
41
|
+
const prior = input.previousLocal.manifest;
|
|
42
|
+
const current = input.local.manifest;
|
|
43
|
+
if (prior.organizationId !== current.organizationId || prior.workspaceId !== current.workspaceId
|
|
44
|
+
|| prior.sourceAuthorization?.repositoryBindingId !== current.sourceAuthorization?.repositoryBindingId
|
|
45
|
+
|| prior.sourceAuthorization?.repositoryAgentId !== current.sourceAuthorization?.repositoryAgentId
|
|
46
|
+
|| prior.sourceAuthorization?.generationId !== current.sourceAuthorization?.generationId) {
|
|
47
|
+
throw new Error('Repository source local baseline has a different authority.');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (!input.published)
|
|
51
|
+
return input.local;
|
|
52
|
+
const local = input.local.manifest;
|
|
53
|
+
const prior = input.previousLocal?.manifest;
|
|
54
|
+
const sourceFiles = (manifest) => manifest?.files.filter(file => file.role !== 'knowledge') ?? [];
|
|
55
|
+
const files = reconcileEntries('file', sourceFiles(local), sourceFiles(prior), input.published.files);
|
|
56
|
+
const skills = reconcileEntries('skill', local.skills, prior?.skills ?? [], input.published.skills);
|
|
57
|
+
const allFiles = [...local.files.filter(file => file.role === 'knowledge'), ...files];
|
|
58
|
+
const available = new Map();
|
|
59
|
+
for (const blob of [...input.published.blobs, ...input.local.blobs])
|
|
60
|
+
available.set(blob.sha256, blob);
|
|
61
|
+
const blobs = [...new Set(allFiles.map(file => file.sha256))].map(hash => {
|
|
62
|
+
const blob = available.get(hash);
|
|
63
|
+
if (!blob)
|
|
64
|
+
throw new Error('Repository source reconciliation is missing a content-addressed blob.');
|
|
65
|
+
return blob;
|
|
66
|
+
});
|
|
67
|
+
return rebuildRepositoryPackageSnapshot(input.local, { files: allFiles, skills, blobs });
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=repositorySourceReconciliation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositorySourceReconciliation.js","sourceRoot":"","sources":["../src/repositorySourceReconciliation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositorySourceReconciliation.test.d.ts","sourceRoot":"","sources":["../src/repositorySourceReconciliation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
8
|
+
import { initializeRepositoryKnowledge } from './repositoryKnowledge.js';
|
|
9
|
+
import { inventoryRepositoryPackage, rebuildRepositoryPackageSnapshot, serializeRepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
10
|
+
import { reconcileRepositorySourceSnapshot } from './repositorySourceReconciliation.js';
|
|
11
|
+
import { fetchPublishedRepositorySource } from './repositorySourceInventoryClient.js';
|
|
12
|
+
const organizationId = 'org_reconcile_fixture';
|
|
13
|
+
const workspaceId = '11111111-1111-4111-8111-111111111111';
|
|
14
|
+
const repositoryBindingId = '22222222-2222-4222-8222-222222222222';
|
|
15
|
+
const repositoryAgentId = '33333333-3333-4333-8333-333333333333';
|
|
16
|
+
const generationId = '44444444-4444-4444-8444-444444444444';
|
|
17
|
+
const digest = (value) => `sha256:${createHash('sha256').update(value).digest('hex')}`;
|
|
18
|
+
const policy = {
|
|
19
|
+
action: 'authorize', confirmed: true, requestId: '55555555-5555-4555-8555-555555555555',
|
|
20
|
+
repositoryBindingId, expectedRevision: 0,
|
|
21
|
+
allowedContentClasses: ['approved_outputs', 'repository_content', 'repository_skills'],
|
|
22
|
+
approvedRepositoryPaths: ['README.md'], approvedOutputFolders: ['output/reports'],
|
|
23
|
+
automaticValidatedPublication: true, retentionDays: 30, maximumFileBytes: 262144,
|
|
24
|
+
maximumSnapshotBytes: 4194304, maximumDailyUploadBytes: 8388608, expiresAt: null,
|
|
25
|
+
};
|
|
26
|
+
const authorization = {
|
|
27
|
+
schema: 'dharma.repository-source-authorization/v1', organizationId, workspaceId,
|
|
28
|
+
repositoryBindingId, repositoryAgentId, revision: 1, generationId,
|
|
29
|
+
receiptId: `repo_consent_${generationId}`, policyRevision: `repository-source-${generationId}`,
|
|
30
|
+
policyHash: digest(canonicalize(policy)), confirmedAt: '2026-09-24T00:00:00.000Z', policy,
|
|
31
|
+
};
|
|
32
|
+
function file(path, content) {
|
|
33
|
+
const bytes = Buffer.from(content);
|
|
34
|
+
const sha256 = digest(bytes);
|
|
35
|
+
return { entry: { path, role: path === 'README.md' ? 'repository_content' : 'approved_output',
|
|
36
|
+
sha256, sizeBytes: bytes.length }, blob: { sha256, contentBase64: bytes.toString('base64') } };
|
|
37
|
+
}
|
|
38
|
+
async function fixture(t) {
|
|
39
|
+
const workspace = await mkdtemp(resolve(tmpdir(), 'repository-source-reconcile-'));
|
|
40
|
+
t.after(() => rm(workspace, { recursive: true, force: true }));
|
|
41
|
+
const managedRoot = resolve(workspace, '.agents/skills/dharma-agent-fabric');
|
|
42
|
+
await mkdir(managedRoot, { recursive: true });
|
|
43
|
+
await writeFile(resolve(managedRoot, '.dharma-agent-fabric.json'), JSON.stringify({ managedBy: 'dharma-agent-fabric', workspaceId }));
|
|
44
|
+
await initializeRepositoryKnowledge({ organizationId, repositoryAgentId, workspace });
|
|
45
|
+
await writeFile(resolve(workspace, 'README.md'), '# Shared repository\n');
|
|
46
|
+
const template = await inventoryRepositoryPackage({ organizationId, workspaceId, repositoryBindingId,
|
|
47
|
+
repositoryAgentId, workspace, sourceAuthorization: authorization });
|
|
48
|
+
const snapshot = (...entries) => {
|
|
49
|
+
const knowledge = template.manifest.files.filter(item => item.role === 'knowledge');
|
|
50
|
+
const hashes = new Set(knowledge.map(item => item.sha256));
|
|
51
|
+
const blobs = [...template.blobs.filter(blob => hashes.has(blob.sha256)), ...entries.map(item => item.blob)];
|
|
52
|
+
return rebuildRepositoryPackageSnapshot(template, {
|
|
53
|
+
files: [...knowledge, ...entries.map(item => item.entry)], skills: [],
|
|
54
|
+
blobs: [...new Map(blobs.map(blob => [blob.sha256, blob])).values()],
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
return { snapshot };
|
|
58
|
+
}
|
|
59
|
+
function published(value) {
|
|
60
|
+
const files = value.manifest.files.filter(item => item.role !== 'knowledge');
|
|
61
|
+
const hashes = new Set(files.map(item => item.sha256));
|
|
62
|
+
return { files, skills: value.manifest.skills, blobs: value.blobs.filter(blob => hashes.has(blob.sha256)),
|
|
63
|
+
sourceFingerprint: value.manifest.sourceFingerprint };
|
|
64
|
+
}
|
|
65
|
+
const readme = file('README.md', '# Shared repository\n');
|
|
66
|
+
const localReport = file('output/reports/local.md', '# Local report\n');
|
|
67
|
+
const remoteReport = file('output/reports/remote.md', '# Remote report\n');
|
|
68
|
+
test('reconciles independent approved reports without losing either source', async (t) => {
|
|
69
|
+
const f = await fixture(t);
|
|
70
|
+
const base = f.snapshot(readme);
|
|
71
|
+
const local = f.snapshot(readme, localReport);
|
|
72
|
+
const remote = f.snapshot(readme, remoteReport);
|
|
73
|
+
const merged = reconcileRepositorySourceSnapshot({ local, previousLocal: base, published: published(remote) });
|
|
74
|
+
assert.deepEqual(merged.manifest.files.filter(item => item.role !== 'knowledge').map(item => item.path), ['README.md', 'output/reports/local.md', 'output/reports/remote.md']);
|
|
75
|
+
assert.notEqual(merged.manifest.sourceFingerprint, remote.manifest.sourceFingerprint);
|
|
76
|
+
serializeRepositoryPackageSnapshot(merged);
|
|
77
|
+
});
|
|
78
|
+
test('does not resurrect a locally deleted file when the remote copy is unchanged', async (t) => {
|
|
79
|
+
const f = await fixture(t);
|
|
80
|
+
const base = f.snapshot(readme, localReport);
|
|
81
|
+
const merged = reconcileRepositorySourceSnapshot({ local: f.snapshot(readme),
|
|
82
|
+
previousLocal: base, published: published(base) });
|
|
83
|
+
assert.deepEqual(merged.manifest.files.filter(item => item.role !== 'knowledge').map(item => item.path), ['README.md']);
|
|
84
|
+
});
|
|
85
|
+
test('adopts a remote deletion when this workspace has not changed the file', async (t) => {
|
|
86
|
+
const f = await fixture(t);
|
|
87
|
+
const base = f.snapshot(readme, localReport);
|
|
88
|
+
const merged = reconcileRepositorySourceSnapshot({ local: base, previousLocal: base,
|
|
89
|
+
published: published(f.snapshot(readme)) });
|
|
90
|
+
assert.deepEqual(merged.manifest.files.filter(item => item.role !== 'knowledge').map(item => item.path), ['README.md']);
|
|
91
|
+
});
|
|
92
|
+
test('rejects concurrent conflicting modifications to the same source path', async (t) => {
|
|
93
|
+
const f = await fixture(t);
|
|
94
|
+
const base = f.snapshot(readme);
|
|
95
|
+
const local = f.snapshot(file('README.md', '# Local revision\n'));
|
|
96
|
+
const remote = f.snapshot(file('README.md', '# Remote revision\n'));
|
|
97
|
+
assert.throws(() => reconcileRepositorySourceSnapshot({ local, previousLocal: base,
|
|
98
|
+
published: published(remote) }), /changed concurrently at readme.md/);
|
|
99
|
+
});
|
|
100
|
+
test('fresh workspaces preserve remote-only source and reject conflicting same-path content', async (t) => {
|
|
101
|
+
const f = await fixture(t);
|
|
102
|
+
const local = f.snapshot(readme, localReport);
|
|
103
|
+
const remote = f.snapshot(readme, remoteReport);
|
|
104
|
+
const merged = reconcileRepositorySourceSnapshot({ local, previousLocal: null, published: published(remote) });
|
|
105
|
+
assert.equal(merged.manifest.files.filter(item => item.role !== 'knowledge').length, 3);
|
|
106
|
+
assert.throws(() => reconcileRepositorySourceSnapshot({ local, previousLocal: null,
|
|
107
|
+
published: published(f.snapshot(file('README.md', '# Different repository\n'))) }), /changed concurrently at readme.md/);
|
|
108
|
+
});
|
|
109
|
+
test('rejects missing or corrupted remote blobs through the normal snapshot serializer', async (t) => {
|
|
110
|
+
const f = await fixture(t);
|
|
111
|
+
const local = f.snapshot(readme);
|
|
112
|
+
const remote = f.snapshot(readme, remoteReport);
|
|
113
|
+
assert.throws(() => reconcileRepositorySourceSnapshot({ local, previousLocal: local,
|
|
114
|
+
published: { ...published(remote), blobs: [] } }), /missing a content-addressed blob/);
|
|
115
|
+
assert.throws(() => reconcileRepositorySourceSnapshot({ local, previousLocal: local,
|
|
116
|
+
published: { ...published(remote), blobs: [{ ...remoteReport.blob, contentBase64: 'YmFk' }] } }), /blob integrity failed/);
|
|
117
|
+
});
|
|
118
|
+
test('reads scoped published inventory and verifies a missing remote blob', async (t) => {
|
|
119
|
+
const f = await fixture(t);
|
|
120
|
+
const local = f.snapshot(readme);
|
|
121
|
+
const remote = f.snapshot(readme, remoteReport);
|
|
122
|
+
const candidateId = '66666666-6666-4666-8666-666666666666';
|
|
123
|
+
const remoteFile = remote.manifest.files.find(item => item.path === remoteReport.entry.path);
|
|
124
|
+
const view = { ok: true, organizationId, repositoryBindingId, repositoryAgentId,
|
|
125
|
+
policyGenerationId: generationId, workspaceBaseline: null,
|
|
126
|
+
source: { candidateId, workspaceId: '77777777-7777-4777-8777-777777777777',
|
|
127
|
+
sourceSnapshotHash: remote.manifest.snapshotHash,
|
|
128
|
+
sourceManifestHash: digest(canonicalize(remote.manifest)),
|
|
129
|
+
sourceFingerprint: remote.manifest.sourceFingerprint,
|
|
130
|
+
files: published(remote).files, skills: remote.manifest.skills } };
|
|
131
|
+
const requests = [];
|
|
132
|
+
const transport = { signedGet: async (route) => {
|
|
133
|
+
requests.push(route);
|
|
134
|
+
if (!route.includes('/blobs/'))
|
|
135
|
+
return view;
|
|
136
|
+
return { ok: true, organizationId, repositoryBindingId, repositoryAgentId,
|
|
137
|
+
candidateId, sourceSnapshotHash: remote.manifest.snapshotHash,
|
|
138
|
+
sourceFingerprint: remote.manifest.sourceFingerprint, path: remoteFile.path,
|
|
139
|
+
role: remoteFile.role, sha256: remoteFile.sha256, sizeBytes: remoteFile.sizeBytes,
|
|
140
|
+
contentBase64: remoteReport.blob.contentBase64 };
|
|
141
|
+
} };
|
|
142
|
+
const scope = { organizationId, workspaceId, repositoryBindingId, repositoryAgentId };
|
|
143
|
+
const fetched = await fetchPublishedRepositorySource({ transport, scope, authorization, local });
|
|
144
|
+
assert.equal(fetched?.blobs.length, 1);
|
|
145
|
+
assert.equal(fetched?.blobs[0]?.sha256, remoteReport.blob.sha256);
|
|
146
|
+
assert.equal(requests.length, 2);
|
|
147
|
+
const merged = reconcileRepositorySourceSnapshot({ local, previousLocal: local, published: fetched });
|
|
148
|
+
assert.deepEqual(merged.manifest.files.filter(item => item.role !== 'knowledge').map(item => item.path), ['README.md', 'output/reports/remote.md']);
|
|
149
|
+
await assert.rejects(fetchPublishedRepositorySource({ transport: { signedGet: async () => ({ ...view, organizationId: 'org_foreign' }) }, scope, authorization, local }), /authority/);
|
|
150
|
+
await assert.rejects(fetchPublishedRepositorySource({ transport: { signedGet: async (route) => route.includes('/blobs/') ? { ...(await transport.signedGet(route)), contentBase64: 'YmFk' }
|
|
151
|
+
: view }, scope, authorization, local }), /blob integrity/);
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=repositorySourceReconciliation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositorySourceReconciliation.test.js","sourceRoot":"","sources":["../src/repositorySourceReconciliation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,20 @@ export type BoundRepositorySource = RepositorySourceScope & {
|
|
|
7
7
|
repositoryBindingId: string;
|
|
8
8
|
repositoryAgentId: string;
|
|
9
9
|
};
|
|
10
|
+
export declare function advanceRepositorySourceBaseline(record: {
|
|
11
|
+
localBaselineSnapshotHash?: string | null;
|
|
12
|
+
publishedLocalSnapshotHash?: string | null;
|
|
13
|
+
pendingLocalSnapshotHash?: string | null;
|
|
14
|
+
pendingLocalOperationId?: string | null;
|
|
15
|
+
}, receipt: {
|
|
16
|
+
state: string;
|
|
17
|
+
operationId: string;
|
|
18
|
+
}): {
|
|
19
|
+
localBaselineSnapshotHash: string | null;
|
|
20
|
+
publishedLocalSnapshotHash: string | null;
|
|
21
|
+
pendingLocalSnapshotHash: string | null;
|
|
22
|
+
pendingLocalOperationId: string | null;
|
|
23
|
+
};
|
|
10
24
|
export declare function fetchRepositorySourceAuthorization(transport: SourceTransport, scope: BoundRepositorySource): Promise<import("./repositorySourceAuthorization.js").RepositorySourceAuthorization>;
|
|
11
25
|
export declare class RepositorySourceWatcher {
|
|
12
26
|
#private;
|
|
@@ -47,7 +61,8 @@ export declare function scanRepositorySourceChanges(input: BoundRepositorySource
|
|
|
47
61
|
catalogBytes: Buffer;
|
|
48
62
|
manifestBytes: Buffer;
|
|
49
63
|
} | null>;
|
|
50
|
-
|
|
64
|
+
loadPublishedLocalBaseline?: () => Promise<RepositoryPackageSnapshot | null>;
|
|
65
|
+
submitCandidate?: (snapshot: RepositoryPackageSnapshot, expectedLatestSourceFingerprint?: string) => Promise<Record<string, unknown>>;
|
|
51
66
|
}): Promise<{
|
|
52
67
|
state: "unchanged" | "debouncing";
|
|
53
68
|
localMutation: boolean;
|
|
@@ -56,6 +71,23 @@ export declare function scanRepositorySourceChanges(input: BoundRepositorySource
|
|
|
56
71
|
fingerprint?: undefined;
|
|
57
72
|
persisted?: undefined;
|
|
58
73
|
candidate?: undefined;
|
|
74
|
+
submittedManifestHash?: undefined;
|
|
75
|
+
} | {
|
|
76
|
+
state: "source_already_published";
|
|
77
|
+
localMutation: boolean;
|
|
78
|
+
sharedAuthority: "verified_existing";
|
|
79
|
+
snapshotId: string;
|
|
80
|
+
fingerprint: string;
|
|
81
|
+
persisted: {
|
|
82
|
+
manifestPath: string;
|
|
83
|
+
snapshotPath: string;
|
|
84
|
+
snapshotHash: string;
|
|
85
|
+
managedCopiesPath: string | null;
|
|
86
|
+
disposition: "candidate_only" | "local_bootstrap_inventory";
|
|
87
|
+
authority: "local_inventory_not_signed";
|
|
88
|
+
};
|
|
89
|
+
candidate: null;
|
|
90
|
+
submittedManifestHash?: undefined;
|
|
59
91
|
} | {
|
|
60
92
|
state: "local_candidate_collected";
|
|
61
93
|
localMutation: boolean;
|
|
@@ -71,6 +103,7 @@ export declare function scanRepositorySourceChanges(input: BoundRepositorySource
|
|
|
71
103
|
authority: "local_inventory_not_signed";
|
|
72
104
|
};
|
|
73
105
|
candidate: Record<string, unknown> | null;
|
|
106
|
+
submittedManifestHash: string;
|
|
74
107
|
}>;
|
|
75
108
|
export {};
|
|
76
109
|
//# sourceMappingURL=repositorySourceSync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositorySourceSync.d.ts","sourceRoot":"","sources":["../src/repositorySourceSync.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8E,KAAK,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC5J,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"repositorySourceSync.d.ts","sourceRoot":"","sources":["../src/repositorySourceSync.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8E,KAAK,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC5J,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAIxE,KAAK,eAAe,GAAG;IAAE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAAC;AACtF,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,GAAG;IAC1D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;;;;;EAejD;AAID,wBAAsB,kCAAkC,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,qBAAqB,uFAOhH;AAID,qBAAa,uBAAuB;;IAIlC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAChB,UAAU,SAAQ;IAI9B,IAAI,CAAC,WAAW,EAAE,MAAM;IAMxB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ;IAahF,QAAQ,CAAC,WAAW,EAAE,MAAM;IAM5B,UAAU;CACX;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,GAAG;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,uBAAuB,CAAC;CAClC,iBAUA;AAED,qBAAa,4BAA4B;;IAEvC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE;QAAE,SAAS,EAAE,8BAA8B,CAAA;KAAE,GAClF;QAAE,SAAS,EAAE,oCAAoC,CAAC;QAAC,YAAY,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,SAAS,EAChI,SAAS,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,OAAO;CAW5E;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,GAAG;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,uBAAuB,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC9F,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAC7E,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,yBAAyB,EACpD,+BAA+B,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDA"}
|
|
@@ -2,6 +2,24 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
3
3
|
import { inventoryRepositoryPackage, readRepositoryPackageSnapshot, readRepositorySourceBaselineSnapshot, writeRepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
4
4
|
import { parseRepositorySourcePolicyResponse, validateRepositorySourceAuthorization } from './repositorySourceAuthorization.js';
|
|
5
|
+
import { fetchPublishedRepositorySource } from './repositorySourceInventoryClient.js';
|
|
6
|
+
import { reconcileRepositorySourceSnapshot } from './repositorySourceReconciliation.js';
|
|
7
|
+
export function advanceRepositorySourceBaseline(record, receipt) {
|
|
8
|
+
if (record.pendingLocalOperationId && record.pendingLocalOperationId !== receipt.operationId) {
|
|
9
|
+
throw new Error('Repository source candidate receipt does not match the pending operation.');
|
|
10
|
+
}
|
|
11
|
+
const matchesPending = record.pendingLocalOperationId === receipt.operationId;
|
|
12
|
+
const terminal = receipt.state === 'published' || receipt.state === 'blocked';
|
|
13
|
+
const publishedLocalSnapshotHash = receipt.state === 'published' && matchesPending
|
|
14
|
+
? record.pendingLocalSnapshotHash ?? null : record.publishedLocalSnapshotHash ?? null;
|
|
15
|
+
return {
|
|
16
|
+
localBaselineSnapshotHash: receipt.state === 'blocked' && matchesPending
|
|
17
|
+
? publishedLocalSnapshotHash : record.localBaselineSnapshotHash ?? null,
|
|
18
|
+
publishedLocalSnapshotHash,
|
|
19
|
+
pendingLocalSnapshotHash: terminal ? null : record.pendingLocalSnapshotHash ?? null,
|
|
20
|
+
pendingLocalOperationId: terminal ? null : record.pendingLocalOperationId ?? null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
5
23
|
const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$(?![\s\S])/i;
|
|
6
24
|
const HASH = /^sha256:[a-f0-9]{64}$(?![\s\S])/;
|
|
7
25
|
export async function fetchRepositorySourceAuthorization(transport, scope) {
|
|
@@ -92,8 +110,8 @@ export async function scanRepositorySourceChanges(input) {
|
|
|
92
110
|
throw new Error('Verified repository knowledge byte limit exceeded.');
|
|
93
111
|
}
|
|
94
112
|
const retainedKnowledge = observed ? { catalogBytes: Buffer.from(observed.catalogBytes), manifestBytes: Buffer.from(observed.manifestBytes) } : null;
|
|
95
|
-
const
|
|
96
|
-
const fingerprint =
|
|
113
|
+
const local = await inventoryRepositoryPackage({ ...input, retainedKnowledge, sourceAuthorization: authorization });
|
|
114
|
+
const fingerprint = local.manifest.sourceFingerprint;
|
|
97
115
|
if (!fingerprint)
|
|
98
116
|
throw new Error('Governed repository source scan returned no fingerprint.');
|
|
99
117
|
const state = input.watcher.observe(fingerprint, (input.monotonicNow || (() => performance.now()))());
|
|
@@ -110,11 +128,29 @@ export async function scanRepositorySourceChanges(input) {
|
|
|
110
128
|
throw new Error('Verified repository knowledge release changed during collection.');
|
|
111
129
|
}
|
|
112
130
|
}
|
|
113
|
-
const
|
|
114
|
-
|
|
131
|
+
const published = input.loadPublishedLocalBaseline
|
|
132
|
+
? await fetchPublishedRepositorySource({ transport: input.transport, scope: input,
|
|
133
|
+
authorization, local }) : null;
|
|
134
|
+
const snapshot = input.loadPublishedLocalBaseline
|
|
135
|
+
? reconcileRepositorySourceSnapshot({ local,
|
|
136
|
+
previousLocal: await input.loadPublishedLocalBaseline(), published }) : local;
|
|
137
|
+
const persisted = await writeRepositoryPackageSnapshot({ workspace: input.workspace, snapshot: local,
|
|
138
|
+
candidateOnly: true });
|
|
139
|
+
if (published && snapshot.manifest.sourceFingerprint === published.sourceFingerprint) {
|
|
140
|
+
input.watcher.complete(fingerprint);
|
|
141
|
+
return { state: 'source_already_published', localMutation: true,
|
|
142
|
+
sharedAuthority: 'verified_existing', snapshotId: snapshot.manifest.snapshotId,
|
|
143
|
+
fingerprint, persisted, candidate: null };
|
|
144
|
+
}
|
|
145
|
+
if (snapshot.manifest.snapshotHash !== local.manifest.snapshotHash) {
|
|
146
|
+
await writeRepositoryPackageSnapshot({ workspace: input.workspace, snapshot, candidateOnly: true });
|
|
147
|
+
}
|
|
148
|
+
const candidate = input.submitCandidate
|
|
149
|
+
? await input.submitCandidate(snapshot, published?.sourceFingerprint) : null;
|
|
115
150
|
input.watcher.complete(fingerprint);
|
|
116
151
|
return { state: 'local_candidate_collected', localMutation: true, sharedAuthority: 'pending',
|
|
117
|
-
snapshotId: snapshot.manifest.snapshotId, fingerprint, persisted, candidate
|
|
152
|
+
snapshotId: snapshot.manifest.snapshotId, fingerprint, persisted, candidate,
|
|
153
|
+
submittedManifestHash: `sha256:${createHash('sha256').update(canonicalize(snapshot.manifest)).digest('hex')}` };
|
|
118
154
|
}
|
|
119
155
|
catch (error) {
|
|
120
156
|
input.watcher.invalidate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositorySourceSync.js","sourceRoot":"","sources":["../src/repositorySourceSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,oCAAoC,EACtG,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mCAAmC,EAAE,qCAAqC,EAA8B,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"repositorySourceSync.js","sourceRoot":"","sources":["../src/repositorySourceSync.ts"],"names":[],"mappings":"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"}
|