pi-background-tasks 2.5.0 → 2.6.0

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 (203) hide show
  1. package/BACKGROUND-TASKS-INSTRUCTIONS.md +1 -1
  2. package/README.md +70 -25
  3. package/TESTING.md +42 -2
  4. package/TEST_PLAN.md +7 -4
  5. package/dist/extensions/anthropic-attribution-child.js +4 -0
  6. package/dist/extensions/anthropic-attribution-child.js.map +1 -0
  7. package/dist/extensions/anthropic-attribution.js +107 -0
  8. package/dist/extensions/anthropic-attribution.js.map +1 -0
  9. package/dist/extensions/background-tasks.js +2 -0
  10. package/dist/extensions/background-tasks.js.map +1 -0
  11. package/dist/extensions/delegate-child.js +2 -0
  12. package/dist/extensions/delegate-child.js.map +1 -0
  13. package/dist/extensions/fusion-child.js +2 -0
  14. package/dist/extensions/fusion-child.js.map +1 -0
  15. package/dist/package.json +5 -0
  16. package/dist/src/core/anthropic-attribution-path.js +24 -0
  17. package/dist/src/core/anthropic-attribution-path.js.map +1 -0
  18. package/dist/src/core/anthropic-attribution.js +2247 -0
  19. package/dist/src/core/anthropic-attribution.js.map +1 -0
  20. package/dist/src/core/attested-pi-contract.js +5 -0
  21. package/dist/src/core/attested-pi-contract.js.map +1 -0
  22. package/dist/src/core/attested-pi-run.js +749 -0
  23. package/dist/src/core/attested-pi-run.js.map +1 -0
  24. package/dist/src/core/canonical-json.js +19 -0
  25. package/dist/src/core/canonical-json.js.map +1 -0
  26. package/dist/src/core/common.js +787 -0
  27. package/dist/src/core/common.js.map +1 -0
  28. package/dist/src/core/config.js +78 -0
  29. package/dist/src/core/config.js.map +1 -0
  30. package/dist/src/core/context/parent-snapshot.js +75 -0
  31. package/dist/src/core/context/parent-snapshot.js.map +1 -0
  32. package/dist/src/core/context/token-budget.js +631 -0
  33. package/dist/src/core/context/token-budget.js.map +1 -0
  34. package/dist/src/core/context/visible-conversation-v2.js +390 -0
  35. package/dist/src/core/context/visible-conversation-v2.js.map +1 -0
  36. package/dist/src/core/delegate/artifacts.js +357 -0
  37. package/dist/src/core/delegate/artifacts.js.map +1 -0
  38. package/dist/src/core/delegate/budget.js +266 -0
  39. package/dist/src/core/delegate/budget.js.map +1 -0
  40. package/dist/src/core/delegate/facade-contract.js +7 -0
  41. package/dist/src/core/delegate/facade-contract.js.map +1 -0
  42. package/dist/src/core/delegate/hook-contract-evidence.json +18 -0
  43. package/dist/src/core/delegate/hook-contract.js +124 -0
  44. package/dist/src/core/delegate/hook-contract.js.map +1 -0
  45. package/dist/src/core/delegate/launch.js +366 -0
  46. package/dist/src/core/delegate/launch.js.map +1 -0
  47. package/dist/src/core/delegate/result-package.js +293 -0
  48. package/dist/src/core/delegate/result-package.js.map +1 -0
  49. package/dist/src/core/delegate/runner.js +398 -0
  50. package/dist/src/core/delegate/runner.js.map +1 -0
  51. package/dist/src/core/delegate/seed.js +334 -0
  52. package/dist/src/core/delegate/seed.js.map +1 -0
  53. package/dist/src/core/delegate/types.js +103 -0
  54. package/dist/src/core/delegate/types.js.map +1 -0
  55. package/dist/src/core/durable-fs.js +372 -0
  56. package/dist/src/core/durable-fs.js.map +1 -0
  57. package/dist/src/core/extension-api.js +382 -0
  58. package/dist/src/core/extension-api.js.map +1 -0
  59. package/dist/src/core/fusion/artifacts.js +654 -0
  60. package/dist/src/core/fusion/artifacts.js.map +1 -0
  61. package/dist/src/core/fusion/budget.js +949 -0
  62. package/dist/src/core/fusion/budget.js.map +1 -0
  63. package/dist/src/core/fusion/child-protocol.js +176 -0
  64. package/dist/src/core/fusion/child-protocol.js.map +1 -0
  65. package/dist/src/core/fusion/claude-cache.js +156 -0
  66. package/dist/src/core/fusion/claude-cache.js.map +1 -0
  67. package/dist/src/core/fusion/clean-context.js +64 -0
  68. package/dist/src/core/fusion/clean-context.js.map +1 -0
  69. package/dist/src/core/fusion/config.js +349 -0
  70. package/dist/src/core/fusion/config.js.map +1 -0
  71. package/dist/src/core/fusion/context.js +184 -0
  72. package/dist/src/core/fusion/context.js.map +1 -0
  73. package/dist/src/core/fusion/evaluation.js +696 -0
  74. package/dist/src/core/fusion/evaluation.js.map +1 -0
  75. package/dist/src/core/fusion/facade-contract.js +3 -0
  76. package/dist/src/core/fusion/facade-contract.js.map +1 -0
  77. package/dist/src/core/fusion/orchestrator.js +867 -0
  78. package/dist/src/core/fusion/orchestrator.js.map +1 -0
  79. package/dist/src/core/fusion/output-contract.js +27 -0
  80. package/dist/src/core/fusion/output-contract.js.map +1 -0
  81. package/dist/src/core/fusion/pi-child.js +1741 -0
  82. package/dist/src/core/fusion/pi-child.js.map +1 -0
  83. package/dist/src/core/fusion/prompts.js +260 -0
  84. package/dist/src/core/fusion/prompts.js.map +1 -0
  85. package/dist/src/core/fusion/result-package.js +857 -0
  86. package/dist/src/core/fusion/result-package.js.map +1 -0
  87. package/dist/src/core/fusion/source-policy.js +259 -0
  88. package/dist/src/core/fusion/source-policy.js.map +1 -0
  89. package/dist/src/core/fusion/types.js +207 -0
  90. package/dist/src/core/fusion/types.js.map +1 -0
  91. package/dist/src/core/fusion/web-fetch.js +777 -0
  92. package/dist/src/core/fusion/web-fetch.js.map +1 -0
  93. package/dist/src/core/fusion/workflows.js +126 -0
  94. package/dist/src/core/fusion/workflows.js.map +1 -0
  95. package/dist/src/core/lazy-module.js +181 -0
  96. package/dist/src/core/lazy-module.js.map +1 -0
  97. package/dist/src/core/pi-launch.js +431 -0
  98. package/dist/src/core/pi-launch.js.map +1 -0
  99. package/dist/src/core/registry.js +3331 -0
  100. package/dist/src/core/registry.js.map +1 -0
  101. package/dist/src/core/reload-shell-owner.js +1396 -0
  102. package/dist/src/core/reload-shell-owner.js.map +1 -0
  103. package/dist/src/core/shell-policy.js +80 -0
  104. package/dist/src/core/shell-policy.js.map +1 -0
  105. package/dist/src/core/task-durable.js +51 -0
  106. package/dist/src/core/task-durable.js.map +1 -0
  107. package/dist/src/core/update-check.js +92 -0
  108. package/dist/src/core/update-check.js.map +1 -0
  109. package/dist/src/core/windows-taskkill.js +185 -0
  110. package/dist/src/core/windows-taskkill.js.map +1 -0
  111. package/dist/src/delegate-child-extension.js +776 -0
  112. package/dist/src/delegate-child-extension.js.map +1 -0
  113. package/dist/src/delegate-extension.js +746 -0
  114. package/dist/src/delegate-extension.js.map +1 -0
  115. package/dist/src/extension.js +953 -0
  116. package/dist/src/extension.js.map +1 -0
  117. package/dist/src/fusion-child-extension.js +760 -0
  118. package/dist/src/fusion-child-extension.js.map +1 -0
  119. package/dist/src/fusion-extension.js +1030 -0
  120. package/dist/src/fusion-extension.js.map +1 -0
  121. package/dist/src/ui/background-tasks-manager.js +689 -0
  122. package/dist/src/ui/background-tasks-manager.js.map +1 -0
  123. package/dist/src/ui/fusion-model-selector.js +277 -0
  124. package/dist/src/ui/fusion-model-selector.js.map +1 -0
  125. package/docs/INDEX.md +35 -33
  126. package/docs/api/eventbus-v1.md +21 -5
  127. package/docs/choose-a-workflow.md +2 -0
  128. package/docs/commands/bg-clear.md +3 -3
  129. package/docs/commands/bg-update.md +3 -3
  130. package/docs/commands/bg.md +18 -6
  131. package/docs/commands/claude-cache.md +4 -4
  132. package/docs/commands/fusion-models.md +49 -4
  133. package/docs/commands/fusion.md +3 -3
  134. package/docs/commands/jobs.md +3 -3
  135. package/docs/commands/kill.md +3 -3
  136. package/docs/commands/logs.md +3 -3
  137. package/docs/commands/task-manager.md +5 -5
  138. package/docs/concepts/completion-delivery.md +6 -2
  139. package/docs/getting-started.md +7 -1
  140. package/docs/manifest.json +228 -42
  141. package/docs/operations/configuration.md +58 -5
  142. package/docs/operations/releasing.md +4 -2
  143. package/docs/operations/testing.md +22 -0
  144. package/docs/operations/troubleshooting.md +6 -2
  145. package/docs/read-before-edit.md +44 -31
  146. package/docs/reference/runtime-contracts.md +87 -51
  147. package/docs/reference/shortcuts-and-dock.md +28 -14
  148. package/docs/subsystems/anthropic-attribution.md +23 -11
  149. package/docs/subsystems/attested-pi-runs.md +12 -7
  150. package/docs/subsystems/background-task-runtime.md +53 -11
  151. package/docs/subsystems/child-launch-durability-and-safety.md +28 -9
  152. package/docs/subsystems/delegation.md +16 -3
  153. package/docs/subsystems/docs-freshness-gate.md +14 -7
  154. package/docs/subsystems/fusion.md +36 -11
  155. package/docs/subsystems/host-ui-and-telemetry.md +22 -9
  156. package/docs/tools/bg_delegate.md +3 -1
  157. package/docs/tools/bg_kill.md +3 -1
  158. package/docs/tools/bg_logs.md +3 -1
  159. package/docs/tools/bg_result.md +5 -3
  160. package/docs/tools/bg_run.md +31 -5
  161. package/docs/tools/bg_run_pi_attested.md +3 -1
  162. package/docs/tools/bg_status.md +3 -1
  163. package/docs/tools/fusion_investigate.md +3 -1
  164. package/docs/tools/fusion_reason.md +3 -1
  165. package/docs/tools/fusion_research.md +3 -1
  166. package/docs/tools/fusion_validate.md +3 -1
  167. package/extensions/anthropic-attribution-child.ts +3 -0
  168. package/extensions/anthropic-attribution.ts +166 -1
  169. package/package.json +12 -10
  170. package/src/core/anthropic-attribution-path.ts +5 -4
  171. package/src/core/anthropic-attribution.ts +293 -113
  172. package/src/core/attested-pi-contract.ts +4 -0
  173. package/src/core/attested-pi-run.ts +468 -81
  174. package/src/core/canonical-json.ts +21 -0
  175. package/src/core/common.ts +450 -40
  176. package/src/core/config.ts +121 -0
  177. package/src/core/context/visible-conversation-v2.ts +3 -6
  178. package/src/core/delegate/artifacts.ts +13 -9
  179. package/src/core/delegate/budget.ts +13 -6
  180. package/src/core/delegate/facade-contract.ts +6 -0
  181. package/src/core/delegate/result-package.ts +32 -14
  182. package/src/core/delegate/runner.ts +129 -58
  183. package/src/core/delegate/seed.ts +5 -7
  184. package/src/core/durable-fs.ts +178 -30
  185. package/src/core/extension-api.ts +36 -8
  186. package/src/core/fusion/artifacts.ts +17 -16
  187. package/src/core/fusion/clean-context.ts +8 -5
  188. package/src/core/fusion/config.ts +2 -1
  189. package/src/core/fusion/context.ts +2 -6
  190. package/src/core/fusion/facade-contract.ts +2 -0
  191. package/src/core/fusion/orchestrator.ts +3 -3
  192. package/src/core/fusion/prompts.ts +1 -1
  193. package/src/core/fusion/result-package.ts +259 -72
  194. package/src/core/fusion/source-policy.ts +43 -17
  195. package/src/core/lazy-module.ts +215 -0
  196. package/src/core/pi-launch.ts +390 -65
  197. package/src/core/registry.ts +2010 -381
  198. package/src/core/reload-shell-owner.ts +1662 -0
  199. package/src/core/shell-policy.ts +134 -0
  200. package/src/core/task-durable.ts +67 -0
  201. package/src/delegate-extension.ts +404 -144
  202. package/src/extension.ts +387 -114
  203. package/src/fusion-extension.ts +202 -96
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../src/core/fusion/artifacts.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { chmod, mkdir } from 'node:fs/promises';\nimport { basename, isAbsolute, join, relative, sep } from 'node:path';\nimport { canonicalJson, sha256Buffer } from '../canonical-json.js';\nimport { sanitizePathSegment } from '../common.js';\nimport { replaceFileDurable } from '../durable-fs.js';\nimport {\n EMPTY_FUSION_USAGE,\n FUSION_COMMITTED_RESULT_SCHEMA_VERSION,\n FUSION_FAILURE_SUMMARY_SCHEMA_VERSION,\n FUSION_MANIFEST_SCHEMA_VERSION,\n FUSION_VALIDATE_CANDIDATE_CONTRACT_EVENT_SCHEMA_VERSION,\n FusionError,\n cloneFusionUsage,\n type FusionArtifactManifest,\n type FusionArtifactRef,\n type FusionFailureArtifactClassification,\n type FusionFailureAttemptMetadata,\n type FusionFailureEvidenceArtifact,\n type FusionFailureSummaryV1,\n type FusionRunProgress,\n type FusionAttemptArtifactRecord,\n type FusionBudgetPlanV1,\n type FusionCalibrationViolation,\n type FusionCandidateId,\n type FusionCandidateOutputRecovery,\n type FusionCapability,\n type FusionContextOmissionLedgerV2,\n type FusionChildRunResult,\n type FusionCommittedResultV1,\n type FusionResultDetails,\n type FusionModelConfigV1,\n type FusionSource,\n type FusionStage,\n type FusionState,\n type FusionTerminalState,\n type FusionUsage,\n type FusionWorkflowId,\n type ResolvedFusionModels,\n} from './types.js';\nimport { fusionWorkflowProfile, type FusionWorkflowProfile } from './workflows.js';\nimport {\n FUSION_CANDIDATE_MAX_OUTPUT_BYTES,\n fusionJsonRenderedTextBytes,\n} from './output-contract.js';\n\n/**\n * Run ids are prefixed by workflow so an artifact directory is self-describing.\n * The prefix set is closed: an unknown prefix must fail rather than be accepted.\n */\nconst RUN_ID_PATTERN = /^(reason|investigate|research|validate)-[0-9a-f]{32}$/;\n\ninterface MutableFusionArtifactManifest {\n schema_version: typeof FUSION_MANIFEST_SCHEMA_VERSION;\n run_id: string;\n workflow: FusionWorkflowId;\n source: FusionSource;\n state: FusionState;\n created_at: string;\n updated_at: string;\n cwd: string;\n config: FusionModelConfigV1;\n models: {\n candidates: [string, string, string];\n evaluator: string;\n merger: string;\n thinking_level: string;\n };\n capabilities: {\n candidate: FusionCapability;\n evaluation: FusionCapability;\n merge: FusionCapability;\n };\n context: {\n kind: import('./types.js').FusionContextKind;\n policy_id: string;\n ledger_artifact?: string;\n source_policy_artifact?: string;\n };\n tool_policy: {\n candidate_tools: readonly string[];\n evaluation_tools: readonly [];\n merge_tools: readonly [];\n };\n usage: FusionUsage;\n attempts: FusionAttemptArtifactRecord[];\n artifacts: Record<string, FusionArtifactRef>;\n anonymous_map?: Record<FusionCandidateId, 1 | 2 | 3>;\n error?: string;\n}\n\nexport interface CreateFusionArtifactStoreOptions {\n cwd: string;\n sessionId?: string | undefined;\n runId?: string | undefined;\n profile?: FusionWorkflowProfile | undefined;\n source: FusionSource;\n config: FusionModelConfigV1;\n models: ResolvedFusionModels;\n capabilities?: {\n candidate: FusionCapability;\n evaluation: FusionCapability;\n merge: FusionCapability;\n };\n now?: () => Date;\n}\n\nexport interface RecordFusionChildAttemptInput {\n result: FusionChildRunResult;\n systemPrompt: string;\n prompt: string;\n responseKind: 'md' | 'txt';\n}\n\nexport type RecordValidationCandidateContractEventInput =\n | {\n candidateId: FusionCandidateId;\n slot: 1 | 2 | 3;\n status: 'normalized';\n detail: {\n normalization: 'markdown_json_fence' | 'prose_then_markdown_json_fence';\n original_sha256: string;\n forwarded_sha256: string;\n warning: string;\n };\n }\n | {\n candidateId: FusionCandidateId;\n slot: 1 | 2 | 3;\n status: 'dropped';\n detail: {\n response_sha256: string;\n error: string;\n warning: string;\n };\n };\n\nexport interface RecordFusionFailedAttemptInput {\n stage: FusionStage;\n slot?: 1 | 2 | 3;\n attempt: number;\n systemPrompt: string;\n prompt: string;\n events: Buffer;\n partialResponse: Buffer;\n stderr: Buffer;\n error: string;\n status: 'failed' | 'cancelled';\n childCreated: boolean;\n responseKind: 'md' | 'txt';\n outputRecovery?: FusionCandidateOutputRecovery;\n provider?: string;\n model?: string;\n qualifiedId?: string;\n usage?: FusionUsage;\n}\n\nfunction makeRunId(profile: FusionWorkflowProfile): string {\n return `${profile.runIdPrefix}${randomBytes(16).toString('hex')}`;\n}\n\nfunction modelsForManifest(models: ResolvedFusionModels): MutableFusionArtifactManifest['models'] {\n const first = models.candidates[0].qualifiedId;\n const second = models.candidates[1].qualifiedId;\n const third = models.candidates[2].qualifiedId;\n return {\n candidates: [first, second, third],\n evaluator: models.evaluator.qualifiedId,\n merger: models.merger.qualifiedId,\n thinking_level: models.evaluator.thinkingLevel,\n };\n}\n\nfunction terminalStates(): ReadonlySet<FusionState> {\n return new Set<FusionState>(['completed', 'failed', 'cancelled']);\n}\n\nconst TERMINAL_STATES = terminalStates();\n\nconst NEXT_STATES: Readonly<Record<FusionState, readonly FusionState[]>> = {\n initializing: ['candidates_running', 'failed', 'cancelled'],\n candidates_running: ['candidates_complete', 'failed', 'cancelled'],\n candidates_complete: ['evaluating', 'failed', 'cancelled'],\n evaluating: ['evaluation_complete', 'failed', 'cancelled'],\n evaluation_complete: ['merging', 'failed', 'cancelled'],\n merging: ['completed', 'failed', 'cancelled'],\n completed: [],\n failed: [],\n cancelled: [],\n};\n\nfunction canTransition(from: FusionState, to: FusionState): boolean {\n return NEXT_STATES[from].includes(to);\n}\n\nfunction pathInside(parent: string, child: string): boolean {\n const rel = relative(parent, child);\n return (\n rel === '' || (!rel.startsWith('..') && !isAbsolute(rel) && !rel.split(sep).includes('..'))\n );\n}\n\nfunction errorForArtifact(message: string): FusionError {\n return new FusionError(message, { code: 'artifact_error', childCreated: false });\n}\n\nasync function writePrivateFile(\n absPath: string,\n data: Buffer | string,\n): Promise<FusionArtifactRef> {\n const bytes = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf8');\n await replaceFileDurable(absPath, data);\n return { path: basename(absPath), byte_length: bytes.length, sha256: sha256Buffer(bytes) };\n}\n\nasync function writeJsonAtomic(absPath: string, value: unknown): Promise<FusionArtifactRef> {\n return writePrivateFile(absPath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction publicManifest(manifest: MutableFusionArtifactManifest): FusionArtifactManifest {\n const out: FusionArtifactManifest = {\n schema_version: manifest.schema_version,\n run_id: manifest.run_id,\n workflow: manifest.workflow,\n source: manifest.source,\n state: manifest.state,\n created_at: manifest.created_at,\n updated_at: manifest.updated_at,\n cwd: manifest.cwd,\n config: manifest.config,\n models: manifest.models,\n capabilities: manifest.capabilities,\n context: { ...manifest.context },\n tool_policy: {\n candidate_tools: [...manifest.tool_policy.candidate_tools],\n evaluation_tools: [],\n merge_tools: [],\n },\n usage: cloneFusionUsage(manifest.usage),\n attempts: [...manifest.attempts],\n artifacts: { ...manifest.artifacts },\n };\n if (manifest.anonymous_map !== undefined) out.anonymous_map = { ...manifest.anonymous_map };\n if (manifest.error !== undefined) out.error = manifest.error;\n return out;\n}\n\nfunction attemptPrefix(stage: FusionStage, slot: 1 | 2 | 3 | undefined, attempt: number): string {\n if (stage === 'candidate') {\n if (slot === undefined) throw errorForArtifact('candidate attempt requires slot');\n return `candidate-${String(slot)}.attempt-${String(attempt)}`;\n }\n if (slot !== undefined)\n throw errorForArtifact(`${stage} attempt must not include candidate slot`);\n return `${stage === 'evaluation' ? 'evaluation' : 'merge'}.attempt-${String(attempt)}`;\n}\n\nfunction responseName(prefix: string, kind: 'md' | 'txt'): string {\n return `${prefix}.response.${kind}`;\n}\n\nfunction calibrationViolationName(prefix: string): string {\n return `${prefix}.calibration-violation.json`;\n}\n\nfunction oversizedResponseName(prefix: string, kind: 'md' | 'txt'): string {\n return `${prefix}.response.oversized.${kind}`;\n}\n\nfunction validateOutputRecovery(\n recovery: FusionCandidateOutputRecovery,\n replacementText?: string,\n): void {\n if (recovery.limit_bytes !== FUSION_CANDIDATE_MAX_OUTPUT_BYTES) {\n throw errorForArtifact('fusion output recovery limit mismatches the candidate contract');\n }\n const originalBytes = Buffer.from(recovery.original_text, 'utf8');\n if (createHash('sha256').update(originalBytes).digest('hex') !== recovery.original_text_sha256) {\n throw errorForArtifact('fusion output recovery original text hash mismatch');\n }\n if (\n fusionJsonRenderedTextBytes(recovery.original_text) !== recovery.original_json_rendered_bytes\n ) {\n throw errorForArtifact('fusion output recovery original JSON-rendered byte count mismatch');\n }\n if (recovery.original_json_rendered_bytes <= recovery.limit_bytes) {\n throw errorForArtifact('fusion output recovery original did not exceed the candidate contract');\n }\n if (replacementText !== undefined) {\n const replacementBytes = fusionJsonRenderedTextBytes(replacementText);\n if (replacementBytes !== recovery.replacement_json_rendered_bytes) {\n throw errorForArtifact(\n 'fusion output recovery replacement JSON-rendered byte count mismatch',\n );\n }\n if (recovery.status === 'completed' && replacementBytes > recovery.limit_bytes) {\n throw errorForArtifact('completed fusion output recovery replacement exceeds the contract');\n }\n }\n}\n\nfunction outputRecoveryRecord(\n recovery: FusionCandidateOutputRecovery,\n path: string,\n): NonNullable<FusionAttemptArtifactRecord['output_recovery']> {\n return {\n kind: recovery.kind,\n status: recovery.status,\n limit_bytes: recovery.limit_bytes,\n original_response_path: path,\n original_record_index: recovery.original_record_index,\n replacement_record_index: recovery.replacement_record_index,\n original_json_rendered_bytes: recovery.original_json_rendered_bytes,\n replacement_json_rendered_bytes: recovery.replacement_json_rendered_bytes,\n original_text_sha256: recovery.original_text_sha256,\n };\n}\n\nfunction artifactRefSha256Hex(value: string): string {\n const hex = value.startsWith('sha256:') ? value.slice('sha256:'.length) : value;\n if (!/^[0-9a-f]{64}$/u.test(hex)) {\n throw errorForArtifact(`fusion artifact sha256 is not a lowercase hex digest: ${value}`);\n }\n return hex;\n}\n\n/** A manifest artifact reference is always one safe basename below its run directory. */\nexport function assertFusionArtifactBasename(name: string): string {\n if (\n name.length === 0 ||\n name !== basename(name) ||\n name.includes('/') ||\n name.includes('\\\\') ||\n name === '.' ||\n name === '..' ||\n Buffer.byteLength(name, 'utf8') > 255\n ) {\n throw errorForArtifact(`invalid fusion artifact name: ${name}`);\n }\n return name;\n}\n\nexport const FUSION_FAILURE_SUMMARY_INLINE_MESSAGE_BYTES = 1024;\nexport const FUSION_FAILURE_SUMMARY_ATTEMPT_CAP = 12;\nexport const FUSION_FAILURE_SUMMARY_EVIDENCE_CAP = 24;\nexport const FUSION_FAILURE_SUMMARY_MAX_BYTES = 32 * 1024;\n\nfunction compareArtifactText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\ninterface FusionProgressManifest {\n state: FusionState;\n artifacts: Readonly<Record<string, FusionArtifactRef>>;\n attempts: readonly {\n stage: FusionStage;\n slot?: 1 | 2 | 3 | undefined;\n status: 'completed' | 'failed' | 'cancelled';\n child_created: boolean;\n }[];\n usage: FusionUsage;\n}\n\nfunction failureStageProgress(\n manifest: FusionProgressManifest,\n stage: FusionStage,\n): FusionRunProgress['candidates'] {\n const attempts = manifest.attempts.filter((attempt) => attempt.stage === stage);\n const created = attempts.filter((attempt) => attempt.child_created).length;\n const completed = attempts.filter(\n (attempt) => attempt.child_created && attempt.status === 'completed',\n ).length;\n const failed = attempts.filter(\n (attempt) => attempt.child_created && attempt.status === 'failed',\n ).length;\n const cancelled = attempts.filter(\n (attempt) => attempt.child_created && attempt.status === 'cancelled',\n ).length;\n const completedByState =\n stage === 'candidate'\n ? completed >= 3\n : stage === 'evaluation'\n ? manifest.artifacts['evaluation.json'] !== undefined ||\n manifest.state === 'evaluation_complete' ||\n manifest.state === 'merging' ||\n manifest.state === 'completed'\n : manifest.artifacts['merged.md'] !== undefined || manifest.state === 'completed';\n const progress: FusionRunProgress['candidates'] = {\n status: completedByState ? 'completed' : created === 0 ? 'not_started' : 'incomplete',\n attempts_recorded: attempts.length,\n children_created: created,\n children_completed: completed,\n children_failed: failed,\n children_cancelled: cancelled,\n };\n if (stage === 'candidate') {\n const createdSlots = new Set(\n attempts.flatMap((attempt) =>\n attempt.child_created && attempt.slot !== undefined ? [attempt.slot] : [],\n ),\n );\n progress.not_started_slots = 3 - createdSlots.size;\n }\n return progress;\n}\n\n/** Derive terminal progress solely from the durable manifest. */\nexport function buildFusionRunProgress(manifest: FusionProgressManifest): FusionRunProgress {\n return {\n manifest_state: manifest.state,\n candidates: failureStageProgress(manifest, 'candidate'),\n evaluation: failureStageProgress(manifest, 'evaluation'),\n merge: failureStageProgress(manifest, 'merge'),\n usage_so_far: cloneFusionUsage(manifest.usage),\n };\n}\n\nfunction terminalMessageMetadata(message: string): FusionFailureSummaryV1['failure']['message'] {\n const bytes = Buffer.from(message, 'utf8');\n return {\n byte_length: bytes.length,\n sha256: sha256Buffer(bytes),\n ...(bytes.length <= FUSION_FAILURE_SUMMARY_INLINE_MESSAGE_BYTES\n ? { inline_message: message }\n : { omission_reason: 'exceeds_inline_message_bytes_cap' as const }),\n };\n}\n\nfunction failureArtifactClassification(\n name: string,\n ref: FusionArtifactRef,\n manifest: FusionArtifactManifest,\n): FusionFailureArtifactClassification {\n for (const attempt of manifest.attempts) {\n if (attempt.response_path === name) {\n return ref.byte_length === 0 && attempt.status !== 'completed'\n ? 'empty_rejected_output'\n : 'complete_stage_output';\n }\n if (attempt.partial_response_path === name) return 'partial_stage_output';\n if (attempt.output_recovery?.original_response_path === name) return 'oversized_original';\n }\n return 'evidence_only';\n}\n\nfunction failureAttemptMetadata(\n manifest: FusionArtifactManifest,\n): readonly FusionFailureAttemptMetadata[] {\n return manifest.attempts\n .map((attempt) => ({\n stage: attempt.stage,\n ...(attempt.slot === undefined ? {} : { slot: attempt.slot }),\n attempt: attempt.attempt,\n status: attempt.status,\n child_created: attempt.child_created,\n }))\n .sort(\n (left, right) =>\n compareArtifactText(left.stage, right.stage) ||\n (left.slot ?? 0) - (right.slot ?? 0) ||\n left.attempt - right.attempt,\n );\n}\n\nexport function buildFusionFailureSummary(input: {\n manifest: FusionArtifactManifest;\n terminalError: FusionError;\n progress: FusionRunProgress;\n terminalState: Exclude<FusionTerminalState, 'completed'>;\n createdAt: string;\n}): FusionFailureSummaryV1 {\n if (\n (input.terminalState !== 'failed' && input.terminalState !== 'cancelled') ||\n input.manifest.state !== input.terminalState\n ) {\n throw errorForArtifact(\n 'failure summary requires a matching failed/cancelled terminal manifest',\n );\n }\n if (input.manifest.error !== input.terminalError.message) {\n throw errorForArtifact('failure summary terminal error does not match the durable manifest');\n }\n if (canonicalJson(input.progress) !== canonicalJson(buildFusionRunProgress(input.manifest))) {\n throw errorForArtifact('failure summary progress does not match the durable terminal manifest');\n }\n if (input.manifest.artifacts['failure-summary.json'] !== undefined) {\n throw errorForArtifact('failure summary already exists in the terminal manifest');\n }\n const attempts = failureAttemptMetadata(input.manifest);\n const evidence: FusionFailureEvidenceArtifact[] = Object.entries(input.manifest.artifacts)\n .map(([name, ref]) => ({\n name: assertFusionArtifactBasename(name),\n classification: failureArtifactClassification(name, ref, input.manifest),\n ref: { ...ref },\n }))\n .sort((left, right) => compareArtifactText(left.name, right.name));\n return {\n schema_version: FUSION_FAILURE_SUMMARY_SCHEMA_VERSION,\n run_id: input.manifest.run_id,\n workflow: input.manifest.workflow,\n source: input.manifest.source,\n terminal_state: input.terminalState,\n created_at: input.createdAt,\n answer: { present: false, reason: 'run_did_not_commit' },\n failure: {\n code: input.terminalError.code,\n ...(input.terminalError.stage === undefined ? {} : { stage: input.terminalError.stage }),\n ...(input.terminalError.slot === undefined ? {} : { slot: input.terminalError.slot }),\n ...(input.terminalError.attempt === undefined\n ? {}\n : { attempt: input.terminalError.attempt }),\n child_created: input.terminalError.childCreated,\n message: terminalMessageMetadata(input.terminalError.message),\n },\n progress: input.progress,\n usage_so_far: cloneFusionUsage(input.manifest.usage),\n attempts: {\n listed: attempts.filter((_attempt, index) => index < FUSION_FAILURE_SUMMARY_ATTEMPT_CAP),\n omitted_count:\n attempts.length - Math.min(attempts.length, FUSION_FAILURE_SUMMARY_ATTEMPT_CAP),\n },\n evidence_artifacts: {\n listed: evidence.filter((_artifact, index) => index < FUSION_FAILURE_SUMMARY_EVIDENCE_CAP),\n omitted_count:\n evidence.length - Math.min(evidence.length, FUSION_FAILURE_SUMMARY_EVIDENCE_CAP),\n },\n remediation_ids: [\n 'inspect_manifest_bound_evidence',\n 'inspect_terminal_error',\n 'split_or_reduce_work',\n 'retry_same_route_after_operator_review',\n ],\n };\n}\n\nexport class FusionArtifactStore {\n private readonly runDirAbs: string;\n private readonly runDirDisplay: string;\n private readonly now: () => Date;\n private manifest: MutableFusionArtifactManifest;\n private manifestWriteChain: Promise<void> = Promise.resolve();\n\n private constructor(\n runDirAbs: string,\n runDirDisplay: string,\n now: () => Date,\n manifest: MutableFusionArtifactManifest,\n ) {\n this.runDirAbs = runDirAbs;\n this.runDirDisplay = runDirDisplay;\n this.now = now;\n this.manifest = manifest;\n }\n\n static async create(options: CreateFusionArtifactStoreOptions): Promise<FusionArtifactStore> {\n const profile = fusionWorkflowProfile(options.profile?.id ?? 'reason');\n const runId = options.runId ?? makeRunId(profile);\n if (!RUN_ID_PATTERN.test(runId)) throw errorForArtifact(`invalid fusion run id: ${runId}`);\n if (!runId.startsWith(profile.runIdPrefix)) {\n throw errorForArtifact(\n `fusion run id ${runId} does not carry the ${profile.id} workflow prefix ${profile.runIdPrefix}`,\n );\n }\n const sessionSegment = sanitizePathSegment(\n options.sessionId ?? `session-${String(process.pid)}`,\n );\n const sessionDirName = `${sessionSegment}-${String(process.pid)}`;\n const runDirAbs = join(options.cwd, '.pi', 'fusion', sessionDirName, runId);\n const runDirDisplay = join('.pi', 'fusion', sessionDirName, runId);\n await mkdir(runDirAbs, { recursive: true, mode: 0o700 });\n await chmod(runDirAbs, 0o700);\n const timestamp = (options.now ?? (() => new Date()))().toISOString();\n const manifest: MutableFusionArtifactManifest = {\n schema_version: FUSION_MANIFEST_SCHEMA_VERSION,\n run_id: runId,\n workflow: profile.id,\n source: options.source,\n state: 'initializing',\n created_at: timestamp,\n updated_at: timestamp,\n cwd: options.cwd,\n config: options.config,\n models: modelsForManifest(options.models),\n capabilities: options.capabilities ?? {\n candidate: 'reason',\n evaluation: 'reason',\n merge: 'reason',\n },\n context: {\n kind: profile.contextKind,\n policy_id:\n profile.contextKind === 'session_projection'\n ? 'fusion-session-projection-v1'\n : 'fusion-clean-task-v1',\n },\n tool_policy: {\n candidate_tools: profile.candidateTools,\n evaluation_tools: [],\n merge_tools: [],\n },\n usage: cloneFusionUsage(EMPTY_FUSION_USAGE),\n attempts: [],\n artifacts: {},\n };\n const store = new FusionArtifactStore(\n runDirAbs,\n runDirDisplay,\n options.now ?? (() => new Date()),\n manifest,\n );\n await store.writeManifest();\n return store;\n }\n\n get runId(): string {\n return this.manifest.run_id;\n }\n\n get artifactDir(): string {\n return this.runDirDisplay;\n }\n\n get artifactDirAbs(): string {\n return this.runDirAbs;\n }\n\n childToolCallLogPath(stage: FusionStage, slot: 1 | 2 | 3 | undefined, attempt: number): string {\n return this.artifactPath(`${attemptPrefix(stage, slot, attempt)}.tool-calls.jsonl`);\n }\n\n childOutputRecoveryPath(slot: 1 | 2 | 3, attempt: number, responseKind: 'md' | 'txt'): string {\n return this.artifactPath(\n oversizedResponseName(attemptPrefix('candidate', slot, attempt), responseKind),\n );\n }\n\n snapshot(): FusionArtifactManifest {\n return publicManifest(this.manifest);\n }\n\n async transition(to: FusionState): Promise<void> {\n await this.updateManifest((manifest) => {\n if (!canTransition(manifest.state, to)) {\n throw new FusionError(`illegal fusion state transition ${manifest.state} -> ${to}`, {\n code: 'state_transition_invalid',\n childCreated: false,\n });\n }\n if (\n to === 'completed' &&\n (manifest.artifacts['merged.md'] === undefined ||\n manifest.artifacts['result.json'] === undefined)\n ) {\n throw new FusionError(\n 'fusion cannot complete before merged.md and result.json are durable',\n {\n code: 'state_transition_invalid',\n childCreated: false,\n },\n );\n }\n manifest.state = to;\n });\n }\n\n async setAnonymousMap(map: Record<FusionCandidateId, 1 | 2 | 3>): Promise<void> {\n await this.updateManifest((manifest) => {\n manifest.anonymous_map = { ...map };\n });\n }\n\n async setUsage(usage: FusionUsage): Promise<void> {\n await this.updateManifest((manifest) => {\n manifest.usage = cloneFusionUsage(usage);\n });\n }\n\n async writeCanonicalInput(serialized: string): Promise<void> {\n await this.writeArtifact('canonical-input.json', serialized);\n }\n\n /**\n * Complete, source-ordered ledger of every omitted conversation event. Kept in\n * a separate artifact so canonical input carries only compact run receipts\n * while the full omission accounting stays locally auditable.\n */\n async writeContextLedger(ledger: FusionContextOmissionLedgerV2): Promise<void> {\n const ref = await this.writeArtifact('context-omission-ledger.json', canonicalJson(ledger));\n await this.updateManifest((manifest) => {\n manifest.context.ledger_artifact = ref.path;\n });\n }\n\n async writeSourcePolicy(serialized: string): Promise<void> {\n const ref = await this.writeArtifact('source-policy.private.json', serialized);\n await this.updateManifest((manifest) => {\n manifest.context.source_policy_artifact = ref.path;\n });\n }\n\n sourcePolicyLaunchReference(): { path: string; sha256: string } {\n const ref = this.manifest.artifacts['source-policy.private.json'];\n if (ref === undefined) throw errorForArtifact('research source policy has not been written');\n return { path: this.artifactPath(ref.path), sha256: artifactRefSha256Hex(ref.sha256) };\n }\n\n /** Route capacities and the pre-candidate whole-workflow feasibility decision. */\n async writeBudgetPlan(plan: FusionBudgetPlanV1): Promise<void> {\n await this.writeArtifact('budget-plan.json', canonicalJson(plan));\n }\n\n async writeBlindCandidates(serialized: string): Promise<void> {\n await this.writeArtifact('blind-candidates.json', serialized);\n }\n\n async writeEvaluationJson(value: unknown): Promise<void> {\n await this.writeArtifact('evaluation.json', canonicalJson(value));\n }\n\n async writeMerged(text: string): Promise<FusionArtifactRef> {\n return this.writeArtifact('merged.md', text);\n }\n\n async writeCommittedResult(\n merged: FusionArtifactRef,\n details: FusionResultDetails,\n ): Promise<FusionArtifactRef> {\n const value: FusionCommittedResultV1 = {\n schema_version: FUSION_COMMITTED_RESULT_SCHEMA_VERSION,\n run_id: this.runId,\n merged,\n details,\n };\n return this.writeArtifact('result.json', `${canonicalJson(value)}\\n`);\n }\n\n async writeError(state: Exclude<FusionTerminalState, 'completed'>, error: string): Promise<void> {\n await this.writeArtifact('error.json', `${JSON.stringify({ state, error }, null, 2)}\\n`);\n await this.updateManifest((manifest) => {\n if (!TERMINAL_STATES.has(state)) throw errorForArtifact(`invalid terminal state ${state}`);\n if (!canTransition(manifest.state, state)) {\n throw new FusionError(`illegal fusion state transition ${manifest.state} -> ${state}`, {\n code: 'state_transition_invalid',\n childCreated: false,\n });\n }\n manifest.state = state;\n manifest.error = error;\n });\n }\n\n /**\n * Writes the terminal evidence summary exactly once after writeError has made\n * the manifest terminal. The summary deliberately contains refs only, never\n * stage-output bodies.\n */\n async writeFailureSummary(summary: FusionFailureSummaryV1): Promise<FusionArtifactRef> {\n if (this.manifest.state !== 'failed' && this.manifest.state !== 'cancelled') {\n throw errorForArtifact('failure summary requires a failed/cancelled terminal manifest');\n }\n if (summary.terminal_state !== this.manifest.state) {\n throw errorForArtifact('failure summary terminal state does not match the manifest');\n }\n if (\n summary.run_id !== this.manifest.run_id ||\n summary.workflow !== this.manifest.workflow ||\n summary.source !== this.manifest.source\n ) {\n throw errorForArtifact('failure summary identity does not match the terminal manifest');\n }\n if (summary.answer?.present !== false || summary.answer.reason !== 'run_did_not_commit') {\n throw errorForArtifact('failure summary must assert that no answer was committed');\n }\n if (this.manifest.error === undefined || this.manifest.artifacts['error.json'] === undefined) {\n throw errorForArtifact('failure summary requires durable terminal error evidence');\n }\n if (\n canonicalJson(summary.failure.message) !==\n canonicalJson(terminalMessageMetadata(this.manifest.error))\n ) {\n throw errorForArtifact('failure summary terminal error metadata does not match the manifest');\n }\n if (\n canonicalJson(summary.progress) !== canonicalJson(buildFusionRunProgress(this.snapshot()))\n ) {\n throw errorForArtifact('failure summary progress does not match the terminal manifest');\n }\n if (canonicalJson(summary.usage_so_far) !== canonicalJson(this.manifest.usage)) {\n throw errorForArtifact('failure summary usage does not match the terminal manifest');\n }\n if (this.manifest.artifacts['failure-summary.json'] !== undefined) {\n throw errorForArtifact('failure summary is already bound in the manifest');\n }\n const bytes = Buffer.from(`${canonicalJson(summary)}\\n`, 'utf8');\n if (bytes.length > FUSION_FAILURE_SUMMARY_MAX_BYTES) {\n throw errorForArtifact('failure summary exceeds its bounded diagnostics artifact limit');\n }\n return this.writeArtifact('failure-summary.json', bytes);\n }\n\n async recordChildAttempt(input: RecordFusionChildAttemptInput): Promise<void> {\n const prefix = attemptPrefix(input.result.stage, input.result.slot, input.result.attempt);\n await this.writeArtifact(`${prefix}.system-prompt.txt`, input.systemPrompt);\n const promptRef = await this.writeArtifact(`${prefix}.prompt.txt`, input.prompt);\n const eventsRef = await this.writeArtifact(`${prefix}.events.jsonl`, input.result.events);\n const stderrRef = await this.writeArtifact(`${prefix}.stderr.txt`, input.result.stderr);\n const responseRef = await this.writeArtifact(\n responseName(prefix, input.responseKind),\n input.result.text,\n );\n const toolCallsRef =\n input.result.toolCallTrace === undefined\n ? undefined\n : await this.writeArtifact(`${prefix}.tool-calls.jsonl`, input.result.toolCallTrace.bytes);\n if (input.result.outputRecovery !== undefined) {\n validateOutputRecovery(input.result.outputRecovery, input.result.text);\n }\n const outputRecoveryRef =\n input.result.outputRecovery === undefined\n ? undefined\n : await this.writeArtifact(\n oversizedResponseName(prefix, input.responseKind),\n input.result.outputRecovery.original_text,\n );\n await this.updateManifest((manifest) => {\n const record: FusionAttemptArtifactRecord = {\n stage: input.result.stage,\n attempt: input.result.attempt,\n status: 'completed',\n child_created: true,\n prompt_path: promptRef.path,\n events_path: eventsRef.path,\n stderr_path: stderrRef.path,\n response_path: responseRef.path,\n provider: input.result.provider,\n model: input.result.model,\n qualifiedId: input.result.qualifiedId,\n usage: cloneFusionUsage(input.result.usage),\n };\n if (toolCallsRef !== undefined && input.result.toolCallTrace !== undefined) {\n record.tool_calls_path = toolCallsRef.path;\n record.tool_calls = { ...input.result.toolCallTrace.summary };\n }\n if (outputRecoveryRef !== undefined && input.result.outputRecovery !== undefined) {\n record.output_recovery = outputRecoveryRecord(\n input.result.outputRecovery,\n outputRecoveryRef.path,\n );\n }\n if (input.result.slot !== undefined) record.slot = input.result.slot;\n manifest.attempts.push(record);\n });\n }\n\n async recordCalibrationViolation(input: {\n stage: FusionStage;\n slot?: 1 | 2 | 3;\n attempt: number;\n violation: FusionCalibrationViolation;\n }): Promise<FusionArtifactRef> {\n const prefix = attemptPrefix(input.stage, input.slot, input.attempt);\n return this.writeArtifact(\n calibrationViolationName(prefix),\n `${canonicalJson(input.violation)}\\n`,\n );\n }\n\n async recordValidationCandidateContractEvent(\n input: RecordValidationCandidateContractEventInput,\n ): Promise<FusionArtifactRef> {\n const name = `candidate-${String(input.slot)}.output-contract-${input.status}.json`;\n return this.writeArtifact(\n name,\n `${canonicalJson({\n schema_version: FUSION_VALIDATE_CANDIDATE_CONTRACT_EVENT_SCHEMA_VERSION,\n ...input.detail,\n candidate_id: input.candidateId,\n slot: input.slot,\n status: input.status,\n })}\\n`,\n );\n }\n\n async recordFailedAttempt(input: RecordFusionFailedAttemptInput): Promise<void> {\n const prefix = attemptPrefix(input.stage, input.slot, input.attempt);\n await this.writeArtifact(`${prefix}.system-prompt.txt`, input.systemPrompt);\n const promptRef = await this.writeArtifact(`${prefix}.prompt.txt`, input.prompt);\n const eventsRef = await this.writeArtifact(`${prefix}.events.jsonl`, input.events);\n const stderrRef = await this.writeArtifact(`${prefix}.stderr.txt`, input.stderr);\n const responseRef = await this.writeArtifact(responseName(prefix, input.responseKind), '');\n const partialResponseRef =\n input.partialResponse.length === 0\n ? undefined\n : await this.writeArtifact(\n `${prefix}.response.partial.${input.responseKind}`,\n input.partialResponse,\n );\n if (input.outputRecovery !== undefined) validateOutputRecovery(input.outputRecovery);\n const outputRecoveryRef =\n input.outputRecovery === undefined\n ? undefined\n : await this.writeArtifact(\n oversizedResponseName(prefix, input.responseKind),\n input.outputRecovery.original_text,\n );\n await this.updateManifest((manifest) => {\n const record: FusionAttemptArtifactRecord = {\n stage: input.stage,\n attempt: input.attempt,\n status: input.status,\n child_created: input.childCreated,\n prompt_path: promptRef.path,\n events_path: eventsRef.path,\n stderr_path: stderrRef.path,\n response_path: responseRef.path,\n error: input.error,\n };\n if (partialResponseRef !== undefined) record.partial_response_path = partialResponseRef.path;\n if (outputRecoveryRef !== undefined && input.outputRecovery !== undefined) {\n record.output_recovery = outputRecoveryRecord(input.outputRecovery, outputRecoveryRef.path);\n }\n if (input.provider !== undefined) record.provider = input.provider;\n if (input.model !== undefined) record.model = input.model;\n if (input.qualifiedId !== undefined) record.qualifiedId = input.qualifiedId;\n if (input.usage !== undefined) record.usage = cloneFusionUsage(input.usage);\n if (input.slot !== undefined) record.slot = input.slot;\n manifest.attempts.push(record);\n });\n }\n\n /** Writes a durable artifact then binds its exact bytes in the manifest. */\n private async writeArtifact(name: string, data: Buffer | string): Promise<FusionArtifactRef> {\n const absPath = this.artifactPath(name);\n const ref = await writePrivateFile(absPath, data);\n await this.updateManifest((manifest) => {\n manifest.artifacts[name] = ref;\n });\n return ref;\n }\n\n private artifactPath(name: string): string {\n assertFusionArtifactBasename(name);\n const absPath = join(this.runDirAbs, name);\n if (!pathInside(this.runDirAbs, absPath)) {\n throw errorForArtifact(`fusion artifact path escapes run directory: ${name}`);\n }\n return absPath;\n }\n\n private async writeManifest(): Promise<void> {\n await writeJsonAtomic(join(this.runDirAbs, 'manifest.json'), publicManifest(this.manifest));\n }\n\n private async updateManifest(\n mutator: (manifest: MutableFusionArtifactManifest) => void,\n ): Promise<void> {\n const write = async () => {\n mutator(this.manifest);\n this.manifest.updated_at = this.now().toISOString();\n await this.writeManifest();\n };\n const next = this.manifestWriteChain.then(write, write);\n this.manifestWriteChain = next.catch(() => undefined);\n await next;\n }\n}\n"]}