@dharma-ai-labs/agent-fabric 0.2.129 → 0.2.131
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/AGENT_FABRIC_ONBOARDING.md +1 -1
- package/README.md +43 -0
- package/dist/demoEnrollment.d.ts.map +1 -1
- package/dist/demoEnrollment.js +3 -2
- package/dist/demoEnrollment.js.map +1 -1
- package/dist/demoPackage.d.ts.map +1 -1
- package/dist/demoPackage.js +29 -9
- package/dist/demoPackage.js.map +1 -1
- package/dist/demoPackage.test.js +75 -1
- package/dist/demoPackage.test.js.map +1 -1
- package/dist/demoStateRename.d.ts +7 -0
- package/dist/demoStateRename.d.ts.map +1 -0
- package/dist/demoStateRename.js +21 -0
- package/dist/demoStateRename.js.map +1 -0
- package/dist/demoStateRename.test.d.ts +2 -0
- package/dist/demoStateRename.test.d.ts.map +1 -0
- package/dist/demoStateRename.test.js +67 -0
- package/dist/demoStateRename.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -21
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +5 -2
- package/dist/index.test.js.map +1 -1
- package/dist/namedSessionPackageGate.d.ts +22 -0
- package/dist/namedSessionPackageGate.d.ts.map +1 -0
- package/dist/namedSessionPackageGate.js +135 -0
- package/dist/namedSessionPackageGate.js.map +1 -0
- package/dist/namedSessionPackageGate.test.d.ts +2 -0
- package/dist/namedSessionPackageGate.test.d.ts.map +1 -0
- package/dist/namedSessionPackageGate.test.js +20 -0
- package/dist/namedSessionPackageGate.test.js.map +1 -0
- package/dist/namedSessionRepositoryState.d.ts +65 -0
- package/dist/namedSessionRepositoryState.d.ts.map +1 -0
- package/dist/namedSessionRepositoryState.js +54 -0
- package/dist/namedSessionRepositoryState.js.map +1 -0
- package/dist/namedSessionRepositoryState.test.d.ts +2 -0
- package/dist/namedSessionRepositoryState.test.d.ts.map +1 -0
- package/dist/namedSessionRepositoryState.test.js +76 -0
- package/dist/namedSessionRepositoryState.test.js.map +1 -0
- package/dist/namedSessionService.d.ts +5 -1
- package/dist/namedSessionService.d.ts.map +1 -1
- package/dist/namedSessionService.js +26 -2
- package/dist/namedSessionService.js.map +1 -1
- package/dist/namedSessionService.test.js +47 -3
- package/dist/namedSessionService.test.js.map +1 -1
- package/dist/namedSessionTaskExport.d.ts +22 -0
- package/dist/namedSessionTaskExport.d.ts.map +1 -0
- package/dist/namedSessionTaskExport.js +158 -0
- package/dist/namedSessionTaskExport.js.map +1 -0
- package/dist/namedSessionTaskExport.test.d.ts +2 -0
- package/dist/namedSessionTaskExport.test.d.ts.map +1 -0
- package/dist/namedSessionTaskExport.test.js +385 -0
- package/dist/namedSessionTaskExport.test.js.map +1 -0
- package/dist/namedSessionTaskExportSync.d.ts +57 -0
- package/dist/namedSessionTaskExportSync.d.ts.map +1 -0
- package/dist/namedSessionTaskExportSync.js +193 -0
- package/dist/namedSessionTaskExportSync.js.map +1 -0
- package/dist/pidLock.test.js +33 -1
- package/dist/pidLock.test.js.map +1 -1
- package/dist/relayAutostart.d.ts +5 -3
- package/dist/relayAutostart.d.ts.map +1 -1
- package/dist/relayAutostart.js +151 -24
- package/dist/relayAutostart.js.map +1 -1
- package/dist/relayAutostart.test.js +138 -2
- package/dist/relayAutostart.test.js.map +1 -1
- package/dist/relaySupervisor.test.js +9 -4
- package/dist/relaySupervisor.test.js.map +1 -1
- package/dist/repositoryPackage.d.ts.map +1 -1
- package/dist/repositoryPackage.js +18 -2
- package/dist/repositoryPackage.js.map +1 -1
- package/dist/repositoryPackage.test.js +29 -0
- package/dist/repositoryPackage.test.js.map +1 -1
- package/dist/repositoryPackageDelivery.test.js +34 -1
- package/dist/repositoryPackageDelivery.test.js.map +1 -1
- package/dist/repositoryRelaySupervisor.d.ts +1 -1
- package/dist/repositoryRelaySupervisor.d.ts.map +1 -1
- package/dist/repositoryRelaySupervisor.js +3 -2
- package/dist/repositoryRelaySupervisor.js.map +1 -1
- package/dist/repositoryRelaySupervisor.test.js +17 -0
- package/dist/repositoryRelaySupervisor.test.js.map +1 -1
- package/dist/schemas/codex-task-export-upload-receipt.schema.json +24 -0
- package/dist/schemas/codex-task-observation.schema.json +99 -0
- package/dist/schemas/codex-task-replay-export.schema.json +375 -0
- package/dist/schemas/named-session-task-export-outbox.schema.json +29 -0
- package/package.json +7 -7
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare function requireNamedSessionSignedPackage(installation: {
|
|
2
|
+
signedLifecycleReady: boolean;
|
|
3
|
+
activeBundleId: string | null;
|
|
4
|
+
signedMarkerBundleId: string | null;
|
|
5
|
+
}, sharedRepositoryReady: boolean): string;
|
|
6
|
+
export interface NamedSessionPackageContent {
|
|
7
|
+
bundleId: string;
|
|
8
|
+
bundleHash: string;
|
|
9
|
+
manifestHash: string;
|
|
10
|
+
catalogHash: string;
|
|
11
|
+
skillsHash: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function readNamedSessionPackageContent(installation: {
|
|
14
|
+
signedLifecycleReady: boolean;
|
|
15
|
+
activeBundleId: string | null;
|
|
16
|
+
signedMarkerBundleId: string | null;
|
|
17
|
+
activeBundleHash: string | null;
|
|
18
|
+
workspaceId: string | null;
|
|
19
|
+
nativeSkillPath: string;
|
|
20
|
+
}, sharedRepositoryReady: boolean): Promise<NamedSessionPackageContent>;
|
|
21
|
+
export declare function verifyNamedSessionVisibleSkill(installation: Parameters<typeof readNamedSessionPackageContent>[0], sharedRepositoryReady: boolean): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=namedSessionPackageGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionPackageGate.d.ts","sourceRoot":"","sources":["../src/namedSessionPackageGate.ts"],"names":[],"mappings":"AAyCA,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACvC,qBAAqB,EAAE,OAAO,GAC7B,MAAM,CAOR;AAqCD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,8BAA8B,CAClD,YAAY,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACvD,qBAAqB,EAAE,OAAO,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAmCrC;AAED,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,GACjG,OAAO,CAAC,MAAM,CAAC,CAEjB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { lstat, open, opendir } from 'node:fs/promises';
|
|
4
|
+
import { basename, dirname, resolve } from 'node:path';
|
|
5
|
+
import { calculateBundleHash } from '@dharma-ai-labs/agent-fabric-skill-manager';
|
|
6
|
+
const BUNDLE_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
7
|
+
const MAX_SKILL_BYTES = 5 * 1024 * 1024;
|
|
8
|
+
const MAX_FILE_BYTES = 262_144;
|
|
9
|
+
async function readStableFile(path, maximumBytes) {
|
|
10
|
+
const before = await lstat(path);
|
|
11
|
+
if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.size > maximumBytes) {
|
|
12
|
+
throw new Error('named_session_skill_tree_invalid');
|
|
13
|
+
}
|
|
14
|
+
const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW || 0) | (constants.O_NONBLOCK || 0));
|
|
15
|
+
try {
|
|
16
|
+
const opened = await handle.stat();
|
|
17
|
+
if (!opened.isFile() || opened.nlink !== 1 || opened.size !== before.size
|
|
18
|
+
|| opened.ino !== before.ino || opened.dev !== before.dev) {
|
|
19
|
+
throw new Error('named_session_skill_tree_changed');
|
|
20
|
+
}
|
|
21
|
+
const buffer = Buffer.alloc(before.size + 1);
|
|
22
|
+
let size = 0;
|
|
23
|
+
while (size < buffer.length) {
|
|
24
|
+
const result = await handle.read(buffer, size, buffer.length - size, size);
|
|
25
|
+
if (!result.bytesRead)
|
|
26
|
+
break;
|
|
27
|
+
size += result.bytesRead;
|
|
28
|
+
}
|
|
29
|
+
const after = await handle.stat();
|
|
30
|
+
const current = await lstat(path);
|
|
31
|
+
if (size !== before.size || !current.isFile() || current.nlink !== 1
|
|
32
|
+
|| current.ino !== before.ino || current.dev !== before.dev
|
|
33
|
+
|| after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs
|
|
34
|
+
|| current.mtimeMs !== after.mtimeMs || current.ctimeMs !== after.ctimeMs) {
|
|
35
|
+
throw new Error('named_session_skill_tree_changed');
|
|
36
|
+
}
|
|
37
|
+
return buffer.subarray(0, size);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await handle.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function requireNamedSessionSignedPackage(installation, sharedRepositoryReady) {
|
|
44
|
+
if (!sharedRepositoryReady || installation.signedLifecycleReady !== true
|
|
45
|
+
|| !installation.activeBundleId || !BUNDLE_ID.test(installation.activeBundleId)
|
|
46
|
+
|| installation.signedMarkerBundleId !== installation.activeBundleId) {
|
|
47
|
+
throw new Error('named_session_repository_package_pending');
|
|
48
|
+
}
|
|
49
|
+
return installation.activeBundleId;
|
|
50
|
+
}
|
|
51
|
+
async function skillTree(root) {
|
|
52
|
+
const files = new Map();
|
|
53
|
+
const hash = createHash('sha256');
|
|
54
|
+
let entries = 0, totalBytes = 0;
|
|
55
|
+
async function visit(path, prefix, depth) {
|
|
56
|
+
if (++entries > 4096 || depth > 12)
|
|
57
|
+
throw new Error('named_session_skill_tree_limit');
|
|
58
|
+
const before = await lstat(path);
|
|
59
|
+
if (before.isSymbolicLink())
|
|
60
|
+
throw new Error('named_session_skill_tree_invalid');
|
|
61
|
+
if (before.isDirectory()) {
|
|
62
|
+
const names = [];
|
|
63
|
+
const directory = await opendir(path);
|
|
64
|
+
for await (const entry of directory) {
|
|
65
|
+
if (names.length >= 4096)
|
|
66
|
+
throw new Error('named_session_skill_tree_limit');
|
|
67
|
+
names.push(entry.name);
|
|
68
|
+
}
|
|
69
|
+
for (const name of names.sort())
|
|
70
|
+
await visit(resolve(path, name), `${prefix}${name}/`, depth + 1);
|
|
71
|
+
const after = await lstat(path);
|
|
72
|
+
if (after.ino !== before.ino || after.dev !== before.dev || after.mtimeMs !== before.mtimeMs
|
|
73
|
+
|| after.ctimeMs !== before.ctimeMs)
|
|
74
|
+
throw new Error('named_session_skill_tree_changed');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!before.isFile() || before.nlink !== 1 || before.size > MAX_FILE_BYTES) {
|
|
78
|
+
throw new Error('named_session_skill_tree_invalid');
|
|
79
|
+
}
|
|
80
|
+
const bytes = await readStableFile(path, MAX_FILE_BYTES);
|
|
81
|
+
totalBytes += bytes.length;
|
|
82
|
+
if (totalBytes > MAX_SKILL_BYTES)
|
|
83
|
+
throw new Error('named_session_skill_tree_limit');
|
|
84
|
+
const relative = prefix.slice(basename(root).length + 1, -1);
|
|
85
|
+
files.set(relative, createHash('sha256').update(bytes).digest('hex'));
|
|
86
|
+
hash.update(prefix.slice(0, -1));
|
|
87
|
+
hash.update('\0');
|
|
88
|
+
hash.update(bytes);
|
|
89
|
+
hash.update('\0');
|
|
90
|
+
}
|
|
91
|
+
await visit(root, `${basename(root)}/`, 0);
|
|
92
|
+
return { contentHash: `sha256:${hash.digest('hex')}`, files };
|
|
93
|
+
}
|
|
94
|
+
export async function readNamedSessionPackageContent(installation, sharedRepositoryReady) {
|
|
95
|
+
const bundleId = requireNamedSessionSignedPackage(installation, sharedRepositoryReady);
|
|
96
|
+
if (!installation.workspaceId || !installation.activeBundleHash) {
|
|
97
|
+
throw new Error('named_session_repository_package_pending');
|
|
98
|
+
}
|
|
99
|
+
const nativeRoot = dirname(dirname(installation.nativeSkillPath));
|
|
100
|
+
const activeRoot = resolve(nativeRoot, '.dharma-managed', 'workspaces', installation.workspaceId, 'active');
|
|
101
|
+
const authorizationPath = resolve(activeRoot, 'AUTHORIZATION.json');
|
|
102
|
+
const authorizationBytes = await readStableFile(authorizationPath, 1_048_576);
|
|
103
|
+
const bundle = JSON.parse(authorizationBytes.toString('utf8'));
|
|
104
|
+
const { signature: _signature, bundleHash: _bundleHash, ...unsigned } = bundle;
|
|
105
|
+
const skill = bundle.skills?.find(entry => entry.skillId === 'dharma-agent-fabric');
|
|
106
|
+
if (bundle.bundleId !== bundleId || bundle.bundleHash !== installation.activeBundleHash
|
|
107
|
+
|| calculateBundleHash(unsigned) !== installation.activeBundleHash
|
|
108
|
+
|| bundle.operation !== 'install' || !skill || skill.path !== '.agents/skills/dharma-agent-fabric') {
|
|
109
|
+
throw new Error('named_session_repository_package_pending');
|
|
110
|
+
}
|
|
111
|
+
const active = await skillTree(resolve(activeRoot, 'dharma-agent-fabric'));
|
|
112
|
+
if (active.contentHash !== skill.contentHash)
|
|
113
|
+
throw new Error('named_session_repository_package_pending');
|
|
114
|
+
const visible = await skillTree(dirname(installation.nativeSkillPath));
|
|
115
|
+
const marker = '.dharma-agent-fabric.json';
|
|
116
|
+
const markerPresent = visible.files.delete(marker);
|
|
117
|
+
active.files.delete(marker);
|
|
118
|
+
if (!markerPresent || active.files.size !== visible.files.size
|
|
119
|
+
|| [...active.files].some(([path, hash]) => visible.files.get(path) !== hash)
|
|
120
|
+
|| [...visible.files.keys()].some(path => !active.files.has(path))) {
|
|
121
|
+
throw new Error('named_session_repository_package_pending');
|
|
122
|
+
}
|
|
123
|
+
if (!authorizationBytes.equals(await readStableFile(authorizationPath, 1_048_576))) {
|
|
124
|
+
throw new Error('named_session_repository_package_pending');
|
|
125
|
+
}
|
|
126
|
+
const manifestHash = active.files.get('MANIFEST.json'), catalogHash = active.files.get('knowledge/CATALOG.json');
|
|
127
|
+
if (!manifestHash || !catalogHash)
|
|
128
|
+
throw new Error('named_session_repository_package_pending');
|
|
129
|
+
return { bundleId, bundleHash: bundle.bundleHash, skillsHash: skill.contentHash,
|
|
130
|
+
manifestHash: `sha256:${manifestHash}`, catalogHash: `sha256:${catalogHash}` };
|
|
131
|
+
}
|
|
132
|
+
export async function verifyNamedSessionVisibleSkill(installation, sharedRepositoryReady) {
|
|
133
|
+
return (await readNamedSessionPackageContent(installation, sharedRepositoryReady)).bundleId;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=namedSessionPackageGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionPackageGate.js","sourceRoot":"","sources":["../src/namedSessionPackageGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionPackageGate.test.d.ts","sourceRoot":"","sources":["../src/namedSessionPackageGate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { requireNamedSessionSignedPackage } from './namedSessionPackageGate.js';
|
|
4
|
+
const bundleId = '11111111-1111-4111-8111-111111111111';
|
|
5
|
+
test('named work requires the active signed repository package', () => {
|
|
6
|
+
assert.equal(requireNamedSessionSignedPackage({ signedLifecycleReady: true,
|
|
7
|
+
activeBundleId: bundleId, signedMarkerBundleId: bundleId }, true), bundleId);
|
|
8
|
+
for (const [installation, sharedReady] of [
|
|
9
|
+
[{ signedLifecycleReady: false, activeBundleId: bundleId, signedMarkerBundleId: bundleId }, true],
|
|
10
|
+
[{ signedLifecycleReady: true, activeBundleId: null, signedMarkerBundleId: bundleId }, true],
|
|
11
|
+
[{ signedLifecycleReady: true, activeBundleId: 'unverified', signedMarkerBundleId: 'unverified' }, true],
|
|
12
|
+
[{ signedLifecycleReady: true, activeBundleId: bundleId, signedMarkerBundleId: null }, true],
|
|
13
|
+
[{ signedLifecycleReady: true, activeBundleId: bundleId,
|
|
14
|
+
signedMarkerBundleId: '22222222-2222-4222-8222-222222222222' }, true],
|
|
15
|
+
[{ signedLifecycleReady: true, activeBundleId: bundleId, signedMarkerBundleId: bundleId }, false],
|
|
16
|
+
]) {
|
|
17
|
+
assert.throws(() => requireNamedSessionSignedPackage(installation, sharedReady), { message: 'named_session_repository_package_pending' });
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=namedSessionPackageGate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionPackageGate.test.js","sourceRoot":"","sources":["../src/namedSessionPackageGate.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAEhF,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAExD,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,oBAAoB,EAAE,IAAI;QACxE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/E,KAAK,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI;QACxC,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC;QACjG,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC;QAC5F,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC;QACxG,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC;QAC5F,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ;gBACrD,oBAAoB,EAAE,sCAAsC,EAAE,EAAE,IAAI,CAAC;QACvE,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC;KACzF,EAAE,CAAC;QACX,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gCAAgC,CAAC,YAAY,EAAE,WAAW,CAAC,EAC7E,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { LocalVault, LocalProviderSessionBinding } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
2
|
+
import type { CodexLocalWorkCapture } from '@dharma-ai-labs/agent-fabric-provider-adapters/experimental/codex-session';
|
|
3
|
+
import { type RepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
4
|
+
import type { OrganizationPolicy } from '@dharma-ai-labs/agent-fabric-policy';
|
|
5
|
+
import type { NamedSessionTaskExportResult } from './namedSessionTaskExport.js';
|
|
6
|
+
export interface NamedSessionRepositoryState {
|
|
7
|
+
schema: 'dharma.named-session-repository-state/v1';
|
|
8
|
+
workId: string;
|
|
9
|
+
captureHash: string;
|
|
10
|
+
sourceSnapshotHash: string;
|
|
11
|
+
resultSnapshotHash: string;
|
|
12
|
+
sourceContentHash: string;
|
|
13
|
+
resultContentHash: string;
|
|
14
|
+
activeBundleId: string;
|
|
15
|
+
activeBundleHash: string;
|
|
16
|
+
packageContent?: {
|
|
17
|
+
manifestHash: string;
|
|
18
|
+
catalogHash: string;
|
|
19
|
+
skillsHash: string;
|
|
20
|
+
};
|
|
21
|
+
providerContext?: {
|
|
22
|
+
retainedContextHash: string;
|
|
23
|
+
contextContentHash: string;
|
|
24
|
+
runtimeVersion: string;
|
|
25
|
+
requestedModel: string;
|
|
26
|
+
executedModel: null;
|
|
27
|
+
replayMode: 'task_level';
|
|
28
|
+
};
|
|
29
|
+
portableExport?: Omit<Extract<NamedSessionTaskExportResult, {
|
|
30
|
+
state: 'ready';
|
|
31
|
+
}>, 'bytes'> | Exclude<NamedSessionTaskExportResult, {
|
|
32
|
+
state: 'ready';
|
|
33
|
+
}>;
|
|
34
|
+
exportOutbox?: {
|
|
35
|
+
state: 'pending';
|
|
36
|
+
workKey: string;
|
|
37
|
+
descriptorHash: string;
|
|
38
|
+
acceptedLearningObservation: false;
|
|
39
|
+
};
|
|
40
|
+
acceptedLearningObservation: false;
|
|
41
|
+
}
|
|
42
|
+
export type NamedSessionRepositoryStateDisposition = NamedSessionRepositoryState | {
|
|
43
|
+
state: 'not_authorized';
|
|
44
|
+
acceptedLearningObservation: false;
|
|
45
|
+
} | {
|
|
46
|
+
state: 'blocked';
|
|
47
|
+
code: 'source_state_unavailable' | 'public_context_unavailable' | 'runtime_version_unavailable';
|
|
48
|
+
acceptedLearningObservation: false;
|
|
49
|
+
};
|
|
50
|
+
export declare function retainNamedSessionRepositoryState(input: {
|
|
51
|
+
vault: LocalVault;
|
|
52
|
+
binding: LocalProviderSessionBinding;
|
|
53
|
+
workId: string;
|
|
54
|
+
capture: CodexLocalWorkCapture;
|
|
55
|
+
before: RepositoryPackageSnapshot;
|
|
56
|
+
after: RepositoryPackageSnapshot;
|
|
57
|
+
activeBundleId: string;
|
|
58
|
+
activeBundleHash: string;
|
|
59
|
+
taskExport?: {
|
|
60
|
+
policy: OrganizationPolicy;
|
|
61
|
+
contextBytes: Uint8Array;
|
|
62
|
+
contextHash: string;
|
|
63
|
+
};
|
|
64
|
+
}): Promise<NamedSessionRepositoryState>;
|
|
65
|
+
//# sourceMappingURL=namedSessionRepositoryState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionRepositoryState.d.ts","sourceRoot":"","sources":["../src/namedSessionRepositoryState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACxG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2EAA2E,CAAC;AACvH,OAAO,EAAsC,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAGhF,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,0CAA0C,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,eAAe,CAAC,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAClG,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,YAAY,CAAA;KAAE,CAAC;IAC1E,cAAc,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,OAAO,CAAC,GACrF,OAAO,CAAC,4BAA4B,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,2BAA2B,EAAE,KAAK,CAAA;KAAE,CAAC;IACjH,2BAA2B,EAAE,KAAK,CAAC;CACpC;AAED,MAAM,MAAM,sCAAsC,GAAG,2BAA2B,GAC5E;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,2BAA2B,EAAE,KAAK,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,0BAA0B,GAAG,4BAA4B,GAAG,6BAA6B,CAAC;IAAC,2BAA2B,EAAE,KAAK,CAAA;CAAE,CAAC;AAG9J,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,2BAA2B,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,yBAAyB,CAAC;IAClC,KAAK,EAAE,yBAAyB,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,kBAAkB,CAAC;QAAC,YAAY,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5F,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA6CvC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { serializeRepositoryPackageSnapshot } from './repositoryPackage.js';
|
|
2
|
+
import { stageNamedSessionTaskExport } from './namedSessionTaskExportSync.js';
|
|
3
|
+
// Local inventory proves captured bytes, not an independent grade or server acceptance.
|
|
4
|
+
export async function retainNamedSessionRepositoryState(input) {
|
|
5
|
+
const { binding, capture, before, after } = input;
|
|
6
|
+
for (const key of ['organizationId', 'repositoryBindingId', 'workspaceId', 'deviceId',
|
|
7
|
+
'endpointId', 'membershipId', 'bindingId', 'provider']) {
|
|
8
|
+
if (capture[key] !== binding[key])
|
|
9
|
+
throw new Error('named_session_repository_state_scope_mismatch');
|
|
10
|
+
}
|
|
11
|
+
if (capture.workId !== input.workId || capture.providerThreadId !== binding.sessionId
|
|
12
|
+
|| !/^sha256:[a-f0-9]{64}$/.test(input.activeBundleHash) || !input.activeBundleId) {
|
|
13
|
+
throw new Error('named_session_repository_state_scope_mismatch');
|
|
14
|
+
}
|
|
15
|
+
const source = before.manifest.sourceAuthorization, result = after.manifest.sourceAuthorization;
|
|
16
|
+
if (!source || !result || source.receiptId !== result.receiptId
|
|
17
|
+
|| source.revision !== result.revision || source.policyHash !== result.policyHash) {
|
|
18
|
+
throw new Error('named_session_repository_state_policy_changed');
|
|
19
|
+
}
|
|
20
|
+
for (const snapshot of [before, after]) {
|
|
21
|
+
if (snapshot.manifest.organizationId !== binding.organizationId
|
|
22
|
+
|| snapshot.manifest.workspaceId !== binding.workspaceId
|
|
23
|
+
|| snapshot.manifest.sourceAuthorization?.repositoryBindingId !== binding.repositoryBindingId) {
|
|
24
|
+
throw new Error('named_session_repository_state_scope_mismatch');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const sourceBytes = serializeRepositoryPackageSnapshot(before);
|
|
28
|
+
const resultBytes = serializeRepositoryPackageSnapshot(after);
|
|
29
|
+
let portableExport;
|
|
30
|
+
let exportOutbox;
|
|
31
|
+
if (input.taskExport) {
|
|
32
|
+
const staged = await stageNamedSessionTaskExport(input.vault, { capture, binding, ...input.taskExport });
|
|
33
|
+
const exported = staged.exported;
|
|
34
|
+
if (exported.state === 'ready') {
|
|
35
|
+
const storedHash = await input.vault.putBlob(Buffer.from(exported.bytes), 'named-session-portable-task-export');
|
|
36
|
+
if (storedHash !== exported.exportHash)
|
|
37
|
+
throw new Error('named_session_portable_export_integrity_failed');
|
|
38
|
+
portableExport = { state: 'ready', exportHash: storedHash, acceptedLearningObservation: false };
|
|
39
|
+
exportOutbox = staged.outbox;
|
|
40
|
+
}
|
|
41
|
+
else
|
|
42
|
+
portableExport = exported;
|
|
43
|
+
}
|
|
44
|
+
return { schema: 'dharma.named-session-repository-state/v1', workId: capture.workId,
|
|
45
|
+
captureHash: await input.vault.putBlob(Buffer.from(JSON.stringify(capture)), 'raw-provider-turn'),
|
|
46
|
+
sourceSnapshotHash: before.manifest.snapshotHash, resultSnapshotHash: after.manifest.snapshotHash,
|
|
47
|
+
sourceContentHash: await input.vault.putBlob(Buffer.from(sourceBytes), 'named-session-source-state'),
|
|
48
|
+
resultContentHash: await input.vault.putBlob(Buffer.from(resultBytes), 'named-session-result-state'),
|
|
49
|
+
activeBundleId: input.activeBundleId, activeBundleHash: input.activeBundleHash,
|
|
50
|
+
...(portableExport ? { portableExport } : {}),
|
|
51
|
+
...(exportOutbox ? { exportOutbox } : {}),
|
|
52
|
+
acceptedLearningObservation: false };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=namedSessionRepositoryState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionRepositoryState.js","sourceRoot":"","sources":["../src/namedSessionRepositoryState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionRepositoryState.test.d.ts","sourceRoot":"","sources":["../src/namedSessionRepositoryState.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { canonicalize } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
8
|
+
import { LocalVault } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
9
|
+
import { inventoryRepositoryPackage } from './repositoryPackage.js';
|
|
10
|
+
import { retainNamedSessionRepositoryState } from './namedSessionRepositoryState.js';
|
|
11
|
+
import { initializeRepositoryKnowledge } from './repositoryKnowledge.js';
|
|
12
|
+
test('task source states retain approved bytes encrypted and reject foreign or changed authority', async (t) => {
|
|
13
|
+
const root = await mkdtemp(join(tmpdir(), 'named-state-'));
|
|
14
|
+
let vault;
|
|
15
|
+
t.after(async () => {
|
|
16
|
+
vault?.close();
|
|
17
|
+
await rm(root, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
vault = await LocalVault.open({ root: join(root, 'vault'), masterKey: randomBytes(32) });
|
|
20
|
+
const binding = { schema: 'dharma.local-provider-session-binding/v1',
|
|
21
|
+
organizationId: 'org_synthetic', workspaceId: randomUUID(), repositoryBindingId: randomUUID(),
|
|
22
|
+
endpointId: randomUUID(), membershipId: randomUUID(), deviceId: randomUUID(), bindingId: randomUUID(),
|
|
23
|
+
provider: 'codex', sessionId: randomUUID(), owner: 'dharma_bridge', workspaceRoot: root,
|
|
24
|
+
createdAt: new Date().toISOString(), expiresAt: new Date(Date.now() + 60000).toISOString(), maximumProviderCostCents: 10 };
|
|
25
|
+
const policy = { action: 'authorize', confirmed: true,
|
|
26
|
+
requestId: randomUUID(), repositoryBindingId: binding.repositoryBindingId, expectedRevision: 0,
|
|
27
|
+
allowedContentClasses: ['approved_outputs', 'repository_content', 'repository_skills'], approvedRepositoryPaths: ['README.md'], approvedOutputFolders: [],
|
|
28
|
+
automaticValidatedPublication: true, retentionDays: 30, maximumFileBytes: 262144,
|
|
29
|
+
maximumSnapshotBytes: 4194304, maximumDailyUploadBytes: 8388608, expiresAt: null };
|
|
30
|
+
const generationId = randomUUID();
|
|
31
|
+
const sourceAuthorization = {
|
|
32
|
+
schema: 'dharma.repository-source-authorization/v1', organizationId: binding.organizationId,
|
|
33
|
+
workspaceId: binding.workspaceId, repositoryBindingId: binding.repositoryBindingId, repositoryAgentId: randomUUID(),
|
|
34
|
+
revision: 1, generationId, receiptId: `repo_consent_${generationId}`, policyRevision: `repository-source-${generationId}`,
|
|
35
|
+
confirmedAt: new Date().toISOString(), policyHash: `sha256:${createHash('sha256').update(canonicalize(policy)).digest('hex')}`, policy
|
|
36
|
+
};
|
|
37
|
+
const snapshotInput = { workspace: root, organizationId: binding.organizationId, workspaceId: binding.workspaceId,
|
|
38
|
+
repositoryAgentId: sourceAuthorization.repositoryAgentId, repositoryBindingId: binding.repositoryBindingId, sourceAuthorization };
|
|
39
|
+
const skillRoot = join(root, '.agents/skills/dharma-agent-fabric');
|
|
40
|
+
await mkdir(skillRoot, { recursive: true });
|
|
41
|
+
await writeFile(join(skillRoot, '.dharma-agent-fabric.json'), JSON.stringify({ managedBy: 'dharma-agent-fabric', workspaceId: binding.workspaceId }));
|
|
42
|
+
await initializeRepositoryKnowledge(snapshotInput);
|
|
43
|
+
await writeFile(join(root, 'README.md'), 'SYNTHETIC_BEFORE_CANARY');
|
|
44
|
+
await writeFile(join(root, 'private-grader.txt'), 'PRIVATE_GRADER_MUST_NOT_BE_CAPTURED');
|
|
45
|
+
const before = await inventoryRepositoryPackage(snapshotInput);
|
|
46
|
+
await writeFile(join(root, 'README.md'), 'SYNTHETIC_AFTER_CANARY');
|
|
47
|
+
const after = await inventoryRepositoryPackage(snapshotInput);
|
|
48
|
+
const workId = randomUUID(), closedAt = new Date().toISOString();
|
|
49
|
+
const capture = { schema: 'dharma.codex-local-work-capture/v1', captureId: randomUUID(),
|
|
50
|
+
organizationId: binding.organizationId, repositoryBindingId: binding.repositoryBindingId,
|
|
51
|
+
workspaceId: binding.workspaceId, endpointId: binding.endpointId, membershipId: binding.membershipId,
|
|
52
|
+
deviceId: binding.deviceId, provider: 'codex', bindingId: binding.bindingId, workId,
|
|
53
|
+
providerThreadId: binding.sessionId, providerTurnId: randomUUID(), startedAt: closedAt, closedAt,
|
|
54
|
+
workOutcome: 'completed', providerTurnState: 'completed', captureScope: 'turn_notifications', coverage: 'observed',
|
|
55
|
+
limitations: [], droppedEvents: 0, acceptedLearningObservation: false, executedModel: null,
|
|
56
|
+
events: [], eventsHash: `sha256:${createHash('sha256').update('[]').digest('hex')}` };
|
|
57
|
+
const input = { vault, binding, workId, capture, before, after, activeBundleId: randomUUID(), activeBundleHash: `sha256:${'a'.repeat(64)}` };
|
|
58
|
+
const receipt = await retainNamedSessionRepositoryState(input);
|
|
59
|
+
assert.notEqual(receipt.sourceSnapshotHash, receipt.resultSnapshotHash);
|
|
60
|
+
assert.equal(receipt.acceptedLearningObservation, false);
|
|
61
|
+
for (const [contentHash, canary] of [[receipt.sourceContentHash, 'SYNTHETIC_BEFORE_CANARY'],
|
|
62
|
+
[receipt.resultContentHash, 'SYNTHETIC_AFTER_CANARY']]) {
|
|
63
|
+
const stored = JSON.parse((await vault.getBlob(contentHash)).toString());
|
|
64
|
+
assert.ok(stored.blobs.some((blob) => Buffer.from(blob.contentBase64, 'base64').toString() === canary));
|
|
65
|
+
assert.equal(stored.manifest.files.some((file) => file.relativePath === 'private-grader.txt'), false);
|
|
66
|
+
const hash = contentHash.slice(7);
|
|
67
|
+
assert.equal((await readFile(join(root, 'vault/blobs', hash.slice(0, 2), `${hash}.blob`))).includes(Buffer.from(canary)), false);
|
|
68
|
+
}
|
|
69
|
+
assert.equal(JSON.stringify(receipt).includes('CANARY'), false);
|
|
70
|
+
await assert.rejects(retainNamedSessionRepositoryState({ ...input, workId: randomUUID() }), /scope_mismatch/);
|
|
71
|
+
await assert.rejects(retainNamedSessionRepositoryState({ ...input, binding: { ...binding, deviceId: randomUUID() } }), /scope_mismatch/);
|
|
72
|
+
await assert.rejects(retainNamedSessionRepositoryState({ ...input, after: { ...after, manifest: { ...after.manifest,
|
|
73
|
+
sourceAuthorization: { ...sourceAuthorization, revision: 2 } } } }), /policy_changed/);
|
|
74
|
+
await assert.rejects(retainNamedSessionRepositoryState({ ...input, after: { ...after, blobs: [] } }), /blob is missing/);
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=namedSessionRepositoryState.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionRepositoryState.test.js","sourceRoot":"","sources":["../src/namedSessionRepositoryState.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,11 @@ export declare function runNamedSessionService(input: {
|
|
|
33
33
|
localWriteRoots: string[];
|
|
34
34
|
authorizeLocalWork(): Promise<boolean>;
|
|
35
35
|
queueEvidence?(capture: CodexLocalWorkCapture): Promise<NamedSessionEvidenceReceipt>;
|
|
36
|
-
|
|
36
|
+
retainRepositoryState?(capture: CodexLocalWorkCapture): Promise<import('./namedSessionRepositoryState.js').NamedSessionRepositoryStateDisposition>;
|
|
37
|
+
syncTaskExports?(): Promise<import('./namedSessionTaskExportSync.js').NamedSessionTaskExportSyncResult>;
|
|
38
|
+
withActivationBoundary<T>(operation: () => Promise<T>, work?: {
|
|
39
|
+
workId: string;
|
|
40
|
+
}): Promise<T>;
|
|
37
41
|
signal: AbortSignal;
|
|
38
42
|
}): Promise<{
|
|
39
43
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedSessionService.d.ts","sourceRoot":"","sources":["../src/namedSessionService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,4BAA4B,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACzG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2EAA2E,CAAC;AAEvH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,yBAAyB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,4BAA4B,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAwBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;EAO3D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAS3G;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,iBAOnF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,oCAyBrG;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IACxE,aAAa,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC5E,gBAAgB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClF,QAAQ,EAAE,uBAAuB,CAAC;IAClC,gBAAgB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrF,sBAAsB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"namedSessionService.d.ts","sourceRoot":"","sources":["../src/namedSessionService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,4BAA4B,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACzG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2EAA2E,CAAC;AAEvH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,yBAAyB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,4BAA4B,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAwBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;EAO3D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAS3G;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,iBAOnF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,oCAyBrG;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,wBAAwB,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IACxE,aAAa,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC5E,gBAAgB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClF,QAAQ,EAAE,uBAAuB,CAAC;IAClC,gBAAgB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrF,qBAAqB,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,kCAAkC,EAAE,sCAAsC,CAAC,CAAC;IACnJ,eAAe,CAAC,IAAI,OAAO,CAAC,OAAO,iCAAiC,EAAE,gCAAgC,CAAC,CAAC;IACxG,sBAAsB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,EAAE,WAAW,CAAC;CACrB;;;GA0MA"}
|
|
@@ -123,10 +123,11 @@ export async function runNamedSessionService(input) {
|
|
|
123
123
|
const responses = new Set();
|
|
124
124
|
let closing = false, pending = 0, serial = Promise.resolve();
|
|
125
125
|
let lastObservation = { state: 'starting' };
|
|
126
|
+
let taskExports;
|
|
126
127
|
const status = () => ({ ok: true, schema: 'dharma.named-session-status/v1', name: registration.name,
|
|
127
128
|
bindingId: binding.bindingId, sessionId: binding.sessionId, ...registration.identity,
|
|
128
129
|
state: closing ? 'stopping' : pending ? 'executing' : 'running', budget: budget.status(),
|
|
129
|
-
queued: pending, lastObservation, lastWork: budget.lastWork() });
|
|
130
|
+
queued: pending, lastObservation, lastWork: budget.lastWork(), ...(taskExports ? { taskExports } : {}) });
|
|
130
131
|
let healthWrites = Promise.resolve();
|
|
131
132
|
const health = () => {
|
|
132
133
|
const snapshot = JSON.stringify({ ...status(), pid: process.pid, observedAt: new Date().toISOString() });
|
|
@@ -237,6 +238,15 @@ export async function runNamedSessionService(input) {
|
|
|
237
238
|
...(capture.schema === 'dharma.codex-local-work-capture/v2' ? { requestHash: capture.requestHash } : {}),
|
|
238
239
|
coverage: capture.coverage, limitations: capture.limitations, providerTurnState: capture.providerTurnState,
|
|
239
240
|
acceptedLearningObservation: false };
|
|
241
|
+
if (input.retainRepositoryState) {
|
|
242
|
+
try {
|
|
243
|
+
nativeEvidence.repositoryState = await input.retainRepositoryState(capture);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
nativeEvidence.repositoryState = { state: 'blocked', code: 'repository_state_retention_failed',
|
|
247
|
+
acceptedLearningObservation: false };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
240
250
|
if (input.queueEvidence) {
|
|
241
251
|
let synchronization;
|
|
242
252
|
try {
|
|
@@ -258,7 +268,7 @@ export async function runNamedSessionService(input) {
|
|
|
258
268
|
}
|
|
259
269
|
nativeEvidence.synchronization = synchronization;
|
|
260
270
|
}
|
|
261
|
-
} }));
|
|
271
|
+
} }), { workId: request.workId });
|
|
262
272
|
const receipt = { ...result, intentHash: intent, nativeEvidence };
|
|
263
273
|
const blob = await input.vault.putBlob(Buffer.from(JSON.stringify(receipt)), 'named-session-work');
|
|
264
274
|
budget.finishWork(request.workId, 'completed', blob);
|
|
@@ -298,7 +308,21 @@ export async function runNamedSessionService(input) {
|
|
|
298
308
|
});
|
|
299
309
|
await chmod(paths.socket, 0o600);
|
|
300
310
|
await health();
|
|
311
|
+
let nextExportSyncAt = 0;
|
|
301
312
|
while (!closing && !input.signal.aborted) {
|
|
313
|
+
if (input.syncTaskExports && Date.now() >= nextExportSyncAt) {
|
|
314
|
+
await enqueue(async () => {
|
|
315
|
+
try {
|
|
316
|
+
taskExports = await input.syncTaskExports();
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
taskExports = { state: 'pending', pending: null, delivered: 0,
|
|
320
|
+
code: 'task_export_sync_unavailable', acceptedLearningObservation: false };
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
nextExportSyncAt = Date.now() + 30000;
|
|
324
|
+
await health();
|
|
325
|
+
}
|
|
302
326
|
let result;
|
|
303
327
|
try {
|
|
304
328
|
result = await enqueue(() => input.withActivationBoundary(() => owner.runNext()));
|