@dharma-ai-labs/agent-fabric 0.2.153 → 0.2.155

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 (300) hide show
  1. package/dist/bootstrapGitScope.test.d.ts +2 -0
  2. package/dist/bootstrapGitScope.test.d.ts.map +1 -0
  3. package/dist/bootstrapGitScope.test.js +115 -0
  4. package/dist/bootstrapGitScope.test.js.map +1 -0
  5. package/dist/bootstrapHostFiles.d.ts +5 -0
  6. package/dist/bootstrapHostFiles.d.ts.map +1 -0
  7. package/dist/bootstrapHostFiles.js +150 -0
  8. package/dist/bootstrapHostFiles.js.map +1 -0
  9. package/dist/bootstrapHostFiles.test.d.ts +2 -0
  10. package/dist/bootstrapHostFiles.test.d.ts.map +1 -0
  11. package/dist/bootstrapHostFiles.test.js +127 -0
  12. package/dist/bootstrapHostFiles.test.js.map +1 -0
  13. package/dist/bootstrapHostScope.d.ts +42 -0
  14. package/dist/bootstrapHostScope.d.ts.map +1 -0
  15. package/dist/bootstrapHostScope.js +224 -0
  16. package/dist/bootstrapHostScope.js.map +1 -0
  17. package/dist/bootstrapHostScope.test.d.ts +2 -0
  18. package/dist/bootstrapHostScope.test.d.ts.map +1 -0
  19. package/dist/bootstrapHostScope.test.js +577 -0
  20. package/dist/bootstrapHostScope.test.js.map +1 -0
  21. package/dist/bootstrapInstallationScope.test.d.ts +2 -0
  22. package/dist/bootstrapInstallationScope.test.d.ts.map +1 -0
  23. package/dist/bootstrapInstallationScope.test.js +68 -0
  24. package/dist/bootstrapInstallationScope.test.js.map +1 -0
  25. package/dist/bootstrapLauncherCaller.test.d.ts +2 -0
  26. package/dist/bootstrapLauncherCaller.test.d.ts.map +1 -0
  27. package/dist/bootstrapLauncherCaller.test.js +91 -0
  28. package/dist/bootstrapLauncherCaller.test.js.map +1 -0
  29. package/dist/bootstrapOwnedChildren.test.d.ts +2 -0
  30. package/dist/bootstrapOwnedChildren.test.d.ts.map +1 -0
  31. package/dist/bootstrapOwnedChildren.test.js +93 -0
  32. package/dist/bootstrapOwnedChildren.test.js.map +1 -0
  33. package/dist/bootstrapPolicyScope.test.d.ts +2 -0
  34. package/dist/bootstrapPolicyScope.test.d.ts.map +1 -0
  35. package/dist/bootstrapPolicyScope.test.js +261 -0
  36. package/dist/bootstrapPolicyScope.test.js.map +1 -0
  37. package/dist/bootstrapProcessCaller.test.d.ts +2 -0
  38. package/dist/bootstrapProcessCaller.test.d.ts.map +1 -0
  39. package/dist/bootstrapProcessCaller.test.js +262 -0
  40. package/dist/bootstrapProcessCaller.test.js.map +1 -0
  41. package/dist/bootstrapRegistryCaller.test.d.ts +2 -0
  42. package/dist/bootstrapRegistryCaller.test.d.ts.map +1 -0
  43. package/dist/bootstrapRegistryCaller.test.js +128 -0
  44. package/dist/bootstrapRegistryCaller.test.js.map +1 -0
  45. package/dist/bootstrapVaultScope.test.d.ts +2 -0
  46. package/dist/bootstrapVaultScope.test.d.ts.map +1 -0
  47. package/dist/bootstrapVaultScope.test.js +105 -0
  48. package/dist/bootstrapVaultScope.test.js.map +1 -0
  49. package/dist/codexBootstrapCompletion.test.d.ts +2 -0
  50. package/dist/codexBootstrapCompletion.test.d.ts.map +1 -0
  51. package/dist/codexBootstrapCompletion.test.js +630 -0
  52. package/dist/codexBootstrapCompletion.test.js.map +1 -0
  53. package/dist/codexBoundSession.d.ts +2 -2
  54. package/dist/codexBoundSession.d.ts.map +1 -1
  55. package/dist/codexBoundSession.js +23 -17
  56. package/dist/codexBoundSession.js.map +1 -1
  57. package/dist/codexBoundSession.test.js +3 -0
  58. package/dist/codexBoundSession.test.js.map +1 -1
  59. package/dist/codexInboxSession.d.ts.map +1 -1
  60. package/dist/codexInboxSession.js +3 -3
  61. package/dist/codexInboxSession.js.map +1 -1
  62. package/dist/codexScopedDispatch.test.d.ts +2 -0
  63. package/dist/codexScopedDispatch.test.d.ts.map +1 -0
  64. package/dist/codexScopedDispatch.test.js +56 -0
  65. package/dist/codexScopedDispatch.test.js.map +1 -0
  66. package/dist/codexSetupAdmission.d.ts +108 -0
  67. package/dist/codexSetupAdmission.d.ts.map +1 -0
  68. package/dist/codexSetupAdmission.js +214 -0
  69. package/dist/codexSetupAdmission.js.map +1 -0
  70. package/dist/codexSetupAdmission.test.d.ts +2 -0
  71. package/dist/codexSetupAdmission.test.d.ts.map +1 -0
  72. package/dist/codexSetupAdmission.test.js +578 -0
  73. package/dist/codexSetupAdmission.test.js.map +1 -0
  74. package/dist/codexSetupChildProvider.test.d.ts +2 -0
  75. package/dist/codexSetupChildProvider.test.d.ts.map +1 -0
  76. package/dist/codexSetupChildProvider.test.js +210 -0
  77. package/dist/codexSetupChildProvider.test.js.map +1 -0
  78. package/dist/codexSetupChildStartup.d.ts +38 -0
  79. package/dist/codexSetupChildStartup.d.ts.map +1 -0
  80. package/dist/codexSetupChildStartup.js +115 -0
  81. package/dist/codexSetupChildStartup.js.map +1 -0
  82. package/dist/codexSetupChildStartup.test.d.ts +2 -0
  83. package/dist/codexSetupChildStartup.test.d.ts.map +1 -0
  84. package/dist/codexSetupChildStartup.test.js +141 -0
  85. package/dist/codexSetupChildStartup.test.js.map +1 -0
  86. package/dist/codexSetupCliDispatch.test.d.ts +2 -0
  87. package/dist/codexSetupCliDispatch.test.d.ts.map +1 -0
  88. package/dist/codexSetupCliDispatch.test.js +138 -0
  89. package/dist/codexSetupCliDispatch.test.js.map +1 -0
  90. package/dist/codexSetupJournalOpen.test.d.ts +2 -0
  91. package/dist/codexSetupJournalOpen.test.d.ts.map +1 -0
  92. package/dist/codexSetupJournalOpen.test.js +101 -0
  93. package/dist/codexSetupJournalOpen.test.js.map +1 -0
  94. package/dist/codexSetupNativeHost.d.ts +31 -0
  95. package/dist/codexSetupNativeHost.d.ts.map +1 -0
  96. package/dist/codexSetupNativeHost.js +211 -0
  97. package/dist/codexSetupNativeHost.js.map +1 -0
  98. package/dist/codexSetupNativeHost.test.d.ts +2 -0
  99. package/dist/codexSetupNativeHost.test.d.ts.map +1 -0
  100. package/dist/codexSetupNativeHost.test.js +479 -0
  101. package/dist/codexSetupNativeHost.test.js.map +1 -0
  102. package/dist/codexSetupNativeWire.test.d.ts +2 -0
  103. package/dist/codexSetupNativeWire.test.d.ts.map +1 -0
  104. package/dist/codexSetupNativeWire.test.js +243 -0
  105. package/dist/codexSetupNativeWire.test.js.map +1 -0
  106. package/dist/codexSetupOwnedConnection.d.ts +14 -0
  107. package/dist/codexSetupOwnedConnection.d.ts.map +1 -0
  108. package/dist/codexSetupOwnedConnection.js +64 -0
  109. package/dist/codexSetupOwnedConnection.js.map +1 -0
  110. package/dist/codexSetupOwnedConnection.test.d.ts +2 -0
  111. package/dist/codexSetupOwnedConnection.test.d.ts.map +1 -0
  112. package/dist/codexSetupOwnedConnection.test.js +192 -0
  113. package/dist/codexSetupOwnedConnection.test.js.map +1 -0
  114. package/dist/codexSetupPortalCommand.test.d.ts +2 -0
  115. package/dist/codexSetupPortalCommand.test.d.ts.map +1 -0
  116. package/dist/codexSetupPortalCommand.test.js +146 -0
  117. package/dist/codexSetupPortalCommand.test.js.map +1 -0
  118. package/dist/codexSetupReadiness.d.ts +23 -0
  119. package/dist/codexSetupReadiness.d.ts.map +1 -0
  120. package/dist/codexSetupReadiness.js +74 -0
  121. package/dist/codexSetupReadiness.js.map +1 -0
  122. package/dist/codexSetupReadiness.test.d.ts +2 -0
  123. package/dist/codexSetupReadiness.test.d.ts.map +1 -0
  124. package/dist/codexSetupReadiness.test.js +145 -0
  125. package/dist/codexSetupReadiness.test.js.map +1 -0
  126. package/dist/codexSetupSessionCaller.test.d.ts +2 -0
  127. package/dist/codexSetupSessionCaller.test.d.ts.map +1 -0
  128. package/dist/codexSetupSessionCaller.test.js +352 -0
  129. package/dist/codexSetupSessionCaller.test.js.map +1 -0
  130. package/dist/codexSetupSessionHandoff.d.ts +48 -0
  131. package/dist/codexSetupSessionHandoff.d.ts.map +1 -0
  132. package/dist/codexSetupSessionHandoff.js +146 -0
  133. package/dist/codexSetupSessionHandoff.js.map +1 -0
  134. package/dist/codexSetupSessionHandoff.test.d.ts +2 -0
  135. package/dist/codexSetupSessionHandoff.test.d.ts.map +1 -0
  136. package/dist/codexSetupSessionHandoff.test.js +289 -0
  137. package/dist/codexSetupSessionHandoff.test.js.map +1 -0
  138. package/dist/codexSetupTransport.test.d.ts +2 -0
  139. package/dist/codexSetupTransport.test.d.ts.map +1 -0
  140. package/dist/codexSetupTransport.test.js +206 -0
  141. package/dist/codexSetupTransport.test.js.map +1 -0
  142. package/dist/codexSetupVaultJournal.d.ts +13 -0
  143. package/dist/codexSetupVaultJournal.d.ts.map +1 -0
  144. package/dist/codexSetupVaultJournal.js +28 -0
  145. package/dist/codexSetupVaultJournal.js.map +1 -0
  146. package/dist/codexSetupVaultJournal.test.d.ts +2 -0
  147. package/dist/codexSetupVaultJournal.test.d.ts.map +1 -0
  148. package/dist/codexSetupVaultJournal.test.js +104 -0
  149. package/dist/codexSetupVaultJournal.test.js.map +1 -0
  150. package/dist/containerChildCleanup.test.d.ts +2 -0
  151. package/dist/containerChildCleanup.test.d.ts.map +1 -0
  152. package/dist/containerChildCleanup.test.js +145 -0
  153. package/dist/containerChildCleanup.test.js.map +1 -0
  154. package/dist/containerRelayLifecycle.d.ts +1 -1
  155. package/dist/containerRelayLifecycle.d.ts.map +1 -1
  156. package/dist/containerRelayLifecycle.js +29 -37
  157. package/dist/containerRelayLifecycle.js.map +1 -1
  158. package/dist/cooperativeInboxSession.d.ts +2 -2
  159. package/dist/cooperativeInboxSession.d.ts.map +1 -1
  160. package/dist/cooperativeInboxSession.js +21 -13
  161. package/dist/cooperativeInboxSession.js.map +1 -1
  162. package/dist/cooperativeInboxSession.test.js +65 -0
  163. package/dist/cooperativeInboxSession.test.js.map +1 -1
  164. package/dist/demoWatchControl.d.ts +3 -3
  165. package/dist/index.d.ts +55 -14
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +1642 -553
  168. package/dist/index.js.map +1 -1
  169. package/dist/namedCodexSkillDiscovery.d.ts +15 -0
  170. package/dist/namedCodexSkillDiscovery.d.ts.map +1 -0
  171. package/dist/namedCodexSkillDiscovery.js +90 -0
  172. package/dist/namedCodexSkillDiscovery.js.map +1 -0
  173. package/dist/namedCodexSkillDiscovery.test.d.ts +2 -0
  174. package/dist/namedCodexSkillDiscovery.test.d.ts.map +1 -0
  175. package/dist/namedCodexSkillDiscovery.test.js +37 -0
  176. package/dist/namedCodexSkillDiscovery.test.js.map +1 -0
  177. package/dist/namedCodexThread.d.ts +2 -0
  178. package/dist/namedCodexThread.d.ts.map +1 -1
  179. package/dist/namedCodexThread.js +13 -4
  180. package/dist/namedCodexThread.js.map +1 -1
  181. package/dist/namedSessionChildOwner.d.ts +17 -0
  182. package/dist/namedSessionChildOwner.d.ts.map +1 -0
  183. package/dist/namedSessionChildOwner.js +122 -0
  184. package/dist/namedSessionChildOwner.js.map +1 -0
  185. package/dist/namedSessionChildOwner.test.d.ts +2 -0
  186. package/dist/namedSessionChildOwner.test.d.ts.map +1 -0
  187. package/dist/namedSessionChildOwner.test.js +203 -0
  188. package/dist/namedSessionChildOwner.test.js.map +1 -0
  189. package/dist/namedSessionEvidence.d.ts +2 -2
  190. package/dist/namedSessionEvidence.d.ts.map +1 -1
  191. package/dist/namedSessionEvidence.js +2 -2
  192. package/dist/namedSessionEvidence.js.map +1 -1
  193. package/dist/namedSessionEvidence.test.js +24 -1
  194. package/dist/namedSessionEvidence.test.js.map +1 -1
  195. package/dist/namedSessionRepositoryState.d.ts +2 -2
  196. package/dist/namedSessionRepositoryState.d.ts.map +1 -1
  197. package/dist/namedSessionService.d.ts +4 -2
  198. package/dist/namedSessionService.d.ts.map +1 -1
  199. package/dist/namedSessionService.js +18 -1
  200. package/dist/namedSessionService.js.map +1 -1
  201. package/dist/namedSessionService.test.js +31 -2
  202. package/dist/namedSessionService.test.js.map +1 -1
  203. package/dist/namedSessionTaskExportSync.d.ts +3 -3
  204. package/dist/namedSessionTaskExportSync.d.ts.map +1 -1
  205. package/dist/namedSessionTaskExportSync.js +6 -6
  206. package/dist/namedSessionTaskExportSync.js.map +1 -1
  207. package/dist/namedSessionTrust.d.ts +2 -2
  208. package/dist/namedSessionTrust.d.ts.map +1 -1
  209. package/dist/namedSessionTrust.js +3 -2
  210. package/dist/namedSessionTrust.js.map +1 -1
  211. package/dist/namedSessionTrust.test.js +2 -1
  212. package/dist/namedSessionTrust.test.js.map +1 -1
  213. package/dist/ownedChildLifecycle.d.ts +13 -0
  214. package/dist/ownedChildLifecycle.d.ts.map +1 -0
  215. package/dist/ownedChildLifecycle.js +87 -0
  216. package/dist/ownedChildLifecycle.js.map +1 -0
  217. package/dist/ownedChildLifecycle.test.d.ts +2 -0
  218. package/dist/ownedChildLifecycle.test.d.ts.map +1 -0
  219. package/dist/ownedChildLifecycle.test.js +133 -0
  220. package/dist/ownedChildLifecycle.test.js.map +1 -0
  221. package/dist/pidLock.test.js +242 -9
  222. package/dist/pidLock.test.js.map +1 -1
  223. package/dist/providerSessionChannel.d.ts +1 -1
  224. package/dist/providerSessionChannel.d.ts.map +1 -1
  225. package/dist/providerSessionChannel.js +7 -3
  226. package/dist/providerSessionChannel.js.map +1 -1
  227. package/dist/providerSessionChannel.test.js +20 -0
  228. package/dist/providerSessionChannel.test.js.map +1 -1
  229. package/dist/providerSessionReplyRecovery.d.ts +2 -2
  230. package/dist/providerSessionReplyRecovery.d.ts.map +1 -1
  231. package/dist/providerSessionReplyRecovery.js +3 -3
  232. package/dist/providerSessionReplyRecovery.js.map +1 -1
  233. package/dist/relayAutostart.d.ts.map +1 -1
  234. package/dist/relayAutostart.js +12 -9
  235. package/dist/relayAutostart.js.map +1 -1
  236. package/dist/relayRuntimeUpgrade.d.ts +1 -1
  237. package/dist/relaySupervisor.d.ts.map +1 -1
  238. package/dist/relaySupervisor.js +19 -14
  239. package/dist/relaySupervisor.js.map +1 -1
  240. package/dist/relaySupervisor.test.js +26 -0
  241. package/dist/relaySupervisor.test.js.map +1 -1
  242. package/dist/relaySupervisorCleanup.test.d.ts +2 -0
  243. package/dist/relaySupervisorCleanup.test.d.ts.map +1 -0
  244. package/dist/relaySupervisorCleanup.test.js +69 -0
  245. package/dist/relaySupervisorCleanup.test.js.map +1 -0
  246. package/dist/repositoryInstallerFiles.d.ts +19 -1
  247. package/dist/repositoryInstallerFiles.d.ts.map +1 -1
  248. package/dist/repositoryInstallerFiles.js +205 -29
  249. package/dist/repositoryInstallerFiles.js.map +1 -1
  250. package/dist/repositoryInstallerScope.test.d.ts +2 -0
  251. package/dist/repositoryInstallerScope.test.d.ts.map +1 -0
  252. package/dist/repositoryInstallerScope.test.js +513 -0
  253. package/dist/repositoryInstallerScope.test.js.map +1 -0
  254. package/dist/repositoryKnowledge.d.ts.map +1 -1
  255. package/dist/repositoryKnowledge.js +177 -37
  256. package/dist/repositoryKnowledge.js.map +1 -1
  257. package/dist/repositoryKnowledgeScope.test.d.ts +2 -0
  258. package/dist/repositoryKnowledgeScope.test.d.ts.map +1 -0
  259. package/dist/repositoryKnowledgeScope.test.js +316 -0
  260. package/dist/repositoryKnowledgeScope.test.js.map +1 -0
  261. package/dist/repositoryOnboardingCaller.test.js +61 -4
  262. package/dist/repositoryOnboardingCaller.test.js.map +1 -1
  263. package/dist/repositoryPackage.d.ts.map +1 -1
  264. package/dist/repositoryPackage.js +340 -59
  265. package/dist/repositoryPackage.js.map +1 -1
  266. package/dist/repositoryPackageDelivery.test.js +65 -0
  267. package/dist/repositoryPackageDelivery.test.js.map +1 -1
  268. package/dist/repositoryPackageScope.test.d.ts +2 -0
  269. package/dist/repositoryPackageScope.test.d.ts.map +1 -0
  270. package/dist/repositoryPackageScope.test.js +578 -0
  271. package/dist/repositoryPackageScope.test.js.map +1 -0
  272. package/dist/schemas/codex-setup-child-start.schema.json +12 -0
  273. package/dist/schemas/codex-setup-intent.schema.json +27 -0
  274. package/dist/schemas/local-codex-setup-session.schema.json +39 -0
  275. package/dist/schemas/setup-claim-failure.schema.json +15 -0
  276. package/dist/skillInstallationScope.test.d.ts +2 -0
  277. package/dist/skillInstallationScope.test.d.ts.map +1 -0
  278. package/dist/skillInstallationScope.test.js +64 -0
  279. package/dist/skillInstallationScope.test.js.map +1 -0
  280. package/dist/skillPreparationCache.test.js +12 -4
  281. package/dist/skillPreparationCache.test.js.map +1 -1
  282. package/dist/skillPreparationCaller.test.js +31 -1
  283. package/dist/skillPreparationCaller.test.js.map +1 -1
  284. package/dist/startupCommitScope.test.d.ts +2 -0
  285. package/dist/startupCommitScope.test.d.ts.map +1 -0
  286. package/dist/startupCommitScope.test.js +172 -0
  287. package/dist/startupCommitScope.test.js.map +1 -0
  288. package/dist/workspaceRegistry.d.ts.map +1 -1
  289. package/dist/workspaceRegistry.js +7 -3
  290. package/dist/workspaceRegistry.js.map +1 -1
  291. package/dist/workspaceRegistry.test.js +51 -0
  292. package/dist/workspaceRegistry.test.js.map +1 -1
  293. package/dist/workspaceRegistryRecovery.d.ts.map +1 -1
  294. package/dist/workspaceRegistryRecovery.js +171 -64
  295. package/dist/workspaceRegistryRecovery.js.map +1 -1
  296. package/dist/workspaceRegistryRecoveryScope.test.d.ts +2 -0
  297. package/dist/workspaceRegistryRecoveryScope.test.d.ts.map +1 -0
  298. package/dist/workspaceRegistryRecoveryScope.test.js +416 -0
  299. package/dist/workspaceRegistryRecoveryScope.test.js.map +1 -0
  300. package/package.json +7 -7
@@ -0,0 +1,316 @@
1
+ import assert from 'node:assert/strict';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as syncFs from 'node:fs';
4
+ import * as crypto from 'node:crypto';
5
+ import * as path from 'node:path';
6
+ import * as url from 'node:url';
7
+ import { createRequire } from 'node:module';
8
+ import { tmpdir } from 'node:os';
9
+ import { runInNewContext } from 'node:vm';
10
+ import test from 'node:test';
11
+ import ts from 'typescript';
12
+ import { currentBootstrapHostScope, runCodexBootstrapHost } from './bootstrapHostScope.js';
13
+ const skill = '.agents/skills/dharma-agent-fabric';
14
+ function input(workspace) {
15
+ const id = (n) => `${String(n).padStart(8, '0')}-1111-4111-8111-111111111111`;
16
+ const now = Date.now(), digest = `sha256:${'a'.repeat(64)}`;
17
+ return { workspace, current: async () => true, signal: new AbortController().signal,
18
+ intent: { schema: 'dharma.codex-setup-intent/v1', operationId: id(1), setupReference: id(2),
19
+ organizationId: 'org_demo', recipientMembershipId: id(3), origin: 'https://hq.example',
20
+ repositoryFingerprint: digest, policyRevision: 'policy-v1', scopeDigest: digest, contractDigest: digest,
21
+ hostContextId: id(4), issuedAt: new Date(now - 1000).toISOString(), expiresAt: new Date(now + 60_000).toISOString() } };
22
+ }
23
+ async function fixture(t) {
24
+ const workspace = await fs.mkdtemp(path.join(tmpdir(), 'dharma-knowledge-scope-'));
25
+ t.after(() => fs.rm(workspace, { recursive: true, force: true }));
26
+ await fs.mkdir(path.join(workspace, skill), { recursive: true });
27
+ await fs.writeFile(path.join(workspace, skill, '.dharma-agent-fabric.json'), JSON.stringify({ managedBy: 'dharma-agent-fabric', workspaceId: 'synthetic' }));
28
+ return { workspace, organizationId: 'org_demo', repositoryAgentId: 'synthetic', now: new Date('2026-10-01T00:00:00.000Z') };
29
+ }
30
+ async function module(overrides = {}) {
31
+ const location = new URL('../src/repositoryKnowledge.ts', import.meta.url), require = createRequire(location);
32
+ const source = (await fs.readFile(location, 'utf8')).replaceAll('import.meta.url', JSON.stringify(location.href));
33
+ const result = ts.transpileModule(source, { compilerOptions: { target: ts.ScriptTarget.ES2023,
34
+ module: ts.ModuleKind.CommonJS }, reportDiagnostics: true });
35
+ assert.equal(result.diagnostics?.filter(item => item.category === ts.DiagnosticCategory.Error).length, 0);
36
+ const exports = {};
37
+ runInNewContext(result.outputText, { exports, Buffer, Date, process, require: (name) => {
38
+ if (name === 'node:fs')
39
+ return syncFs;
40
+ if (name === 'node:fs/promises')
41
+ return { ...fs, ...overrides };
42
+ if (name === 'node:crypto')
43
+ return crypto;
44
+ if (name === 'node:path')
45
+ return path;
46
+ if (name === 'node:url')
47
+ return url;
48
+ if (name === 'node:module')
49
+ return { createRequire: () => require };
50
+ if (name === './bootstrapHostScope.js')
51
+ return { currentBootstrapHostScope };
52
+ return require(name);
53
+ } }, { timeout: 1000, contextCodeGeneration: { strings: false, wasm: false } });
54
+ return exports;
55
+ }
56
+ for (const scoped of [true, false])
57
+ for (const cleanup of [true, false]) {
58
+ test(`knowledge preserves replaced staging despite reused dev/ino (${scoped ? 'scoped' : 'legacy'}, ${cleanup ? 'cleanup' : 'publication'})`, async (t) => {
59
+ const f = await fixture(t);
60
+ let staging = '', foreign = '', acquired, unlinks = 0, links = 0;
61
+ const api = await module({ open: async (...args) => {
62
+ const handle = await fs.open(...args);
63
+ if (!(Number(args[1]) & syncFs.constants.O_CREAT))
64
+ return handle;
65
+ staging = String(args[0]);
66
+ const close = handle.close.bind(handle);
67
+ handle.close = async () => {
68
+ acquired = await handle.stat({ bigint: true });
69
+ await close();
70
+ const original = await fs.readFile(staging);
71
+ foreign = 'x'.repeat(original.length);
72
+ await fs.unlink(staging);
73
+ await fs.writeFile(staging, foreign);
74
+ };
75
+ return handle;
76
+ }, lstat: async (name, options) => {
77
+ const actual = await fs.lstat(name, options);
78
+ if (String(name) !== staging || !acquired || !options?.bigint)
79
+ return actual;
80
+ return Object.assign(Object.create(Object.getPrototypeOf(actual)), actual, { dev: acquired.dev, ino: acquired.ino });
81
+ }, unlink: async (...args) => { unlinks++; return fs.unlink(...args); },
82
+ link: async (...args) => {
83
+ links++;
84
+ if (cleanup)
85
+ throw new Error('fixture link failure');
86
+ return fs.link(...args);
87
+ } });
88
+ const operation = () => api.initializeRepositoryKnowledge(f);
89
+ const error = await (scoped ? runCodexBootstrapHost(input(f.workspace), operation) : operation()).then(() => null, (failure) => failure);
90
+ assert.equal(await fs.readFile(staging, 'utf8'), foreign);
91
+ assert.equal(unlinks, 0);
92
+ assert.equal(links, 0);
93
+ await assert.rejects(fs.stat(path.join(f.workspace, skill, '.repository-knowledge-init.json')), { code: 'ENOENT' });
94
+ assert.equal(error?.message, 'repository_knowledge_cleanup_unconfirmed');
95
+ });
96
+ }
97
+ test('knowledge verifies content even when an in-place edit reports unchanged metadata', async (t) => {
98
+ const f = await fixture(t);
99
+ let staging = '', foreign = '', acquired, unlinks = 0, links = 0;
100
+ const api = await module({ open: async (...args) => {
101
+ const handle = await fs.open(...args);
102
+ if (Number(args[1]) & syncFs.constants.O_CREAT) {
103
+ staging = String(args[0]);
104
+ const close = handle.close.bind(handle);
105
+ handle.close = async () => {
106
+ acquired = await handle.stat({ bigint: true });
107
+ await close();
108
+ foreign = 'x'.repeat(Number(acquired.size));
109
+ await fs.writeFile(staging, foreign);
110
+ };
111
+ }
112
+ else if (String(args[0]) === staging)
113
+ handle.stat = (async () => acquired);
114
+ return handle;
115
+ }, lstat: async (name, options) => String(name) === staging && acquired && options?.bigint ? acquired : fs.lstat(name, options),
116
+ unlink: async (...args) => { unlinks++; return fs.unlink(...args); },
117
+ link: async (...args) => { links++; return fs.link(...args); } });
118
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f)), { message: 'repository_knowledge_cleanup_unconfirmed' });
119
+ assert.equal(await fs.readFile(staging, 'utf8'), foreign);
120
+ assert.equal(unlinks, 0);
121
+ assert.equal(links, 0);
122
+ });
123
+ test('knowledge closes its staging reader after read withdrawal without publication or cleanup', async (t) => {
124
+ const f = await fixture(t);
125
+ let staging = '', readersClosed = 0, unlinks = 0, links = 0;
126
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
127
+ const api = await module({ open: async (...args) => {
128
+ const handle = await fs.open(...args);
129
+ if (Number(args[1]) & syncFs.constants.O_CREAT)
130
+ staging = String(args[0]);
131
+ else if (String(args[0]) === staging) {
132
+ const read = handle.read.bind(handle), close = handle.close.bind(handle);
133
+ handle.read = (async (...values) => { const result = await Reflect.apply(read, handle, values); scope.close(); return result; });
134
+ handle.close = async () => { readersClosed++; return close(); };
135
+ }
136
+ return handle;
137
+ }, unlink: async (...args) => { unlinks++; return fs.unlink(...args); },
138
+ link: async (...args) => { links++; return fs.link(...args); } });
139
+ await api.initializeRepositoryKnowledge(f);
140
+ }), { message: 'codex_setup_host_scope_unavailable' });
141
+ assert.equal(readersClosed, 1);
142
+ assert.equal(unlinks, 0);
143
+ assert.equal(links, 0);
144
+ assert.equal(JSON.parse(await fs.readFile(staging, 'utf8')).organizationId, 'org_demo');
145
+ });
146
+ test('knowledge scope refuses workspace metadata before IO when original host is closed', async (t) => {
147
+ const f = await fixture(t);
148
+ let stats = 0;
149
+ const api = await module({ lstat: async (...args) => { stats++; return fs.lstat(...args); } });
150
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
151
+ scope.close();
152
+ await api.initializeRepositoryKnowledge(f);
153
+ }), { message: 'codex_setup_host_scope_unavailable' });
154
+ assert.equal(stats, 0);
155
+ });
156
+ test('knowledge scope stops after withdrawn workspace metadata without resolving another path', async (t) => {
157
+ const f = await fixture(t);
158
+ let stats = 0, resolutions = 0;
159
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
160
+ const api = await module({ lstat: async (...args) => {
161
+ stats++;
162
+ const value = await fs.lstat(...args);
163
+ scope.close();
164
+ return value;
165
+ }, realpath: async (...args) => { resolutions++; return fs.realpath(...args); } });
166
+ await api.readRepositoryKnowledge(f);
167
+ }), { message: 'codex_setup_host_scope_unavailable' });
168
+ assert.equal(stats, 1);
169
+ assert.equal(resolutions, 0);
170
+ });
171
+ test('knowledge scope closes acquired marker handle after withdrawal without reading', async (t) => {
172
+ const f = await fixture(t);
173
+ let reads = 0, closes = 0;
174
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
175
+ const api = await module({ open: async (...args) => {
176
+ const handle = await fs.open(...args), close = handle.close.bind(handle), read = handle.read.bind(handle);
177
+ handle.close = async () => { closes++; return close(); };
178
+ handle.read = ((...values) => { reads++; return Reflect.apply(read, handle, values); });
179
+ scope.close();
180
+ return handle;
181
+ } });
182
+ await api.readRepositoryKnowledge(f);
183
+ }), { message: 'codex_setup_host_scope_unavailable' });
184
+ assert.equal(reads, 0);
185
+ assert.equal(closes, 1);
186
+ });
187
+ test('knowledge scope snapshots identity and timestamp before workspace inspection yields', async (t) => {
188
+ const f = await fixture(t), intended = { ...f, now: new Date(f.now) };
189
+ const api = await module({ lstat: async (...args) => {
190
+ const value = await fs.lstat(...args);
191
+ f.organizationId = 'org_foreign';
192
+ f.now.setTime(0);
193
+ return value;
194
+ } });
195
+ const actual = await runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f));
196
+ assert.equal(actual.catalog.organizationId, intended.organizationId);
197
+ assert.equal(actual.catalog.initializedAt, intended.now.toISOString());
198
+ });
199
+ test('knowledge scope retains interrupted generated staging after write and closes only its handle', async (t) => {
200
+ const f = await fixture(t);
201
+ let links = 0, syncs = 0, closes = 0;
202
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
203
+ const api = await module({ open: async (...args) => {
204
+ const handle = await fs.open(...args);
205
+ if (!(Number(args[1]) & syncFs.constants.O_CREAT))
206
+ return handle;
207
+ const write = handle.writeFile.bind(handle), sync = handle.sync.bind(handle), close = handle.close.bind(handle);
208
+ handle.writeFile = async (...values) => { const value = await write(...values); scope.close(); return value; };
209
+ handle.sync = async () => { syncs++; return sync(); };
210
+ handle.close = async () => { closes++; return close(); };
211
+ return handle;
212
+ }, link: async (...args) => { links++; return fs.link(...args); } });
213
+ await api.initializeRepositoryKnowledge(f);
214
+ }), { message: 'codex_setup_host_scope_unavailable' });
215
+ assert.equal(links, 0);
216
+ assert.equal(syncs, 0);
217
+ assert.equal(closes, 1);
218
+ assert.equal((await fs.readdir(path.join(f.workspace, skill))).filter(name => name.startsWith('.knowledge-init-')).length, 1);
219
+ await assert.rejects(fs.stat(path.join(f.workspace, skill, 'knowledge')), { code: 'ENOENT' });
220
+ });
221
+ test('knowledge scope preserves published intent when link result withdraws host authority', async (t) => {
222
+ const f = await fixture(t);
223
+ let links = 0, unlinks = 0, directories = 0;
224
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), async ({ scope }) => {
225
+ const api = await module({ link: async (...args) => {
226
+ links++;
227
+ await fs.link(...args);
228
+ scope.close();
229
+ }, unlink: async (...args) => { unlinks++; return fs.unlink(...args); },
230
+ mkdir: async (...args) => { directories++; return fs.mkdir(...args); } });
231
+ await api.initializeRepositoryKnowledge(f);
232
+ }), { message: 'codex_setup_host_scope_unavailable' });
233
+ assert.equal(links, 1);
234
+ assert.equal(unlinks, 0);
235
+ assert.equal(directories, 0);
236
+ assert.equal(JSON.parse(await fs.readFile(path.join(f.workspace, skill, '.repository-knowledge-init.json'), 'utf8')).organizationId, f.organizationId);
237
+ });
238
+ test('knowledge scope never invokes a native error code accessor or discloses native diagnostics', async (t) => {
239
+ const f = await fixture(t);
240
+ let getters = 0;
241
+ const api = await module({ lstat: async () => {
242
+ throw Object.defineProperty(new Error('private native canary'), 'code', {
243
+ get: () => { getters++; throw new Error('private getter canary'); }
244
+ });
245
+ } });
246
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.readRepositoryKnowledge(f)), { message: 'repository_knowledge_storage_unavailable' });
247
+ assert.equal(getters, 0);
248
+ });
249
+ test('knowledge scope initializes and reuses byte-identical unsigned catalog under its original identity', async (t) => {
250
+ const f = await fixture(t), api = await module();
251
+ const first = await runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f));
252
+ const catalog = path.join(f.workspace, skill, 'knowledge', 'CATALOG.json'), bytes = await fs.readFile(catalog);
253
+ const second = await runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge({ ...f, now: new Date('2026-10-02T00:00:00.000Z') }));
254
+ assert.equal(first.disposition, 'initialized');
255
+ assert.equal(second.disposition, 'reused');
256
+ assert.deepEqual(second.catalog, first.catalog);
257
+ assert.deepEqual(await fs.readFile(catalog), bytes);
258
+ assert.equal(second.catalog.provenance.authority, 'unsigned');
259
+ });
260
+ test('knowledge scope snapshots input without invoking identity accessors', async (t) => {
261
+ const f = await fixture(t);
262
+ let getters = 0, stats = 0;
263
+ Object.defineProperty(f, 'organizationId', { get: () => { getters++; throw new Error('private input canary'); } });
264
+ const api = await module({ lstat: async (...args) => { stats++; return fs.lstat(...args); } });
265
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f)), { message: 'repository_knowledge_input_invalid' });
266
+ assert.equal(getters, 0);
267
+ assert.equal(stats, 0);
268
+ });
269
+ test('knowledge scope retains an unowned staging collision without cleanup or publication', async (t) => {
270
+ const f = await fixture(t);
271
+ let foreignPath = '', unlinks = 0;
272
+ const api = await module({ open: async (...args) => {
273
+ if (!(Number(args[1]) & syncFs.constants.O_CREAT))
274
+ return fs.open(...args);
275
+ foreignPath = String(args[0]);
276
+ await fs.writeFile(foreignPath, 'foreign');
277
+ throw Object.assign(new Error('private collision canary'), { code: 'EEXIST' });
278
+ }, unlink: async (...args) => { unlinks++; return fs.unlink(...args); } });
279
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f)), { message: 'repository_knowledge_storage_unavailable' });
280
+ assert.equal(unlinks, 0);
281
+ assert.equal(await fs.readFile(foreignPath, 'utf8'), 'foreign');
282
+ });
283
+ test('knowledge scope preserves foreign staging replacement after its acquired handle closes', async (t) => {
284
+ const f = await fixture(t);
285
+ let foreignPath = '', unlinks = 0;
286
+ const api = await module({ open: async (...args) => {
287
+ const handle = await fs.open(...args);
288
+ if (!(Number(args[1]) & syncFs.constants.O_CREAT))
289
+ return handle;
290
+ foreignPath = String(args[0]);
291
+ const close = handle.close.bind(handle);
292
+ handle.close = async () => { await close(); await fs.unlink(foreignPath); await fs.writeFile(foreignPath, 'foreign'); };
293
+ return handle;
294
+ }, link: async () => { throw new Error('private link canary'); },
295
+ unlink: async (...args) => { unlinks++; return fs.unlink(...args); } });
296
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f)), { message: 'repository_knowledge_cleanup_unconfirmed' });
297
+ assert.equal(unlinks, 0);
298
+ assert.equal(await fs.readFile(foreignPath, 'utf8'), 'foreign');
299
+ });
300
+ test('knowledge scope does not unlink generated evidence after uncertain staging close', async (t) => {
301
+ const f = await fixture(t);
302
+ let closes = 0, unlinks = 0;
303
+ const api = await module({ open: async (...args) => {
304
+ const handle = await fs.open(...args);
305
+ if (!(Number(args[1]) & syncFs.constants.O_CREAT))
306
+ return handle;
307
+ const close = handle.close.bind(handle);
308
+ handle.close = async () => { closes++; await close(); throw new Error('private close canary'); };
309
+ return handle;
310
+ }, unlink: async (...args) => { unlinks++; return fs.unlink(...args); } });
311
+ await assert.rejects(runCodexBootstrapHost(input(f.workspace), () => api.initializeRepositoryKnowledge(f)), { message: 'repository_knowledge_cleanup_unconfirmed' });
312
+ assert.equal(closes, 1);
313
+ assert.equal(unlinks, 0);
314
+ assert.equal((await fs.readdir(path.join(f.workspace, skill))).filter(name => name.startsWith('.knowledge-init-')).length, 1);
315
+ });
316
+ //# sourceMappingURL=repositoryKnowledgeScope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryKnowledgeScope.test.js","sourceRoot":"","sources":["../src/repositoryKnowledgeScope.test.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ import test from 'node:test';
8
8
  import ts from 'typescript';
9
9
  import { appendRecoveredWorkspace, resolveRegistryRecoveryProjection } from './workspaceRegistryRecovery.js';
10
10
  import { bootstrapGrantMode } from './privateGrantInput.js';
11
+ import { assertBootstrapHostSource, currentBootstrapHostScope, runCodexBootstrapHost } from './bootstrapHostScope.js';
12
+ import { parseNamedCodexSkillObservation } from './namedCodexSkillDiscovery.js';
11
13
  // Execute the actual function body, parsed by TypeScript rather than extracted
12
14
  // by text matching. All I/O boundaries are injected: no enrollment, paid work,
13
15
  // secret-store writes, daemon processes, or external requests can occur.
@@ -21,7 +23,9 @@ async function caller(name, dependencies) {
21
23
  reportDiagnostics: true,
22
24
  });
23
25
  assert.equal(compiled.diagnostics?.filter(item => item.category === ts.DiagnosticCategory.Error).length, 0);
24
- return runInNewContext(`${compiled.outputText}\n${name}`, dependencies, {
26
+ return runInNewContext(`${compiled.outputText}\n${name}`, {
27
+ assertBootstrapHostSource, currentBootstrapHostScope, parseNamedCodexSkillObservation, ...dependencies,
28
+ }, {
25
29
  timeout: 1000, contextCodeGeneration: { strings: false, wasm: false },
26
30
  });
27
31
  }
@@ -99,10 +103,40 @@ function bootstrapDependencies(onboarding) {
99
103
  requireCompletedBootstrapEvidence: () => undefined,
100
104
  summarizeBootstrapOrganizationApi: () => ({ ok: true }),
101
105
  loadAgentFabricOnboardingContract: async () => ({ markdown: '# fixture', sha256: 'a'.repeat(64) }),
102
- namedSessionCommand: async () => { await record('named_session'); return { ok: true, state: 'running' }; },
106
+ namedSessionCommand: async (action, flags) => {
107
+ await record(`named_session:${action}`);
108
+ return { ok: true, state: 'running', name: String(flags.get('name')), bindingId: 'fixture_binding',
109
+ sessionId: 'fixture_session', organizationId: 'org_fixture', repositoryBindingId: 'fixture_repository',
110
+ workspaceId: String(flags.get('workspace-id')), endpointId: 'fixture_endpoint', membershipId: 'fixture_member',
111
+ deviceId: 'fixture_device', provider: 'codex',
112
+ nativeSkill: { schema: 'dharma.named-codex-skill-observation/v1', nativeDiscovered: true,
113
+ bundleId: '11111111-1111-4111-8111-111111111111', bundleHash: `sha256:${'a'.repeat(64)}`,
114
+ manifestHash: `sha256:${'b'.repeat(64)}`, catalogHash: `sha256:${'c'.repeat(64)}`,
115
+ skillsHash: `sha256:${'d'.repeat(64)}`, observedAt: new Date().toISOString() } };
116
+ },
103
117
  };
104
118
  return { dependencies, calls };
105
119
  }
120
+ test('host onboarding cannot replace absent accepted enrollment with a legacy login', async () => {
121
+ const f = bootstrapDependencies({});
122
+ let logins = 0;
123
+ f.dependencies.login = async () => { logins++; return { status: 'pending' }; };
124
+ const onboard = await caller('onboard', f.dependencies);
125
+ const workspace = resolve('/fixture', 'onboard');
126
+ const flags = new Map([['workspace', workspace],
127
+ ['organization-id', 'org_fixture'], ['policy-revision', 'policy-v1']]);
128
+ const uuid = '11111111-1111-4111-8111-111111111111', digest = `sha256:${'a'.repeat(64)}`;
129
+ const now = Date.now();
130
+ await assert.rejects(runCodexBootstrapHost({ workspace, signal: new AbortController().signal, current: async () => true,
131
+ intent: { schema: 'dharma.codex-setup-intent/v1', operationId: uuid, setupReference: uuid,
132
+ organizationId: 'org_fixture', recipientMembershipId: uuid, origin: 'https://fixture.invalid',
133
+ repositoryFingerprint: digest, policyRevision: 'policy-v1', scopeDigest: digest, contractDigest: digest,
134
+ hostContextId: uuid, issuedAt: new Date(now - 1000).toISOString(), expiresAt: new Date(now + 60_000).toISOString() },
135
+ }, async () => onboard(flags)), { message: 'codex_setup_host_enrollment_missing' });
136
+ assert.equal(logins, 0);
137
+ assert.equal((await onboard(flags)).stage, 'approve_device');
138
+ assert.equal(logins, 1, 'ordinary legacy onboarding keeps its existing login path');
139
+ });
106
140
  test('registry recovery command plans before applying one current-device anchor row', async () => {
107
141
  const workspace = resolve('/fixture', 'anchor');
108
142
  const policyPath = resolve(workspace, '.dharma', 'approved-policy.json');
@@ -546,7 +580,7 @@ test('bootstrap completes after the relay installs the signed shared release', a
546
580
  assert.equal(actual.repositoryReadiness.attempts, 3);
547
581
  assert.equal(actual.namedSession.state, 'running');
548
582
  assert.equal(actual.workflowReadiness.namedSession, 'ready');
549
- assert.equal(f.calls.filter(value => value === 'named_session').length, 1);
583
+ assert.deepEqual(f.calls.filter(value => value.startsWith('named_session:')), ['named_session:start', 'named_session:readiness']);
550
584
  });
551
585
  test('published-package secret denial stays visible without repeating evidence capture', async () => {
552
586
  const f = bootstrapDependencies({ ok: true, stage: 'ready', localStage: 'ready',
@@ -594,12 +628,35 @@ test('a failed named session cannot produce a complete bootstrap receipt', async
594
628
  test('a stopped named session keeps an otherwise ready bootstrap incomplete', async () => {
595
629
  const f = bootstrapDependencies({ ok: true, stage: 'ready', localStage: 'ready',
596
630
  sharedRepositoryReady: true, workspaceId: 'workspace_fixture' });
597
- f.dependencies.namedSessionCommand = async () => ({ ok: true, state: 'stopped' });
631
+ const respond = f.dependencies.namedSessionCommand;
632
+ f.dependencies.namedSessionCommand = async (action, flags) => ({
633
+ ...await respond(action, flags), state: 'stopped',
634
+ });
598
635
  const actual = await (await caller('bootstrap', f.dependencies))(bootstrapFlags(true));
599
636
  assert.equal(actual.ok, false);
600
637
  assert.equal(actual.stage, 'named_session_pending');
601
638
  assert.equal(actual.workflowReadiness.namedSession, 'pending');
602
639
  });
640
+ test('bootstrap rejects missing or malformed native observations using the real IPC parser', async () => {
641
+ for (const nativeSkill of [undefined, { schema: 'foreign-observation' }]) {
642
+ const f = bootstrapDependencies({ ok: true, stage: 'ready', localStage: 'ready',
643
+ sharedRepositoryReady: true, workspaceId: 'workspace_fixture' });
644
+ const respond = f.dependencies.namedSessionCommand;
645
+ f.dependencies.namedSessionCommand = async (action, flags) => ({
646
+ ...await respond(action, flags), ...(action === 'readiness' ? { nativeSkill } : {}),
647
+ });
648
+ await assert.rejects((await caller('bootstrap', f.dependencies))(bootstrapFlags(true)), /named_session_native_skill_invalid/);
649
+ }
650
+ });
651
+ test('bootstrap rejects a readiness identity changed after named-session start', async () => {
652
+ const f = bootstrapDependencies({ ok: true, stage: 'ready', localStage: 'ready',
653
+ sharedRepositoryReady: true, workspaceId: 'workspace_fixture' });
654
+ const respond = f.dependencies.namedSessionCommand;
655
+ f.dependencies.namedSessionCommand = async (action, flags) => ({
656
+ ...await respond(action, flags), ...(action === 'readiness' ? { membershipId: 'foreign_member' } : {}),
657
+ });
658
+ await assert.rejects((await caller('bootstrap', f.dependencies))(bootstrapFlags(true)), /named_session_readiness_scope_mismatch/);
659
+ });
603
660
  test('bootstrap reports a blocked repository candidate without replaying enrollment', async () => {
604
661
  const f = bootstrapDependencies({ ok: true, stage: 'shared_repository_pending', localStage: 'ready',
605
662
  sharedRepositoryReady: false, workspaceId: 'workspace_fixture' });