@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.
Files changed (86) hide show
  1. package/AGENT_FABRIC_ONBOARDING.md +1 -1
  2. package/README.md +43 -0
  3. package/dist/demoEnrollment.d.ts.map +1 -1
  4. package/dist/demoEnrollment.js +3 -2
  5. package/dist/demoEnrollment.js.map +1 -1
  6. package/dist/demoPackage.d.ts.map +1 -1
  7. package/dist/demoPackage.js +29 -9
  8. package/dist/demoPackage.js.map +1 -1
  9. package/dist/demoPackage.test.js +75 -1
  10. package/dist/demoPackage.test.js.map +1 -1
  11. package/dist/demoStateRename.d.ts +7 -0
  12. package/dist/demoStateRename.d.ts.map +1 -0
  13. package/dist/demoStateRename.js +21 -0
  14. package/dist/demoStateRename.js.map +1 -0
  15. package/dist/demoStateRename.test.d.ts +2 -0
  16. package/dist/demoStateRename.test.d.ts.map +1 -0
  17. package/dist/demoStateRename.test.js +67 -0
  18. package/dist/demoStateRename.test.js.map +1 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +107 -21
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.test.js +5 -2
  24. package/dist/index.test.js.map +1 -1
  25. package/dist/namedSessionPackageGate.d.ts +22 -0
  26. package/dist/namedSessionPackageGate.d.ts.map +1 -0
  27. package/dist/namedSessionPackageGate.js +135 -0
  28. package/dist/namedSessionPackageGate.js.map +1 -0
  29. package/dist/namedSessionPackageGate.test.d.ts +2 -0
  30. package/dist/namedSessionPackageGate.test.d.ts.map +1 -0
  31. package/dist/namedSessionPackageGate.test.js +20 -0
  32. package/dist/namedSessionPackageGate.test.js.map +1 -0
  33. package/dist/namedSessionRepositoryState.d.ts +65 -0
  34. package/dist/namedSessionRepositoryState.d.ts.map +1 -0
  35. package/dist/namedSessionRepositoryState.js +54 -0
  36. package/dist/namedSessionRepositoryState.js.map +1 -0
  37. package/dist/namedSessionRepositoryState.test.d.ts +2 -0
  38. package/dist/namedSessionRepositoryState.test.d.ts.map +1 -0
  39. package/dist/namedSessionRepositoryState.test.js +76 -0
  40. package/dist/namedSessionRepositoryState.test.js.map +1 -0
  41. package/dist/namedSessionService.d.ts +5 -1
  42. package/dist/namedSessionService.d.ts.map +1 -1
  43. package/dist/namedSessionService.js +26 -2
  44. package/dist/namedSessionService.js.map +1 -1
  45. package/dist/namedSessionService.test.js +47 -3
  46. package/dist/namedSessionService.test.js.map +1 -1
  47. package/dist/namedSessionTaskExport.d.ts +22 -0
  48. package/dist/namedSessionTaskExport.d.ts.map +1 -0
  49. package/dist/namedSessionTaskExport.js +158 -0
  50. package/dist/namedSessionTaskExport.js.map +1 -0
  51. package/dist/namedSessionTaskExport.test.d.ts +2 -0
  52. package/dist/namedSessionTaskExport.test.d.ts.map +1 -0
  53. package/dist/namedSessionTaskExport.test.js +385 -0
  54. package/dist/namedSessionTaskExport.test.js.map +1 -0
  55. package/dist/namedSessionTaskExportSync.d.ts +57 -0
  56. package/dist/namedSessionTaskExportSync.d.ts.map +1 -0
  57. package/dist/namedSessionTaskExportSync.js +193 -0
  58. package/dist/namedSessionTaskExportSync.js.map +1 -0
  59. package/dist/pidLock.test.js +33 -1
  60. package/dist/pidLock.test.js.map +1 -1
  61. package/dist/relayAutostart.d.ts +5 -3
  62. package/dist/relayAutostart.d.ts.map +1 -1
  63. package/dist/relayAutostart.js +151 -24
  64. package/dist/relayAutostart.js.map +1 -1
  65. package/dist/relayAutostart.test.js +138 -2
  66. package/dist/relayAutostart.test.js.map +1 -1
  67. package/dist/relaySupervisor.test.js +9 -4
  68. package/dist/relaySupervisor.test.js.map +1 -1
  69. package/dist/repositoryPackage.d.ts.map +1 -1
  70. package/dist/repositoryPackage.js +18 -2
  71. package/dist/repositoryPackage.js.map +1 -1
  72. package/dist/repositoryPackage.test.js +29 -0
  73. package/dist/repositoryPackage.test.js.map +1 -1
  74. package/dist/repositoryPackageDelivery.test.js +34 -1
  75. package/dist/repositoryPackageDelivery.test.js.map +1 -1
  76. package/dist/repositoryRelaySupervisor.d.ts +1 -1
  77. package/dist/repositoryRelaySupervisor.d.ts.map +1 -1
  78. package/dist/repositoryRelaySupervisor.js +3 -2
  79. package/dist/repositoryRelaySupervisor.js.map +1 -1
  80. package/dist/repositoryRelaySupervisor.test.js +17 -0
  81. package/dist/repositoryRelaySupervisor.test.js.map +1 -1
  82. package/dist/schemas/codex-task-export-upload-receipt.schema.json +24 -0
  83. package/dist/schemas/codex-task-observation.schema.json +99 -0
  84. package/dist/schemas/codex-task-replay-export.schema.json +375 -0
  85. package/dist/schemas/named-session-task-export-outbox.schema.json +29 -0
  86. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionPackageGate.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionRepositoryState.test.d.ts.map
@@ -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
- withActivationBoundary<T>(operation: () => Promise<T>): Promise<T>;
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;IACnE,MAAM,EAAE,WAAW,CAAC;CACrB;;;GA0LA"}
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()));