@dharma-ai-labs/agent-fabric 0.2.48 → 0.2.50

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 (199) hide show
  1. package/dist/index.d.ts +92 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +846 -180
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.test.js +25 -3
  6. package/dist/index.test.js.map +1 -1
  7. package/dist/repositoryCandidateSync.d.ts +55 -0
  8. package/dist/repositoryCandidateSync.d.ts.map +1 -0
  9. package/dist/repositoryCandidateSync.js +177 -0
  10. package/dist/repositoryCandidateSync.js.map +1 -0
  11. package/dist/repositoryCandidateSync.test.d.ts +2 -0
  12. package/dist/repositoryCandidateSync.test.d.ts.map +1 -0
  13. package/dist/repositoryCandidateSync.test.js +141 -0
  14. package/dist/repositoryCandidateSync.test.js.map +1 -0
  15. package/dist/repositoryInstalledKnowledge.d.ts +13 -0
  16. package/dist/repositoryInstalledKnowledge.d.ts.map +1 -0
  17. package/dist/repositoryInstalledKnowledge.js +25 -0
  18. package/dist/repositoryInstalledKnowledge.js.map +1 -0
  19. package/dist/repositoryInstallerFiles.d.ts +6 -0
  20. package/dist/repositoryInstallerFiles.d.ts.map +1 -0
  21. package/dist/repositoryInstallerFiles.js +113 -0
  22. package/dist/repositoryInstallerFiles.js.map +1 -0
  23. package/dist/repositoryKnowledge.d.ts +119 -0
  24. package/dist/repositoryKnowledge.d.ts.map +1 -0
  25. package/dist/repositoryKnowledge.js +462 -0
  26. package/dist/repositoryKnowledge.js.map +1 -0
  27. package/dist/repositoryKnowledge.test.d.ts +2 -0
  28. package/dist/repositoryKnowledge.test.d.ts.map +1 -0
  29. package/dist/repositoryKnowledge.test.js +245 -0
  30. package/dist/repositoryKnowledge.test.js.map +1 -0
  31. package/dist/repositoryKnowledgeRetention.test.d.ts +2 -0
  32. package/dist/repositoryKnowledgeRetention.test.d.ts.map +1 -0
  33. package/dist/repositoryKnowledgeRetention.test.js +386 -0
  34. package/dist/repositoryKnowledgeRetention.test.js.map +1 -0
  35. package/dist/repositoryOnboardingCaller.test.d.ts +2 -0
  36. package/dist/repositoryOnboardingCaller.test.d.ts.map +1 -0
  37. package/dist/repositoryOnboardingCaller.test.js +197 -0
  38. package/dist/repositoryOnboardingCaller.test.js.map +1 -0
  39. package/dist/repositoryOnboardingFlow.test.d.ts +2 -0
  40. package/dist/repositoryOnboardingFlow.test.d.ts.map +1 -0
  41. package/dist/repositoryOnboardingFlow.test.js +47 -0
  42. package/dist/repositoryOnboardingFlow.test.js.map +1 -0
  43. package/dist/repositoryPackage.d.ts +115 -0
  44. package/dist/repositoryPackage.d.ts.map +1 -0
  45. package/dist/repositoryPackage.js +1095 -0
  46. package/dist/repositoryPackage.js.map +1 -0
  47. package/dist/repositoryPackage.test.d.ts +2 -0
  48. package/dist/repositoryPackage.test.d.ts.map +1 -0
  49. package/dist/repositoryPackage.test.js +709 -0
  50. package/dist/repositoryPackage.test.js.map +1 -0
  51. package/dist/repositoryPackageDelivery.d.ts +29 -0
  52. package/dist/repositoryPackageDelivery.d.ts.map +1 -0
  53. package/dist/repositoryPackageDelivery.js +140 -0
  54. package/dist/repositoryPackageDelivery.js.map +1 -0
  55. package/dist/repositoryPackageDelivery.test.d.ts +2 -0
  56. package/dist/repositoryPackageDelivery.test.d.ts.map +1 -0
  57. package/dist/repositoryPackageDelivery.test.js +787 -0
  58. package/dist/repositoryPackageDelivery.test.js.map +1 -0
  59. package/dist/repositoryPackageDeliveryCaller.test.d.ts +2 -0
  60. package/dist/repositoryPackageDeliveryCaller.test.d.ts.map +1 -0
  61. package/dist/repositoryPackageDeliveryCaller.test.js +18 -0
  62. package/dist/repositoryPackageDeliveryCaller.test.js.map +1 -0
  63. package/dist/repositoryPackageDeliveryPreflight.test.d.ts +2 -0
  64. package/dist/repositoryPackageDeliveryPreflight.test.d.ts.map +1 -0
  65. package/dist/repositoryPackageDeliveryPreflight.test.js +29 -0
  66. package/dist/repositoryPackageDeliveryPreflight.test.js.map +1 -0
  67. package/dist/repositoryPackageTransfer.d.ts +85 -0
  68. package/dist/repositoryPackageTransfer.d.ts.map +1 -0
  69. package/dist/repositoryPackageTransfer.js +233 -0
  70. package/dist/repositoryPackageTransfer.js.map +1 -0
  71. package/dist/repositoryPackageTransfer.test.d.ts +2 -0
  72. package/dist/repositoryPackageTransfer.test.d.ts.map +1 -0
  73. package/dist/repositoryPackageTransfer.test.js +173 -0
  74. package/dist/repositoryPackageTransfer.test.js.map +1 -0
  75. package/dist/repositoryPackageTransferV2.test.d.ts +2 -0
  76. package/dist/repositoryPackageTransferV2.test.d.ts.map +1 -0
  77. package/dist/repositoryPackageTransferV2.test.js +549 -0
  78. package/dist/repositoryPackageTransferV2.test.js.map +1 -0
  79. package/dist/repositoryPackageTransferV2Schema.test.d.ts +2 -0
  80. package/dist/repositoryPackageTransferV2Schema.test.d.ts.map +1 -0
  81. package/dist/repositoryPackageTransferV2Schema.test.js +48 -0
  82. package/dist/repositoryPackageTransferV2Schema.test.js.map +1 -0
  83. package/dist/repositoryReleaseMetadata.d.ts +37 -0
  84. package/dist/repositoryReleaseMetadata.d.ts.map +1 -0
  85. package/dist/repositoryReleaseMetadata.js +251 -0
  86. package/dist/repositoryReleaseMetadata.js.map +1 -0
  87. package/dist/repositoryReleaseMetadata.test.d.ts +2 -0
  88. package/dist/repositoryReleaseMetadata.test.d.ts.map +1 -0
  89. package/dist/repositoryReleaseMetadata.test.js +297 -0
  90. package/dist/repositoryReleaseMetadata.test.js.map +1 -0
  91. package/dist/repositoryRoleDerivation.d.ts +11 -0
  92. package/dist/repositoryRoleDerivation.d.ts.map +1 -0
  93. package/dist/repositoryRoleDerivation.js +59 -0
  94. package/dist/repositoryRoleDerivation.js.map +1 -0
  95. package/dist/repositoryRoleDerivation.test.d.ts +2 -0
  96. package/dist/repositoryRoleDerivation.test.d.ts.map +1 -0
  97. package/dist/repositoryRoleDerivation.test.js +33 -0
  98. package/dist/repositoryRoleDerivation.test.js.map +1 -0
  99. package/dist/repositoryRoleMetadata.d.ts +63 -0
  100. package/dist/repositoryRoleMetadata.d.ts.map +1 -0
  101. package/dist/repositoryRoleMetadata.js +203 -0
  102. package/dist/repositoryRoleMetadata.js.map +1 -0
  103. package/dist/repositoryRoleMetadata.test.d.ts +2 -0
  104. package/dist/repositoryRoleMetadata.test.d.ts.map +1 -0
  105. package/dist/repositoryRoleMetadata.test.js +296 -0
  106. package/dist/repositoryRoleMetadata.test.js.map +1 -0
  107. package/dist/repositoryRoleQuestion.d.ts +36 -0
  108. package/dist/repositoryRoleQuestion.d.ts.map +1 -0
  109. package/dist/repositoryRoleQuestion.js +68 -0
  110. package/dist/repositoryRoleQuestion.js.map +1 -0
  111. package/dist/repositoryRoleQuestion.test.d.ts +2 -0
  112. package/dist/repositoryRoleQuestion.test.d.ts.map +1 -0
  113. package/dist/repositoryRoleQuestion.test.js +66 -0
  114. package/dist/repositoryRoleQuestion.test.js.map +1 -0
  115. package/dist/repositorySourceAuthorization.d.ts +43 -0
  116. package/dist/repositorySourceAuthorization.d.ts.map +1 -0
  117. package/dist/repositorySourceAuthorization.js +164 -0
  118. package/dist/repositorySourceAuthorization.js.map +1 -0
  119. package/dist/repositorySourceCapture.test.d.ts +2 -0
  120. package/dist/repositorySourceCapture.test.d.ts.map +1 -0
  121. package/dist/repositorySourceCapture.test.js +303 -0
  122. package/dist/repositorySourceCapture.test.js.map +1 -0
  123. package/dist/repositorySourceSync.d.ts +54 -0
  124. package/dist/repositorySourceSync.d.ts.map +1 -0
  125. package/dist/repositorySourceSync.js +88 -0
  126. package/dist/repositorySourceSync.js.map +1 -0
  127. package/dist/repositorySourceSync.test.d.ts +2 -0
  128. package/dist/repositorySourceSync.test.d.ts.map +1 -0
  129. package/dist/repositorySourceSync.test.js +218 -0
  130. package/dist/repositorySourceSync.test.js.map +1 -0
  131. package/dist/schemas/repository-knowledge-retention-v1.schema.json +26 -0
  132. package/dist/schemas/repository-knowledge-v2.schema.json +74 -0
  133. package/dist/schemas/repository-knowledge.schema.json +63 -0
  134. package/dist/schemas/repository-package-chunk-v2.schema.json +15 -0
  135. package/dist/schemas/repository-package-chunk.schema.json +18 -0
  136. package/dist/schemas/repository-package-delivery-v1.schema.json +51 -0
  137. package/dist/schemas/repository-package-envelope-v1.schema.json +16 -0
  138. package/dist/schemas/repository-package-transfer-v2.schema.json +36 -0
  139. package/dist/schemas/repository-package-transfer.schema.json +34 -0
  140. package/dist/schemas/repository-package-v2.schema.json +491 -0
  141. package/dist/schemas/repository-package-v3.schema.json +36 -0
  142. package/dist/schemas/repository-package.schema.json +94 -0
  143. package/dist/schemas/repository-release-manifest.schema.json +34 -0
  144. package/dist/schemas/repository-role-metadata.schema.json +82 -0
  145. package/dist/schemas/skill-preparation-pointer-v1.schema.json +28 -0
  146. package/dist/schemas/skill-preparation-v1.schema.json +32 -0
  147. package/dist/skillPollResponse.test.d.ts +2 -0
  148. package/dist/skillPollResponse.test.d.ts.map +1 -0
  149. package/dist/skillPollResponse.test.js +37 -0
  150. package/dist/skillPollResponse.test.js.map +1 -0
  151. package/dist/skillPreparation.test.d.ts +2 -0
  152. package/dist/skillPreparation.test.d.ts.map +1 -0
  153. package/dist/skillPreparation.test.js +163 -0
  154. package/dist/skillPreparation.test.js.map +1 -0
  155. package/dist/skillPreparationCache.d.ts +34 -0
  156. package/dist/skillPreparationCache.d.ts.map +1 -0
  157. package/dist/skillPreparationCache.js +371 -0
  158. package/dist/skillPreparationCache.js.map +1 -0
  159. package/dist/skillPreparationCache.test.d.ts +2 -0
  160. package/dist/skillPreparationCache.test.d.ts.map +1 -0
  161. package/dist/skillPreparationCache.test.js +316 -0
  162. package/dist/skillPreparationCache.test.js.map +1 -0
  163. package/dist/skillPreparationCaller.test.d.ts +2 -0
  164. package/dist/skillPreparationCaller.test.d.ts.map +1 -0
  165. package/dist/skillPreparationCaller.test.js +32 -0
  166. package/dist/skillPreparationCaller.test.js.map +1 -0
  167. package/dist/skillPreparationPump.d.ts +11 -0
  168. package/dist/skillPreparationPump.d.ts.map +1 -0
  169. package/dist/skillPreparationPump.js +41 -0
  170. package/dist/skillPreparationPump.js.map +1 -0
  171. package/dist/skillPreparationPump.test.d.ts +2 -0
  172. package/dist/skillPreparationPump.test.d.ts.map +1 -0
  173. package/dist/skillPreparationPump.test.js +87 -0
  174. package/dist/skillPreparationPump.test.js.map +1 -0
  175. package/dist/skillPreparationRecord.d.ts +2 -0
  176. package/dist/skillPreparationRecord.d.ts.map +1 -0
  177. package/dist/skillPreparationRecord.js +36 -0
  178. package/dist/skillPreparationRecord.js.map +1 -0
  179. package/dist/skillPreparationTransaction.d.ts +13 -0
  180. package/dist/skillPreparationTransaction.d.ts.map +1 -0
  181. package/dist/skillPreparationTransaction.js +236 -0
  182. package/dist/skillPreparationTransaction.js.map +1 -0
  183. package/dist/skillPreparationTransaction.test.d.ts +2 -0
  184. package/dist/skillPreparationTransaction.test.d.ts.map +1 -0
  185. package/dist/skillPreparationTransaction.test.js +181 -0
  186. package/dist/skillPreparationTransaction.test.js.map +1 -0
  187. package/dist/skillSyncPolicy.test.d.ts +2 -0
  188. package/dist/skillSyncPolicy.test.d.ts.map +1 -0
  189. package/dist/skillSyncPolicy.test.js +156 -0
  190. package/dist/skillSyncPolicy.test.js.map +1 -0
  191. package/dist/usage.d.ts +1 -1
  192. package/dist/usage.d.ts.map +1 -1
  193. package/dist/usage.js +1 -1
  194. package/dist/usage.js.map +1 -1
  195. package/dist/windowsProcessPortability.test.d.ts +2 -0
  196. package/dist/windowsProcessPortability.test.d.ts.map +1 -0
  197. package/dist/windowsProcessPortability.test.js +14 -0
  198. package/dist/windowsProcessPortability.test.js.map +1 -0
  199. package/package.json +7 -4
@@ -0,0 +1,316 @@
1
+ import assert from 'node:assert/strict';
2
+ import { generateKeyPairSync } from 'node:crypto';
3
+ import { readdirSync, renameSync, writeFileSync } from 'node:fs';
4
+ import { mkdir, mkdtemp, readFile, readdir, realpath, rm, symlink, writeFile } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { join, relative, resolve, sep } from 'node:path';
7
+ import { EventEmitter } from 'node:events';
8
+ import { Script } from 'node:vm';
9
+ import test from 'node:test';
10
+ import ts from 'typescript';
11
+ import { canonicalize, sha256, signCanonicalObject } from '@dharma-ai-labs/agent-fabric-contracts';
12
+ import { calculateBundleHash } from '@dharma-ai-labs/agent-fabric-skill-manager';
13
+ import { serializeSkillPreparationRecord } from './skillPreparationRecord.js';
14
+ import { skillPreparationScopeRoot, withSkillPreparationTransaction } from './skillPreparationTransaction.js';
15
+ import { prepareProvidersIndependently } from './skillPreparationPump.js';
16
+ const WORKSPACE = '11111111-1111-4111-8111-111111111111';
17
+ async function publisher() {
18
+ return (await import('./skillPreparationCache.js')).publishSkillPreparationCache;
19
+ }
20
+ async function taker() {
21
+ return (await import('./skillPreparationCache.js')).takeSkillPreparationCache;
22
+ }
23
+ async function fixture(writePrepared = true) {
24
+ const home = await realpath(await mkdtemp(join(tmpdir(), 'af-cache-pointer-')));
25
+ const sourceRoot = await withSkillPreparationTransaction({ home, workspaceId: WORKSPACE, provider: 'codex', assertCurrent: () => { } }, scopeRoot => mkdtemp(join(scopeRoot, 'attempt-')));
26
+ const scopeRoot = skillPreparationScopeRoot(home, WORKSPACE, 'codex');
27
+ const keys = generateKeyPairSync('ed25519');
28
+ const unsigned = { schema: 'dharma.skill-bundle/v2', bundleId: '44444444-4444-4444-8444-444444444444',
29
+ organizationId: 'org_test', version: 'fixture', operation: 'clear', skills: [], riskClass: 'R0',
30
+ targetSelectors: { organizationAgentIds: [], deviceIds: [], workspaceIds: [WORKSPACE], providers: ['codex'] },
31
+ activationPolicy: 'next_session', rollbackBundleId: null,
32
+ evaluationReceiptId: '55555555-5555-4555-8555-555555555555', createdAt: new Date().toISOString(),
33
+ expiresAt: new Date(Date.now() + 3600000).toISOString() };
34
+ const signed = { ...unsigned, bundleHash: calculateBundleHash(unsigned) };
35
+ const bundle = { ...signed, signature: signCanonicalObject(signed, keys.privateKey) };
36
+ const record = { schema: 'dharma.skill-preparation/v1', organizationId: 'org_test',
37
+ deviceId: '33333333-3333-4333-8333-333333333333', workspaceId: WORKSPACE,
38
+ repositoryAgentId: '22222222-2222-4222-8222-222222222222', repositoryBindingId: null,
39
+ provider: 'codex', policyHash: sha256('fixture-policy'), rolloutId: 'fixture-rollout',
40
+ bundle, repositoryPackage: null, preparedAt: new Date().toISOString(), activationAuthorized: false };
41
+ const recordBytes = await serializeSkillPreparationRecord(record);
42
+ if (writePrepared)
43
+ await writeFile(join(sourceRoot, 'PREPARED.json'), recordBytes, { mode: 0o600, flag: 'wx' });
44
+ const expected = { organizationId: record.organizationId, deviceId: record.deviceId,
45
+ repositoryAgentId: record.repositoryAgentId, repositoryBindingId: record.repositoryBindingId,
46
+ policyHash: record.policyHash, rolloutId: record.rolloutId, bundleId: bundle.bundleId, bundleHash: bundle.bundleHash };
47
+ return { home, scopeRoot, sourceRoot, record, recordBytes, expected };
48
+ }
49
+ test('durable preparation pointer pins exact metadata and never authorizes activation', async () => {
50
+ const f = await fixture();
51
+ let committed = false;
52
+ try {
53
+ await (await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex', assertCurrent: () => { }, onCommitted: () => { committed = true; } });
54
+ const pointer = JSON.parse(await readFile(join(f.scopeRoot, 'CURRENT.json'), 'utf8'));
55
+ assert.equal(committed, true);
56
+ assert.equal(pointer.schema, 'dharma.skill-preparation-pointer/v1');
57
+ assert.equal(pointer.metadataHash, sha256(f.recordBytes));
58
+ assert.equal(pointer.workspaceId, WORKSPACE);
59
+ assert.equal(pointer.organizationId, 'org_test');
60
+ assert.equal(pointer.activationAuthorized, false);
61
+ assert.equal(await readFile(join(f.scopeRoot, pointer.sourceDirectory, 'PREPARED.json'), 'utf8'), f.recordBytes);
62
+ assert.ok(!pointer.sourceDirectory.includes('/') && pointer.sourceDirectory.startsWith('attempt-'));
63
+ assert.ok(!(await readdir(f.scopeRoot)).some(name => name.startsWith('.CURRENT-')));
64
+ }
65
+ finally {
66
+ await rm(f.home, { recursive: true, force: true });
67
+ }
68
+ });
69
+ test('safe-boundary cache take validates scope and transfers a preparation only once', async () => {
70
+ const f = await fixture();
71
+ try {
72
+ await (await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex', assertCurrent: () => { }, onCommitted: () => { } });
73
+ const input = { home: f.home, workspaceId: WORKSPACE, provider: 'codex', assertCurrent: () => { },
74
+ organizationId: f.expected.organizationId, deviceId: f.expected.deviceId,
75
+ repositoryAgentId: f.expected.repositoryAgentId, repositoryBindingId: f.expected.repositoryBindingId,
76
+ policyHash: f.expected.policyHash };
77
+ const taken = await (await taker())(input);
78
+ assert.equal(taken?.sourceRoot, f.sourceRoot);
79
+ assert.equal((taken?.record.bundle).bundleId, f.expected.bundleId);
80
+ assert.equal(await (await taker())(input), null);
81
+ }
82
+ finally {
83
+ await rm(f.home, { recursive: true, force: true });
84
+ }
85
+ });
86
+ test('stop before pointer commit leaves no committed cache', async () => {
87
+ const f = await fixture();
88
+ let committed = false;
89
+ try {
90
+ await assert.rejects((await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex',
91
+ assertCurrent: () => { throw new Error('fixture stopped'); }, onCommitted: () => { committed = true; } }), /stopped/);
92
+ assert.equal(committed, false);
93
+ await assert.rejects(readFile(join(f.scopeRoot, 'CURRENT.json')), { code: 'ENOENT' });
94
+ }
95
+ finally {
96
+ await rm(f.home, { recursive: true, force: true });
97
+ }
98
+ });
99
+ test('stop after pointer rename retains the committed snapshot', async () => {
100
+ const f = await fixture();
101
+ let committed = false;
102
+ try {
103
+ await assert.rejects((await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex',
104
+ assertCurrent: () => { if (committed)
105
+ throw new Error('fixture stopped after commit'); },
106
+ onCommitted: () => { committed = true; } }), /stopped after commit/);
107
+ assert.equal(committed, true);
108
+ assert.equal(JSON.parse(await readFile(join(f.scopeRoot, 'CURRENT.json'), 'utf8')).metadataHash, sha256(f.recordBytes));
109
+ assert.equal(await readFile(join(f.sourceRoot, 'PREPARED.json'), 'utf8'), f.recordBytes);
110
+ }
111
+ finally {
112
+ await rm(f.home, { recursive: true, force: true });
113
+ }
114
+ });
115
+ test('changed metadata or foreign workspace cannot publish a pointer', async () => {
116
+ const f = await fixture();
117
+ try {
118
+ const publish = await publisher();
119
+ await assert.rejects(publish({ ...f, workspaceId: WORKSPACE, provider: 'codex',
120
+ recordBytes: canonicalize({ ...f.record, rolloutId: 'changed' }) + '\n', assertCurrent: () => { }, onCommitted: () => { } }), /metadata/);
121
+ await assert.rejects(publish({ ...f, workspaceId: '66666666-6666-4666-8666-666666666666',
122
+ provider: 'codex', assertCurrent: () => { }, onCommitted: () => { } }), /scope|workspace/);
123
+ await assert.rejects(readFile(join(f.scopeRoot, 'CURRENT.json')), { code: 'ENOENT' });
124
+ }
125
+ finally {
126
+ await rm(f.home, { recursive: true, force: true });
127
+ }
128
+ });
129
+ test('symlinked pointer does not modify its foreign target', async () => {
130
+ const f = await fixture();
131
+ const foreign = await mkdtemp(join(tmpdir(), 'af-cache-foreign-'));
132
+ try {
133
+ const target = join(foreign, 'pointer.json');
134
+ await writeFile(target, 'preserve');
135
+ await symlink(target, join(f.scopeRoot, 'CURRENT.json'));
136
+ await assert.rejects((await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex', assertCurrent: () => { }, onCommitted: () => { } }), /pointer|file/);
137
+ assert.equal(await readFile(target, 'utf8'), 'preserve');
138
+ }
139
+ finally {
140
+ await rm(f.home, { recursive: true, force: true });
141
+ await rm(foreign, { recursive: true, force: true });
142
+ }
143
+ });
144
+ // Synthetic development seam: execute the compiled production function, not its module
145
+ // initialization. Authorization, transport, vault and OS-lock boundaries are injected;
146
+ // this qualifies staging ownership only, never enrollment, native locking or live use.
147
+ async function runActualRelay(f, cycles, diagnostic) {
148
+ const source = await readFile(new URL('./index.js', import.meta.url), 'utf8');
149
+ diagnostic(`synthetic production-caller source=${sha256(await readFile(new URL('../src/index.ts', import.meta.url)))} emitted=${sha256(source)}`);
150
+ const ast = ts.createSourceFile('index.js', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
151
+ const declarations = ast.statements.filter(node => ts.isFunctionDeclaration(node) && node.name?.text === 'relayStart');
152
+ assert.equal(declarations.length, 1, 'exact production relayStart declaration is required');
153
+ const declaration = declarations[0].getText(ast);
154
+ const roots = [f.sourceRoot];
155
+ for (let index = 1; index < cycles; index++)
156
+ roots.push(await mkdtemp(join(f.scopeRoot, 'attempt-')));
157
+ let preparedCount = 0;
158
+ let flight;
159
+ let stopped = false;
160
+ let vaultCloses = 0;
161
+ let transportCalls = 0;
162
+ const flags = new Map([['policy', join(f.home, '.dharma', 'approved-policy.json')], ['once', true]]);
163
+ const workspace = { path: f.home, workspaceId: WORKSPACE, organizationId: 'org_test',
164
+ repositoryAgentId: f.record.repositoryAgentId, repositoryBindingId: '77777777-7777-4777-8777-777777777777' };
165
+ const policy = { revision: 1, fixture: 'synthetic-staging-policy' };
166
+ const processFixture = Object.assign(new EventEmitter(), { pid: 123 });
167
+ const checkedPath = (path) => {
168
+ const resolved = resolve(path);
169
+ const local = relative(f.home, resolved);
170
+ assert.ok(local !== '..' && !local.startsWith(`..${sep}`) && !resolve(local).startsWith(`${sep}${sep}`), 'foreign fixture filesystem path');
171
+ assert.ok(resolved === f.home || resolved.startsWith(f.home + sep), 'fixture filesystem containment');
172
+ return resolved;
173
+ };
174
+ const result = await new Script(`${declaration}\nrelayStart(flags);`, { filename: 'synthetic-relay-staging-fixture.js' }).runInNewContext({
175
+ flags, process: processFixture, performance, Date, Map, Promise, Number, Error,
176
+ resolve, mkdir: (path, options) => mkdir(checkedPath(path), options),
177
+ writeFile: (path, bytes, options) => writeFile(checkedPath(path), bytes, options),
178
+ rm: (path, options) => rm(checkedPath(path), options),
179
+ setTimeout, canonicalize, sha256,
180
+ required: (options, name) => options.get(name),
181
+ registry: async () => [workspace], loadVerifiedWorkspacePolicy: async () => policy,
182
+ client: async () => Object.freeze({ fixture: true }), dharmaHome: () => f.home,
183
+ RepositorySourceWatcher: class {
184
+ invalidate() { }
185
+ },
186
+ loadVaultModule: async () => ({ LocalVault: { open: async () => ({ close: () => { vaultCloses++; } }) },
187
+ loadOrCreateVaultMasterKey: async () => Buffer.alloc(32) }),
188
+ rawLocalRetentionDays: () => 1,
189
+ providerAdapters: [{ providerId: 'codex', capability: async () => ({ skillInstall: 'available' }) }],
190
+ isLocalProviderId: (provider) => provider === 'codex', prepareProvidersIndependently,
191
+ withSkillPreparationTransaction: async (_input, operation) => operation(),
192
+ skillPreparationScopeRoot, serializeSkillPreparationRecord,
193
+ publishSkillPreparationCache: await publisher(),
194
+ prepareSkillUpdate: async () => {
195
+ const sourceRoot = roots[preparedCount++];
196
+ assert.ok(sourceRoot, 'unexpected extra preparation');
197
+ return { sourceRoot, config: { organizationId: 'org_test', deviceId: f.record.deviceId },
198
+ workspace, policy, rollout: { id: f.record.rolloutId }, bundle: f.record.bundle,
199
+ assertCurrent: () => { if (stopped)
200
+ throw new Error('fixture stopped'); } };
201
+ },
202
+ startSkillPreparationPump: (input) => {
203
+ const assertRunning = () => { if (stopped)
204
+ throw new Error('fixture stopped'); };
205
+ flight = Promise.resolve().then(async () => { for (let index = 0; index < cycles; index++)
206
+ await input.prepare(assertRunning); });
207
+ return { requestStop: () => { stopped = true; }, stop: async () => { await flight; stopped = true; } };
208
+ },
209
+ deferUnavailableRelayRetention: async (operation) => ({ state: 'completed', value: await operation() }),
210
+ finalizeRecoveredSignedTaskTrajectories: async () => [], syncWorkspacePolicy: async () => { },
211
+ scanRepositorySourceChanges: async () => ({ state: 'fixture_unchanged', localMutation: false }),
212
+ repositorySharedReady: async () => false,
213
+ installedRepositoryKnowledge: async () => null, syncPendingRetentionCapsules: async () => 0,
214
+ processEvidenceRequest: async () => ({}),
215
+ executeOneTask: async () => { transportCalls++; await flight; return {}; },
216
+ });
217
+ assert.equal(vaultCloses, 1);
218
+ assert.equal(transportCalls, 1);
219
+ assert.equal(preparedCount, cycles, 'production staging callback must actually execute');
220
+ assert.equal(processFixture.listenerCount('SIGINT'), 0);
221
+ assert.equal(processFixture.listenerCount('SIGTERM'), 0);
222
+ return { result, roots };
223
+ }
224
+ test('actual relay staging publishes a recoverable pointer without live dependencies', async (t) => {
225
+ const f = await fixture(false);
226
+ try {
227
+ const { result } = await runActualRelay(f, 1, message => t.diagnostic(message));
228
+ assert.equal(result.skillPreparationsCompleted, 1, 'baseline staging must succeed before recovery assertions');
229
+ assert.equal(result.skillPreparationFailures, 0);
230
+ const pointer = JSON.parse(await readFile(join(f.scopeRoot, 'CURRENT.json'), 'utf8'));
231
+ assert.equal(pointer.sourceDirectory, f.sourceRoot.slice(f.scopeRoot.length + 1));
232
+ assert.equal(pointer.activationAuthorized, false);
233
+ }
234
+ finally {
235
+ await rm(f.home, { recursive: true, force: true });
236
+ }
237
+ });
238
+ test('actual relay second preparation preserves the previous snapshot pending safe retention', async (t) => {
239
+ const f = await fixture(false);
240
+ try {
241
+ const { result, roots } = await runActualRelay(f, 2, message => t.diagnostic(message));
242
+ assert.equal(result.skillPreparationsCompleted, 2, 'both baseline callbacks must stage successfully');
243
+ assert.equal(result.skillPreparationFailures, 0);
244
+ await readFile(join(roots[0], 'PREPARED.json'), 'utf8');
245
+ await readFile(join(roots[1], 'PREPARED.json'), 'utf8');
246
+ }
247
+ finally {
248
+ await rm(f.home, { recursive: true, force: true });
249
+ }
250
+ });
251
+ test('fresh actual relay invocation leaves durable publication inspectable without inherited Map state', async (t) => {
252
+ const f = await fixture(false);
253
+ try {
254
+ const first = await runActualRelay(f, 1, message => t.diagnostic(message));
255
+ assert.equal(first.result.skillPreparationsCompleted, 1);
256
+ assert.equal(first.result.skillPreparationFailures, 0);
257
+ const restarted = await runActualRelay(f, 0, message => t.diagnostic(message));
258
+ assert.equal(restarted.result.skillPreparationsCompleted, 0);
259
+ assert.equal(restarted.result.skillPreparationFailures, 0);
260
+ const pointer = JSON.parse(await readFile(join(f.scopeRoot, 'CURRENT.json'), 'utf8'));
261
+ assert.equal(pointer.sourceDirectory, f.sourceRoot.slice(f.scopeRoot.length + 1));
262
+ assert.equal(pointer.activationAuthorized, false);
263
+ }
264
+ finally {
265
+ await rm(f.home, { recursive: true, force: true });
266
+ }
267
+ });
268
+ test('preparation cache rejects non-UTF8 metadata even when decoded text matches', async () => {
269
+ const f = await fixture();
270
+ let committed = false;
271
+ try {
272
+ f.record.rolloutId = 'fixture-\uFFFD';
273
+ f.expected.rolloutId = f.record.rolloutId;
274
+ f.recordBytes = await serializeSkillPreparationRecord(f.record);
275
+ const expected = Buffer.from(f.recordBytes, 'utf8');
276
+ const offset = expected.indexOf(Buffer.from('\uFFFD', 'utf8'));
277
+ assert.ok(offset >= 0, 'fixture must include literal replacement-character bytes');
278
+ const invalid = Buffer.concat([expected.subarray(0, offset), Buffer.from([255]), expected.subarray(offset + 3)]);
279
+ assert.equal(invalid.toString('utf8'), f.recordBytes, 'decoded text alone must collide');
280
+ assert.notDeepEqual(invalid, expected, 'persisted bytes must differ');
281
+ await writeFile(join(f.sourceRoot, 'PREPARED.json'), invalid);
282
+ await assert.rejects((await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex',
283
+ assertCurrent: () => { }, onCommitted: () => { committed = true; } }), /UTF|bytes|metadata/);
284
+ assert.equal(committed, false);
285
+ await assert.rejects(readFile(join(f.scopeRoot, 'CURRENT.json')), { code: 'ENOENT' });
286
+ }
287
+ finally {
288
+ await rm(f.home, { recursive: true, force: true });
289
+ }
290
+ });
291
+ test('preparation cache rejects a replaced synced pointer before commit', async () => {
292
+ const f = await fixture();
293
+ let committed = false;
294
+ let substituted = false;
295
+ try {
296
+ await assert.rejects((await publisher())({ ...f, workspaceId: WORKSPACE, provider: 'codex',
297
+ assertCurrent: () => {
298
+ if (substituted)
299
+ return;
300
+ const temporary = readdirSync(f.scopeRoot).find(name => name.startsWith('.CURRENT-'));
301
+ if (!temporary)
302
+ return;
303
+ const path = join(f.scopeRoot, temporary);
304
+ renameSync(path, join(f.scopeRoot, 'fixture-original-synced-pointer.json'));
305
+ writeFileSync(path, '{"fixture_substitution":true}\n', { mode: 0o600, flag: 'wx' });
306
+ substituted = true;
307
+ }, onCommitted: () => { committed = true; } }), /identity|changed|file|pointer/);
308
+ assert.equal(substituted, true, 'fixture must reach the real post-sync pre-rename window');
309
+ assert.equal(committed, false);
310
+ await assert.rejects(readFile(join(f.scopeRoot, 'CURRENT.json')), { code: 'ENOENT' });
311
+ }
312
+ finally {
313
+ await rm(f.home, { recursive: true, force: true });
314
+ }
315
+ });
316
+ //# sourceMappingURL=skillPreparationCache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationCache.test.js","sourceRoot":"","sources":["../src/skillPreparationCache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skillPreparationCaller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationCaller.test.d.ts","sourceRoot":"","sources":["../src/skillPreparationCaller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import assert from 'node:assert/strict';
2
+ import { readFile } from 'node:fs/promises';
3
+ import test from 'node:test';
4
+ test('actual explicit skill sync consumes shared preparation before activation', async () => {
5
+ const source = await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
6
+ const activation = source.slice(source.indexOf('async function activatePreparedSkillUpdate('), source.indexOf('async function skillSync('));
7
+ const sync = source.slice(source.indexOf('async function skillSync('), source.indexOf('async function installedRepositoryKnowledge('));
8
+ assert.match(sync, /await prepareSkillUpdate\(/);
9
+ assert.match(sync, /activatePreparedSkillUpdate\(/);
10
+ assert.match(activation, /await installSkillBundle\(/);
11
+ });
12
+ test('actual relay starts independent staging and stops it before closing resources', async () => {
13
+ const source = await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
14
+ const relay = source.slice(source.indexOf('async function relayStart('), source.indexOf('export async function run('));
15
+ assert.match(relay, /startSkillPreparationPump\(/);
16
+ assert.ok(relay.indexOf('startSkillPreparationPump(') < relay.indexOf('await executeOneTask('));
17
+ assert.match(relay, /await skillPreparationPump\.stop\(\);\s*vault\.close\(\)/);
18
+ assert.doesNotMatch(relay, /await skillSync\(/);
19
+ });
20
+ test('actual provider staging uses independently isolated failures', async () => {
21
+ const source = await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
22
+ const relay = source.slice(source.indexOf('async function relayStart('), source.indexOf('export async function run('));
23
+ assert.match(relay, /await prepareProvidersIndependently\(providerAdapters, assertRunning/);
24
+ });
25
+ test('actual relay consumes a verified cache only after an idle task boundary and falls back to fresh preparation', async () => {
26
+ const source = await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
27
+ const relay = source.slice(source.indexOf('async function relayStart('), source.indexOf('export async function run('));
28
+ assert.ok(relay.indexOf('const result = await executeOneTask(') < relay.indexOf('await takeCachedSkillUpdate('));
29
+ assert.match(relay, /const prepared = cached \|\| await prepareSkillUpdate\(/);
30
+ assert.ok(relay.indexOf('await takeCachedSkillUpdate(') < relay.indexOf('await activatePreparedSkillUpdate('));
31
+ });
32
+ //# sourceMappingURL=skillPreparationCaller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationCaller.test.js","sourceRoot":"","sources":["../src/skillPreparationCaller.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function prepareProvidersIndependently<T>(providers: readonly T[], assertRunning: () => void, prepare: (provider: T) => Promise<void>, onError: (provider: T, error: unknown) => void): Promise<void>;
2
+ export declare function startSkillPreparationPump(input: {
3
+ prepare: (assertRunning: () => void) => Promise<void>;
4
+ intervalMs?: number;
5
+ onError?: (error: unknown) => void;
6
+ }): {
7
+ requestStop: () => void;
8
+ stop(): Promise<void>;
9
+ readonly running: boolean;
10
+ };
11
+ //# sourceMappingURL=skillPreparationPump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationPump.d.ts","sourceRoot":"","sources":["../src/skillPreparationPump.ts"],"names":[],"mappings":"AAAA,wBAAsB,6BAA6B,CAAC,CAAC,EACnD,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,IAAI,EAClD,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,iBAOxF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;;;;EAsBA"}
@@ -0,0 +1,41 @@
1
+ export async function prepareProvidersIndependently(providers, assertRunning, prepare, onError) {
2
+ for (const provider of providers) {
3
+ assertRunning();
4
+ try {
5
+ await prepare(provider);
6
+ assertRunning();
7
+ }
8
+ catch (error) {
9
+ assertRunning();
10
+ onError(provider, error);
11
+ }
12
+ }
13
+ }
14
+ export function startSkillPreparationPump(input) {
15
+ const intervalMs = input.intervalMs ?? 60_000;
16
+ if (!Number.isSafeInteger(intervalMs) || intervalMs < 1)
17
+ throw new Error('Preparation interval is invalid.');
18
+ let stopped = false;
19
+ let flight = null;
20
+ const assertRunning = () => { if (stopped)
21
+ throw new Error('Skill preparation stopped.'); };
22
+ const tick = () => {
23
+ if (stopped || flight)
24
+ return;
25
+ // A logical deadline must never release ownership of a still-running call.
26
+ flight = Promise.resolve().then(() => { assertRunning(); return input.prepare(assertRunning); })
27
+ .catch(error => { if (!stopped)
28
+ input.onError?.(error); })
29
+ .finally(() => { flight = null; });
30
+ };
31
+ const timer = setInterval(tick, intervalMs);
32
+ timer.unref();
33
+ tick();
34
+ const requestStop = () => { stopped = true; clearInterval(timer); };
35
+ return {
36
+ requestStop,
37
+ async stop() { requestStop(); await flight; },
38
+ get running() { return flight !== null; },
39
+ };
40
+ }
41
+ //# sourceMappingURL=skillPreparationPump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationPump.js","sourceRoot":"","sources":["../src/skillPreparationPump.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,SAAuB,EAAE,aAAyB,EAClD,OAAuC,EAAE,OAA8C;IAEvF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,aAAa,EAAE,CAAC;QAChB,IAAI,CAAC;YAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;YAAC,aAAa,EAAE,CAAC;QAAC,CAAC;QACjD,OAAO,KAAK,EAAE,CAAC;YAAC,aAAa,EAAE,CAAC;YAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAIzC;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7G,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAyB,IAAI,CAAC;IACxC,MAAM,aAAa,GAAG,GAAG,EAAE,GAAG,IAAI,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,IAAI,OAAO,IAAI,MAAM;YAAE,OAAO;QAC9B,2EAA2E;QAC3E,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7F,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACzD,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,EAAE,CAAC;IACP,MAAM,WAAW,GAAG,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO;QACL,WAAW;QACX,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skillPreparationPump.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationPump.test.d.ts","sourceRoot":"","sources":["../src/skillPreparationPump.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { setTimeout as sleep } from 'node:timers/promises';
4
+ import { prepareProvidersIndependently, startSkillPreparationPump } from './skillPreparationPump.js';
5
+ test('independent preparation continues while a separate task is pending', async () => {
6
+ let count = 0;
7
+ let completeTask;
8
+ const task = new Promise(resolve => { completeTask = resolve; });
9
+ const pump = startSkillPreparationPump({ intervalMs: 5, prepare: async (check) => { check(); count++; } });
10
+ try {
11
+ await sleep(40);
12
+ assert.ok(count >= 2);
13
+ completeTask();
14
+ await task;
15
+ }
16
+ finally {
17
+ await pump.stop();
18
+ }
19
+ });
20
+ test('single-flight ownership is retained until a blocked preparation settles', async () => {
21
+ let count = 0;
22
+ let release;
23
+ const blocked = new Promise(resolve => { release = resolve; });
24
+ const pump = startSkillPreparationPump({ intervalMs: 2, prepare: async () => { count++; await blocked; } });
25
+ await sleep(25);
26
+ assert.equal(count, 1);
27
+ assert.equal(pump.running, true);
28
+ let closed = false;
29
+ const closing = pump.stop().then(() => { closed = true; });
30
+ await sleep(15);
31
+ assert.equal(closed, false);
32
+ assert.equal(count, 1);
33
+ release();
34
+ await closing;
35
+ assert.equal(pump.running, false);
36
+ });
37
+ test('signal-shaped stop prevents post-await publication and future cycles', async () => {
38
+ let release;
39
+ const blocked = new Promise(resolve => { release = resolve; });
40
+ let started = 0, published = 0, errors = 0;
41
+ const pump = startSkillPreparationPump({ intervalMs: 2, onError: () => { errors++; },
42
+ prepare: async (check) => { started++; await blocked; check(); published++; } });
43
+ await sleep(10);
44
+ pump.requestStop();
45
+ release();
46
+ await pump.stop();
47
+ await sleep(15);
48
+ assert.equal(started, 1);
49
+ assert.equal(published, 0);
50
+ assert.equal(errors, 0);
51
+ });
52
+ test('a failed preparation releases ownership for a later retry', async () => {
53
+ let count = 0, errors = 0;
54
+ const pump = startSkillPreparationPump({ intervalMs: 5, onError: () => { errors++; },
55
+ prepare: async () => { count++; if (count === 1)
56
+ throw new Error('fixture'); } });
57
+ try {
58
+ await sleep(30);
59
+ assert.ok(count >= 2);
60
+ assert.equal(errors, 1);
61
+ }
62
+ finally {
63
+ await pump.stop();
64
+ }
65
+ });
66
+ test('first provider failure cannot starve a later authorized provider', async () => {
67
+ const calls = [], failures = [];
68
+ await prepareProvidersIndependently(['codex', 'claude'], () => { }, async (provider) => {
69
+ calls.push(provider);
70
+ if (provider === 'codex')
71
+ throw new Error('denied fixture');
72
+ }, provider => { failures.push(provider); });
73
+ assert.deepEqual(calls, ['codex', 'claude']);
74
+ assert.deepEqual(failures, ['codex']);
75
+ });
76
+ test('stop during a provider failure prevents subsequent provider work', async () => {
77
+ const calls = [];
78
+ let stopped = false;
79
+ await assert.rejects(() => prepareProvidersIndependently(['codex', 'claude'], () => { if (stopped)
80
+ throw new Error('stopped'); }, async (provider) => {
81
+ calls.push(provider);
82
+ stopped = true;
83
+ throw new Error('fixture');
84
+ }, () => { throw new Error('Should not report a stopped cycle.'); }), /stopped/);
85
+ assert.deepEqual(calls, ['codex']);
86
+ });
87
+ //# sourceMappingURL=skillPreparationPump.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationPump.test.js","sourceRoot":"","sources":["../src/skillPreparationPump.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function serializeSkillPreparationRecord(value: unknown): Promise<string>;
2
+ //# sourceMappingURL=skillPreparationRecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationRecord.d.ts","sourceRoot":"","sources":["../src/skillPreparationRecord.ts"],"names":[],"mappings":"AAKA,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BrF"}
@@ -0,0 +1,36 @@
1
+ import { resolve } from 'node:path';
2
+ import { canonicalize, sha256, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
3
+ // This validates a cache record, not signing, publication or installation authority.
4
+ export async function serializeSkillPreparationRecord(value) {
5
+ const bytes = canonicalize(value) + '\n';
6
+ if (Buffer.byteLength(bytes) > 3 * 1024 * 1024)
7
+ throw new Error('Skill preparation metadata exceeds its byte limit.');
8
+ const record = JSON.parse(bytes);
9
+ const valid = await validateContract(resolve(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/skill-preparation/v1', record);
10
+ if (!valid.ok)
11
+ throw new Error('Skill preparation record does not match its contract.');
12
+ const bundle = record.bundle;
13
+ if (bundle.organizationId !== record.organizationId)
14
+ throw new Error('Skill preparation organization mismatch.');
15
+ for (const [selectors, target] of [[bundle.targetSelectors.organizationAgentIds, record.repositoryAgentId],
16
+ [bundle.targetSelectors.deviceIds, record.deviceId], [bundle.targetSelectors.workspaceIds, record.workspaceId],
17
+ [bundle.targetSelectors.providers, record.provider]]) {
18
+ if (selectors.length && !selectors.includes(target))
19
+ throw new Error('Skill preparation target mismatch.');
20
+ }
21
+ if (record.repositoryPackage !== null) {
22
+ const { envelope, index } = record.repositoryPackage;
23
+ const descriptor = envelope.descriptor;
24
+ for (const key of ['organizationId', 'repositoryAgentId', 'repositoryBindingId']) {
25
+ if (!record[key] || descriptor[key] !== record[key] || index[key] !== record[key]) {
26
+ throw new Error('Skill preparation repository scope mismatch.');
27
+ }
28
+ }
29
+ if (envelope.bundleId !== bundle.bundleId || envelope.bundleHash !== bundle.bundleHash
30
+ || descriptor.transferIndexHash !== sha256(canonicalize(index))) {
31
+ throw new Error('Skill preparation provenance mismatch.');
32
+ }
33
+ }
34
+ return bytes;
35
+ }
36
+ //# sourceMappingURL=skillPreparationRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillPreparationRecord.js","sourceRoot":"","sources":["../src/skillPreparationRecord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAGhG,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,KAAc;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACtH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAC1E,mDAAmD,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAqB,CAAC;IAC5C,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACjH,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,oBAAoB,EAAE,MAAM,CAAC,iBAAiB,CAAC;QACxG,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC;QAC9G,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAU,EAAE,CAAC;QAChE,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAe,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,iBAA0F,CAAC;QAC9H,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAqC,CAAC;QAClE,KAAK,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClF,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;eACjF,UAAU,CAAC,iBAAiB,KAAK,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}