agentera 3.0.0-dev.8 → 3.0.0-dev.81

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 (725) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +252 -22
  3. package/bundle/.agentera-build-source.json +8 -0
  4. package/bundle/CHANGELOG.md +1389 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +142 -0
  8. package/bundle/UPGRADE.md +275 -0
  9. package/bundle/extract-corpus-parity.json +2 -4
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +484 -0
  12. package/bundle/references/adapters/package-registry.yaml +443 -188
  13. package/bundle/references/adapters/package-surface-characterization.md +68 -34
  14. package/bundle/references/adapters/product-v1-reset.yaml +101 -0
  15. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  16. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  17. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  18. package/bundle/references/adapters/runtime-retired-resources.yaml +357 -0
  19. package/bundle/references/analysis/evidence-tier-authority.yaml +559 -0
  20. package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
  21. package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
  22. package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
  23. package/bundle/references/analysis/verification-policy.yaml +262 -0
  24. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
  25. package/bundle/references/artifacts/glossary-entry-contract.yaml +2906 -0
  26. package/bundle/references/artifacts/state-storage-authority.yaml +3075 -0
  27. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  28. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  29. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  30. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  31. package/bundle/references/cli/routing-model.md +152 -93
  32. package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
  33. package/bundle/references/cli/update-channels.yaml +7 -5
  34. package/bundle/references/cli/vocabulary-index.yaml +7 -9
  35. package/bundle/references/cli/vocabulary.md +54 -97
  36. package/bundle/references/meta/retained-reference-authority.yaml +171 -0
  37. package/bundle/skills/agentera/SKILL.md +183 -63
  38. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
  39. package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
  40. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
  41. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
  42. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
  43. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
  44. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
  45. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
  46. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  47. package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
  48. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
  49. package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
  51. package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
  52. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
  53. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
  54. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
  55. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
  56. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  57. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
  58. package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
  59. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
  60. package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
  62. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
  63. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
  64. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
  65. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
  66. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
  67. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
  68. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +13 -4
  69. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
  70. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
  71. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -3
  72. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
  73. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
  74. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
  75. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
  76. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  77. package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
  79. package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
  81. package/bundle/skills/agentera/protocol.yaml +4 -4
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +29 -30
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -43
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -34
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +53 -51
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -35
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +453 -55
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -39
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +305 -7
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +0 -19
  95. package/dist/.agentera-build-source.json +8 -0
  96. package/dist/analytics/extractCorpus/cli.js +52 -11
  97. package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
  98. package/dist/analytics/extractCorpus/core.js +262 -14
  99. package/dist/analytics/extractCorpus/corpus.js +57 -18
  100. package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
  101. package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
  102. package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
  103. package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
  104. package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
  105. package/dist/analytics/extractCorpus/index.js +4 -2
  106. package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
  107. package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
  108. package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
  109. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  110. package/dist/analytics/extractCorpus.js +0 -1
  111. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  112. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  113. package/dist/analytics/personalGlossaryAdmission.js +113 -0
  114. package/dist/analytics/personalGlossaryCandidateProjection.js +788 -0
  115. package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
  116. package/dist/analytics/personalGlossaryCandidateProjectionModel.js +1 -0
  117. package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
  118. package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
  119. package/dist/analytics/personalGlossaryDecision.js +203 -0
  120. package/dist/analytics/personalGlossaryExplicit.js +788 -0
  121. package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
  122. package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
  123. package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
  124. package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
  125. package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
  126. package/dist/analytics/personalGlossaryProfile.js +229 -0
  127. package/dist/analytics/personalGlossaryRecurrence.js +618 -0
  128. package/dist/analytics/personalGlossaryRefreshProjection.js +351 -0
  129. package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
  130. package/dist/analytics/personalGlossaryReviewRecords.js +332 -0
  131. package/dist/analytics/profileSignals.js +211 -0
  132. package/dist/analytics/usageStats.js +150 -23
  133. package/dist/audit/terminologyDrift.js +281 -0
  134. package/dist/bin/agentera.js +3 -2
  135. package/dist/capabilities/audit/instructions.js +16 -6
  136. package/dist/capabilities/build/instructions.js +59 -6
  137. package/dist/capabilities/design/instructions.js +3 -4
  138. package/dist/capabilities/discuss/instructions.js +29 -6
  139. package/dist/capabilities/document/instructions.js +11 -6
  140. package/dist/capabilities/index.js +20 -14
  141. package/dist/capabilities/optimize/instructions.js +14 -6
  142. package/dist/capabilities/orchestrate/instructions.js +42 -6
  143. package/dist/capabilities/plan/instructions.js +30 -3
  144. package/dist/capabilities/profile/instructions.js +104 -5
  145. package/dist/capabilities/research/instructions.js +4 -5
  146. package/dist/capabilities/status/instructions.js +15 -6
  147. package/dist/capabilities/status/startupInstructions.js +34 -0
  148. package/dist/capabilities/vision/instructions.js +3 -5
  149. package/dist/cli/appContext.js +14 -7
  150. package/dist/cli/argvalidate.js +0 -1
  151. package/dist/cli/capabilityContext/benchmark.js +5 -4
  152. package/dist/cli/capabilityContext/bespoke.js +14 -6
  153. package/dist/cli/capabilityContext/build.js +116 -42
  154. package/dist/cli/capabilityContext/closeout.js +30 -27
  155. package/dist/cli/capabilityContext/contract.js +18 -27
  156. package/dist/cli/capabilityContext/evidence.js +84 -77
  157. package/dist/cli/capabilityContext/index.js +0 -1
  158. package/dist/cli/capabilityContext/orchestration.js +42 -18
  159. package/dist/cli/capabilityContext/planState.js +89 -96
  160. package/dist/cli/capabilityContext/progress.js +52 -12
  161. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  162. package/dist/cli/capabilityContext/shared.js +9 -20
  163. package/dist/cli/capabilityContext/slim.js +52 -8
  164. package/dist/cli/capabilityContext/startup.js +51 -114
  165. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  166. package/dist/cli/capabilityContext/types.js +26 -10
  167. package/dist/cli/capabilityContext.js +0 -1
  168. package/dist/cli/commands/appHome.js +0 -1
  169. package/dist/cli/commands/capability.js +2 -2
  170. package/dist/cli/commands/compact.js +163 -13
  171. package/dist/cli/commands/doctor.js +162 -11
  172. package/dist/cli/commands/durability.js +81 -0
  173. package/dist/cli/commands/glossaryAdvice.js +138 -0
  174. package/dist/cli/commands/lint.js +22 -8
  175. package/dist/cli/commands/personalGlossaryCandidateReads.js +755 -0
  176. package/dist/cli/commands/personalGlossaryDecision.js +349 -0
  177. package/dist/cli/commands/personalGlossaryPublish.js +484 -0
  178. package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
  179. package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
  180. package/dist/cli/commands/prime/briefOrientation.js +845 -0
  181. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  182. package/dist/cli/commands/prime/bundleStatus.js +54 -4
  183. package/dist/cli/commands/prime/collectEntityOrientation.js +338 -0
  184. package/dist/cli/commands/prime/collectOrientationState.js +124 -68
  185. package/dist/cli/commands/prime/orientationOutput.js +271 -59
  186. package/dist/cli/commands/prime/types.js +0 -1
  187. package/dist/cli/commands/prime.js +89 -11
  188. package/dist/cli/commands/profileGrounding.js +55 -0
  189. package/dist/cli/commands/query.js +74 -52
  190. package/dist/cli/commands/report.js +187 -27
  191. package/dist/cli/commands/route.js +142 -0
  192. package/dist/cli/commands/schema.js +436 -138
  193. package/dist/cli/commands/state/decisions.js +40 -56
  194. package/dist/cli/commands/state/docs.js +58 -85
  195. package/dist/cli/commands/state/experimentRecords.js +151 -0
  196. package/dist/cli/commands/state/experiments.js +11 -65
  197. package/dist/cli/commands/state/get.js +129 -0
  198. package/dist/cli/commands/state/health.js +11 -113
  199. package/dist/cli/commands/state/index.js +6 -41
  200. package/dist/cli/commands/state/list.js +194 -0
  201. package/dist/cli/commands/state/objective.js +21 -65
  202. package/dist/cli/commands/state/plan.js +11 -170
  203. package/dist/cli/commands/state/planTasks.js +154 -0
  204. package/dist/cli/commands/state/plans.js +154 -0
  205. package/dist/cli/commands/state/progress.js +11 -45
  206. package/dist/cli/commands/state/shared.js +0 -1
  207. package/dist/cli/commands/state/todo.js +28 -107
  208. package/dist/cli/commands/state/write.js +459 -0
  209. package/dist/cli/commands/upgrade.js +176 -5
  210. package/dist/cli/commands/upgradeVerify.js +118 -0
  211. package/dist/cli/commands/validate.js +235 -136
  212. package/dist/cli/commands/verify.js +73 -16
  213. package/dist/cli/contracts/bundleStatus.js +0 -1
  214. package/dist/cli/contracts/orientationState.js +0 -1
  215. package/dist/cli/dispatch/argvParser.js +0 -1
  216. package/dist/cli/dispatch/check.js +84 -40
  217. package/dist/cli/dispatch/commands.js +3 -3
  218. package/dist/cli/dispatch/index.js +84 -52
  219. package/dist/cli/dispatch/lifecycle.js +182 -62
  220. package/dist/cli/dispatch/prime.js +37 -2
  221. package/dist/cli/dispatch/projections.js +17 -0
  222. package/dist/cli/dispatch/shared.js +1 -2
  223. package/dist/cli/dispatch/state.js +62 -66
  224. package/dist/cli/dispatch.js +0 -1
  225. package/dist/cli/errors.js +16 -17
  226. package/dist/cli/help.js +419 -41
  227. package/dist/cli/migrationRequired.js +125 -0
  228. package/dist/cli/orientation/attention.js +19 -22
  229. package/dist/cli/orientation/corpusCoverage.js +32 -1
  230. package/dist/cli/orientation.js +346 -129
  231. package/dist/cli/planArtifacts.js +350 -0
  232. package/dist/cli/planEvidence.js +157 -0
  233. package/dist/cli/planLifecycleState.js +36 -0
  234. package/dist/cli/planTaskIndex.js +11 -0
  235. package/dist/cli/preCutoverCommand.js +32 -0
  236. package/dist/cli/prime-blob.js +71 -3
  237. package/dist/cli/productV1Eol.js +55 -0
  238. package/dist/cli/profileAcquisition.js +167 -0
  239. package/dist/cli/startupCompletenessContract.js +11 -9
  240. package/dist/cli/stateQuery.js +47 -12
  241. package/dist/cli/structured.js +0 -1
  242. package/dist/cli/todoMarkdown.js +25 -12
  243. package/dist/cli/todoReadinessSelection.js +192 -0
  244. package/dist/cli/todoSeverity.js +0 -1
  245. package/dist/core/atomicWriter.js +23 -0
  246. package/dist/core/developmentChannel.js +1 -0
  247. package/dist/core/developmentInvocation.js +377 -0
  248. package/dist/core/difflib.js +0 -1
  249. package/dist/core/envPaths.js +0 -1
  250. package/dist/core/jsonValue.js +0 -1
  251. package/dist/core/paths.js +0 -1
  252. package/dist/core/pyjson.js +0 -1
  253. package/dist/core/shell.js +4 -0
  254. package/dist/core/skillIdentity.js +23 -0
  255. package/dist/core/sourceRoot.js +9 -12
  256. package/dist/core/text.js +10 -0
  257. package/dist/core/toml.js +0 -1
  258. package/dist/core/yaml.js +61 -2
  259. package/dist/eval/evalSkills.js +13 -14
  260. package/dist/eval/glossaryEvaluation.js +751 -0
  261. package/dist/eval/glossaryEvaluationProcess.js +29 -0
  262. package/dist/eval/glossaryEvaluationRunner.js +571 -0
  263. package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
  264. package/dist/eval/hybridRouteEvaluation.js +155 -0
  265. package/dist/eval/semanticEval.js +0 -1
  266. package/dist/eval/semanticFixtures.js +0 -1
  267. package/dist/hooks/common.js +3 -56
  268. package/dist/hooks/compaction/apply.js +224 -47
  269. package/dist/hooks/compaction/dryRun.js +2 -1
  270. package/dist/hooks/compaction/index.js +5 -6
  271. package/dist/hooks/compaction/parse.js +73 -6
  272. package/dist/hooks/compaction/retention.js +28 -25
  273. package/dist/hooks/compaction/status.js +145 -26
  274. package/dist/hooks/compaction/types.js +0 -1
  275. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  276. package/dist/hooks/validateArtifact/index.js +6 -65
  277. package/dist/hooks/validateArtifact/markdown.js +9 -10
  278. package/dist/hooks/validateArtifact/schema.js +96 -9
  279. package/dist/hooks/validateArtifact/traversal.js +12 -11
  280. package/dist/hooks/validateArtifact/violations.js +5 -3
  281. package/dist/migrate/v2HandoffManifest.js +8 -3
  282. package/dist/registries/activationContract.js +2 -0
  283. package/dist/registries/activationTuples.js +145 -0
  284. package/dist/registries/artifactProtocolIds.js +2 -1
  285. package/dist/registries/artifactRegistry.js +207 -60
  286. package/dist/registries/artifactSchemaProjection.js +45 -0
  287. package/dist/registries/capabilityContract.js +5 -21
  288. package/dist/registries/evaluatorHandoffContract.js +0 -1
  289. package/dist/registries/evidenceTierContract.js +375 -0
  290. package/dist/registries/explicitSegmentGrammarContract.js +619 -0
  291. package/dist/registries/glossaryAdviceContract.js +79 -0
  292. package/dist/registries/glossaryCandidateContractPaths.js +6 -0
  293. package/dist/registries/glossaryCandidateContracts.js +820 -0
  294. package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
  295. package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
  296. package/dist/registries/glossaryCandidateProjectionAuthority.js +345 -0
  297. package/dist/registries/glossaryCandidateProjectionContract.js +108 -0
  298. package/dist/registries/glossaryCaveatContract.js +67 -0
  299. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  300. package/dist/registries/glossaryEntryContract.js +759 -0
  301. package/dist/registries/glossaryEntryTemporal.js +12 -0
  302. package/dist/registries/glossaryMiningAuthority.js +764 -0
  303. package/dist/registries/glossaryProfileFullContract.js +24 -0
  304. package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
  305. package/dist/registries/glossaryReviewRecordsContract.js +129 -0
  306. package/dist/registries/glossaryTermIdentity.js +139 -0
  307. package/dist/registries/glossaryTermOccurrence.js +20 -0
  308. package/dist/registries/hybridRoute.js +274 -0
  309. package/dist/registries/hybridRouteReceipt.js +221 -0
  310. package/dist/registries/packagePublication.js +273 -0
  311. package/dist/registries/packageRegistry.js +184 -209
  312. package/dist/registries/personalGlossaryContracts.js +1 -0
  313. package/dist/registries/todoReadinessContract.js +448 -0
  314. package/dist/registries/triggerLoader.js +7 -44
  315. package/dist/registries/verbosityBudgetContract.js +205 -0
  316. package/dist/release/releaseMetadata.js +168 -11
  317. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  318. package/dist/runtime/lifecycleAdapters.js +777 -0
  319. package/dist/runtime/lifecycleAuthority.js +453 -0
  320. package/dist/runtime/lifecycleOperationContract.js +123 -0
  321. package/dist/runtime/lifecycleOperations.js +634 -0
  322. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  323. package/dist/runtime/lifecyclePublication.js +415 -0
  324. package/dist/runtime/lifecycleSnapshot.js +438 -0
  325. package/dist/runtime/nativeResourceCleanup.js +618 -0
  326. package/dist/setup/opencode.js +20 -13
  327. package/dist/setup/opencodeConstants.js +1 -0
  328. package/dist/setup/sharedSkill.js +45 -0
  329. package/dist/setup/smokeChecks.js +14 -75
  330. package/dist/state/archiveDiscovery.js +580 -0
  331. package/dist/state/archivePublication.js +225 -0
  332. package/dist/state/archiveRecovery.js +237 -0
  333. package/dist/state/archiveReplay.js +53 -0
  334. package/dist/state/canonicalMigrationRecord.js +36 -0
  335. package/dist/state/changelog.js +221 -0
  336. package/dist/state/decisionEntities.js +367 -0
  337. package/dist/state/decisionLegacyValidation.js +215 -0
  338. package/dist/state/decisionMigrationProvenance.js +199 -0
  339. package/dist/state/decisionOverlay.js +254 -0
  340. package/dist/state/decisionRevision.js +256 -0
  341. package/dist/state/decisionRevisionMigration.js +89 -0
  342. package/dist/state/directRetrieval.js +323 -0
  343. package/dist/state/durability.js +324 -0
  344. package/dist/state/entityCutover.js +459 -0
  345. package/dist/state/entityCutoverGit.js +127 -0
  346. package/dist/state/entityGlossaryAuthority.js +13 -0
  347. package/dist/state/entityListProjection.js +187 -0
  348. package/dist/state/entityListRuntimeRegistry.js +85 -0
  349. package/dist/state/entityMigrationCausality.js +97 -0
  350. package/dist/state/entityMigrationIdentity.js +5 -0
  351. package/dist/state/entityMigrationPreview.js +840 -0
  352. package/dist/state/entityMigrationTodo.js +133 -0
  353. package/dist/state/entityPublicationContext.js +859 -0
  354. package/dist/state/entityRetrievalHelp.js +506 -0
  355. package/dist/state/entityStorage.js +894 -0
  356. package/dist/state/entityWriterLock.js +18 -0
  357. package/dist/state/exactReplacementRecovery.js +18 -0
  358. package/dist/state/experimentArchive.js +63 -0
  359. package/dist/state/experimentIdentity.js +202 -0
  360. package/dist/state/healthEntities.js +262 -0
  361. package/dist/state/healthEntityValidation.js +18 -0
  362. package/dist/state/healthRepair.js +69 -0
  363. package/dist/state/installRoot.js +15 -7
  364. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  365. package/dist/state/legacyIdentity.js +47 -0
  366. package/dist/state/legacySummaryRecord.js +6 -0
  367. package/dist/state/listAccounting.js +54 -0
  368. package/dist/state/listClassification.js +17 -0
  369. package/dist/state/listCursor.js +42 -0
  370. package/dist/state/listRetrieval.js +781 -0
  371. package/dist/state/migrationSourceBinding.js +30 -0
  372. package/dist/state/objectiveExperimentEntities.js +322 -0
  373. package/dist/state/planEntities.js +1027 -0
  374. package/dist/state/planIdentity.js +47 -0
  375. package/dist/state/planLineageValidation.js +52 -0
  376. package/dist/state/planReplacementTransaction.js +475 -0
  377. package/dist/state/planRetrieval.js +313 -0
  378. package/dist/state/planTaskRetrieval.js +294 -0
  379. package/dist/state/progressEntities.js +512 -0
  380. package/dist/state/progressGlossaryCaveat.js +168 -0
  381. package/dist/state/progressPublicationOrder.js +19 -0
  382. package/dist/state/progressWritePolicy.js +33 -0
  383. package/dist/state/projectRoot.js +62 -0
  384. package/dist/state/projectionPolicy.js +190 -0
  385. package/dist/state/retrievalAuthority.js +156 -0
  386. package/dist/state/safeProjectFile.js +155 -0
  387. package/dist/state/startupAnalysis/benchmark.js +70 -9
  388. package/dist/state/startupAnalysis/contract.js +44 -10
  389. package/dist/state/startupAnalysis/helpers.js +1 -2
  390. package/dist/state/startupAnalysis/index.js +0 -1
  391. package/dist/state/startupAnalysis/metrics.js +0 -1
  392. package/dist/state/startupAnalysis/records.js +0 -1
  393. package/dist/state/startupAnalysis/report.js +0 -1
  394. package/dist/state/startupAnalysis/threshold.js +13 -1
  395. package/dist/state/startupAnalysis.js +0 -1
  396. package/dist/state/startupProjection.js +499 -0
  397. package/dist/state/stateMode.js +222 -0
  398. package/dist/state/stateStorageAuthority.js +47 -0
  399. package/dist/state/summaryEntityRead.js +25 -0
  400. package/dist/state/summaryMigrationProvenance.js +66 -0
  401. package/dist/state/summarySourceRowAuthority.js +36 -0
  402. package/dist/state/todoActivationSafety.js +58 -0
  403. package/dist/state/todoCreateBatch.js +69 -0
  404. package/dist/state/todoDocsEntities.js +1339 -0
  405. package/dist/state/todoDocsEntityValidation.js +158 -0
  406. package/dist/state/todoMarkdownProjection.js +63 -0
  407. package/dist/state/todoReconciliationActivation.js +182 -0
  408. package/dist/state/todoReconciliationInspection.js +184 -0
  409. package/dist/state/todoReconciliationRepair.js +320 -0
  410. package/dist/state/todoReconciliationTransaction.js +628 -0
  411. package/dist/state/todoSeverityHeadings.js +71 -0
  412. package/dist/state/todoTransitionBatch.js +65 -0
  413. package/dist/state/todoUpdateBatch.js +50 -0
  414. package/dist/state/write/assign.js +20 -0
  415. package/dist/state/write/candidateMutation.js +269 -0
  416. package/dist/state/write/errors.js +11 -0
  417. package/dist/state/write/experimentPublication.js +192 -0
  418. package/dist/state/write/explain.js +380 -0
  419. package/dist/state/write/fields.js +61 -0
  420. package/dist/state/write/glossaryPublication.js +263 -0
  421. package/dist/state/write/grammar.js +285 -0
  422. package/dist/state/write/helpers.js +29 -0
  423. package/dist/state/write/index.js +12 -0
  424. package/dist/state/write/input.js +391 -0
  425. package/dist/state/write/lock.js +837 -0
  426. package/dist/state/write/mutation.js +234 -0
  427. package/dist/state/write/operations.js +170 -0
  428. package/dist/state/write/planEvaluation.js +128 -0
  429. package/dist/state/write/planPublication.js +179 -0
  430. package/dist/state/write/runtimeOperations.js +146 -0
  431. package/dist/state/write/serialize.js +1 -0
  432. package/dist/state/write/transaction.js +57 -0
  433. package/dist/state/write/validate.js +7 -0
  434. package/dist/upgrade/appContentRefresh.js +77 -36
  435. package/dist/upgrade/appModel.js +0 -1
  436. package/dist/upgrade/atomicWriter.js +1 -0
  437. package/dist/upgrade/bundleEvidence.js +0 -1
  438. package/dist/upgrade/channels.js +6 -9
  439. package/dist/upgrade/compatibility.js +43 -17
  440. package/dist/upgrade/doctor.js +55 -32
  441. package/dist/upgrade/doctorClassifier.js +11 -1
  442. package/dist/upgrade/installedHooksRetirement.js +46 -40
  443. package/dist/upgrade/legacyAgentCleanup.js +133 -34
  444. package/dist/upgrade/lifecycleUpgrade.js +126 -0
  445. package/dist/upgrade/migrateArtifactsV2ToV3.js +325 -82
  446. package/dist/upgrade/migrationPublication.js +122 -0
  447. package/dist/upgrade/nextMajorDoctor.js +0 -22
  448. package/dist/upgrade/npxPlatformStatus.js +2 -2
  449. package/dist/upgrade/productV1Reset.js +515 -0
  450. package/dist/upgrade/productV1ResetAuthority.js +139 -0
  451. package/dist/upgrade/projectIntegration.js +126 -134
  452. package/dist/upgrade/projectIntegrationDecision.js +21 -13
  453. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  454. package/dist/upgrade/runtimeMigration.js +210 -430
  455. package/dist/upgrade/upgradeCommands.js +14 -1
  456. package/dist/upgrade/upgradeLock.js +85 -0
  457. package/dist/upgrade/upgradeOrchestrator.js +257 -48
  458. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  459. package/dist/upgrade/versionResolution.js +0 -1
  460. package/dist/validate/activationArtifactEvidence.js +866 -0
  461. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  462. package/dist/validate/activationConjunction.js +816 -0
  463. package/dist/validate/activationEvidenceManifest.js +610 -0
  464. package/dist/validate/activationPackageSemantics.js +29 -0
  465. package/dist/validate/appHomeContract.js +1 -7
  466. package/dist/validate/bootstrapAuthority.js +44 -0
  467. package/dist/validate/capability.js +11 -3
  468. package/dist/validate/crossCapability.js +14 -9
  469. package/dist/validate/glossaryVariantGuard.js +96 -0
  470. package/dist/validate/retainedReferenceAuthority.js +879 -0
  471. package/dist/validate/selfAudit.js +39 -45
  472. package/dist/validate/vocabularyAuthority.js +8 -8
  473. package/package.json +39 -13
  474. package/bundle/references/adapters/cursor.md +0 -214
  475. package/bundle/references/adapters/opencode.md +0 -530
  476. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  477. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  478. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  479. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -554
  480. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  481. package/bundle/references/analysis/benchmark.md +0 -267
  482. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  483. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  484. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  485. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  486. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  487. package/bundle/references/cli/coexistence-probe.yaml +0 -13
  488. package/bundle/references/cli/parity-expected-actual-template.md +0 -30
  489. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  490. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  491. package/bundle/references/cli/upgrade-repair-wording.md +0 -45
  492. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  493. package/bundle/references/meta/documentation-inventory.md +0 -49
  494. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  495. package/bundle/skills/agentera/agents/audit.toml +0 -6
  496. package/bundle/skills/agentera/agents/build.toml +0 -6
  497. package/bundle/skills/agentera/agents/design.toml +0 -6
  498. package/bundle/skills/agentera/agents/discuss.toml +0 -6
  499. package/bundle/skills/agentera/agents/document.toml +0 -6
  500. package/bundle/skills/agentera/agents/optimize.toml +0 -6
  501. package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
  502. package/bundle/skills/agentera/agents/plan.toml +0 -6
  503. package/bundle/skills/agentera/agents/profile.toml +0 -6
  504. package/bundle/skills/agentera/agents/research.toml +0 -6
  505. package/bundle/skills/agentera/agents/status.toml +0 -6
  506. package/bundle/skills/agentera/agents/vision.toml +0 -6
  507. package/bundle/skills/agentera/references/contract.md +0 -1048
  508. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  509. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  510. package/dist/analytics/extractCorpus/core.js.map +0 -1
  511. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  512. package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
  513. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  514. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
  515. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  516. package/dist/analytics/extractCorpus/index.js.map +0 -1
  517. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  518. package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
  519. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  520. package/dist/analytics/extractCorpus.js.map +0 -1
  521. package/dist/analytics/usageStats.js.map +0 -1
  522. package/dist/bin/agentera.js.map +0 -1
  523. package/dist/capabilities/audit/instructions.js.map +0 -1
  524. package/dist/capabilities/build/instructions.js.map +0 -1
  525. package/dist/capabilities/design/instructions.js.map +0 -1
  526. package/dist/capabilities/discuss/instructions.js.map +0 -1
  527. package/dist/capabilities/document/instructions.js.map +0 -1
  528. package/dist/capabilities/index.js.map +0 -1
  529. package/dist/capabilities/optimize/instructions.js.map +0 -1
  530. package/dist/capabilities/orchestrate/instructions.js.map +0 -1
  531. package/dist/capabilities/plan/instructions.js.map +0 -1
  532. package/dist/capabilities/profile/instructions.js.map +0 -1
  533. package/dist/capabilities/research/instructions.js.map +0 -1
  534. package/dist/capabilities/status/instructions.js.map +0 -1
  535. package/dist/capabilities/vision/instructions.js.map +0 -1
  536. package/dist/cli/appContext.js.map +0 -1
  537. package/dist/cli/argvalidate.js.map +0 -1
  538. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  539. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  540. package/dist/cli/capabilityContext/build.js.map +0 -1
  541. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  542. package/dist/cli/capabilityContext/contract.js.map +0 -1
  543. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  544. package/dist/cli/capabilityContext/index.js.map +0 -1
  545. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  546. package/dist/cli/capabilityContext/planState.js.map +0 -1
  547. package/dist/cli/capabilityContext/progress.js.map +0 -1
  548. package/dist/cli/capabilityContext/shared.js.map +0 -1
  549. package/dist/cli/capabilityContext/slim.js.map +0 -1
  550. package/dist/cli/capabilityContext/startup.js.map +0 -1
  551. package/dist/cli/capabilityContext/types.js.map +0 -1
  552. package/dist/cli/capabilityContext.js.map +0 -1
  553. package/dist/cli/commands/appHome.js.map +0 -1
  554. package/dist/cli/commands/capability.js.map +0 -1
  555. package/dist/cli/commands/compact.js.map +0 -1
  556. package/dist/cli/commands/doctor.js.map +0 -1
  557. package/dist/cli/commands/lint.js.map +0 -1
  558. package/dist/cli/commands/prime/bundleStatus.js.map +0 -1
  559. package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
  560. package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
  561. package/dist/cli/commands/prime/types.js.map +0 -1
  562. package/dist/cli/commands/prime/v1Migration.js +0 -39
  563. package/dist/cli/commands/prime/v1Migration.js.map +0 -1
  564. package/dist/cli/commands/prime.js.map +0 -1
  565. package/dist/cli/commands/query.js.map +0 -1
  566. package/dist/cli/commands/report.js.map +0 -1
  567. package/dist/cli/commands/schema.js.map +0 -1
  568. package/dist/cli/commands/state/decisions.js.map +0 -1
  569. package/dist/cli/commands/state/docs.js.map +0 -1
  570. package/dist/cli/commands/state/experiments.js.map +0 -1
  571. package/dist/cli/commands/state/health.js.map +0 -1
  572. package/dist/cli/commands/state/index.js.map +0 -1
  573. package/dist/cli/commands/state/objective.js.map +0 -1
  574. package/dist/cli/commands/state/plan.js.map +0 -1
  575. package/dist/cli/commands/state/progress.js.map +0 -1
  576. package/dist/cli/commands/state/shared.js.map +0 -1
  577. package/dist/cli/commands/state/todo.js.map +0 -1
  578. package/dist/cli/commands/upgrade.js.map +0 -1
  579. package/dist/cli/commands/validate.js.map +0 -1
  580. package/dist/cli/commands/verify.js.map +0 -1
  581. package/dist/cli/contracts/bundleStatus.js.map +0 -1
  582. package/dist/cli/contracts/orientationState.js.map +0 -1
  583. package/dist/cli/dispatch/argvParser.js.map +0 -1
  584. package/dist/cli/dispatch/check.js.map +0 -1
  585. package/dist/cli/dispatch/commands.js.map +0 -1
  586. package/dist/cli/dispatch/index.js.map +0 -1
  587. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  588. package/dist/cli/dispatch/prime.js.map +0 -1
  589. package/dist/cli/dispatch/shared.js.map +0 -1
  590. package/dist/cli/dispatch/state.js.map +0 -1
  591. package/dist/cli/dispatch.js.map +0 -1
  592. package/dist/cli/errors.js.map +0 -1
  593. package/dist/cli/help.js.map +0 -1
  594. package/dist/cli/orientation/attention.js.map +0 -1
  595. package/dist/cli/orientation/corpusCoverage.js.map +0 -1
  596. package/dist/cli/orientation.js.map +0 -1
  597. package/dist/cli/prime-blob.js.map +0 -1
  598. package/dist/cli/startupCompletenessContract.js.map +0 -1
  599. package/dist/cli/stateQuery.js.map +0 -1
  600. package/dist/cli/structured.js.map +0 -1
  601. package/dist/cli/todoMarkdown.js.map +0 -1
  602. package/dist/cli/todoSeverity.js.map +0 -1
  603. package/dist/core/difflib.js.map +0 -1
  604. package/dist/core/envPaths.js.map +0 -1
  605. package/dist/core/jsonValue.js.map +0 -1
  606. package/dist/core/paths.js.map +0 -1
  607. package/dist/core/pyjson.js.map +0 -1
  608. package/dist/core/sourceRoot.js.map +0 -1
  609. package/dist/core/toml.js.map +0 -1
  610. package/dist/core/yaml.js.map +0 -1
  611. package/dist/eval/evalSkills.js.map +0 -1
  612. package/dist/eval/semanticEval.js.map +0 -1
  613. package/dist/eval/semanticFixtures.js.map +0 -1
  614. package/dist/hooks/common.js.map +0 -1
  615. package/dist/hooks/compaction/apply.js.map +0 -1
  616. package/dist/hooks/compaction/dryRun.js.map +0 -1
  617. package/dist/hooks/compaction/index.js.map +0 -1
  618. package/dist/hooks/compaction/parse.js.map +0 -1
  619. package/dist/hooks/compaction/retention.js.map +0 -1
  620. package/dist/hooks/compaction/status.js.map +0 -1
  621. package/dist/hooks/compaction/types.js.map +0 -1
  622. package/dist/hooks/cursorPreToolUse.js +0 -19
  623. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  624. package/dist/hooks/cursorSessionStart.js +0 -79
  625. package/dist/hooks/cursorSessionStart.js.map +0 -1
  626. package/dist/hooks/sessionStart.js +0 -216
  627. package/dist/hooks/sessionStart.js.map +0 -1
  628. package/dist/hooks/sessionStop.js +0 -206
  629. package/dist/hooks/sessionStop.js.map +0 -1
  630. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  631. package/dist/hooks/validateArtifact/index.js.map +0 -1
  632. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  633. package/dist/hooks/validateArtifact/runtime.js +0 -86
  634. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  635. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  636. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  637. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  638. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  639. package/dist/registries/artifactProtocolIds.js.map +0 -1
  640. package/dist/registries/artifactRegistry.js.map +0 -1
  641. package/dist/registries/capabilityContract.js.map +0 -1
  642. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  643. package/dist/registries/packageRegistry.js.map +0 -1
  644. package/dist/registries/runtimeAdapterRegistry.js +0 -316
  645. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  646. package/dist/registries/triggerLoader.js.map +0 -1
  647. package/dist/release/releaseMetadata.js.map +0 -1
  648. package/dist/setup/codex/agents.js +0 -96
  649. package/dist/setup/codex/agents.js.map +0 -1
  650. package/dist/setup/codex/cli.js +0 -161
  651. package/dist/setup/codex/cli.js.map +0 -1
  652. package/dist/setup/codex/configToml.js +0 -639
  653. package/dist/setup/codex/configToml.js.map +0 -1
  654. package/dist/setup/codex/constants.js +0 -29
  655. package/dist/setup/codex/constants.js.map +0 -1
  656. package/dist/setup/codex/installRoot.js +0 -64
  657. package/dist/setup/codex/installRoot.js.map +0 -1
  658. package/dist/setup/codex/state.js +0 -270
  659. package/dist/setup/codex/state.js.map +0 -1
  660. package/dist/setup/codex.js +0 -12
  661. package/dist/setup/codex.js.map +0 -1
  662. package/dist/setup/copilot.js +0 -227
  663. package/dist/setup/copilot.js.map +0 -1
  664. package/dist/setup/cursor.js +0 -129
  665. package/dist/setup/cursor.js.map +0 -1
  666. package/dist/setup/cursorSurfaces.js +0 -67
  667. package/dist/setup/cursorSurfaces.js.map +0 -1
  668. package/dist/setup/doctor/core.js +0 -300
  669. package/dist/setup/doctor/core.js.map +0 -1
  670. package/dist/setup/doctor/diagnostics.js +0 -240
  671. package/dist/setup/doctor/diagnostics.js.map +0 -1
  672. package/dist/setup/doctor/opencode.js +0 -313
  673. package/dist/setup/doctor/opencode.js.map +0 -1
  674. package/dist/setup/doctor/report.js +0 -425
  675. package/dist/setup/doctor/report.js.map +0 -1
  676. package/dist/setup/doctor.js +0 -10
  677. package/dist/setup/doctor.js.map +0 -1
  678. package/dist/setup/opencode.js.map +0 -1
  679. package/dist/setup/smokeChecks.js.map +0 -1
  680. package/dist/state/installRoot.js.map +0 -1
  681. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  682. package/dist/state/startupAnalysis/contract.js.map +0 -1
  683. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  684. package/dist/state/startupAnalysis/index.js.map +0 -1
  685. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  686. package/dist/state/startupAnalysis/records.js.map +0 -1
  687. package/dist/state/startupAnalysis/report.js.map +0 -1
  688. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  689. package/dist/state/startupAnalysis.js.map +0 -1
  690. package/dist/upgrade/appContentRefresh.js.map +0 -1
  691. package/dist/upgrade/appModel.js.map +0 -1
  692. package/dist/upgrade/bundleEvidence.js.map +0 -1
  693. package/dist/upgrade/channels.js.map +0 -1
  694. package/dist/upgrade/coexistenceProbe.js +0 -107
  695. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  696. package/dist/upgrade/compatibility.js.map +0 -1
  697. package/dist/upgrade/doctor.js.map +0 -1
  698. package/dist/upgrade/doctorClassifier.js.map +0 -1
  699. package/dist/upgrade/installedHooksRetirement.js.map +0 -1
  700. package/dist/upgrade/legacyAgentCleanup.js.map +0 -1
  701. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  702. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  703. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  704. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  705. package/dist/upgrade/npxPlatformStatus.js.map +0 -1
  706. package/dist/upgrade/projectIntegration.js.map +0 -1
  707. package/dist/upgrade/projectIntegrationDecision.js.map +0 -1
  708. package/dist/upgrade/runtimeMigration.js.map +0 -1
  709. package/dist/upgrade/upgradeCommands.js.map +0 -1
  710. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  711. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  712. package/dist/upgrade/versionResolution.js.map +0 -1
  713. package/dist/validate/appHomeContract.js.map +0 -1
  714. package/dist/validate/capability.js.map +0 -1
  715. package/dist/validate/crossCapability.js.map +0 -1
  716. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  717. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  718. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
  719. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  720. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  721. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  722. package/dist/validate/lifecycleAdapters.js +0 -62
  723. package/dist/validate/lifecycleAdapters.js.map +0 -1
  724. package/dist/validate/selfAudit.js.map +0 -1
  725. package/dist/validate/vocabularyAuthority.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ import { canonicalRecordJson } from "./archiveDiscovery.js";
2
+ import { deriveLegacyPlanIdentity } from "./retrievalAuthority.js";
3
+ // These identities are accepted only while reading legacy aggregate plan
4
+ // sources. Canonical entity plans use the bare envelope ID assigned by the
5
+ // writer; neither composite form is a public selector.
6
+ export const PERSISTED_PLAN_ID = /^plan:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
7
+ export const LEGACY_PLAN_ID = /^legacy-plan:[0-9a-f]{64}$/;
8
+ export const PLAN_ID = /^(plan:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|legacy-plan:[0-9a-f]{64})$/;
9
+ function mapping(value) {
10
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
11
+ }
12
+ function normalizeStatus(value) {
13
+ if (value === "active")
14
+ return "open";
15
+ if (value === "completed")
16
+ return "complete";
17
+ return value;
18
+ }
19
+ /** Canonical read-compatible plan shape used only for identity comparison and legacy derivation. */
20
+ export function canonicalPlanIdentityDocument(document) {
21
+ const normalized = structuredClone(document);
22
+ const header = mapping(normalized.header);
23
+ normalized.header = header.status === undefined
24
+ ? { ...header }
25
+ : { ...header, status: normalizeStatus(header.status) };
26
+ if (Array.isArray(normalized.entries)) {
27
+ normalized.tasks = normalized.entries;
28
+ delete normalized.entries;
29
+ }
30
+ return normalized;
31
+ }
32
+ export function resolvePlanIdentity(document) {
33
+ const canonicalDocument = canonicalPlanIdentityDocument(document);
34
+ const persisted = mapping(canonicalDocument.header).id;
35
+ const canonicalJson = canonicalRecordJson(canonicalDocument);
36
+ if (persisted !== undefined) {
37
+ if (typeof persisted !== "string" || !PERSISTED_PLAN_ID.test(persisted)) {
38
+ throw new Error("legacy plan header.id is not a valid migration-only identity");
39
+ }
40
+ return { stableId: persisted, persisted: true, canonicalJson };
41
+ }
42
+ return {
43
+ stableId: deriveLegacyPlanIdentity(canonicalJson),
44
+ persisted: false,
45
+ canonicalJson,
46
+ };
47
+ }
@@ -0,0 +1,52 @@
1
+ function mapping(value) {
2
+ return value !== null && typeof value === "object" && !Array.isArray(value);
3
+ }
4
+ function planStatus(plan) {
5
+ const header = plan.record?.header;
6
+ return mapping(header) ? header.status : undefined;
7
+ }
8
+ export function planLineageIssues(plans, recovery) {
9
+ const plansById = new Map(plans.map((plan) => [plan.id, plan]));
10
+ const successorsByPredecessor = new Map();
11
+ const issues = [];
12
+ for (const successor of plans) {
13
+ const predecessorId = successor.record?.previous_plan_archived;
14
+ if (typeof predecessorId !== "string")
15
+ continue;
16
+ const predecessor = plansById.get(predecessorId);
17
+ if (predecessorId === successor.id || (predecessor && planStatus(predecessor) !== "archived")) {
18
+ issues.push({
19
+ code: "unresolved_relation",
20
+ path: successor.relativePath,
21
+ id: successor.id,
22
+ artifact: successor.artifact ?? undefined,
23
+ boundary: successor.boundary ?? undefined,
24
+ relation: "previous_plan_archived",
25
+ targetId: predecessorId,
26
+ message: predecessorId === successor.id
27
+ ? `plan '${successor.id}' cannot name itself as its archived predecessor`
28
+ : `plan '${successor.id}' predecessor '${predecessorId}' must be archived`,
29
+ recovery: recovery(`set record.previous_plan_archived in '${successor.relativePath}' to one distinct archived plan ID, or remove the writer-owned field from invalid state`),
30
+ });
31
+ }
32
+ successorsByPredecessor.set(predecessorId, [...(successorsByPredecessor.get(predecessorId) ?? []), successor]);
33
+ }
34
+ for (const [predecessorId, successors] of successorsByPredecessor) {
35
+ if (successors.length < 2)
36
+ continue;
37
+ for (const successor of successors) {
38
+ issues.push({
39
+ code: "conflicting_ownership",
40
+ path: successor.relativePath,
41
+ id: successor.id,
42
+ artifact: successor.artifact ?? undefined,
43
+ boundary: successor.boundary ?? undefined,
44
+ relation: "previous_plan_archived",
45
+ targetId: predecessorId,
46
+ message: `archived predecessor '${predecessorId}' has multiple successor plan records: ${successors.map((candidate) => candidate.id).sort().join(", ")}`,
47
+ recovery: recovery(`retain record.previous_plan_archived on only one canonical successor of archived plan '${predecessorId}'`),
48
+ });
49
+ }
50
+ }
51
+ return issues;
52
+ }
@@ -0,0 +1,475 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { loadYamlMapping } from "../core/yaml.js";
5
+ import { canonicalRecordJson } from "./archiveDiscovery.js";
6
+ import { entityExactGetMaxBytes } from "./entityStorage.js";
7
+ import { FILE_REPLACEMENT_METADATA_NAME, FILE_REPLACEMENT_RECOVERY_VERSION, validateEntityRecoveryDirectory, } from "./entityPublicationContext.js";
8
+ import { reject } from "./write/errors.js";
9
+ const VERSION = "agentera.planReplacementTransaction.v1";
10
+ const DIRECTORY = ".agentera/.entity-recovery/plan-replacement";
11
+ const MAX_JOURNAL_BYTES = 4 * 1024 * 1024;
12
+ const MAX_TARGET_BYTES = 1024 * 1024;
13
+ const MAX_TARGETS = 102;
14
+ const ID = /^[a-z]{10}$/;
15
+ const TARGET = /^\.agentera\/entities\/plan\/(?:plan|plan_task)\/[a-z]{10}\.yaml$/;
16
+ function mapping(value) {
17
+ return value !== null && typeof value === "object" && !Array.isArray(value);
18
+ }
19
+ function sha256(value) {
20
+ return createHash("sha256").update(value).digest("hex");
21
+ }
22
+ function encode(value) {
23
+ return Buffer.from(value).toString("base64");
24
+ }
25
+ function decode(value) {
26
+ return Buffer.from(value, "base64");
27
+ }
28
+ function exactBase64(value) {
29
+ if (typeof value !== "string")
30
+ return false;
31
+ try {
32
+ return encode(decode(value)) === value;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ function same(left, right) {
39
+ return left === null ? right === null : right !== null && left.equals(right);
40
+ }
41
+ function journalPath(id) {
42
+ return `${DIRECTORY}/${id}.json`;
43
+ }
44
+ function invalid(message) {
45
+ throw new Error(`plan replacement journal ${message}`);
46
+ }
47
+ function conflict(message) {
48
+ reject({
49
+ class: "conflict",
50
+ message,
51
+ recovery: "Preserve the pending plan replacement journal, canonical target bytes, and retained recovery roles. Retry only the exact original state plan replace request after reconciling any reported concurrent bytes; no competing bytes were overwritten.",
52
+ });
53
+ }
54
+ function targetPath(boundary, id) {
55
+ return `.agentera/entities/plan/${boundary}/${id}.yaml`;
56
+ }
57
+ function parseEnvelope(bytes, label) {
58
+ try {
59
+ const value = loadYamlMapping(bytes.toString("utf8"));
60
+ if (!mapping(value))
61
+ throw new Error("not a mapping");
62
+ return value;
63
+ }
64
+ catch {
65
+ invalid(`${label} is not a valid canonical entity envelope`);
66
+ }
67
+ }
68
+ function parseJournal(bytes, fileName) {
69
+ if (bytes.length > MAX_JOURNAL_BYTES)
70
+ invalid("exceeds its byte bound");
71
+ let parsed;
72
+ try {
73
+ parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
74
+ }
75
+ catch {
76
+ invalid("is not valid bounded UTF-8 JSON");
77
+ }
78
+ if (!mapping(parsed))
79
+ invalid("is not a mapping");
80
+ const value = parsed;
81
+ if (Object.keys(value).sort().join(",") !== "id,operation,schema_version,targets"
82
+ || value.schema_version !== VERSION
83
+ || typeof value.id !== "string"
84
+ || !/^[a-f0-9]{24}$/.test(value.id)
85
+ || !mapping(value.operation)
86
+ || !Array.isArray(value.targets)
87
+ || value.targets.length < 2
88
+ || value.targets.length > MAX_TARGETS)
89
+ invalid("is malformed");
90
+ const operation = value.operation;
91
+ if (Object.keys(operation).sort().join(",") !== "input_sha256,kind,predecessor,successor"
92
+ || !["existing", "create"].includes(String(operation.kind))
93
+ || typeof operation.predecessor !== "string"
94
+ || typeof operation.successor !== "string"
95
+ || !ID.test(operation.predecessor)
96
+ || !ID.test(operation.successor)
97
+ || operation.predecessor === operation.successor
98
+ || typeof operation.input_sha256 !== "string"
99
+ || !/^[a-f0-9]{64}$/.test(operation.input_sha256))
100
+ invalid("has an invalid operation identity");
101
+ const paths = new Set();
102
+ for (const target of value.targets) {
103
+ if (!mapping(target)
104
+ || Object.keys(target).sort().join(",") !== "after,before,path"
105
+ || typeof target.path !== "string"
106
+ || !TARGET.test(target.path)
107
+ || paths.has(target.path)
108
+ || (target.before !== null && !exactBase64(target.before))
109
+ || !exactBase64(target.after)
110
+ || decode(target.after).length > MAX_TARGET_BYTES
111
+ || (target.before !== null && decode(target.before).length > MAX_TARGET_BYTES))
112
+ invalid("has an invalid target");
113
+ paths.add(target.path);
114
+ }
115
+ const body = value.targets;
116
+ const identity = { operation, targets: body };
117
+ const expectedId = sha256(canonicalRecordJson(identity)).slice(0, 24);
118
+ if (value.id !== expectedId || (fileName !== undefined && fileName !== `${value.id}.json`)) {
119
+ invalid("identity does not match its operation and complete target set");
120
+ }
121
+ const predecessor = body.find((target) => target.path === targetPath("plan", operation.predecessor));
122
+ const successor = body.find((target) => target.path === targetPath("plan", operation.successor));
123
+ if (!predecessor || predecessor.before === null || !successor)
124
+ invalid("does not include both canonical plan targets");
125
+ if (operation.kind === "create" && successor.before !== null)
126
+ invalid("create target has a predecessor byte baseline");
127
+ if (operation.kind === "existing" && successor.before === null)
128
+ invalid("existing successor target lacks a byte baseline");
129
+ const predecessorEnvelope = parseEnvelope(decode(predecessor.after), "predecessor after target");
130
+ const successorEnvelope = parseEnvelope(decode(successor.after), "successor after target");
131
+ const predecessorHeader = mapping(predecessorEnvelope.record?.header)
132
+ ? predecessorEnvelope.record.header
133
+ : {};
134
+ const successorRecord = mapping(successorEnvelope.record) ? successorEnvelope.record : {};
135
+ if (predecessorEnvelope.id !== operation.predecessor
136
+ || predecessorEnvelope.artifact !== "plan"
137
+ || predecessorHeader.status !== "archived"
138
+ || successorEnvelope.id !== operation.successor
139
+ || successorEnvelope.artifact !== "plan"
140
+ || successorRecord.previous_plan_archived !== operation.predecessor
141
+ || successorRecord.replacement_input_sha256 !== operation.input_sha256)
142
+ invalid("does not encode the declared predecessor archive and immutable successor identity");
143
+ const taskTargets = body.filter((target) => target.path.includes("/plan_task/"));
144
+ if (operation.kind === "existing" && taskTargets.length)
145
+ invalid("existing-successor operation includes unexpected task targets");
146
+ if (operation.kind === "create") {
147
+ for (const target of taskTargets) {
148
+ if (target.before !== null)
149
+ invalid("create task target has a predecessor byte baseline");
150
+ const envelope = parseEnvelope(decode(target.after), "created task after target");
151
+ if (!mapping(envelope.record) || envelope.artifact !== "plan" || envelope.record.plan !== operation.successor) {
152
+ invalid("created task target does not belong to the declared successor");
153
+ }
154
+ }
155
+ }
156
+ return { schema_version: VERSION, id: value.id, operation: operation, targets: body };
157
+ }
158
+ function readJournal(root, name) {
159
+ const file = path.join(root, DIRECTORY, name);
160
+ const stat = fs.lstatSync(file);
161
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_JOURNAL_BYTES)
162
+ invalid("file is not a safe bounded regular file");
163
+ return parseJournal(fs.readFileSync(file), name);
164
+ }
165
+ function pendingJournalNames(root) {
166
+ const directory = path.join(root, DIRECTORY);
167
+ if (!fs.existsSync(directory))
168
+ return [];
169
+ const stat = fs.lstatSync(directory);
170
+ if (!stat.isDirectory() || stat.isSymbolicLink())
171
+ invalid("directory is not a safe real directory");
172
+ const names = fs.readdirSync(directory, { withFileTypes: true })
173
+ .filter((entry) => entry.name.endsWith(".json"))
174
+ .map((entry) => {
175
+ if (!entry.isFile() || entry.isSymbolicLink())
176
+ invalid("directory contains an unsafe journal entry");
177
+ return entry.name;
178
+ })
179
+ .sort();
180
+ if (names.length > 1)
181
+ invalid("has multiple pending operations");
182
+ return names;
183
+ }
184
+ export function inspectPendingPlanReplacement(root) {
185
+ const name = pendingJournalNames(root)[0];
186
+ if (!name)
187
+ return null;
188
+ const journal = readJournal(root, name);
189
+ return {
190
+ predecessor: journal.operation.predecessor,
191
+ successor: journal.operation.successor,
192
+ kind: journal.operation.kind,
193
+ inputSha256: journal.operation.input_sha256,
194
+ targetCount: journal.targets.length,
195
+ };
196
+ }
197
+ function assertExactRetry(journal, retry) {
198
+ const operation = journal.operation;
199
+ const matches = operation.predecessor === retry.predecessor
200
+ && (operation.kind === "existing"
201
+ ? retry.successor === operation.successor && retry.inputSha256 === undefined
202
+ : retry.successor === undefined && retry.inputSha256 === operation.input_sha256);
203
+ if (!matches) {
204
+ conflict(operation.kind === "existing"
205
+ ? `pending plan replacement for predecessor '${operation.predecessor}' requires successor '${operation.successor}', not this request`
206
+ : `pending plan replacement for predecessor '${operation.predecessor}' requires the exact original successor input`);
207
+ }
208
+ }
209
+ function bytesAt(root, relative) {
210
+ const file = path.join(root, relative);
211
+ try {
212
+ const stat = fs.lstatSync(file);
213
+ if (!stat.isFile() || stat.isSymbolicLink())
214
+ throw new Error("is not a safe regular file");
215
+ return fs.readFileSync(file);
216
+ }
217
+ catch (error) {
218
+ if (error.code === "ENOENT")
219
+ return null;
220
+ throw new Error(`plan replacement target '${relative}' ${error.message}`);
221
+ }
222
+ }
223
+ function fsyncDirectory(directory) {
224
+ if (process.platform === "win32")
225
+ return;
226
+ const descriptor = fs.openSync(directory, "r");
227
+ try {
228
+ fs.fsyncSync(descriptor);
229
+ }
230
+ finally {
231
+ fs.closeSync(descriptor);
232
+ }
233
+ }
234
+ function parseFileRecoveryMetadata(file) {
235
+ let parsed;
236
+ try {
237
+ const stat = fs.lstatSync(file);
238
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1024)
239
+ throw new Error("is unsafe or over bound");
240
+ parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(fs.readFileSync(file)));
241
+ }
242
+ catch {
243
+ conflict(`plan replacement retained recovery metadata '${file}' is invalid`);
244
+ }
245
+ if (!mapping(parsed))
246
+ conflict(`plan replacement retained recovery metadata '${file}' is not a mapping`);
247
+ const value = parsed;
248
+ if (Object.keys(value).sort().join(",") !== "after_sha256,before_sha256,schema_version,target_path"
249
+ || value.schema_version !== FILE_REPLACEMENT_RECOVERY_VERSION
250
+ || typeof value.target_path !== "string"
251
+ || typeof value.before_sha256 !== "string"
252
+ || typeof value.after_sha256 !== "string"
253
+ || !/^[a-f0-9]{64}$/.test(value.before_sha256)
254
+ || !/^[a-f0-9]{64}$/.test(value.after_sha256))
255
+ conflict(`plan replacement retained recovery metadata '${file}' has an invalid canonical record`);
256
+ return value;
257
+ }
258
+ function roleBytes(file, label) {
259
+ const stat = fs.lstatSync(file);
260
+ if (!stat.isFile() || stat.isSymbolicLink())
261
+ conflict(`plan replacement ${label} '${file}' is unsafe`);
262
+ return fs.readFileSync(file);
263
+ }
264
+ function removeExactRole(file, expected) {
265
+ if (!roleBytes(file, "recovery role").equals(expected))
266
+ conflict(`plan replacement recovery role '${file}' changed`);
267
+ fs.unlinkSync(file);
268
+ }
269
+ function recoverImmutableStage(root, target) {
270
+ if (target.before !== null)
271
+ return;
272
+ const absolute = path.join(root, target.path);
273
+ const directory = path.dirname(absolute);
274
+ if (!fs.existsSync(directory))
275
+ return;
276
+ const name = path.basename(absolute);
277
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
278
+ const pattern = new RegExp(`^\\.${escaped}\\.\\d+\\.[a-f0-9-]+\\.tmp$`);
279
+ const stages = fs.readdirSync(directory).filter((candidate) => pattern.test(candidate));
280
+ if (stages.length > 1)
281
+ conflict(`plan replacement target '${target.path}' has multiple retained immutable publication stages`);
282
+ if (!stages.length)
283
+ return;
284
+ const stage = path.join(directory, stages[0]);
285
+ const after = decode(target.after);
286
+ if (!roleBytes(stage, "immutable publication stage").equals(after)) {
287
+ conflict(`plan replacement target '${target.path}' retained immutable publication stage changed`);
288
+ }
289
+ const current = bytesAt(root, target.path);
290
+ if (current !== null && !current.equals(after)) {
291
+ conflict(`plan replacement target '${target.path}' has concurrent canonical bytes beside its immutable publication stage`);
292
+ }
293
+ removeExactRole(stage, after);
294
+ fsyncDirectory(directory);
295
+ }
296
+ function recoverReplacementRoles(context, target) {
297
+ if (target.before === null)
298
+ return;
299
+ const root = context.pinnedPath();
300
+ const recoveryRoot = path.join(root, ".agentera/.entity-recovery");
301
+ if (!fs.existsSync(recoveryRoot))
302
+ return;
303
+ const targetDirectory = path.dirname(context.pinnedPath(target.path));
304
+ const recoveryRootIdentity = validateEntityRecoveryDirectory(context.validatedRoot, recoveryRoot, targetDirectory, "private entity recovery root '.agentera/.entity-recovery'");
305
+ const entries = fs.readdirSync(recoveryRoot, { withFileTypes: true });
306
+ if (entries.length > 128)
307
+ conflict("private entity recovery root exceeds its bounded entry count");
308
+ const before = decode(target.before);
309
+ const after = decode(target.after);
310
+ const matches = [];
311
+ for (const entry of entries) {
312
+ if (entry.name === ".gitignore" || entry.name === "plan-replacement")
313
+ continue;
314
+ const directory = path.join(recoveryRoot, entry.name);
315
+ const identity = validateEntityRecoveryDirectory(context.validatedRoot, directory, targetDirectory, `private entity recovery attempt '${path.relative(root, directory).split(path.sep).join("/")}'`);
316
+ const metadata = path.join(directory, FILE_REPLACEMENT_METADATA_NAME);
317
+ if (!fs.existsSync(metadata))
318
+ continue;
319
+ const value = parseFileRecoveryMetadata(metadata);
320
+ if (value.target_path !== target.path)
321
+ continue;
322
+ if (value.before_sha256 !== sha256(before) || value.after_sha256 !== sha256(after)) {
323
+ conflict(`plan replacement target '${target.path}' retained recovery role digests do not match its pending journal`);
324
+ }
325
+ const names = fs.readdirSync(directory).sort();
326
+ if (names.some((name) => !["original.previous", "replacement.tmp", FILE_REPLACEMENT_METADATA_NAME].includes(name))) {
327
+ conflict(`plan replacement target '${target.path}' retained recovery attempt contains an unknown role`);
328
+ }
329
+ const previous = path.join(directory, "original.previous");
330
+ const stage = path.join(directory, "replacement.tmp");
331
+ if (fs.existsSync(previous) && !roleBytes(previous, "prior-byte role").equals(before)) {
332
+ conflict(`plan replacement target '${target.path}' retained prior-byte role changed`);
333
+ }
334
+ if (fs.existsSync(stage) && !roleBytes(stage, "replacement stage").equals(after)) {
335
+ conflict(`plan replacement target '${target.path}' retained replacement stage changed`);
336
+ }
337
+ matches.push({ directory, identity, metadata, ...(fs.existsSync(previous) ? { previous } : {}), ...(fs.existsSync(stage) ? { stage } : {}) });
338
+ }
339
+ if (matches.length > 1)
340
+ conflict(`plan replacement target '${target.path}' has multiple retained recovery attempts`);
341
+ const match = matches[0];
342
+ if (!match)
343
+ return;
344
+ const current = bytesAt(root, target.path);
345
+ if (!same(current, before) && !same(current, after)) {
346
+ conflict(`plan replacement target '${target.path}' has concurrent canonical bytes beside retained recovery roles`);
347
+ }
348
+ validateEntityRecoveryDirectory(context.validatedRoot, recoveryRoot, targetDirectory, "private entity recovery root '.agentera/.entity-recovery'", recoveryRootIdentity);
349
+ validateEntityRecoveryDirectory(context.validatedRoot, match.directory, targetDirectory, `private entity recovery attempt '${path.relative(root, match.directory).split(path.sep).join("/")}'`, match.identity);
350
+ if (match.stage)
351
+ removeExactRole(match.stage, after);
352
+ if (match.previous)
353
+ removeExactRole(match.previous, before);
354
+ removeExactRole(match.metadata, roleBytes(match.metadata, "replacement metadata"));
355
+ fs.rmdirSync(match.directory);
356
+ fsyncDirectory(recoveryRoot);
357
+ }
358
+ function applyTarget(context, sourceRoot, target) {
359
+ const root = context.pinnedPath();
360
+ recoverImmutableStage(root, target);
361
+ recoverReplacementRoles(context, target);
362
+ const before = target.before === null ? null : decode(target.before);
363
+ const after = decode(target.after);
364
+ const current = bytesAt(root, target.path);
365
+ if (same(current, after))
366
+ return null;
367
+ if (!same(current, before)) {
368
+ conflict(`plan replacement target '${target.path}' changed after journal preparation`);
369
+ }
370
+ if (before === null) {
371
+ const identity = context.publishImmutable(target.path, after.toString("utf8"));
372
+ if (!identity)
373
+ conflict(`plan replacement target '${target.path}' appeared during publication`);
374
+ return identity;
375
+ }
376
+ return context.replaceExisting(target.path, before, after.toString("utf8"), entityExactGetMaxBytes(sourceRoot)).publishedIdentity;
377
+ }
378
+ function rollback(context, sourceRoot, applied) {
379
+ const failures = [];
380
+ for (const { target, identity } of [...applied].reverse()) {
381
+ try {
382
+ if (target.before === null) {
383
+ const result = context.removeExact(target.path, identity, false);
384
+ if (result !== "removed")
385
+ throw new Error(`exact removal returned ${result}`);
386
+ }
387
+ else {
388
+ context.restoreExact(target.path, identity, decode(target.before).toString("utf8"), entityExactGetMaxBytes(sourceRoot));
389
+ }
390
+ }
391
+ catch (error) {
392
+ failures.push(`${target.path}: ${error.message}`);
393
+ }
394
+ }
395
+ return failures;
396
+ }
397
+ function finishJournal(context, relative, bytes, knownIdentity) {
398
+ const identity = knownIdentity ?? context.replaceExisting(relative, bytes, bytes.toString("utf8"), MAX_JOURNAL_BYTES).publishedIdentity;
399
+ if (context.removeExact(relative, identity) !== "removed") {
400
+ throw new Error(`plan replacement journal '${relative}' changed before cleanup`);
401
+ }
402
+ }
403
+ function completeJournal(context, sourceRoot, journal, bytes, relative, options, knownIdentity) {
404
+ const applied = [];
405
+ try {
406
+ for (const target of journal.targets) {
407
+ const identity = applyTarget(context, sourceRoot, target);
408
+ if (identity)
409
+ applied.push({ target, identity });
410
+ }
411
+ options.validate();
412
+ context.assertValid();
413
+ finishJournal(context, relative, bytes, knownIdentity);
414
+ }
415
+ catch (error) {
416
+ const failures = rollback(context, sourceRoot, applied);
417
+ if (failures.length) {
418
+ conflict(`plan replacement could not restore every target after failure: ${failures.join("; ")}`);
419
+ }
420
+ throw error;
421
+ }
422
+ }
423
+ export function recoverPendingPlanReplacement(context, sourceRoot, retry, options) {
424
+ const root = context.pinnedPath();
425
+ let pending;
426
+ try {
427
+ pending = inspectPendingPlanReplacement(root);
428
+ }
429
+ catch (error) {
430
+ reject({
431
+ class: "conflict",
432
+ message: `pending plan replacement journal is invalid: ${error.message}`,
433
+ recovery: "Preserve '.agentera/.entity-recovery/plan-replacement', restore its last valid journal bytes, and retry the exact non-dry-run plan replacement; no journal target bytes were changed.",
434
+ });
435
+ }
436
+ if (!pending)
437
+ return null;
438
+ const name = pendingJournalNames(root)[0];
439
+ const file = path.join(root, DIRECTORY, name);
440
+ const bytes = fs.readFileSync(file);
441
+ const journal = parseJournal(bytes, name);
442
+ assertExactRetry(journal, retry);
443
+ completeJournal(context, sourceRoot, journal, bytes, journalPath(journal.id), options);
444
+ return pending;
445
+ }
446
+ export function publishPlanReplacement(context, sourceRoot, operation, targets, options) {
447
+ if (!ID.test(operation.predecessor)
448
+ || !ID.test(operation.successor)
449
+ || operation.predecessor === operation.successor
450
+ || !/^[a-f0-9]{64}$/.test(operation.inputSha256)
451
+ || targets.length < 2
452
+ || targets.length > MAX_TARGETS
453
+ || new Set(targets.map((target) => target.path)).size !== targets.length
454
+ || targets.some((target) => !TARGET.test(target.path) || Buffer.byteLength(target.after) > MAX_TARGET_BYTES || (target.before !== null && target.before.length > MAX_TARGET_BYTES))) {
455
+ reject({ class: "schema_violation", message: "plan replacement transaction has invalid bounded targets", recovery: "Recompute the complete plan replacement target set from the locked canonical snapshot and retry; no state was changed." });
456
+ }
457
+ const body = targets.map((target) => ({ path: target.path, before: target.before === null ? null : encode(target.before), after: encode(target.after) }));
458
+ const journalOperation = {
459
+ kind: operation.kind,
460
+ predecessor: operation.predecessor,
461
+ successor: operation.successor,
462
+ input_sha256: operation.inputSha256,
463
+ };
464
+ const id = sha256(canonicalRecordJson({ operation: journalOperation, targets: body })).slice(0, 24);
465
+ const journal = { schema_version: VERSION, id, operation: journalOperation, targets: body };
466
+ const bytes = Buffer.from(`${JSON.stringify(journal)}\n`);
467
+ parseJournal(bytes, `${id}.json`);
468
+ const relative = journalPath(id);
469
+ recoverImmutableStage(context.pinnedPath(), { path: relative, before: null, after: bytes.toString("base64") });
470
+ const identity = context.publishImmutable(relative, bytes.toString("utf8"));
471
+ if (!identity) {
472
+ conflict(`plan replacement journal '${id}' already exists; retry the exact operation once so it can be recovered before another target set is prepared`);
473
+ }
474
+ completeJournal(context, sourceRoot, journal, bytes, relative, options, identity);
475
+ }