@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.
Files changed (198) hide show
  1. package/dist/index.d.ts +88 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +840 -175
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.test.js +2 -2
  6. package/dist/repositoryCandidateSync.d.ts +55 -0
  7. package/dist/repositoryCandidateSync.d.ts.map +1 -0
  8. package/dist/repositoryCandidateSync.js +177 -0
  9. package/dist/repositoryCandidateSync.js.map +1 -0
  10. package/dist/repositoryCandidateSync.test.d.ts +2 -0
  11. package/dist/repositoryCandidateSync.test.d.ts.map +1 -0
  12. package/dist/repositoryCandidateSync.test.js +141 -0
  13. package/dist/repositoryCandidateSync.test.js.map +1 -0
  14. package/dist/repositoryInstalledKnowledge.d.ts +13 -0
  15. package/dist/repositoryInstalledKnowledge.d.ts.map +1 -0
  16. package/dist/repositoryInstalledKnowledge.js +25 -0
  17. package/dist/repositoryInstalledKnowledge.js.map +1 -0
  18. package/dist/repositoryInstallerFiles.d.ts +6 -0
  19. package/dist/repositoryInstallerFiles.d.ts.map +1 -0
  20. package/dist/repositoryInstallerFiles.js +113 -0
  21. package/dist/repositoryInstallerFiles.js.map +1 -0
  22. package/dist/repositoryKnowledge.d.ts +119 -0
  23. package/dist/repositoryKnowledge.d.ts.map +1 -0
  24. package/dist/repositoryKnowledge.js +462 -0
  25. package/dist/repositoryKnowledge.js.map +1 -0
  26. package/dist/repositoryKnowledge.test.d.ts +2 -0
  27. package/dist/repositoryKnowledge.test.d.ts.map +1 -0
  28. package/dist/repositoryKnowledge.test.js +245 -0
  29. package/dist/repositoryKnowledge.test.js.map +1 -0
  30. package/dist/repositoryKnowledgeRetention.test.d.ts +2 -0
  31. package/dist/repositoryKnowledgeRetention.test.d.ts.map +1 -0
  32. package/dist/repositoryKnowledgeRetention.test.js +386 -0
  33. package/dist/repositoryKnowledgeRetention.test.js.map +1 -0
  34. package/dist/repositoryOnboardingCaller.test.d.ts +2 -0
  35. package/dist/repositoryOnboardingCaller.test.d.ts.map +1 -0
  36. package/dist/repositoryOnboardingCaller.test.js +216 -0
  37. package/dist/repositoryOnboardingCaller.test.js.map +1 -0
  38. package/dist/repositoryOnboardingFlow.test.d.ts +2 -0
  39. package/dist/repositoryOnboardingFlow.test.d.ts.map +1 -0
  40. package/dist/repositoryOnboardingFlow.test.js +47 -0
  41. package/dist/repositoryOnboardingFlow.test.js.map +1 -0
  42. package/dist/repositoryPackage.d.ts +115 -0
  43. package/dist/repositoryPackage.d.ts.map +1 -0
  44. package/dist/repositoryPackage.js +1095 -0
  45. package/dist/repositoryPackage.js.map +1 -0
  46. package/dist/repositoryPackage.test.d.ts +2 -0
  47. package/dist/repositoryPackage.test.d.ts.map +1 -0
  48. package/dist/repositoryPackage.test.js +709 -0
  49. package/dist/repositoryPackage.test.js.map +1 -0
  50. package/dist/repositoryPackageDelivery.d.ts +29 -0
  51. package/dist/repositoryPackageDelivery.d.ts.map +1 -0
  52. package/dist/repositoryPackageDelivery.js +140 -0
  53. package/dist/repositoryPackageDelivery.js.map +1 -0
  54. package/dist/repositoryPackageDelivery.test.d.ts +2 -0
  55. package/dist/repositoryPackageDelivery.test.d.ts.map +1 -0
  56. package/dist/repositoryPackageDelivery.test.js +787 -0
  57. package/dist/repositoryPackageDelivery.test.js.map +1 -0
  58. package/dist/repositoryPackageDeliveryCaller.test.d.ts +2 -0
  59. package/dist/repositoryPackageDeliveryCaller.test.d.ts.map +1 -0
  60. package/dist/repositoryPackageDeliveryCaller.test.js +18 -0
  61. package/dist/repositoryPackageDeliveryCaller.test.js.map +1 -0
  62. package/dist/repositoryPackageDeliveryPreflight.test.d.ts +2 -0
  63. package/dist/repositoryPackageDeliveryPreflight.test.d.ts.map +1 -0
  64. package/dist/repositoryPackageDeliveryPreflight.test.js +29 -0
  65. package/dist/repositoryPackageDeliveryPreflight.test.js.map +1 -0
  66. package/dist/repositoryPackageTransfer.d.ts +85 -0
  67. package/dist/repositoryPackageTransfer.d.ts.map +1 -0
  68. package/dist/repositoryPackageTransfer.js +233 -0
  69. package/dist/repositoryPackageTransfer.js.map +1 -0
  70. package/dist/repositoryPackageTransfer.test.d.ts +2 -0
  71. package/dist/repositoryPackageTransfer.test.d.ts.map +1 -0
  72. package/dist/repositoryPackageTransfer.test.js +173 -0
  73. package/dist/repositoryPackageTransfer.test.js.map +1 -0
  74. package/dist/repositoryPackageTransferV2.test.d.ts +2 -0
  75. package/dist/repositoryPackageTransferV2.test.d.ts.map +1 -0
  76. package/dist/repositoryPackageTransferV2.test.js +549 -0
  77. package/dist/repositoryPackageTransferV2.test.js.map +1 -0
  78. package/dist/repositoryPackageTransferV2Schema.test.d.ts +2 -0
  79. package/dist/repositoryPackageTransferV2Schema.test.d.ts.map +1 -0
  80. package/dist/repositoryPackageTransferV2Schema.test.js +48 -0
  81. package/dist/repositoryPackageTransferV2Schema.test.js.map +1 -0
  82. package/dist/repositoryReleaseMetadata.d.ts +37 -0
  83. package/dist/repositoryReleaseMetadata.d.ts.map +1 -0
  84. package/dist/repositoryReleaseMetadata.js +251 -0
  85. package/dist/repositoryReleaseMetadata.js.map +1 -0
  86. package/dist/repositoryReleaseMetadata.test.d.ts +2 -0
  87. package/dist/repositoryReleaseMetadata.test.d.ts.map +1 -0
  88. package/dist/repositoryReleaseMetadata.test.js +297 -0
  89. package/dist/repositoryReleaseMetadata.test.js.map +1 -0
  90. package/dist/repositoryRoleDerivation.d.ts +11 -0
  91. package/dist/repositoryRoleDerivation.d.ts.map +1 -0
  92. package/dist/repositoryRoleDerivation.js +59 -0
  93. package/dist/repositoryRoleDerivation.js.map +1 -0
  94. package/dist/repositoryRoleDerivation.test.d.ts +2 -0
  95. package/dist/repositoryRoleDerivation.test.d.ts.map +1 -0
  96. package/dist/repositoryRoleDerivation.test.js +33 -0
  97. package/dist/repositoryRoleDerivation.test.js.map +1 -0
  98. package/dist/repositoryRoleMetadata.d.ts +63 -0
  99. package/dist/repositoryRoleMetadata.d.ts.map +1 -0
  100. package/dist/repositoryRoleMetadata.js +203 -0
  101. package/dist/repositoryRoleMetadata.js.map +1 -0
  102. package/dist/repositoryRoleMetadata.test.d.ts +2 -0
  103. package/dist/repositoryRoleMetadata.test.d.ts.map +1 -0
  104. package/dist/repositoryRoleMetadata.test.js +296 -0
  105. package/dist/repositoryRoleMetadata.test.js.map +1 -0
  106. package/dist/repositoryRoleQuestion.d.ts +36 -0
  107. package/dist/repositoryRoleQuestion.d.ts.map +1 -0
  108. package/dist/repositoryRoleQuestion.js +68 -0
  109. package/dist/repositoryRoleQuestion.js.map +1 -0
  110. package/dist/repositoryRoleQuestion.test.d.ts +2 -0
  111. package/dist/repositoryRoleQuestion.test.d.ts.map +1 -0
  112. package/dist/repositoryRoleQuestion.test.js +66 -0
  113. package/dist/repositoryRoleQuestion.test.js.map +1 -0
  114. package/dist/repositorySourceAuthorization.d.ts +43 -0
  115. package/dist/repositorySourceAuthorization.d.ts.map +1 -0
  116. package/dist/repositorySourceAuthorization.js +164 -0
  117. package/dist/repositorySourceAuthorization.js.map +1 -0
  118. package/dist/repositorySourceCapture.test.d.ts +2 -0
  119. package/dist/repositorySourceCapture.test.d.ts.map +1 -0
  120. package/dist/repositorySourceCapture.test.js +303 -0
  121. package/dist/repositorySourceCapture.test.js.map +1 -0
  122. package/dist/repositorySourceSync.d.ts +54 -0
  123. package/dist/repositorySourceSync.d.ts.map +1 -0
  124. package/dist/repositorySourceSync.js +88 -0
  125. package/dist/repositorySourceSync.js.map +1 -0
  126. package/dist/repositorySourceSync.test.d.ts +2 -0
  127. package/dist/repositorySourceSync.test.d.ts.map +1 -0
  128. package/dist/repositorySourceSync.test.js +218 -0
  129. package/dist/repositorySourceSync.test.js.map +1 -0
  130. package/dist/schemas/repository-knowledge-retention-v1.schema.json +26 -0
  131. package/dist/schemas/repository-knowledge-v2.schema.json +74 -0
  132. package/dist/schemas/repository-knowledge.schema.json +63 -0
  133. package/dist/schemas/repository-package-chunk-v2.schema.json +15 -0
  134. package/dist/schemas/repository-package-chunk.schema.json +18 -0
  135. package/dist/schemas/repository-package-delivery-v1.schema.json +51 -0
  136. package/dist/schemas/repository-package-envelope-v1.schema.json +16 -0
  137. package/dist/schemas/repository-package-transfer-v2.schema.json +36 -0
  138. package/dist/schemas/repository-package-transfer.schema.json +34 -0
  139. package/dist/schemas/repository-package-v2.schema.json +491 -0
  140. package/dist/schemas/repository-package-v3.schema.json +36 -0
  141. package/dist/schemas/repository-package.schema.json +94 -0
  142. package/dist/schemas/repository-release-manifest.schema.json +34 -0
  143. package/dist/schemas/repository-role-metadata.schema.json +82 -0
  144. package/dist/schemas/skill-preparation-pointer-v1.schema.json +28 -0
  145. package/dist/schemas/skill-preparation-v1.schema.json +32 -0
  146. package/dist/skillPollResponse.test.d.ts +2 -0
  147. package/dist/skillPollResponse.test.d.ts.map +1 -0
  148. package/dist/skillPollResponse.test.js +37 -0
  149. package/dist/skillPollResponse.test.js.map +1 -0
  150. package/dist/skillPreparation.test.d.ts +2 -0
  151. package/dist/skillPreparation.test.d.ts.map +1 -0
  152. package/dist/skillPreparation.test.js +163 -0
  153. package/dist/skillPreparation.test.js.map +1 -0
  154. package/dist/skillPreparationCache.d.ts +34 -0
  155. package/dist/skillPreparationCache.d.ts.map +1 -0
  156. package/dist/skillPreparationCache.js +371 -0
  157. package/dist/skillPreparationCache.js.map +1 -0
  158. package/dist/skillPreparationCache.test.d.ts +2 -0
  159. package/dist/skillPreparationCache.test.d.ts.map +1 -0
  160. package/dist/skillPreparationCache.test.js +316 -0
  161. package/dist/skillPreparationCache.test.js.map +1 -0
  162. package/dist/skillPreparationCaller.test.d.ts +2 -0
  163. package/dist/skillPreparationCaller.test.d.ts.map +1 -0
  164. package/dist/skillPreparationCaller.test.js +32 -0
  165. package/dist/skillPreparationCaller.test.js.map +1 -0
  166. package/dist/skillPreparationPump.d.ts +11 -0
  167. package/dist/skillPreparationPump.d.ts.map +1 -0
  168. package/dist/skillPreparationPump.js +41 -0
  169. package/dist/skillPreparationPump.js.map +1 -0
  170. package/dist/skillPreparationPump.test.d.ts +2 -0
  171. package/dist/skillPreparationPump.test.d.ts.map +1 -0
  172. package/dist/skillPreparationPump.test.js +87 -0
  173. package/dist/skillPreparationPump.test.js.map +1 -0
  174. package/dist/skillPreparationRecord.d.ts +2 -0
  175. package/dist/skillPreparationRecord.d.ts.map +1 -0
  176. package/dist/skillPreparationRecord.js +36 -0
  177. package/dist/skillPreparationRecord.js.map +1 -0
  178. package/dist/skillPreparationTransaction.d.ts +13 -0
  179. package/dist/skillPreparationTransaction.d.ts.map +1 -0
  180. package/dist/skillPreparationTransaction.js +236 -0
  181. package/dist/skillPreparationTransaction.js.map +1 -0
  182. package/dist/skillPreparationTransaction.test.d.ts +2 -0
  183. package/dist/skillPreparationTransaction.test.d.ts.map +1 -0
  184. package/dist/skillPreparationTransaction.test.js +181 -0
  185. package/dist/skillPreparationTransaction.test.js.map +1 -0
  186. package/dist/skillSyncPolicy.test.d.ts +2 -0
  187. package/dist/skillSyncPolicy.test.d.ts.map +1 -0
  188. package/dist/skillSyncPolicy.test.js +156 -0
  189. package/dist/skillSyncPolicy.test.js.map +1 -0
  190. package/dist/usage.d.ts +1 -1
  191. package/dist/usage.d.ts.map +1 -1
  192. package/dist/usage.js +1 -1
  193. package/dist/usage.js.map +1 -1
  194. package/dist/windowsProcessPortability.test.d.ts +2 -0
  195. package/dist/windowsProcessPortability.test.d.ts.map +1 -0
  196. package/dist/windowsProcessPortability.test.js +14 -0
  197. package/dist/windowsProcessPortability.test.js.map +1 -0
  198. package/package.json +7 -4
@@ -0,0 +1,218 @@
1
+ import assert from 'node:assert/strict';
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { dirname, 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 { fetchRepositorySourceAuthorization, RepositorySourceWatcher, scanRepositorySourceChanges } from './repositorySourceSync.js';
10
+ const scope = { organizationId: 'org_source_sync_fixture', workspaceId: '056b63dc-ebed-48ed-85d8-02c72f623ea8',
11
+ repositoryBindingId: '73a95988-fd64-41ba-a0b9-6c8867d03788', repositoryAgentId: '57f61652-a5eb-46e4-930c-9478cd4a9c31' };
12
+ const A = `sha256:${'a'.repeat(64)}`, B = `sha256:${'b'.repeat(64)}`;
13
+ function response() {
14
+ const generation = '1a731db0-d1bb-469c-8ffd-e1f10bece914';
15
+ const policy = { action: 'authorize', confirmed: true, requestId: '5ff2ee1b-6cb3-459e-a977-ea99c757bf30',
16
+ repositoryBindingId: scope.repositoryBindingId, expectedRevision: 0,
17
+ allowedContentClasses: ['approved_outputs', 'repository_content', 'repository_skills'],
18
+ approvedRepositoryPaths: ['README.md', 'docs'], approvedOutputFolders: ['output/approved'],
19
+ automaticValidatedPublication: true, retentionDays: 30, maximumFileBytes: 262144,
20
+ maximumSnapshotBytes: 4194304, maximumDailyUploadBytes: 8388608, expiresAt: null };
21
+ return { ok: true, organizationId: scope.organizationId, policy: {
22
+ organizationId: scope.organizationId, repositoryBindingId: scope.repositoryBindingId, repositoryAgentId: scope.repositoryAgentId,
23
+ current: { active: true, reason: 'authorized', revision: 1, generationId: generation,
24
+ receiptId: `repo_consent_${generation}`, policyRevision: `repository-source-${generation}`,
25
+ confirmedAt: '2020-01-01T00:00:00+00:00', policy,
26
+ policyHash: `sha256:${createHash('sha256').update(canonicalize(policy)).digest('hex')}` }
27
+ } };
28
+ }
29
+ async function fixture(t) {
30
+ const workspace = await mkdtemp(resolve(tmpdir(), 'repository-source-sync-'));
31
+ t.after(() => rm(workspace, { recursive: true, force: true }));
32
+ const put = async (path, text) => {
33
+ await mkdir(dirname(resolve(workspace, path)), { recursive: true });
34
+ await writeFile(resolve(workspace, path), text);
35
+ };
36
+ await put('.agents/skills/dharma-agent-fabric/.dharma-agent-fabric.json', JSON.stringify({ managedBy: 'dharma-agent-fabric', workspaceId: scope.workspaceId }));
37
+ await initializeRepositoryKnowledge({ ...scope, workspace });
38
+ await put('README.md', '# Shared repository');
39
+ await put('.codex/skills/review/SKILL.md', '# Review');
40
+ const watcher = new RepositorySourceWatcher(1000);
41
+ let now = 0;
42
+ const calls = [];
43
+ let view = response();
44
+ const transport = { signedGet: async (route) => { calls.push(route); return structuredClone(view); } };
45
+ const input = { ...scope, workspace, watcher, transport, monotonicNow: () => now };
46
+ return { input, put, calls, setNow: (value) => { now = value; }, setView: (value) => { view = value; } };
47
+ }
48
+ test('source policy fetch uses the enrolled signed GET and the bound workspace', async () => {
49
+ const routes = [];
50
+ const result = await fetchRepositorySourceAuthorization({ signedGet: async (route) => { routes.push(route); return response(); } }, scope);
51
+ assert.deepEqual(routes, [`/agent-fabric/repository-source-policy?workspaceId=${scope.workspaceId}`]);
52
+ assert.equal(result.repositoryBindingId, scope.repositoryBindingId);
53
+ assert.equal(result.repositoryAgentId, scope.repositoryAgentId);
54
+ });
55
+ test('an incomplete repository identity cannot dispatch a source-policy read', async () => {
56
+ let calls = 0;
57
+ await assert.rejects(fetchRepositorySourceAuthorization({ signedGet: async () => { calls++; return response(); } }, { ...scope, repositoryBindingId: '' }), /complete bound identity/);
58
+ assert.equal(calls, 0);
59
+ });
60
+ test('source policy fetch rejects a foreign repository binding', async () => {
61
+ const view = response();
62
+ view.policy.repositoryBindingId = 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa';
63
+ await assert.rejects(fetchRepositorySourceAuthorization({ signedGet: async () => view }, scope), /foreign|scope/);
64
+ });
65
+ test('source policy fetch rejects inactive or revoked grants rather than falling back', async () => {
66
+ const view = response();
67
+ view.policy.current.active = false;
68
+ view.policy.current.reason = 'revoked';
69
+ await assert.rejects(fetchRepositorySourceAuthorization({ signedGet: async () => view }, scope), /inactive/);
70
+ });
71
+ test('source policy fetch rejects an expired current grant', async () => {
72
+ const view = response();
73
+ view.policy.current.policy.expiresAt = '2021-01-01T00:00:00.000Z';
74
+ view.policy.current.policyHash = `sha256:${createHash('sha256').update(canonicalize(view.policy.current.policy)).digest('hex')}`;
75
+ await assert.rejects(fetchRepositorySourceAuthorization({ signedGet: async () => view }, scope), /expired/);
76
+ });
77
+ test('source policy fetch propagates transport failure without an unsigned fallback', async () => {
78
+ const failure = new Error('fixture_offline');
79
+ await assert.rejects(fetchRepositorySourceAuthorization({ signedGet: async () => { throw failure; } }, scope), failure);
80
+ });
81
+ test('watcher requires a stable debounce and suppresses completed fingerprints', () => {
82
+ const watcher = new RepositorySourceWatcher(1000);
83
+ assert.equal(watcher.observe(A, 0), 'debouncing');
84
+ assert.throws(() => watcher.complete(A), /conflicts/);
85
+ assert.equal(watcher.observe(A, 999), 'debouncing');
86
+ assert.equal(watcher.observe(A, 1000), 'stable');
87
+ watcher.complete(A);
88
+ assert.equal(watcher.observe(A, 2000), 'unchanged');
89
+ assert.equal(watcher.observe(B, 2001), 'debouncing');
90
+ });
91
+ test('changing content restarts debounce and rejects stale completion', () => {
92
+ const watcher = new RepositorySourceWatcher(1000);
93
+ watcher.observe(A, 0);
94
+ watcher.observe(B, 999);
95
+ assert.equal(watcher.observe(B, 1000), 'debouncing');
96
+ assert.throws(() => watcher.complete(A), /conflicts/);
97
+ assert.equal(watcher.observe(B, 1999), 'stable');
98
+ });
99
+ test('invalid fingerprints and backwards clocks reset watcher state', () => {
100
+ const watcher = new RepositorySourceWatcher(1000);
101
+ watcher.observe(A, 1000);
102
+ assert.throws(() => watcher.observe(A, 999), /Invalid/);
103
+ assert.equal(watcher.observe(A, 0), 'debouncing');
104
+ assert.throws(() => watcher.observe(`${A}\n`, 1), /Invalid/);
105
+ assert.throws(() => new RepositorySourceWatcher(0), /Invalid/);
106
+ });
107
+ test('relay source scan captures real approved sources only after stable observations', async (t) => {
108
+ const f = await fixture(t);
109
+ await f.put('output/approved/report.md', 'Canonical term: evidence ledger.');
110
+ assert.equal((await scanRepositorySourceChanges(f.input)).state, 'debouncing');
111
+ await assert.rejects(readFile(resolve(f.input.workspace, '.agents/skills/dharma-agent-fabric/MANIFEST.json')), /ENOENT/);
112
+ f.setNow(1000);
113
+ const collected = await scanRepositorySourceChanges(f.input);
114
+ assert.equal(collected.state, 'local_candidate_collected');
115
+ assert.equal(collected.sharedAuthority, 'pending');
116
+ assert.equal(collected.localMutation, true);
117
+ assert.equal(f.calls.length, 3);
118
+ assert.ok(collected.persisted);
119
+ assert.equal(collected.persisted.disposition, 'candidate_only');
120
+ assert.equal(collected.persisted.managedCopiesPath, null);
121
+ await assert.rejects(readFile(resolve(f.input.workspace, '.agents/skills/dharma-agent-fabric/MANIFEST.json')), /ENOENT/);
122
+ const manifest = JSON.parse(await readFile(resolve(f.input.workspace, collected.persisted.manifestPath), 'utf8'));
123
+ assert.equal(manifest.schema, 'dharma.repository-package/v2');
124
+ assert.ok(manifest.knowledge);
125
+ assert.ok(manifest.files.some((file) => file.path === 'output/approved/report.md'));
126
+ f.setNow(2000);
127
+ assert.equal((await scanRepositorySourceChanges(f.input)).state, 'unchanged');
128
+ });
129
+ test('candidate submission must succeed before a source fingerprint is completed', async (t) => {
130
+ const f = await fixture(t);
131
+ let submissions = 0;
132
+ const input = { ...f.input, submitCandidate: async () => {
133
+ submissions += 1;
134
+ if (submissions === 1)
135
+ throw new Error('candidate unavailable');
136
+ return { state: 'accepted' };
137
+ } };
138
+ await scanRepositorySourceChanges(input);
139
+ f.setNow(1000);
140
+ await assert.rejects(scanRepositorySourceChanges(input), /candidate unavailable/);
141
+ f.setNow(2000);
142
+ assert.equal((await scanRepositorySourceChanges(input)).state, 'debouncing');
143
+ f.setNow(3000);
144
+ assert.equal((await scanRepositorySourceChanges(input)).state, 'local_candidate_collected');
145
+ assert.equal(submissions, 2);
146
+ });
147
+ test('an uncommitted report edit is collected autonomously on later scans', async (t) => {
148
+ const f = await fixture(t);
149
+ await f.put('output/approved/report.md', 'First observation.');
150
+ await scanRepositorySourceChanges(f.input);
151
+ f.setNow(1000);
152
+ const first = await scanRepositorySourceChanges(f.input);
153
+ await f.put('output/approved/report.md', 'Second observation.');
154
+ f.setNow(2000);
155
+ assert.equal((await scanRepositorySourceChanges(f.input)).state, 'debouncing');
156
+ f.setNow(3000);
157
+ const second = await scanRepositorySourceChanges(f.input);
158
+ assert.notEqual(first.snapshotId, second.snapshotId);
159
+ });
160
+ test('revoked source permission prevents local capture and resets previous debounce', async (t) => {
161
+ const f = await fixture(t);
162
+ await scanRepositorySourceChanges(f.input);
163
+ const revoked = response();
164
+ revoked.policy.current.active = false;
165
+ revoked.policy.current.reason = 'revoked';
166
+ f.setView(revoked);
167
+ f.setNow(1000);
168
+ await assert.rejects(scanRepositorySourceChanges(f.input), /inactive/);
169
+ f.setView(response());
170
+ f.setNow(2000);
171
+ assert.equal((await scanRepositorySourceChanges(f.input)).state, 'debouncing');
172
+ await assert.rejects(readFile(resolve(f.input.workspace, '.agents/skills/dharma-agent-fabric/MANIFEST.json')), /ENOENT/);
173
+ });
174
+ test('permission change between collection and local persistence fails closed', async (t) => {
175
+ const f = await fixture(t);
176
+ await scanRepositorySourceChanges(f.input);
177
+ f.setNow(1000);
178
+ let calls = 0;
179
+ const transport = { signedGet: async () => {
180
+ const view = response();
181
+ if (++calls === 2) {
182
+ view.policy.current.policy.retentionDays = 31;
183
+ view.policy.current.policyHash = `sha256:${createHash('sha256').update(canonicalize(view.policy.current.policy)).digest('hex')}`;
184
+ }
185
+ return view;
186
+ } };
187
+ await assert.rejects(scanRepositorySourceChanges({ ...f.input, transport }), /changed during collection/);
188
+ await assert.rejects(readFile(resolve(f.input.workspace, '.agents/skills/dharma-agent-fabric/MANIFEST.json')), /ENOENT/);
189
+ });
190
+ test('unsupported secret files stay excluded in relay collection', async (t) => {
191
+ const f = await fixture(t);
192
+ await f.put('docs/.env.local', 'AUTH_TOKEN=secret_fixture');
193
+ await scanRepositorySourceChanges(f.input);
194
+ f.setNow(1000);
195
+ const collected = await scanRepositorySourceChanges(f.input);
196
+ assert.ok(collected.persisted);
197
+ const manifest = JSON.parse(await readFile(resolve(f.input.workspace, collected.persisted.manifestPath), 'utf8'));
198
+ assert.equal(manifest.files.some((file) => file.path.includes('.env')), false);
199
+ });
200
+ test('expiry during the second signed GET prevents persistence of a local candidate', async (t) => {
201
+ t.mock.timers.enable({ apis: ['Date'], now: Date.parse('2030-01-01T00:00:00.000Z') });
202
+ const f = await fixture(t);
203
+ const view = response();
204
+ view.policy.current.policy.expiresAt = '2030-01-01T00:00:00.500Z';
205
+ view.policy.current.policyHash = `sha256:${createHash('sha256').update(canonicalize(view.policy.current.policy)).digest('hex')}`;
206
+ let reads = 0;
207
+ const transport = { signedGet: async () => {
208
+ if (++reads === 3)
209
+ t.mock.timers.tick(1000);
210
+ return structuredClone(view);
211
+ } };
212
+ const input = { ...f.input, transport };
213
+ assert.equal((await scanRepositorySourceChanges(input)).state, 'debouncing');
214
+ f.setNow(1000);
215
+ await assert.rejects(scanRepositorySourceChanges(input), /expired/);
216
+ await assert.rejects(readFile(resolve(f.input.workspace, '.agents/skills/dharma-agent-fabric/MANIFEST.json')), /ENOENT/);
217
+ });
218
+ //# sourceMappingURL=repositorySourceSync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositorySourceSync.test.js","sourceRoot":"","sources":["../src/repositorySourceSync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-knowledge-retention/v1",
4
+ "title": "Unverified prior repository release retention reference",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "authority", "organizationId", "repositoryBindingId", "repositoryAgentId", "generation", "catalogPath", "manifestPath", "catalogHash", "manifestHash", "catalogSizeBytes", "manifestSizeBytes"],
8
+ "properties": {
9
+ "schema": { "const": "dharma.repository-knowledge-retention/v1" },
10
+ "authority": { "const": "unverified_prior_release_reference" },
11
+ "organizationId": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}$(?![\\s\\S])" },
12
+ "repositoryBindingId": { "$ref": "#/$defs/uuid" },
13
+ "repositoryAgentId": { "$ref": "#/$defs/uuid" },
14
+ "generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
15
+ "catalogPath": { "const": ".agents/skills/dharma-agent-fabric/knowledge/CATALOG.json" },
16
+ "manifestPath": { "const": ".agents/skills/dharma-agent-fabric/MANIFEST.json" },
17
+ "catalogHash": { "$ref": "#/$defs/hash" },
18
+ "manifestHash": { "$ref": "#/$defs/hash" },
19
+ "catalogSizeBytes": { "type": "integer", "minimum": 1, "maximum": 262144 },
20
+ "manifestSizeBytes": { "type": "integer", "minimum": 1, "maximum": 262144 }
21
+ },
22
+ "$defs": {
23
+ "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])" },
24
+ "uuid": { "type": "string", "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$(?![\\s\\S])" }
25
+ }
26
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-knowledge/v2",
4
+ "title": "Canonical repository knowledge requiring a verified release",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "managedBy", "organizationId", "repositoryAgentId", "knowledgeBaseId", "generation", "authority", "policyHash", "sourceSnapshotHash", "sourceLocalCatalogHash", "projectionHash", "repoAtlas", "concepts", "unresolved"],
8
+ "properties": {
9
+ "schema": { "const": "dharma.repository-knowledge/v2" },
10
+ "managedBy": { "const": "dharma-agent-fabric" },
11
+ "organizationId": { "$ref": "#/$defs/organization" },
12
+ "repositoryAgentId": { "type": "string", "format": "uuid" },
13
+ "knowledgeBaseId": { "type": "string", "pattern": "^repository-kb:sha256:[a-f0-9]{64}$(?![\\s\\S])" },
14
+ "generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
15
+ "authority": { "const": "requires_verified_release" },
16
+ "policyHash": { "$ref": "#/$defs/hash" },
17
+ "sourceSnapshotHash": { "$ref": "#/$defs/hash" },
18
+ "sourceLocalCatalogHash": { "$ref": "#/$defs/hash" },
19
+ "projectionHash": { "$ref": "#/$defs/hash" },
20
+ "repoAtlas": {
21
+ "type": "object", "additionalProperties": false,
22
+ "required": ["associationId", "knowledgeBaseId", "organizationId", "repositoryAgentId", "basis", "sourceWindowIds", "analysisHash"],
23
+ "properties": {
24
+ "associationId": { "type": "string", "format": "uuid" },
25
+ "knowledgeBaseId": { "type": "string", "pattern": "^repository-kb:sha256:[a-f0-9]{64}$(?![\\s\\S])" },
26
+ "organizationId": { "$ref": "#/$defs/organization" },
27
+ "repositoryAgentId": { "type": "string", "format": "uuid" },
28
+ "basis": { "enum": ["repository_initialization", "semantic_analysis"] },
29
+ "sourceWindowIds": { "type": "array", "maxItems": 500, "items": { "type": "string", "format": "uuid" } },
30
+ "analysisHash": { "anyOf": [{ "$ref": "#/$defs/hash" }, { "type": "null" }] }
31
+ }
32
+ },
33
+ "concepts": { "type": "array", "maxItems": 256, "items": { "$ref": "#/$defs/concept" } },
34
+ "unresolved": {
35
+ "type": "array", "maxItems": 128,
36
+ "items": {
37
+ "type": "object", "additionalProperties": false,
38
+ "required": ["proposalHash", "reason", "conceptId"],
39
+ "properties": {
40
+ "proposalHash": { "$ref": "#/$defs/hash" },
41
+ "reason": { "enum": ["source_not_approved", "unsupported_source_projection", "duplicate_label", "conflicting_definition", "conflicting_alias", "catalog_capacity", "concept_capacity"] },
42
+ "conceptId": { "type": "string", "pattern": "^concept_[a-f0-9]{64}$(?![\\s\\S])" }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "$defs": {
48
+ "organization": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}$(?![\\s\\S])" },
49
+ "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])" },
50
+ "label": { "type": "string", "minLength": 1, "maxLength": 160, "pattern": "^[^\\u0000-\\u001f]+$(?![\\s\\S])" },
51
+ "source": {
52
+ "type": "object", "additionalProperties": false,
53
+ "required": ["sourceId", "sourceHash", "firstLine", "lastLine", "quote"],
54
+ "properties": {
55
+ "sourceId": { "type": "string", "format": "uuid" },
56
+ "sourceHash": { "$ref": "#/$defs/hash" },
57
+ "firstLine": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
58
+ "lastLine": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
59
+ "quote": { "type": "string", "minLength": 1, "maxLength": 8192 }
60
+ }
61
+ },
62
+ "concept": {
63
+ "type": "object", "additionalProperties": false,
64
+ "required": ["conceptId", "canonicalName", "aliases", "definition", "sources"],
65
+ "properties": {
66
+ "conceptId": { "type": "string", "pattern": "^concept_[a-f0-9]{64}$(?![\\s\\S])" },
67
+ "canonicalName": { "$ref": "#/$defs/label" },
68
+ "aliases": { "type": "array", "maxItems": 20, "items": { "$ref": "#/$defs/label" } },
69
+ "definition": { "type": "string", "minLength": 1, "maxLength": 8192 },
70
+ "sources": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "$ref": "#/$defs/source" } }
71
+ }
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-knowledge/v1",
4
+ "title": "Locally initialized unsigned repository knowledge catalog",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "managedBy", "organizationId", "repositoryAgentId", "knowledgeBaseId", "initializedAt", "provenance", "repoAtlas", "concepts", "catalogHash"],
8
+ "properties": {
9
+ "schema": { "const": "dharma.repository-knowledge/v1" },
10
+ "managedBy": { "const": "dharma-agent-fabric" },
11
+ "organizationId": { "$ref": "#/$defs/organizationId" },
12
+ "repositoryAgentId": { "$ref": "#/$defs/repositoryAgentId" },
13
+ "knowledgeBaseId": { "type": "string", "pattern": "^repository-kb:sha256:[0-9a-f]{64}$", "description": "Local deterministic identity; runtime verifies its exact organization/repository-agent derivation. Not a server-assigned ID." },
14
+ "initializedAt": { "type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$" },
15
+ "provenance": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": ["origin", "authority", "serverReleaseId"],
19
+ "properties": {
20
+ "origin": { "const": "locally_initialized" },
21
+ "authority": { "const": "unsigned" },
22
+ "serverReleaseId": { "type": "null" }
23
+ }
24
+ },
25
+ "repoAtlas": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["association", "findingsState", "organizationId", "repositoryAgentId"],
29
+ "properties": {
30
+ "association": { "const": "local_scope_only" },
31
+ "findingsState": { "const": "not_observed" },
32
+ "organizationId": { "$ref": "#/$defs/organizationId" },
33
+ "repositoryAgentId": { "$ref": "#/$defs/repositoryAgentId" }
34
+ }
35
+ },
36
+ "concepts": {
37
+ "type": "array",
38
+ "maxItems": 256,
39
+ "uniqueItems": true,
40
+ "items": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["conceptId", "relativePath", "sha256"],
44
+ "properties": {
45
+ "conceptId": { "type": "string", "pattern": "^concept_[a-z0-9][a-z0-9_-]{0,79}$" },
46
+ "relativePath": {
47
+ "type": "string",
48
+ "maxLength": 500,
49
+ "pattern": "^concepts/(?:[A-Za-z0-9_-]+/)*[A-Za-z0-9_-]+\\.(?:json|md)$",
50
+ "not": { "pattern": "(?:^|/)(?:[Cc][Oo][Nn]|[Pp][Rr][Nn]|[Aa][Uu][Xx]|[Nn][Uu][Ll]|[Cc][Oo][Mm][1-9]|[Ll][Pp][Tt][1-9])(?:\\.|/|$)|(?:^|[/._-])(?:[Ss][Ee][Cc][Rr][Ee][Tt][Ss]?|[Cc][Rr][Ee][Dd][Ee][Nn][Tt][Ii][Aa][Ll][Ss]?|[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd][Ss]?|[Pp][Rr][Ii][Vv][Aa][Tt][Ee][-_]?[Kk][Ee][Yy][Ss]?|[Tt][Oo][Kk][Ee][Nn][Ss]?|[Kk][Ee][Yy][Ss][Tt][Oo][Rr][Ee])(?:[/._-]|$)" }
51
+ },
52
+ "sha256": { "$ref": "#/$defs/hash" }
53
+ }
54
+ }
55
+ },
56
+ "catalogHash": { "$ref": "#/$defs/hash", "description": "SHA-256 over canonical sorted-key JSON excluding catalogHash; runtime verifies integrity and cross-field scope. Not a signature." }
57
+ },
58
+ "$defs": {
59
+ "organizationId": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}$" },
60
+ "repositoryAgentId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,159}$" },
61
+ "hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
62
+ }
63
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-package-chunk/v2",
4
+ "title": "Repository Package Transfer Chunk V2",
5
+ "description": "Byte chunk bound to an immutable transfer index. Runtime validates canonical Base64, exact length and the index-pinned chunk hash; this shape does not authorize retrieval or installation.",
6
+ "type": "object", "additionalProperties": false,
7
+ "required": ["schema", "indexHash", "fileIndex", "chunkIndex", "contentBase64"],
8
+ "properties": {
9
+ "schema": { "const": "dharma.repository-package-chunk/v2" },
10
+ "indexHash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}(?![\\s\\S])" },
11
+ "fileIndex": { "type": "integer", "minimum": 0, "maximum": 515 },
12
+ "chunkIndex": { "type": "integer", "minimum": 0, "maximum": 3 },
13
+ "contentBase64": { "type": "string", "maxLength": 87384, "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?(?![\\s\\S])" }
14
+ }
15
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://dharma-ai.io/schemas/repository-package-chunk.schema.json",
4
+ "title": "Repository package byte-transfer chunk; not release authority",
5
+ "type": "object", "additionalProperties": false,
6
+ "required": ["schema", "indexHash", "fileIndex", "chunkIndex", "contentBase64"],
7
+ "properties": {
8
+ "schema": { "const": "dharma.repository-package-chunk/v1" },
9
+ "indexHash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])" },
10
+ "fileIndex": { "type": "integer", "minimum": 0, "maximum": 511 },
11
+ "chunkIndex": { "type": "integer", "minimum": 0, "maximum": 3 },
12
+ "contentBase64": {
13
+ "type": "string", "maxLength": 87384,
14
+ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?(?![\\s\\S])"
15
+ }
16
+ },
17
+ "$comment": "Runtime checks exact canonical encoding, expected index binding, chunk byte count and digest. Missing chunks cannot produce a complete package."
18
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-package-delivery/v1",
4
+ "title": "Authenticated Chunk Repository Package Delivery Descriptor",
5
+ "description": "Descriptor shape only. Authority requires inclusion in a verified signed envelope plus current repository, policy and rollout checks. No producer or recipient integration is implied. The copied-source 4 MiB bound is enforced separately. Runtime validation must additionally require expiresAt strictly after createdAt.",
6
+ "$comment": "Portable JSON Schema cannot compare timestamp properties. Enforce expiresAt > createdAt in the runtime contract; date-time format validation must be enabled for calendar validity. Transfer v2 is a distinct contract, not a renaming of the existing 512-file/4-MiB transfer v1.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": [
10
+ "schema", "delivery", "transferSchema", "organizationId", "repositoryBindingId", "repositoryAgentId",
11
+ "releaseId", "generation", "gitCommit", "policyHash", "sourceSnapshotHash", "sourceManifestHash",
12
+ "sourceLocalCatalogHash", "catalogHash", "manifestHash", "transferIndexHash", "fileCount", "totalBytes",
13
+ "maximumFileBytes", "createdAt", "expiresAt"
14
+ ],
15
+ "properties": {
16
+ "schema": { "const": "dharma.repository-package-delivery/v1" },
17
+ "delivery": { "const": "authenticated_chunks" },
18
+ "transferSchema": { "const": "dharma.repository-package-transfer/v2" },
19
+ "organizationId": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}$(?![\\s\\S])" },
20
+ "repositoryBindingId": { "$ref": "#/$defs/uuid" },
21
+ "repositoryAgentId": { "$ref": "#/$defs/uuid" },
22
+ "releaseId": { "$ref": "#/$defs/uuid" },
23
+ "generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
24
+ "gitCommit": { "type": "string", "pattern": "^(?:[a-f0-9]{40}|[a-f0-9]{64})$(?![\\s\\S])" },
25
+ "policyHash": { "$ref": "#/$defs/hash" },
26
+ "sourceSnapshotHash": { "$ref": "#/$defs/hash" },
27
+ "sourceManifestHash": { "$ref": "#/$defs/hash" },
28
+ "sourceLocalCatalogHash": { "$ref": "#/$defs/hash" },
29
+ "catalogHash": { "$ref": "#/$defs/hash" },
30
+ "manifestHash": { "$ref": "#/$defs/hash" },
31
+ "transferIndexHash": { "$ref": "#/$defs/hash" },
32
+ "fileCount": { "type": "integer", "minimum": 1, "maximum": 516 },
33
+ "totalBytes": { "type": "integer", "minimum": 0, "maximum": 5242880 },
34
+ "maximumFileBytes": { "const": 262144 },
35
+ "createdAt": { "$ref": "#/$defs/timestamp" },
36
+ "expiresAt": { "$ref": "#/$defs/timestamp", "description": "Must be strictly later than createdAt; enforced by runtime validation." }
37
+ },
38
+ "$defs": {
39
+ "uuid": {
40
+ "type": "string",
41
+ "format": "uuid",
42
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$(?![\\s\\S])"
43
+ },
44
+ "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])" },
45
+ "timestamp": {
46
+ "type": "string",
47
+ "format": "date-time",
48
+ "pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{3}Z$(?![\\s\\S])"
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-package-envelope/v1",
4
+ "title": "Signed Repository Package Delivery Envelope",
5
+ "description": "Separate signed delivery carrier bound to an unchanged signed skill-bundle/v2. Endpoint authorization and current repository eligibility remain mandatory for every read.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema", "bundleId", "bundleHash", "descriptor", "signature"],
9
+ "properties": {
10
+ "schema": { "const": "dharma.repository-package-envelope/v1" },
11
+ "bundleId": { "type": "string", "format": "uuid" },
12
+ "bundleHash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$(?![\\s\\S])" },
13
+ "descriptor": { "$ref": "https://schemas.dharma-ai.io/repository-package-delivery/v1" },
14
+ "signature": { "type": "string", "minLength": 86, "maxLength": 86, "pattern": "^[A-Za-z0-9_-]{86}$(?![\\s\\S])" }
15
+ }
16
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dharma-ai.io/repository-package-transfer/v2",
4
+ "title": "Repository Package Transfer Index V2",
5
+ "description": "Complete immutable byte inventory. Runtime validation also enforces portable NFC paths, path collisions, byte sums, chunk counts and the 1 MiB canonical index limit. A trusted signed delivery descriptor and current repository/policy authorization are required separately.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema", "organizationId", "repositoryBindingId", "repositoryAgentId", "releaseId", "generation", "gitCommit", "totalBytes", "files"],
9
+ "properties": {
10
+ "schema": { "const": "dharma.repository-package-transfer/v2" },
11
+ "organizationId": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}(?![\\s\\S])" },
12
+ "repositoryBindingId": { "$ref": "#/$defs/uuid" },
13
+ "repositoryAgentId": { "$ref": "#/$defs/uuid" },
14
+ "releaseId": { "$ref": "#/$defs/uuid" },
15
+ "generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
16
+ "gitCommit": { "type": "string", "pattern": "^(?:[a-f0-9]{40}|[a-f0-9]{64})(?![\\s\\S])" },
17
+ "totalBytes": { "type": "integer", "minimum": 0, "maximum": 5242880 },
18
+ "files": {
19
+ "type": "array", "minItems": 1, "maxItems": 516,
20
+ "items": {
21
+ "type": "object", "additionalProperties": false,
22
+ "required": ["path", "sha256", "sizeBytes", "chunkHashes"],
23
+ "properties": {
24
+ "path": { "type": "string", "minLength": 1, "maxLength": 500, "description": "Runtime enforces portable relative paths and NFC normalization." },
25
+ "sha256": { "$ref": "#/$defs/hash" },
26
+ "sizeBytes": { "type": "integer", "minimum": 0, "maximum": 262144 },
27
+ "chunkHashes": { "type": "array", "maxItems": 4, "items": { "$ref": "#/$defs/hash" } }
28
+ }
29
+ }
30
+ }
31
+ },
32
+ "$defs": {
33
+ "uuid": { "type": "string", "format": "uuid", "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}(?![\\s\\S])" },
34
+ "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}(?![\\s\\S])" }
35
+ }
36
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://dharma-ai.io/schemas/repository-package-transfer.schema.json",
4
+ "title": "Repository package byte-transfer index; not release authority",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "organizationId", "repositoryAgentId", "releaseId", "gitCommit", "totalBytes", "files"],
8
+ "properties": {
9
+ "schema": { "const": "dharma.repository-package-transfer/v1" },
10
+ "organizationId": { "type": "string", "pattern": "^org_[A-Za-z0-9_]{1,156}(?![\\s\\S])" },
11
+ "repositoryAgentId": { "$ref": "#/$defs/id" },
12
+ "releaseId": { "$ref": "#/$defs/id" },
13
+ "gitCommit": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})(?![\\s\\S])" },
14
+ "totalBytes": { "type": "integer", "minimum": 0, "maximum": 4194304 },
15
+ "files": {
16
+ "type": "array", "minItems": 1, "maxItems": 512,
17
+ "items": {
18
+ "type": "object", "additionalProperties": false,
19
+ "required": ["path", "sha256", "sizeBytes", "chunkHashes"],
20
+ "properties": {
21
+ "path": { "type": "string", "minLength": 1, "maxLength": 500 },
22
+ "sha256": { "$ref": "#/$defs/digest" },
23
+ "sizeBytes": { "type": "integer", "minimum": 0, "maximum": 262144 },
24
+ "chunkHashes": { "type": "array", "maxItems": 4, "items": { "$ref": "#/$defs/digest" } }
25
+ }
26
+ }
27
+ }
28
+ },
29
+ "$defs": {
30
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,159}(?![\\s\\S])" },
31
+ "digest": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])" }
32
+ },
33
+ "$comment": "Runtime additionally checks normalized safe relative paths, case collisions, whole-release totals, chunk lengths, empty-file hashes and index size. Expected scope and index hash must come from protected enrollment and the existing verified signed release."
34
+ }