@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.
- package/dist/index.d.ts +92 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +846 -180
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +25 -3
- package/dist/index.test.js.map +1 -1
- package/dist/repositoryCandidateSync.d.ts +55 -0
- package/dist/repositoryCandidateSync.d.ts.map +1 -0
- package/dist/repositoryCandidateSync.js +177 -0
- package/dist/repositoryCandidateSync.js.map +1 -0
- package/dist/repositoryCandidateSync.test.d.ts +2 -0
- package/dist/repositoryCandidateSync.test.d.ts.map +1 -0
- package/dist/repositoryCandidateSync.test.js +141 -0
- package/dist/repositoryCandidateSync.test.js.map +1 -0
- package/dist/repositoryInstalledKnowledge.d.ts +13 -0
- package/dist/repositoryInstalledKnowledge.d.ts.map +1 -0
- package/dist/repositoryInstalledKnowledge.js +25 -0
- package/dist/repositoryInstalledKnowledge.js.map +1 -0
- package/dist/repositoryInstallerFiles.d.ts +6 -0
- package/dist/repositoryInstallerFiles.d.ts.map +1 -0
- package/dist/repositoryInstallerFiles.js +113 -0
- package/dist/repositoryInstallerFiles.js.map +1 -0
- package/dist/repositoryKnowledge.d.ts +119 -0
- package/dist/repositoryKnowledge.d.ts.map +1 -0
- package/dist/repositoryKnowledge.js +462 -0
- package/dist/repositoryKnowledge.js.map +1 -0
- package/dist/repositoryKnowledge.test.d.ts +2 -0
- package/dist/repositoryKnowledge.test.d.ts.map +1 -0
- package/dist/repositoryKnowledge.test.js +245 -0
- package/dist/repositoryKnowledge.test.js.map +1 -0
- package/dist/repositoryKnowledgeRetention.test.d.ts +2 -0
- package/dist/repositoryKnowledgeRetention.test.d.ts.map +1 -0
- package/dist/repositoryKnowledgeRetention.test.js +386 -0
- package/dist/repositoryKnowledgeRetention.test.js.map +1 -0
- package/dist/repositoryOnboardingCaller.test.d.ts +2 -0
- package/dist/repositoryOnboardingCaller.test.d.ts.map +1 -0
- package/dist/repositoryOnboardingCaller.test.js +197 -0
- package/dist/repositoryOnboardingCaller.test.js.map +1 -0
- package/dist/repositoryOnboardingFlow.test.d.ts +2 -0
- package/dist/repositoryOnboardingFlow.test.d.ts.map +1 -0
- package/dist/repositoryOnboardingFlow.test.js +47 -0
- package/dist/repositoryOnboardingFlow.test.js.map +1 -0
- package/dist/repositoryPackage.d.ts +115 -0
- package/dist/repositoryPackage.d.ts.map +1 -0
- package/dist/repositoryPackage.js +1095 -0
- package/dist/repositoryPackage.js.map +1 -0
- package/dist/repositoryPackage.test.d.ts +2 -0
- package/dist/repositoryPackage.test.d.ts.map +1 -0
- package/dist/repositoryPackage.test.js +709 -0
- package/dist/repositoryPackage.test.js.map +1 -0
- package/dist/repositoryPackageDelivery.d.ts +29 -0
- package/dist/repositoryPackageDelivery.d.ts.map +1 -0
- package/dist/repositoryPackageDelivery.js +140 -0
- package/dist/repositoryPackageDelivery.js.map +1 -0
- package/dist/repositoryPackageDelivery.test.d.ts +2 -0
- package/dist/repositoryPackageDelivery.test.d.ts.map +1 -0
- package/dist/repositoryPackageDelivery.test.js +787 -0
- package/dist/repositoryPackageDelivery.test.js.map +1 -0
- package/dist/repositoryPackageDeliveryCaller.test.d.ts +2 -0
- package/dist/repositoryPackageDeliveryCaller.test.d.ts.map +1 -0
- package/dist/repositoryPackageDeliveryCaller.test.js +18 -0
- package/dist/repositoryPackageDeliveryCaller.test.js.map +1 -0
- package/dist/repositoryPackageDeliveryPreflight.test.d.ts +2 -0
- package/dist/repositoryPackageDeliveryPreflight.test.d.ts.map +1 -0
- package/dist/repositoryPackageDeliveryPreflight.test.js +29 -0
- package/dist/repositoryPackageDeliveryPreflight.test.js.map +1 -0
- package/dist/repositoryPackageTransfer.d.ts +85 -0
- package/dist/repositoryPackageTransfer.d.ts.map +1 -0
- package/dist/repositoryPackageTransfer.js +233 -0
- package/dist/repositoryPackageTransfer.js.map +1 -0
- package/dist/repositoryPackageTransfer.test.d.ts +2 -0
- package/dist/repositoryPackageTransfer.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransfer.test.js +173 -0
- package/dist/repositoryPackageTransfer.test.js.map +1 -0
- package/dist/repositoryPackageTransferV2.test.d.ts +2 -0
- package/dist/repositoryPackageTransferV2.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransferV2.test.js +549 -0
- package/dist/repositoryPackageTransferV2.test.js.map +1 -0
- package/dist/repositoryPackageTransferV2Schema.test.d.ts +2 -0
- package/dist/repositoryPackageTransferV2Schema.test.d.ts.map +1 -0
- package/dist/repositoryPackageTransferV2Schema.test.js +48 -0
- package/dist/repositoryPackageTransferV2Schema.test.js.map +1 -0
- package/dist/repositoryReleaseMetadata.d.ts +37 -0
- package/dist/repositoryReleaseMetadata.d.ts.map +1 -0
- package/dist/repositoryReleaseMetadata.js +251 -0
- package/dist/repositoryReleaseMetadata.js.map +1 -0
- package/dist/repositoryReleaseMetadata.test.d.ts +2 -0
- package/dist/repositoryReleaseMetadata.test.d.ts.map +1 -0
- package/dist/repositoryReleaseMetadata.test.js +297 -0
- package/dist/repositoryReleaseMetadata.test.js.map +1 -0
- package/dist/repositoryRoleDerivation.d.ts +11 -0
- package/dist/repositoryRoleDerivation.d.ts.map +1 -0
- package/dist/repositoryRoleDerivation.js +59 -0
- package/dist/repositoryRoleDerivation.js.map +1 -0
- package/dist/repositoryRoleDerivation.test.d.ts +2 -0
- package/dist/repositoryRoleDerivation.test.d.ts.map +1 -0
- package/dist/repositoryRoleDerivation.test.js +33 -0
- package/dist/repositoryRoleDerivation.test.js.map +1 -0
- package/dist/repositoryRoleMetadata.d.ts +63 -0
- package/dist/repositoryRoleMetadata.d.ts.map +1 -0
- package/dist/repositoryRoleMetadata.js +203 -0
- package/dist/repositoryRoleMetadata.js.map +1 -0
- package/dist/repositoryRoleMetadata.test.d.ts +2 -0
- package/dist/repositoryRoleMetadata.test.d.ts.map +1 -0
- package/dist/repositoryRoleMetadata.test.js +296 -0
- package/dist/repositoryRoleMetadata.test.js.map +1 -0
- package/dist/repositoryRoleQuestion.d.ts +36 -0
- package/dist/repositoryRoleQuestion.d.ts.map +1 -0
- package/dist/repositoryRoleQuestion.js +68 -0
- package/dist/repositoryRoleQuestion.js.map +1 -0
- package/dist/repositoryRoleQuestion.test.d.ts +2 -0
- package/dist/repositoryRoleQuestion.test.d.ts.map +1 -0
- package/dist/repositoryRoleQuestion.test.js +66 -0
- package/dist/repositoryRoleQuestion.test.js.map +1 -0
- package/dist/repositorySourceAuthorization.d.ts +43 -0
- package/dist/repositorySourceAuthorization.d.ts.map +1 -0
- package/dist/repositorySourceAuthorization.js +164 -0
- package/dist/repositorySourceAuthorization.js.map +1 -0
- package/dist/repositorySourceCapture.test.d.ts +2 -0
- package/dist/repositorySourceCapture.test.d.ts.map +1 -0
- package/dist/repositorySourceCapture.test.js +303 -0
- package/dist/repositorySourceCapture.test.js.map +1 -0
- package/dist/repositorySourceSync.d.ts +54 -0
- package/dist/repositorySourceSync.d.ts.map +1 -0
- package/dist/repositorySourceSync.js +88 -0
- package/dist/repositorySourceSync.js.map +1 -0
- package/dist/repositorySourceSync.test.d.ts +2 -0
- package/dist/repositorySourceSync.test.d.ts.map +1 -0
- package/dist/repositorySourceSync.test.js +218 -0
- package/dist/repositorySourceSync.test.js.map +1 -0
- package/dist/schemas/repository-knowledge-retention-v1.schema.json +26 -0
- package/dist/schemas/repository-knowledge-v2.schema.json +74 -0
- package/dist/schemas/repository-knowledge.schema.json +63 -0
- package/dist/schemas/repository-package-chunk-v2.schema.json +15 -0
- package/dist/schemas/repository-package-chunk.schema.json +18 -0
- package/dist/schemas/repository-package-delivery-v1.schema.json +51 -0
- package/dist/schemas/repository-package-envelope-v1.schema.json +16 -0
- package/dist/schemas/repository-package-transfer-v2.schema.json +36 -0
- package/dist/schemas/repository-package-transfer.schema.json +34 -0
- package/dist/schemas/repository-package-v2.schema.json +491 -0
- package/dist/schemas/repository-package-v3.schema.json +36 -0
- package/dist/schemas/repository-package.schema.json +94 -0
- package/dist/schemas/repository-release-manifest.schema.json +34 -0
- package/dist/schemas/repository-role-metadata.schema.json +82 -0
- package/dist/schemas/skill-preparation-pointer-v1.schema.json +28 -0
- package/dist/schemas/skill-preparation-v1.schema.json +32 -0
- package/dist/skillPollResponse.test.d.ts +2 -0
- package/dist/skillPollResponse.test.d.ts.map +1 -0
- package/dist/skillPollResponse.test.js +37 -0
- package/dist/skillPollResponse.test.js.map +1 -0
- package/dist/skillPreparation.test.d.ts +2 -0
- package/dist/skillPreparation.test.d.ts.map +1 -0
- package/dist/skillPreparation.test.js +163 -0
- package/dist/skillPreparation.test.js.map +1 -0
- package/dist/skillPreparationCache.d.ts +34 -0
- package/dist/skillPreparationCache.d.ts.map +1 -0
- package/dist/skillPreparationCache.js +371 -0
- package/dist/skillPreparationCache.js.map +1 -0
- package/dist/skillPreparationCache.test.d.ts +2 -0
- package/dist/skillPreparationCache.test.d.ts.map +1 -0
- package/dist/skillPreparationCache.test.js +316 -0
- package/dist/skillPreparationCache.test.js.map +1 -0
- package/dist/skillPreparationCaller.test.d.ts +2 -0
- package/dist/skillPreparationCaller.test.d.ts.map +1 -0
- package/dist/skillPreparationCaller.test.js +32 -0
- package/dist/skillPreparationCaller.test.js.map +1 -0
- package/dist/skillPreparationPump.d.ts +11 -0
- package/dist/skillPreparationPump.d.ts.map +1 -0
- package/dist/skillPreparationPump.js +41 -0
- package/dist/skillPreparationPump.js.map +1 -0
- package/dist/skillPreparationPump.test.d.ts +2 -0
- package/dist/skillPreparationPump.test.d.ts.map +1 -0
- package/dist/skillPreparationPump.test.js +87 -0
- package/dist/skillPreparationPump.test.js.map +1 -0
- package/dist/skillPreparationRecord.d.ts +2 -0
- package/dist/skillPreparationRecord.d.ts.map +1 -0
- package/dist/skillPreparationRecord.js +36 -0
- package/dist/skillPreparationRecord.js.map +1 -0
- package/dist/skillPreparationTransaction.d.ts +13 -0
- package/dist/skillPreparationTransaction.d.ts.map +1 -0
- package/dist/skillPreparationTransaction.js +236 -0
- package/dist/skillPreparationTransaction.js.map +1 -0
- package/dist/skillPreparationTransaction.test.d.ts +2 -0
- package/dist/skillPreparationTransaction.test.d.ts.map +1 -0
- package/dist/skillPreparationTransaction.test.js +181 -0
- package/dist/skillPreparationTransaction.test.js.map +1 -0
- package/dist/skillSyncPolicy.test.d.ts +2 -0
- package/dist/skillSyncPolicy.test.d.ts.map +1 -0
- package/dist/skillSyncPolicy.test.js +156 -0
- package/dist/skillSyncPolicy.test.js.map +1 -0
- package/dist/usage.d.ts +1 -1
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +1 -1
- package/dist/usage.js.map +1 -1
- package/dist/windowsProcessPortability.test.d.ts +2 -0
- package/dist/windowsProcessPortability.test.d.ts.map +1 -0
- package/dist/windowsProcessPortability.test.js +14 -0
- package/dist/windowsProcessPortability.test.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { constants, fstatSync, lstatSync, readSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { lstat, open, realpath, rename, rm } from 'node:fs/promises';
|
|
4
|
+
import { basename, dirname, parse, relative, resolve, sep } from 'node:path';
|
|
5
|
+
import { canonicalize, sha256, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
6
|
+
import { serializeSkillPreparationRecord } from './skillPreparationRecord.js';
|
|
7
|
+
import { assertPrivatePath, skillPreparationScopeRoot } from './skillPreparationTransaction.js';
|
|
8
|
+
const ATTEMPT = /^attempt-[A-Za-z0-9]{6}$(?![\s\S])/;
|
|
9
|
+
const METADATA_LIMIT = 3 * 1024 * 1024;
|
|
10
|
+
function sameIdentity(left, right) {
|
|
11
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
12
|
+
}
|
|
13
|
+
function privatelyOwnedStat(stat) {
|
|
14
|
+
if (process.platform === 'win32')
|
|
15
|
+
return true;
|
|
16
|
+
const getuid = process.getuid;
|
|
17
|
+
const uid = stat.uid;
|
|
18
|
+
const mode = stat.mode;
|
|
19
|
+
return typeof getuid === 'function' && typeof uid === 'number' && typeof mode === 'number'
|
|
20
|
+
&& uid === getuid() && (mode & 0o077) === 0;
|
|
21
|
+
}
|
|
22
|
+
async function privateDirectory(path) {
|
|
23
|
+
const stat = await lstat(path);
|
|
24
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
25
|
+
throw new Error('Invalid preparation cache directory.');
|
|
26
|
+
await assertPrivatePath(path, stat);
|
|
27
|
+
return stat;
|
|
28
|
+
}
|
|
29
|
+
async function privateFile(path, limit, writable = false) {
|
|
30
|
+
const initial = await lstat(path);
|
|
31
|
+
if (!initial.isFile() || initial.isSymbolicLink() || initial.nlink !== 1 || initial.size > limit) {
|
|
32
|
+
throw new Error('Invalid preparation cache file.');
|
|
33
|
+
}
|
|
34
|
+
await assertPrivatePath(path, initial);
|
|
35
|
+
const file = await open(path, (writable ? constants.O_RDWR : constants.O_RDONLY) | (constants.O_NOFOLLOW || 0));
|
|
36
|
+
try {
|
|
37
|
+
const held = await file.stat();
|
|
38
|
+
if (!held.isFile() || held.nlink !== 1 || !sameIdentity(initial, held))
|
|
39
|
+
throw new Error('Preparation cache file changed.');
|
|
40
|
+
await assertPrivatePath(path, held);
|
|
41
|
+
const buffer = Buffer.alloc(limit + 1);
|
|
42
|
+
let length = 0;
|
|
43
|
+
while (length <= limit) {
|
|
44
|
+
const read = await file.read(buffer, length, buffer.length - length, length);
|
|
45
|
+
if (!read.bytesRead)
|
|
46
|
+
break;
|
|
47
|
+
length += read.bytesRead;
|
|
48
|
+
}
|
|
49
|
+
if (length > limit || length !== held.size)
|
|
50
|
+
throw new Error('Preparation cache file exceeds its stable byte limit.');
|
|
51
|
+
const assertStable = async () => {
|
|
52
|
+
const current = await lstat(path);
|
|
53
|
+
const now = await file.stat();
|
|
54
|
+
if (!current.isFile() || current.isSymbolicLink() || current.nlink !== 1
|
|
55
|
+
|| !sameIdentity(held, current) || !sameIdentity(held, now)
|
|
56
|
+
|| now.nlink !== 1 || now.size !== held.size || now.mtimeMs !== held.mtimeMs
|
|
57
|
+
|| current.size !== held.size || current.mtimeMs !== held.mtimeMs)
|
|
58
|
+
throw new Error('Preparation cache file changed.');
|
|
59
|
+
await assertPrivatePath(path, current);
|
|
60
|
+
await assertPrivatePath(path, now);
|
|
61
|
+
};
|
|
62
|
+
await assertStable();
|
|
63
|
+
const rawBytes = buffer.subarray(0, length);
|
|
64
|
+
let text;
|
|
65
|
+
try {
|
|
66
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(rawBytes);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error('Invalid preparation cache UTF8 bytes.');
|
|
70
|
+
}
|
|
71
|
+
return { file, rawBytes, text, assertStable };
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
await file.close();
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function syncDirectory(path, expected) {
|
|
79
|
+
if (process.platform === 'win32') {
|
|
80
|
+
if (!sameIdentity(expected, await privateDirectory(path)))
|
|
81
|
+
throw new Error('Preparation cache directory changed.');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const file = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW || 0));
|
|
85
|
+
try {
|
|
86
|
+
const held = await file.stat();
|
|
87
|
+
if (!held.isDirectory() || !sameIdentity(expected, held))
|
|
88
|
+
throw new Error('Preparation cache directory changed.');
|
|
89
|
+
await assertPrivatePath(path, held);
|
|
90
|
+
await file.sync();
|
|
91
|
+
if (!sameIdentity(held, await privateDirectory(path)))
|
|
92
|
+
throw new Error('Preparation cache directory changed.');
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
await file.close();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Caller holds the scoped OS transaction. Cache provenance is never activation authority.
|
|
99
|
+
// onCommitted must synchronously, non-throwingly transfer root ownership to the caller.
|
|
100
|
+
export async function publishSkillPreparationCache(input) {
|
|
101
|
+
input.assertCurrent();
|
|
102
|
+
const home = await realpath(resolve(input.home));
|
|
103
|
+
const scopeRoot = skillPreparationScopeRoot(home, input.workspaceId, input.provider);
|
|
104
|
+
const sourceRoot = await realpath(resolve(input.sourceRoot));
|
|
105
|
+
if (dirname(sourceRoot) !== scopeRoot || !ATTEMPT.test(basename(sourceRoot)))
|
|
106
|
+
throw new Error('Preparation cache scope mismatch.');
|
|
107
|
+
if (Buffer.byteLength(input.recordBytes) > METADATA_LIMIT)
|
|
108
|
+
throw new Error('Preparation metadata exceeds its limit.');
|
|
109
|
+
let ancestor = parse(home).root;
|
|
110
|
+
for (const part of relative(ancestor, sourceRoot).split(sep).filter(Boolean)) {
|
|
111
|
+
ancestor = resolve(ancestor, part);
|
|
112
|
+
const stat = await lstat(ancestor);
|
|
113
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
114
|
+
throw new Error('Invalid preparation cache ancestor.');
|
|
115
|
+
input.assertCurrent();
|
|
116
|
+
}
|
|
117
|
+
const directories = new Map();
|
|
118
|
+
for (const path of [home, resolve(home, 'relay'), resolve(home, 'relay', 'skill-pending-sources'), scopeRoot, sourceRoot]) {
|
|
119
|
+
directories.set(path, await privateDirectory(path));
|
|
120
|
+
input.assertCurrent();
|
|
121
|
+
}
|
|
122
|
+
const assertDirectories = async () => {
|
|
123
|
+
for (const [path, stat] of directories) {
|
|
124
|
+
if (!sameIdentity(stat, await privateDirectory(path)))
|
|
125
|
+
throw new Error('Preparation cache directory changed.');
|
|
126
|
+
input.assertCurrent();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const metadata = await privateFile(resolve(sourceRoot, 'PREPARED.json'), METADATA_LIMIT, true);
|
|
130
|
+
const pointerPath = resolve(scopeRoot, 'CURRENT.json');
|
|
131
|
+
const temporary = resolve(scopeRoot, `.CURRENT-${randomUUID()}.json`);
|
|
132
|
+
let pointerWriter;
|
|
133
|
+
let pointerCandidate;
|
|
134
|
+
let pointerIdentity;
|
|
135
|
+
let committed = false;
|
|
136
|
+
try {
|
|
137
|
+
input.assertCurrent();
|
|
138
|
+
if (!metadata.rawBytes.equals(Buffer.from(input.recordBytes, 'utf8')))
|
|
139
|
+
throw new Error('Preparation metadata bytes mismatch.');
|
|
140
|
+
const record = JSON.parse(metadata.text);
|
|
141
|
+
if (await serializeSkillPreparationRecord(record) !== metadata.text)
|
|
142
|
+
throw new Error('Preparation metadata is not canonical.');
|
|
143
|
+
input.assertCurrent();
|
|
144
|
+
const bundle = record.bundle;
|
|
145
|
+
for (const key of ['organizationId', 'deviceId', 'repositoryAgentId', 'repositoryBindingId', 'policyHash', 'rolloutId']) {
|
|
146
|
+
if (record[key] !== input.expected[key])
|
|
147
|
+
throw new Error('Preparation metadata expected scope mismatch.');
|
|
148
|
+
}
|
|
149
|
+
if (record.workspaceId !== input.workspaceId || record.provider !== input.provider
|
|
150
|
+
|| bundle.bundleId !== input.expected.bundleId || bundle.bundleHash !== input.expected.bundleHash) {
|
|
151
|
+
throw new Error('Preparation metadata workspace or bundle scope mismatch.');
|
|
152
|
+
}
|
|
153
|
+
const checkExistingPointer = async () => {
|
|
154
|
+
let previous;
|
|
155
|
+
try {
|
|
156
|
+
previous = await privateFile(pointerPath, 65536);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error.code === 'ENOENT')
|
|
160
|
+
return;
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const value = JSON.parse(previous.text);
|
|
165
|
+
const valid = await validateContract(resolve(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/skill-preparation-pointer/v1', value);
|
|
166
|
+
if (!valid.ok || value.workspaceId !== input.workspaceId || value.provider !== input.provider
|
|
167
|
+
|| !ATTEMPT.test(value.sourceDirectory))
|
|
168
|
+
throw new Error('Invalid preparation cache pointer scope.');
|
|
169
|
+
for (const key of ['organizationId', 'deviceId', 'repositoryAgentId', 'repositoryBindingId']) {
|
|
170
|
+
if (value[key] !== input.expected[key])
|
|
171
|
+
throw new Error('Foreign preparation cache pointer scope.');
|
|
172
|
+
}
|
|
173
|
+
await privateDirectory(resolve(scopeRoot, value.sourceDirectory));
|
|
174
|
+
await previous.assertStable();
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await previous.file.close();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
await checkExistingPointer();
|
|
181
|
+
input.assertCurrent();
|
|
182
|
+
const pointer = { schema: 'dharma.skill-preparation-pointer/v1', cacheId: randomUUID(),
|
|
183
|
+
organizationId: record.organizationId, deviceId: record.deviceId, workspaceId: input.workspaceId,
|
|
184
|
+
repositoryAgentId: record.repositoryAgentId, repositoryBindingId: record.repositoryBindingId,
|
|
185
|
+
provider: input.provider, policyHash: record.policyHash, rolloutId: record.rolloutId,
|
|
186
|
+
bundleId: bundle.bundleId, bundleHash: bundle.bundleHash, metadataHash: sha256(metadata.rawBytes),
|
|
187
|
+
sourceDirectory: basename(sourceRoot), preparedAt: record.preparedAt, cachedAt: new Date().toISOString(),
|
|
188
|
+
activationAuthorized: false };
|
|
189
|
+
const valid = await validateContract(resolve(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/skill-preparation-pointer/v1', pointer);
|
|
190
|
+
if (!valid.ok)
|
|
191
|
+
throw new Error('Invalid preparation cache pointer contract.');
|
|
192
|
+
input.assertCurrent();
|
|
193
|
+
await metadata.assertStable();
|
|
194
|
+
await metadata.file.sync();
|
|
195
|
+
input.assertCurrent();
|
|
196
|
+
await syncDirectory(sourceRoot, directories.get(sourceRoot));
|
|
197
|
+
input.assertCurrent();
|
|
198
|
+
const pointerBytes = Buffer.from(canonicalize(pointer) + '\n', 'utf8');
|
|
199
|
+
pointerWriter = await open(temporary, constants.O_RDWR | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW || 0), 0o600);
|
|
200
|
+
pointerIdentity = await pointerWriter.stat();
|
|
201
|
+
await assertPrivatePath(temporary, pointerIdentity);
|
|
202
|
+
await pointerWriter.writeFile(pointerBytes);
|
|
203
|
+
await pointerWriter.sync();
|
|
204
|
+
pointerIdentity = await pointerWriter.stat();
|
|
205
|
+
await assertDirectories();
|
|
206
|
+
await metadata.assertStable();
|
|
207
|
+
await checkExistingPointer();
|
|
208
|
+
pointerCandidate = await privateFile(temporary, 65536);
|
|
209
|
+
if (!pointerCandidate.rawBytes.equals(pointerBytes)
|
|
210
|
+
|| !sameIdentity(pointerIdentity, await pointerCandidate.file.stat()))
|
|
211
|
+
throw new Error('Preparation cache pointer identity changed.');
|
|
212
|
+
await pointerCandidate.assertStable();
|
|
213
|
+
input.assertCurrent();
|
|
214
|
+
// No callback or await may separate these final checks from rename invocation.
|
|
215
|
+
for (const stat of [lstatSync(temporary), fstatSync(pointerWriter.fd), fstatSync(pointerCandidate.file.fd)]) {
|
|
216
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1 || !sameIdentity(pointerIdentity, stat)
|
|
217
|
+
|| !privatelyOwnedStat(stat)
|
|
218
|
+
|| stat.size !== pointerBytes.length || stat.mtimeMs !== pointerIdentity.mtimeMs)
|
|
219
|
+
throw new Error('Preparation cache pointer identity changed.');
|
|
220
|
+
}
|
|
221
|
+
const candidateBytes = Buffer.alloc(pointerBytes.length + 1);
|
|
222
|
+
let length = 0;
|
|
223
|
+
while (length < candidateBytes.length) {
|
|
224
|
+
const read = readSync(pointerCandidate.file.fd, candidateBytes, length, candidateBytes.length - length, length);
|
|
225
|
+
if (!read)
|
|
226
|
+
break;
|
|
227
|
+
length += read;
|
|
228
|
+
}
|
|
229
|
+
if (!candidateBytes.subarray(0, length).equals(pointerBytes))
|
|
230
|
+
throw new Error('Preparation cache pointer bytes changed.');
|
|
231
|
+
for (const stat of [lstatSync(temporary), fstatSync(pointerWriter.fd), fstatSync(pointerCandidate.file.fd)]) {
|
|
232
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1 || !sameIdentity(pointerIdentity, stat)
|
|
233
|
+
|| !privatelyOwnedStat(stat)
|
|
234
|
+
|| stat.size !== pointerBytes.length || stat.mtimeMs !== pointerIdentity.mtimeMs)
|
|
235
|
+
throw new Error('Preparation cache pointer identity changed.');
|
|
236
|
+
}
|
|
237
|
+
await rename(temporary, pointerPath);
|
|
238
|
+
committed = true;
|
|
239
|
+
input.onCommitted();
|
|
240
|
+
// The cache is recoverable staging, never activation authority. Windows does
|
|
241
|
+
// not expose a portable directory fsync, so verify the committed file there;
|
|
242
|
+
// a lost directory entry only causes safe re-preparation after restart.
|
|
243
|
+
await syncDirectory(scopeRoot, directories.get(scopeRoot));
|
|
244
|
+
if (process.platform === 'win32') {
|
|
245
|
+
const committedPointer = await privateFile(pointerPath, 65536);
|
|
246
|
+
try {
|
|
247
|
+
if (!committedPointer.rawBytes.equals(pointerBytes))
|
|
248
|
+
throw new Error('Preparation cache pointer bytes changed.');
|
|
249
|
+
await committedPointer.assertStable();
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
await committedPointer.file.close();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
input.assertCurrent();
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
try {
|
|
259
|
+
if (pointerIdentity && !committed) {
|
|
260
|
+
try {
|
|
261
|
+
if (sameIdentity(pointerIdentity, lstatSync(temporary)))
|
|
262
|
+
unlinkSync(temporary);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (error.code !== 'ENOENT')
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
try {
|
|
272
|
+
await metadata.file.close();
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
try {
|
|
276
|
+
await pointerCandidate?.file.close();
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
await pointerWriter?.close();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Transfers one verified private cache root to the caller. The pointer is removed
|
|
286
|
+
// before return, so a cache can never be activated twice or mistaken for authority.
|
|
287
|
+
export async function takeSkillPreparationCache(input) {
|
|
288
|
+
input.assertCurrent();
|
|
289
|
+
const scopeRoot = skillPreparationScopeRoot(resolve(input.home), input.workspaceId, input.provider);
|
|
290
|
+
const pointerPath = resolve(scopeRoot, 'CURRENT.json');
|
|
291
|
+
let pointerFile;
|
|
292
|
+
try {
|
|
293
|
+
pointerFile = await privateFile(pointerPath, 65_536);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
if (error.code === 'ENOENT')
|
|
297
|
+
return null;
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
let metadataFile;
|
|
301
|
+
let consumingPath;
|
|
302
|
+
let pointerClosed = false;
|
|
303
|
+
try {
|
|
304
|
+
const pointer = JSON.parse(pointerFile.text);
|
|
305
|
+
const valid = await validateContract(resolve(import.meta.dirname, 'schemas'), 'https://schemas.dharma-ai.io/skill-preparation-pointer/v1', pointer);
|
|
306
|
+
if (!valid.ok || pointer.workspaceId !== input.workspaceId || pointer.provider !== input.provider
|
|
307
|
+
|| !ATTEMPT.test(pointer.sourceDirectory))
|
|
308
|
+
throw new Error('Invalid preparation cache pointer scope.');
|
|
309
|
+
for (const key of ['organizationId', 'deviceId', 'repositoryAgentId', 'repositoryBindingId', 'policyHash']) {
|
|
310
|
+
if (pointer[key] !== input[key])
|
|
311
|
+
throw new Error('Preparation cache pointer current scope mismatch.');
|
|
312
|
+
}
|
|
313
|
+
const sourceRoot = resolve(scopeRoot, pointer.sourceDirectory);
|
|
314
|
+
await privateDirectory(sourceRoot);
|
|
315
|
+
metadataFile = await privateFile(resolve(sourceRoot, 'PREPARED.json'), METADATA_LIMIT);
|
|
316
|
+
if (sha256(metadataFile.rawBytes) !== pointer.metadataHash)
|
|
317
|
+
throw new Error('Preparation cache metadata hash mismatch.');
|
|
318
|
+
const record = JSON.parse(metadataFile.text);
|
|
319
|
+
if (await serializeSkillPreparationRecord(record) !== metadataFile.text)
|
|
320
|
+
throw new Error('Preparation cache metadata is not canonical.');
|
|
321
|
+
const bundle = record.bundle;
|
|
322
|
+
for (const key of ['organizationId', 'deviceId', 'workspaceId', 'repositoryAgentId', 'repositoryBindingId', 'provider',
|
|
323
|
+
'policyHash', 'rolloutId']) {
|
|
324
|
+
if (record[key] !== pointer[key])
|
|
325
|
+
throw new Error('Preparation cache record scope mismatch.');
|
|
326
|
+
}
|
|
327
|
+
if (bundle.bundleId !== pointer.bundleId || bundle.bundleHash !== pointer.bundleHash) {
|
|
328
|
+
throw new Error('Preparation cache bundle mismatch.');
|
|
329
|
+
}
|
|
330
|
+
input.assertCurrent();
|
|
331
|
+
await pointerFile.assertStable();
|
|
332
|
+
await metadataFile.assertStable();
|
|
333
|
+
consumingPath = resolve(scopeRoot, `.CONSUMING-${pointer.cacheId}.json`);
|
|
334
|
+
const pointerIdentity = await pointerFile.file.stat();
|
|
335
|
+
const pointerBytes = Buffer.from(pointerFile.rawBytes);
|
|
336
|
+
if (process.platform === 'win32') {
|
|
337
|
+
// Windows does not permit renaming an open file. The scoped transaction
|
|
338
|
+
// serializes trusted writers; re-open the renamed entry and require the
|
|
339
|
+
// exact pre-close identity and bytes before allowing activation.
|
|
340
|
+
await pointerFile.file.close();
|
|
341
|
+
pointerClosed = true;
|
|
342
|
+
}
|
|
343
|
+
await rename(pointerPath, consumingPath);
|
|
344
|
+
if (process.platform === 'win32') {
|
|
345
|
+
const consumed = await privateFile(consumingPath, 65_536);
|
|
346
|
+
try {
|
|
347
|
+
if (!sameIdentity(pointerIdentity, await consumed.file.stat())
|
|
348
|
+
|| !consumed.rawBytes.equals(pointerBytes)) {
|
|
349
|
+
throw new Error('Preparation cache pointer changed during consumption.');
|
|
350
|
+
}
|
|
351
|
+
await consumed.assertStable();
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
await consumed.file.close();
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
input.assertCurrent();
|
|
358
|
+
await metadataFile.assertStable();
|
|
359
|
+
await rm(consumingPath, { force: true });
|
|
360
|
+
consumingPath = undefined;
|
|
361
|
+
return { sourceRoot, record };
|
|
362
|
+
}
|
|
363
|
+
finally {
|
|
364
|
+
await metadataFile?.file.close();
|
|
365
|
+
if (!pointerClosed)
|
|
366
|
+
await pointerFile.file.close();
|
|
367
|
+
if (consumingPath)
|
|
368
|
+
await rm(consumingPath, { force: true });
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=skillPreparationCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillPreparationCache.js","sourceRoot":"","sources":["../src/skillPreparationCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillPreparationCache.test.d.ts","sourceRoot":"","sources":["../src/skillPreparationCache.test.ts"],"names":[],"mappings":""}
|