agentera 3.0.0-dev.7 → 3.0.0-dev.72

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 (723) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -22
  3. package/bundle/CHANGELOG.md +1361 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +252 -0
  8. package/bundle/extract-corpus-parity.json +2 -4
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +488 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -188
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -34
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +266 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +152 -93
  27. package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
  28. package/bundle/references/cli/update-channels.yaml +4 -2
  29. package/bundle/references/cli/vocabulary-index.yaml +5 -7
  30. package/bundle/references/cli/vocabulary.md +51 -93
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/skills/agentera/SKILL.md +183 -63
  33. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
  34. package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
  35. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
  36. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
  37. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
  38. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
  39. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
  40. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
  41. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  42. package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
  43. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
  44. package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
  45. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
  49. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
  50. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
  51. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  52. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
  53. package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
  54. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
  56. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
  60. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
  61. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
  62. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
  63. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +9 -4
  64. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +4 -4
  65. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
  66. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +61 -3
  67. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
  68. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
  69. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
  70. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
  71. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  72. package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
  73. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
  74. package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
  75. package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
  76. package/bundle/skills/agentera/protocol.yaml +4 -4
  77. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  78. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
  79. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +30 -12
  80. package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
  81. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -12
  82. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -9
  83. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  84. package/bundle/skills/agentera/schemas/artifacts/health.yaml +56 -19
  85. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -4
  86. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +457 -32
  87. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +131 -18
  88. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +302 -7
  89. package/dist/analytics/extractCorpus/cli.js +52 -11
  90. package/dist/analytics/extractCorpus/copilotSessions.js +6 -4
  91. package/dist/analytics/extractCorpus/core.js +40 -12
  92. package/dist/analytics/extractCorpus/corpus.js +39 -17
  93. package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
  94. package/dist/analytics/extractCorpus/cursorSessions.js +6 -4
  95. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  96. package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
  97. package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
  98. package/dist/analytics/extractCorpus/index.js +3 -1
  99. package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
  100. package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
  101. package/dist/analytics/extractCorpus/sqliteSessions.js +0 -1
  102. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  103. package/dist/analytics/extractCorpus.js +0 -1
  104. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  105. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  106. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  107. package/dist/analytics/personalGlossaryProfile.js +219 -0
  108. package/dist/analytics/profileSignals.js +211 -0
  109. package/dist/analytics/usageStats.js +150 -23
  110. package/dist/audit/terminologyDrift.js +281 -0
  111. package/dist/bin/agentera.js +3 -2
  112. package/dist/capabilities/audit/instructions.js +16 -6
  113. package/dist/capabilities/build/instructions.js +59 -6
  114. package/dist/capabilities/design/instructions.js +3 -4
  115. package/dist/capabilities/discuss/instructions.js +29 -6
  116. package/dist/capabilities/document/instructions.js +11 -6
  117. package/dist/capabilities/index.js +16 -14
  118. package/dist/capabilities/optimize/instructions.js +14 -6
  119. package/dist/capabilities/orchestrate/instructions.js +42 -6
  120. package/dist/capabilities/plan/instructions.js +30 -3
  121. package/dist/capabilities/profile/instructions.js +70 -6
  122. package/dist/capabilities/research/instructions.js +4 -5
  123. package/dist/capabilities/status/instructions.js +15 -6
  124. package/dist/capabilities/status/startupInstructions.js +34 -0
  125. package/dist/capabilities/vision/instructions.js +3 -5
  126. package/dist/cli/appContext.js +14 -7
  127. package/dist/cli/argvalidate.js +0 -1
  128. package/dist/cli/capabilityContext/benchmark.js +5 -4
  129. package/dist/cli/capabilityContext/bespoke.js +14 -6
  130. package/dist/cli/capabilityContext/build.js +116 -42
  131. package/dist/cli/capabilityContext/closeout.js +30 -27
  132. package/dist/cli/capabilityContext/contract.js +18 -27
  133. package/dist/cli/capabilityContext/evidence.js +84 -77
  134. package/dist/cli/capabilityContext/index.js +0 -1
  135. package/dist/cli/capabilityContext/orchestration.js +42 -18
  136. package/dist/cli/capabilityContext/planState.js +89 -96
  137. package/dist/cli/capabilityContext/progress.js +51 -12
  138. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  139. package/dist/cli/capabilityContext/shared.js +9 -20
  140. package/dist/cli/capabilityContext/slim.js +52 -8
  141. package/dist/cli/capabilityContext/startup.js +51 -114
  142. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  143. package/dist/cli/capabilityContext/types.js +26 -10
  144. package/dist/cli/capabilityContext.js +0 -1
  145. package/dist/cli/commands/appHome.js +0 -1
  146. package/dist/cli/commands/capability.js +2 -2
  147. package/dist/cli/commands/compact.js +163 -13
  148. package/dist/cli/commands/doctor.js +117 -11
  149. package/dist/cli/commands/durability.js +81 -0
  150. package/dist/cli/commands/glossaryAdvice.js +138 -0
  151. package/dist/cli/commands/lint.js +22 -8
  152. package/dist/cli/commands/personalGlossary.js +176 -0
  153. package/dist/cli/commands/prime/briefOrientation.js +746 -0
  154. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  155. package/dist/cli/commands/prime/bundleStatus.js +54 -4
  156. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  157. package/dist/cli/commands/prime/collectOrientationState.js +126 -63
  158. package/dist/cli/commands/prime/orientationOutput.js +267 -56
  159. package/dist/cli/commands/prime/types.js +0 -1
  160. package/dist/cli/commands/prime/v1Migration.js +0 -1
  161. package/dist/cli/commands/prime.js +76 -11
  162. package/dist/cli/commands/profileGrounding.js +55 -0
  163. package/dist/cli/commands/query.js +74 -52
  164. package/dist/cli/commands/report.js +73 -19
  165. package/dist/cli/commands/route.js +142 -0
  166. package/dist/cli/commands/schema.js +257 -138
  167. package/dist/cli/commands/state/decisions.js +40 -56
  168. package/dist/cli/commands/state/docs.js +58 -85
  169. package/dist/cli/commands/state/experimentRecords.js +151 -0
  170. package/dist/cli/commands/state/experiments.js +11 -65
  171. package/dist/cli/commands/state/get.js +129 -0
  172. package/dist/cli/commands/state/health.js +11 -113
  173. package/dist/cli/commands/state/index.js +6 -41
  174. package/dist/cli/commands/state/list.js +194 -0
  175. package/dist/cli/commands/state/objective.js +21 -65
  176. package/dist/cli/commands/state/plan.js +11 -170
  177. package/dist/cli/commands/state/planTasks.js +154 -0
  178. package/dist/cli/commands/state/plans.js +154 -0
  179. package/dist/cli/commands/state/progress.js +11 -45
  180. package/dist/cli/commands/state/shared.js +0 -1
  181. package/dist/cli/commands/state/todo.js +28 -107
  182. package/dist/cli/commands/state/write.js +433 -0
  183. package/dist/cli/commands/upgrade.js +146 -5
  184. package/dist/cli/commands/upgradeVerify.js +118 -0
  185. package/dist/cli/commands/validate.js +235 -136
  186. package/dist/cli/commands/verify.js +23 -8
  187. package/dist/cli/contracts/bundleStatus.js +0 -1
  188. package/dist/cli/contracts/orientationState.js +0 -1
  189. package/dist/cli/dispatch/argvParser.js +0 -1
  190. package/dist/cli/dispatch/check.js +84 -40
  191. package/dist/cli/dispatch/commands.js +3 -3
  192. package/dist/cli/dispatch/index.js +77 -52
  193. package/dist/cli/dispatch/lifecycle.js +117 -62
  194. package/dist/cli/dispatch/prime.js +37 -2
  195. package/dist/cli/dispatch/projections.js +17 -0
  196. package/dist/cli/dispatch/shared.js +1 -2
  197. package/dist/cli/dispatch/state.js +62 -66
  198. package/dist/cli/dispatch.js +0 -1
  199. package/dist/cli/errors.js +16 -17
  200. package/dist/cli/help.js +358 -39
  201. package/dist/cli/migrationRequired.js +122 -0
  202. package/dist/cli/orientation/attention.js +19 -19
  203. package/dist/cli/orientation/corpusCoverage.js +32 -1
  204. package/dist/cli/orientation.js +346 -129
  205. package/dist/cli/planArtifacts.js +350 -0
  206. package/dist/cli/planEvidence.js +157 -0
  207. package/dist/cli/planLifecycleState.js +36 -0
  208. package/dist/cli/planTaskIndex.js +11 -0
  209. package/dist/cli/preCutoverCommand.js +32 -0
  210. package/dist/cli/prime-blob.js +71 -3
  211. package/dist/cli/profileAcquisition.js +167 -0
  212. package/dist/cli/startupCompletenessContract.js +11 -8
  213. package/dist/cli/stateQuery.js +47 -12
  214. package/dist/cli/structured.js +0 -1
  215. package/dist/cli/todoMarkdown.js +25 -12
  216. package/dist/cli/todoReadinessSelection.js +192 -0
  217. package/dist/cli/todoSeverity.js +0 -1
  218. package/dist/core/atomicWriter.js +20 -0
  219. package/dist/core/developmentChannel.js +1 -0
  220. package/dist/core/developmentInvocation.js +374 -0
  221. package/dist/core/difflib.js +0 -1
  222. package/dist/core/envPaths.js +0 -1
  223. package/dist/core/jsonValue.js +0 -1
  224. package/dist/core/paths.js +0 -1
  225. package/dist/core/pyjson.js +0 -1
  226. package/dist/core/shell.js +4 -0
  227. package/dist/core/skillIdentity.js +23 -0
  228. package/dist/core/sourceRoot.js +9 -12
  229. package/dist/core/text.js +10 -0
  230. package/dist/core/toml.js +0 -1
  231. package/dist/core/yaml.js +8 -1
  232. package/dist/eval/evalSkills.js +13 -14
  233. package/dist/eval/hybridRouteEvaluation.js +155 -0
  234. package/dist/eval/semanticEval.js +0 -1
  235. package/dist/eval/semanticFixtures.js +0 -1
  236. package/dist/hooks/common.js +3 -56
  237. package/dist/hooks/compaction/apply.js +224 -47
  238. package/dist/hooks/compaction/dryRun.js +2 -1
  239. package/dist/hooks/compaction/index.js +5 -6
  240. package/dist/hooks/compaction/parse.js +73 -6
  241. package/dist/hooks/compaction/retention.js +28 -25
  242. package/dist/hooks/compaction/status.js +145 -26
  243. package/dist/hooks/compaction/types.js +0 -1
  244. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  245. package/dist/hooks/validateArtifact/index.js +6 -65
  246. package/dist/hooks/validateArtifact/markdown.js +9 -10
  247. package/dist/hooks/validateArtifact/schema.js +96 -9
  248. package/dist/hooks/validateArtifact/traversal.js +12 -11
  249. package/dist/hooks/validateArtifact/violations.js +5 -3
  250. package/dist/migrate/v2HandoffManifest.js +8 -3
  251. package/dist/registries/activationContract.js +2 -0
  252. package/dist/registries/activationTuples.js +108 -0
  253. package/dist/registries/artifactProtocolIds.js +2 -1
  254. package/dist/registries/artifactRegistry.js +207 -60
  255. package/dist/registries/artifactSchemaProjection.js +45 -0
  256. package/dist/registries/capabilityContract.js +5 -21
  257. package/dist/registries/evaluatorHandoffContract.js +0 -1
  258. package/dist/registries/evidenceTierContract.js +371 -0
  259. package/dist/registries/glossaryAdviceContract.js +79 -0
  260. package/dist/registries/glossaryCaveatContract.js +67 -0
  261. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  262. package/dist/registries/glossaryEntryContract.js +757 -0
  263. package/dist/registries/glossaryTermIdentity.js +17 -0
  264. package/dist/registries/glossaryTermOccurrence.js +20 -0
  265. package/dist/registries/hybridRoute.js +274 -0
  266. package/dist/registries/hybridRouteReceipt.js +221 -0
  267. package/dist/registries/packagePublication.js +273 -0
  268. package/dist/registries/packageRegistry.js +184 -209
  269. package/dist/registries/todoReadinessContract.js +448 -0
  270. package/dist/registries/triggerLoader.js +7 -44
  271. package/dist/registries/verbosityBudgetContract.js +205 -0
  272. package/dist/release/releaseMetadata.js +155 -5
  273. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  274. package/dist/runtime/lifecycleAdapters.js +777 -0
  275. package/dist/runtime/lifecycleAuthority.js +453 -0
  276. package/dist/runtime/lifecycleOperationContract.js +123 -0
  277. package/dist/runtime/lifecycleOperations.js +634 -0
  278. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  279. package/dist/runtime/lifecyclePublication.js +415 -0
  280. package/dist/runtime/lifecycleSnapshot.js +438 -0
  281. package/dist/runtime/nativeResourceCleanup.js +502 -0
  282. package/dist/setup/opencode.js +20 -13
  283. package/dist/setup/opencodeConstants.js +1 -0
  284. package/dist/setup/sharedSkill.js +45 -0
  285. package/dist/setup/smokeChecks.js +14 -75
  286. package/dist/state/archiveDiscovery.js +580 -0
  287. package/dist/state/archivePublication.js +225 -0
  288. package/dist/state/archiveRecovery.js +237 -0
  289. package/dist/state/archiveReplay.js +53 -0
  290. package/dist/state/canonicalMigrationRecord.js +36 -0
  291. package/dist/state/changelog.js +221 -0
  292. package/dist/state/decisionEntities.js +367 -0
  293. package/dist/state/decisionLegacyValidation.js +215 -0
  294. package/dist/state/decisionMigrationProvenance.js +199 -0
  295. package/dist/state/decisionOverlay.js +254 -0
  296. package/dist/state/decisionRevision.js +256 -0
  297. package/dist/state/decisionRevisionMigration.js +89 -0
  298. package/dist/state/directRetrieval.js +323 -0
  299. package/dist/state/durability.js +324 -0
  300. package/dist/state/entityCutover.js +459 -0
  301. package/dist/state/entityCutoverGit.js +127 -0
  302. package/dist/state/entityGlossaryAuthority.js +13 -0
  303. package/dist/state/entityListProjection.js +187 -0
  304. package/dist/state/entityListRuntimeRegistry.js +85 -0
  305. package/dist/state/entityMigrationCausality.js +97 -0
  306. package/dist/state/entityMigrationIdentity.js +5 -0
  307. package/dist/state/entityMigrationPreview.js +840 -0
  308. package/dist/state/entityMigrationTodo.js +133 -0
  309. package/dist/state/entityPublicationContext.js +859 -0
  310. package/dist/state/entityRetrievalHelp.js +506 -0
  311. package/dist/state/entityStorage.js +899 -0
  312. package/dist/state/exactReplacementRecovery.js +18 -0
  313. package/dist/state/experimentArchive.js +63 -0
  314. package/dist/state/experimentIdentity.js +202 -0
  315. package/dist/state/healthEntities.js +262 -0
  316. package/dist/state/healthEntityValidation.js +18 -0
  317. package/dist/state/healthRepair.js +69 -0
  318. package/dist/state/installRoot.js +15 -7
  319. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  320. package/dist/state/legacyIdentity.js +47 -0
  321. package/dist/state/legacySummaryRecord.js +6 -0
  322. package/dist/state/listAccounting.js +54 -0
  323. package/dist/state/listClassification.js +17 -0
  324. package/dist/state/listCursor.js +42 -0
  325. package/dist/state/listRetrieval.js +781 -0
  326. package/dist/state/migrationSourceBinding.js +30 -0
  327. package/dist/state/objectiveExperimentEntities.js +322 -0
  328. package/dist/state/planEntities.js +1027 -0
  329. package/dist/state/planIdentity.js +47 -0
  330. package/dist/state/planLineageValidation.js +52 -0
  331. package/dist/state/planReplacementTransaction.js +475 -0
  332. package/dist/state/planRetrieval.js +313 -0
  333. package/dist/state/planTaskRetrieval.js +294 -0
  334. package/dist/state/progressEntities.js +512 -0
  335. package/dist/state/progressGlossaryCaveat.js +168 -0
  336. package/dist/state/progressPublicationOrder.js +19 -0
  337. package/dist/state/progressWritePolicy.js +33 -0
  338. package/dist/state/projectRoot.js +62 -0
  339. package/dist/state/projectionPolicy.js +190 -0
  340. package/dist/state/retrievalAuthority.js +156 -0
  341. package/dist/state/safeProjectFile.js +155 -0
  342. package/dist/state/startupAnalysis/benchmark.js +70 -9
  343. package/dist/state/startupAnalysis/contract.js +44 -10
  344. package/dist/state/startupAnalysis/helpers.js +1 -2
  345. package/dist/state/startupAnalysis/index.js +0 -1
  346. package/dist/state/startupAnalysis/metrics.js +0 -1
  347. package/dist/state/startupAnalysis/records.js +0 -1
  348. package/dist/state/startupAnalysis/report.js +0 -1
  349. package/dist/state/startupAnalysis/threshold.js +13 -1
  350. package/dist/state/startupAnalysis.js +0 -1
  351. package/dist/state/startupProjection.js +499 -0
  352. package/dist/state/stateMode.js +222 -0
  353. package/dist/state/stateStorageAuthority.js +47 -0
  354. package/dist/state/summaryEntityRead.js +25 -0
  355. package/dist/state/summaryMigrationProvenance.js +66 -0
  356. package/dist/state/summarySourceRowAuthority.js +36 -0
  357. package/dist/state/todoActivationSafety.js +58 -0
  358. package/dist/state/todoDocsEntities.js +1124 -0
  359. package/dist/state/todoDocsEntityValidation.js +158 -0
  360. package/dist/state/todoMarkdownProjection.js +51 -0
  361. package/dist/state/todoReconciliationActivation.js +182 -0
  362. package/dist/state/todoReconciliationInspection.js +171 -0
  363. package/dist/state/todoReconciliationRepair.js +318 -0
  364. package/dist/state/todoReconciliationTransaction.js +595 -0
  365. package/dist/state/write/assign.js +20 -0
  366. package/dist/state/write/candidateMutation.js +269 -0
  367. package/dist/state/write/errors.js +11 -0
  368. package/dist/state/write/experimentPublication.js +192 -0
  369. package/dist/state/write/explain.js +377 -0
  370. package/dist/state/write/fields.js +61 -0
  371. package/dist/state/write/glossaryPublication.js +263 -0
  372. package/dist/state/write/grammar.js +285 -0
  373. package/dist/state/write/helpers.js +29 -0
  374. package/dist/state/write/index.js +12 -0
  375. package/dist/state/write/input.js +391 -0
  376. package/dist/state/write/lock.js +837 -0
  377. package/dist/state/write/mutation.js +234 -0
  378. package/dist/state/write/operations.js +170 -0
  379. package/dist/state/write/planEvaluation.js +128 -0
  380. package/dist/state/write/planPublication.js +179 -0
  381. package/dist/state/write/runtimeOperations.js +146 -0
  382. package/dist/state/write/serialize.js +1 -0
  383. package/dist/state/write/transaction.js +57 -0
  384. package/dist/state/write/validate.js +7 -0
  385. package/dist/upgrade/appContentRefresh.js +77 -36
  386. package/dist/upgrade/appModel.js +0 -1
  387. package/dist/upgrade/atomicWriter.js +1 -0
  388. package/dist/upgrade/bundleEvidence.js +0 -1
  389. package/dist/upgrade/channels.js +6 -9
  390. package/dist/upgrade/compatibility.js +43 -17
  391. package/dist/upgrade/doctor.js +55 -32
  392. package/dist/upgrade/doctorClassifier.js +11 -1
  393. package/dist/upgrade/installedHooksRetirement.js +46 -40
  394. package/dist/upgrade/legacyAgentCleanup.js +187 -21
  395. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  396. package/dist/upgrade/migrateArtifactsV2ToV3.js +334 -64
  397. package/dist/upgrade/migrationPublication.js +122 -0
  398. package/dist/upgrade/nextMajorDoctor.js +0 -1
  399. package/dist/upgrade/npxPlatformStatus.js +0 -1
  400. package/dist/upgrade/projectIntegration.js +121 -159
  401. package/dist/upgrade/projectIntegrationDecision.js +42 -85
  402. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  403. package/dist/upgrade/runtimeMigration.js +262 -453
  404. package/dist/upgrade/upgradeCommands.js +14 -1
  405. package/dist/upgrade/upgradeLock.js +85 -0
  406. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  407. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  408. package/dist/upgrade/versionResolution.js +0 -1
  409. package/dist/validate/activationArtifactEvidence.js +852 -0
  410. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  411. package/dist/validate/activationConjunction.js +816 -0
  412. package/dist/validate/activationEvidenceManifest.js +531 -0
  413. package/dist/validate/activationPackageSemantics.js +29 -0
  414. package/dist/validate/appHomeContract.js +1 -7
  415. package/dist/validate/bootstrapAuthority.js +44 -0
  416. package/dist/validate/capability.js +11 -3
  417. package/dist/validate/crossCapability.js +14 -9
  418. package/dist/validate/retainedReferenceAuthority.js +879 -0
  419. package/dist/validate/selfAudit.js +39 -45
  420. package/dist/validate/v1LegacyCruft.js +131 -0
  421. package/dist/validate/vocabularyAuthority.js +8 -8
  422. package/package.json +41 -13
  423. package/bundle/references/adapters/cursor.md +0 -214
  424. package/bundle/references/adapters/opencode.md +0 -530
  425. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  426. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  427. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  428. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -554
  429. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  430. package/bundle/references/analysis/benchmark.md +0 -267
  431. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  432. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  433. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  434. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  435. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  436. package/bundle/references/cli/coexistence-probe.yaml +0 -13
  437. package/bundle/references/cli/parity-expected-actual-template.md +0 -30
  438. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  439. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  440. package/bundle/references/cli/upgrade-repair-wording.md +0 -45
  441. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  442. package/bundle/references/meta/documentation-inventory.md +0 -49
  443. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  444. package/bundle/skills/agentera/agents/audit.toml +0 -6
  445. package/bundle/skills/agentera/agents/build.toml +0 -6
  446. package/bundle/skills/agentera/agents/design.toml +0 -6
  447. package/bundle/skills/agentera/agents/discuss.toml +0 -6
  448. package/bundle/skills/agentera/agents/document.toml +0 -6
  449. package/bundle/skills/agentera/agents/optimize.toml +0 -6
  450. package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
  451. package/bundle/skills/agentera/agents/plan.toml +0 -6
  452. package/bundle/skills/agentera/agents/profile.toml +0 -6
  453. package/bundle/skills/agentera/agents/research.toml +0 -6
  454. package/bundle/skills/agentera/agents/status.toml +0 -6
  455. package/bundle/skills/agentera/agents/vision.toml +0 -6
  456. package/bundle/skills/agentera/references/contract.md +0 -1048
  457. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  458. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  459. package/dist/analytics/extractCorpus/core.js.map +0 -1
  460. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  461. package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
  462. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  463. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
  464. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  465. package/dist/analytics/extractCorpus/index.js.map +0 -1
  466. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  467. package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
  468. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  469. package/dist/analytics/extractCorpus.js.map +0 -1
  470. package/dist/analytics/usageStats.js.map +0 -1
  471. package/dist/bin/agentera.js.map +0 -1
  472. package/dist/capabilities/audit/instructions.js.map +0 -1
  473. package/dist/capabilities/build/instructions.js.map +0 -1
  474. package/dist/capabilities/design/instructions.js.map +0 -1
  475. package/dist/capabilities/discuss/instructions.js.map +0 -1
  476. package/dist/capabilities/document/instructions.js.map +0 -1
  477. package/dist/capabilities/dokumentera/instructions.js +0 -6
  478. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  479. package/dist/capabilities/hej/instructions.js +0 -6
  480. package/dist/capabilities/hej/instructions.js.map +0 -1
  481. package/dist/capabilities/index.js.map +0 -1
  482. package/dist/capabilities/inspektera/instructions.js +0 -6
  483. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  484. package/dist/capabilities/inspirera/instructions.js +0 -6
  485. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  486. package/dist/capabilities/optimera/instructions.js +0 -6
  487. package/dist/capabilities/optimera/instructions.js.map +0 -1
  488. package/dist/capabilities/optimize/instructions.js.map +0 -1
  489. package/dist/capabilities/orchestrate/instructions.js.map +0 -1
  490. package/dist/capabilities/orkestrera/instructions.js +0 -6
  491. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  492. package/dist/capabilities/plan/instructions.js.map +0 -1
  493. package/dist/capabilities/planera/instructions.js +0 -6
  494. package/dist/capabilities/planera/instructions.js.map +0 -1
  495. package/dist/capabilities/profile/instructions.js.map +0 -1
  496. package/dist/capabilities/profilera/instructions.js +0 -6
  497. package/dist/capabilities/profilera/instructions.js.map +0 -1
  498. package/dist/capabilities/realisera/instructions.js +0 -6
  499. package/dist/capabilities/realisera/instructions.js.map +0 -1
  500. package/dist/capabilities/research/instructions.js.map +0 -1
  501. package/dist/capabilities/resonera/instructions.js +0 -6
  502. package/dist/capabilities/resonera/instructions.js.map +0 -1
  503. package/dist/capabilities/status/instructions.js.map +0 -1
  504. package/dist/capabilities/vision/instructions.js.map +0 -1
  505. package/dist/capabilities/visionera/instructions.js +0 -6
  506. package/dist/capabilities/visionera/instructions.js.map +0 -1
  507. package/dist/capabilities/visualisera/instructions.js +0 -5
  508. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  509. package/dist/cli/appContext.js.map +0 -1
  510. package/dist/cli/argvalidate.js.map +0 -1
  511. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  512. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  513. package/dist/cli/capabilityContext/build.js.map +0 -1
  514. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  515. package/dist/cli/capabilityContext/contract.js.map +0 -1
  516. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  517. package/dist/cli/capabilityContext/index.js.map +0 -1
  518. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  519. package/dist/cli/capabilityContext/planState.js.map +0 -1
  520. package/dist/cli/capabilityContext/progress.js.map +0 -1
  521. package/dist/cli/capabilityContext/realisera.js +0 -174
  522. package/dist/cli/capabilityContext/realisera.js.map +0 -1
  523. package/dist/cli/capabilityContext/shared.js.map +0 -1
  524. package/dist/cli/capabilityContext/slim.js.map +0 -1
  525. package/dist/cli/capabilityContext/startup.js.map +0 -1
  526. package/dist/cli/capabilityContext/types.js.map +0 -1
  527. package/dist/cli/capabilityContext.js.map +0 -1
  528. package/dist/cli/commands/appHome.js.map +0 -1
  529. package/dist/cli/commands/backfill.js +0 -84
  530. package/dist/cli/commands/backfill.js.map +0 -1
  531. package/dist/cli/commands/capability.js.map +0 -1
  532. package/dist/cli/commands/compact.js.map +0 -1
  533. package/dist/cli/commands/doctor.js.map +0 -1
  534. package/dist/cli/commands/lint.js.map +0 -1
  535. package/dist/cli/commands/prime/bundleStatus.js.map +0 -1
  536. package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
  537. package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
  538. package/dist/cli/commands/prime/routeOutput.js +0 -50
  539. package/dist/cli/commands/prime/routeOutput.js.map +0 -1
  540. package/dist/cli/commands/prime/types.js.map +0 -1
  541. package/dist/cli/commands/prime/v1Migration.js.map +0 -1
  542. package/dist/cli/commands/prime.js.map +0 -1
  543. package/dist/cli/commands/query.js.map +0 -1
  544. package/dist/cli/commands/report.js.map +0 -1
  545. package/dist/cli/commands/schema.js.map +0 -1
  546. package/dist/cli/commands/state/decisions.js.map +0 -1
  547. package/dist/cli/commands/state/docs.js.map +0 -1
  548. package/dist/cli/commands/state/experiments.js.map +0 -1
  549. package/dist/cli/commands/state/health.js.map +0 -1
  550. package/dist/cli/commands/state/index.js.map +0 -1
  551. package/dist/cli/commands/state/objective.js.map +0 -1
  552. package/dist/cli/commands/state/plan.js.map +0 -1
  553. package/dist/cli/commands/state/progress.js.map +0 -1
  554. package/dist/cli/commands/state/shared.js.map +0 -1
  555. package/dist/cli/commands/state/todo.js.map +0 -1
  556. package/dist/cli/commands/state.js +0 -1023
  557. package/dist/cli/commands/state.js.map +0 -1
  558. package/dist/cli/commands/upgrade.js.map +0 -1
  559. package/dist/cli/commands/validate.js.map +0 -1
  560. package/dist/cli/commands/verify.js.map +0 -1
  561. package/dist/cli/contracts/bundleStatus.js.map +0 -1
  562. package/dist/cli/contracts/orientationState.js.map +0 -1
  563. package/dist/cli/dispatch/argvParser.js.map +0 -1
  564. package/dist/cli/dispatch/check.js.map +0 -1
  565. package/dist/cli/dispatch/commands.js.map +0 -1
  566. package/dist/cli/dispatch/index.js.map +0 -1
  567. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  568. package/dist/cli/dispatch/prime.js.map +0 -1
  569. package/dist/cli/dispatch/shared.js.map +0 -1
  570. package/dist/cli/dispatch/state.js.map +0 -1
  571. package/dist/cli/dispatch.js.map +0 -1
  572. package/dist/cli/errors.js.map +0 -1
  573. package/dist/cli/help.js.map +0 -1
  574. package/dist/cli/orientation/attention.js.map +0 -1
  575. package/dist/cli/orientation/corpusCoverage.js.map +0 -1
  576. package/dist/cli/orientation.js.map +0 -1
  577. package/dist/cli/prime-blob.js.map +0 -1
  578. package/dist/cli/startupCompletenessContract.js.map +0 -1
  579. package/dist/cli/stateQuery.js.map +0 -1
  580. package/dist/cli/structured.js.map +0 -1
  581. package/dist/cli/todoMarkdown.js.map +0 -1
  582. package/dist/cli/todoSeverity.js.map +0 -1
  583. package/dist/core/difflib.js.map +0 -1
  584. package/dist/core/envPaths.js.map +0 -1
  585. package/dist/core/git.js +0 -43
  586. package/dist/core/git.js.map +0 -1
  587. package/dist/core/jsonValue.js.map +0 -1
  588. package/dist/core/paths.js.map +0 -1
  589. package/dist/core/pyjson.js.map +0 -1
  590. package/dist/core/sourceRoot.js.map +0 -1
  591. package/dist/core/toml.js.map +0 -1
  592. package/dist/core/yaml.js.map +0 -1
  593. package/dist/eval/evalSkills.js.map +0 -1
  594. package/dist/eval/semanticEval.js.map +0 -1
  595. package/dist/eval/semanticFixtures.js.map +0 -1
  596. package/dist/hooks/common.js.map +0 -1
  597. package/dist/hooks/compaction/apply.js.map +0 -1
  598. package/dist/hooks/compaction/dryRun.js.map +0 -1
  599. package/dist/hooks/compaction/index.js.map +0 -1
  600. package/dist/hooks/compaction/parse.js.map +0 -1
  601. package/dist/hooks/compaction/retention.js.map +0 -1
  602. package/dist/hooks/compaction/status.js.map +0 -1
  603. package/dist/hooks/compaction/todoResolved.js +0 -137
  604. package/dist/hooks/compaction/todoResolved.js.map +0 -1
  605. package/dist/hooks/compaction/types.js.map +0 -1
  606. package/dist/hooks/compaction.js +0 -935
  607. package/dist/hooks/compaction.js.map +0 -1
  608. package/dist/hooks/cursorPreToolUse.js +0 -19
  609. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  610. package/dist/hooks/cursorSessionStart.js +0 -79
  611. package/dist/hooks/cursorSessionStart.js.map +0 -1
  612. package/dist/hooks/sessionStart.js +0 -216
  613. package/dist/hooks/sessionStart.js.map +0 -1
  614. package/dist/hooks/sessionStop.js +0 -206
  615. package/dist/hooks/sessionStop.js.map +0 -1
  616. package/dist/hooks/todoLayout.js +0 -177
  617. package/dist/hooks/todoLayout.js.map +0 -1
  618. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  619. package/dist/hooks/validateArtifact/index.js.map +0 -1
  620. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  621. package/dist/hooks/validateArtifact/runtime.js +0 -86
  622. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  623. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  624. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  625. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  626. package/dist/hooks/validateArtifact.js +0 -924
  627. package/dist/hooks/validateArtifact.js.map +0 -1
  628. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  629. package/dist/registries/artifactProtocolIds.js.map +0 -1
  630. package/dist/registries/artifactRegistry.js.map +0 -1
  631. package/dist/registries/capabilityContract.js.map +0 -1
  632. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  633. package/dist/registries/packageRegistry.js.map +0 -1
  634. package/dist/registries/runtimeAdapterRegistry.js +0 -316
  635. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  636. package/dist/registries/triggerLoader.js.map +0 -1
  637. package/dist/release/releaseMetadata.js.map +0 -1
  638. package/dist/routing/index.js +0 -2
  639. package/dist/routing/index.js.map +0 -1
  640. package/dist/routing/routeEngine.js +0 -189
  641. package/dist/routing/routeEngine.js.map +0 -1
  642. package/dist/setup/codex/agents.js +0 -96
  643. package/dist/setup/codex/agents.js.map +0 -1
  644. package/dist/setup/codex/cli.js +0 -161
  645. package/dist/setup/codex/cli.js.map +0 -1
  646. package/dist/setup/codex/configToml.js +0 -639
  647. package/dist/setup/codex/configToml.js.map +0 -1
  648. package/dist/setup/codex/constants.js +0 -29
  649. package/dist/setup/codex/constants.js.map +0 -1
  650. package/dist/setup/codex/installRoot.js +0 -64
  651. package/dist/setup/codex/installRoot.js.map +0 -1
  652. package/dist/setup/codex/state.js +0 -270
  653. package/dist/setup/codex/state.js.map +0 -1
  654. package/dist/setup/codex.js +0 -12
  655. package/dist/setup/codex.js.map +0 -1
  656. package/dist/setup/copilot.js +0 -227
  657. package/dist/setup/copilot.js.map +0 -1
  658. package/dist/setup/cursor.js +0 -129
  659. package/dist/setup/cursor.js.map +0 -1
  660. package/dist/setup/cursorSurfaces.js +0 -67
  661. package/dist/setup/cursorSurfaces.js.map +0 -1
  662. package/dist/setup/doctor/core.js +0 -300
  663. package/dist/setup/doctor/core.js.map +0 -1
  664. package/dist/setup/doctor/diagnostics.js +0 -240
  665. package/dist/setup/doctor/diagnostics.js.map +0 -1
  666. package/dist/setup/doctor/opencode.js +0 -313
  667. package/dist/setup/doctor/opencode.js.map +0 -1
  668. package/dist/setup/doctor/report.js +0 -425
  669. package/dist/setup/doctor/report.js.map +0 -1
  670. package/dist/setup/doctor.js +0 -10
  671. package/dist/setup/doctor.js.map +0 -1
  672. package/dist/setup/opencode.js.map +0 -1
  673. package/dist/setup/smokeChecks.js.map +0 -1
  674. package/dist/state/installRoot.js.map +0 -1
  675. package/dist/state/progressCommit.js +0 -289
  676. package/dist/state/progressCommit.js.map +0 -1
  677. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  678. package/dist/state/startupAnalysis/contract.js.map +0 -1
  679. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  680. package/dist/state/startupAnalysis/index.js.map +0 -1
  681. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  682. package/dist/state/startupAnalysis/records.js.map +0 -1
  683. package/dist/state/startupAnalysis/report.js.map +0 -1
  684. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  685. package/dist/state/startupAnalysis.js.map +0 -1
  686. package/dist/upgrade/appContentRefresh.js.map +0 -1
  687. package/dist/upgrade/appModel.js.map +0 -1
  688. package/dist/upgrade/bundleEvidence.js.map +0 -1
  689. package/dist/upgrade/channels.js.map +0 -1
  690. package/dist/upgrade/cliProbe.js +0 -22
  691. package/dist/upgrade/cliProbe.js.map +0 -1
  692. package/dist/upgrade/coexistenceProbe.js +0 -107
  693. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  694. package/dist/upgrade/compatibility.js.map +0 -1
  695. package/dist/upgrade/doctor.js.map +0 -1
  696. package/dist/upgrade/doctorClassifier.js.map +0 -1
  697. package/dist/upgrade/installedHooksRetirement.js.map +0 -1
  698. package/dist/upgrade/legacyAgentCleanup.js.map +0 -1
  699. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  700. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  701. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  702. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  703. package/dist/upgrade/npxPlatformStatus.js.map +0 -1
  704. package/dist/upgrade/projectIntegration.js.map +0 -1
  705. package/dist/upgrade/projectIntegrationDecision.js.map +0 -1
  706. package/dist/upgrade/runtimeMigration.js.map +0 -1
  707. package/dist/upgrade/upgradeCommands.js.map +0 -1
  708. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  709. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  710. package/dist/upgrade/versionResolution.js.map +0 -1
  711. package/dist/validate/appHomeContract.js.map +0 -1
  712. package/dist/validate/capability.js.map +0 -1
  713. package/dist/validate/crossCapability.js.map +0 -1
  714. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  715. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  716. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
  717. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  718. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  719. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  720. package/dist/validate/lifecycleAdapters.js +0 -62
  721. package/dist/validate/lifecycleAdapters.js.map +0 -1
  722. package/dist/validate/selfAudit.js.map +0 -1
  723. package/dist/validate/vocabularyAuthority.js.map +0 -1
@@ -0,0 +1,595 @@
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 { ExactReplacementConflictError, FileReplacementError } from "./exactReplacementRecovery.js";
9
+ import { TODO_RECONCILIATION_ACTIVATION_PATH } from "./todoReconciliationActivation.js";
10
+ import { reject } from "./write/errors.js";
11
+ const VERSION = "agentera.todoReconciliationTransaction.v1";
12
+ const DIRECTORY = ".agentera/.todo-reconciliation";
13
+ const MAX_JOURNAL_BYTES = 4 * 1024 * 1024;
14
+ const MAX_TARGET_BYTES = 1024 * 1024;
15
+ const MAX_TARGETS = Math.floor(MAX_JOURNAL_BYTES / 32);
16
+ const ENTITY_MODE_MARKER = ".agentera/state-mode.yaml";
17
+ export class InjectedTodoReconciliationInterruption extends Error {
18
+ publishedTargets;
19
+ constructor(publishedTargets) {
20
+ super(`injected TODO reconciliation interruption after ${publishedTargets} target publications`);
21
+ this.publishedTargets = publishedTargets;
22
+ this.name = "InjectedTodoReconciliationInterruption";
23
+ }
24
+ }
25
+ function encode(bytes) {
26
+ return Buffer.from(bytes).toString("base64");
27
+ }
28
+ function decode(bytes) {
29
+ return Buffer.from(bytes, "base64");
30
+ }
31
+ function exactBase64(value) {
32
+ if (typeof value !== "string")
33
+ return false;
34
+ try {
35
+ return encode(decode(value)) === value;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ export function todoCreateRequestSha256(record) {
42
+ return createHash("sha256")
43
+ .update("agentera.todoCreateRequest.v1\0")
44
+ .update(canonicalRecordJson(record))
45
+ .digest("hex");
46
+ }
47
+ function bytesAt(root, relative) {
48
+ const target = path.join(root, relative);
49
+ return fs.existsSync(target) ? fs.readFileSync(target) : null;
50
+ }
51
+ function same(left, right) {
52
+ return left === null ? right === null : right !== null && left.equals(right);
53
+ }
54
+ function validTarget(relative, publicPath) {
55
+ return relative === publicPath
56
+ || relative === TODO_RECONCILIATION_ACTIVATION_PATH
57
+ || relative === ENTITY_MODE_MARKER
58
+ || /^\.agentera\/entities\/[a-z][a-z0-9_]*\/[a-z][a-z0-9_]*\/[a-z]{10}\.yaml$/.test(relative);
59
+ }
60
+ function createReceiptFromTargets(targets) {
61
+ const created = targets.filter((target) => target.before === null && /^\.agentera\/entities\/todo\/todo_item\/[a-z]{10}\.yaml$/.test(target.path));
62
+ if (!created.length)
63
+ return undefined;
64
+ if (created.length !== 1)
65
+ invalidJournal("TODO reconciliation journal has multiple immutable TODO entity targets");
66
+ const target = created[0];
67
+ const createdId = path.posix.basename(target.path, ".yaml");
68
+ let envelope;
69
+ try {
70
+ envelope = loadYamlMapping(decode(target.after).toString("utf8"));
71
+ }
72
+ catch {
73
+ invalidJournal("TODO reconciliation journal has an invalid created entity envelope");
74
+ }
75
+ if (envelope.id !== createdId || envelope.artifact !== "todo" || !envelope.record || typeof envelope.record !== "object" || Array.isArray(envelope.record)) {
76
+ invalidJournal("TODO reconciliation journal create target does not match its canonical entity envelope");
77
+ }
78
+ const request = structuredClone(envelope.record);
79
+ delete request.reconciliation;
80
+ return { created_id: createdId, request_sha256: todoCreateRequestSha256(request) };
81
+ }
82
+ function invalidJournal(message) {
83
+ reject({
84
+ class: "conflict",
85
+ message,
86
+ recovery: `Preserve '${DIRECTORY}', restore its last valid committed journal bytes, and retry the exact non-dry-run TODO mutation; no target bytes were changed.`,
87
+ });
88
+ }
89
+ function parseJournal(bytes, fileName) {
90
+ if (bytes.length > MAX_JOURNAL_BYTES)
91
+ invalidJournal("TODO reconciliation journal exceeds its byte bound");
92
+ let parsed;
93
+ try {
94
+ parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
95
+ }
96
+ catch {
97
+ invalidJournal("TODO reconciliation journal is not valid bounded UTF-8 JSON");
98
+ }
99
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
100
+ invalidJournal("TODO reconciliation journal is not a mapping");
101
+ const value = parsed;
102
+ const expectedKeys = ["schema_version", "id", "public_path", "mapping_sha256", "targets", ...(value.create === undefined ? [] : ["create"]), ...(value.activation_effect_sha256 === undefined ? [] : ["activation_effect_sha256"]), ...(value.owner_mapping_sha256 === undefined ? [] : ["owner_mapping_sha256"])].sort().join(",");
103
+ if (Object.keys(value).sort().join(",") !== expectedKeys
104
+ || value.schema_version !== VERSION
105
+ || typeof value.id !== "string"
106
+ || !/^[a-f0-9]{24}$/.test(value.id)
107
+ || typeof value.public_path !== "string"
108
+ || typeof value.mapping_sha256 !== "string"
109
+ || !/^[a-f0-9]{64}$/.test(value.mapping_sha256)
110
+ || !Array.isArray(value.targets)
111
+ || value.targets.length < 1
112
+ || value.targets.length > MAX_TARGETS)
113
+ invalidJournal("TODO reconciliation journal is malformed");
114
+ if (value.activation_effect_sha256 !== undefined && !/^[a-f0-9]{64}$/.test(value.activation_effect_sha256))
115
+ invalidJournal("TODO reconciliation journal has an invalid activation effect authorization");
116
+ if (value.owner_mapping_sha256 !== undefined && !/^[a-f0-9]{64}$/.test(value.owner_mapping_sha256))
117
+ invalidJournal("TODO reconciliation journal has an invalid owner-mapping authorization");
118
+ if (value.create !== undefined && (!value.create
119
+ || typeof value.create !== "object"
120
+ || Array.isArray(value.create)
121
+ || Object.keys(value.create).sort().join(",") !== "created_id,request_sha256"
122
+ || typeof value.create.created_id !== "string"
123
+ || !/^[a-z]{10}$/.test(value.create.created_id)
124
+ || typeof value.create.request_sha256 !== "string"
125
+ || !/^[a-f0-9]{64}$/.test(value.create.request_sha256)))
126
+ invalidJournal("TODO reconciliation journal has an invalid create receipt");
127
+ const paths = new Set();
128
+ for (const target of value.targets) {
129
+ if (!target
130
+ || typeof target !== "object"
131
+ || Array.isArray(target)
132
+ || Object.keys(target).sort().join(",") !== "after,before,path"
133
+ || typeof target.path !== "string"
134
+ || !validTarget(target.path, value.public_path)
135
+ || paths.has(target.path)
136
+ || (target.before !== null && !exactBase64(target.before))
137
+ || !exactBase64(target.after)
138
+ || decode(target.after).length > MAX_TARGET_BYTES
139
+ || (target.before !== null && decode(target.before).length > MAX_TARGET_BYTES))
140
+ invalidJournal("TODO reconciliation journal has an invalid target");
141
+ paths.add(target.path);
142
+ }
143
+ const body = value.targets;
144
+ const activates = body.some((target) => target.path === TODO_RECONCILIATION_ACTIVATION_PATH);
145
+ if (!activates && (value.activation_effect_sha256 !== undefined || value.owner_mapping_sha256 !== undefined))
146
+ invalidJournal("TODO reconciliation journal effect authorization has no activation target");
147
+ if (value.owner_mapping_sha256 !== undefined && value.activation_effect_sha256 === undefined)
148
+ invalidJournal("TODO reconciliation journal owner-mapping authorization has no effect authorization");
149
+ const inferredCreate = createReceiptFromTargets(body);
150
+ if (value.create && (!inferredCreate
151
+ || value.create.created_id !== inferredCreate.created_id
152
+ || value.create.request_sha256 !== inferredCreate.request_sha256))
153
+ invalidJournal("TODO reconciliation create receipt does not match its canonical entity target");
154
+ const identity = value.create || value.activation_effect_sha256 || value.owner_mapping_sha256
155
+ ? { ...(value.create ? { create: value.create } : {}), ...(value.activation_effect_sha256 ? { activation_effect_sha256: value.activation_effect_sha256 } : {}), ...(value.owner_mapping_sha256 ? { owner_mapping_sha256: value.owner_mapping_sha256 } : {}), targets: body }
156
+ : body;
157
+ const expectedId = createHash("sha256").update(canonicalRecordJson(identity)).digest("hex").slice(0, 24);
158
+ if (value.id !== expectedId || (fileName !== undefined && fileName !== `${value.id}.json`)) {
159
+ invalidJournal("TODO reconciliation journal identity does not match its canonical targets");
160
+ }
161
+ const create = value.create ?? inferredCreate;
162
+ return { ...value, ...(create ? { create } : {}) };
163
+ }
164
+ function targetLimit(target, sourceRoot) {
165
+ return target.path.startsWith(".agentera/entities/") ? entityExactGetMaxBytes(sourceRoot) : MAX_TARGET_BYTES;
166
+ }
167
+ function assertBinding(journal, binding) {
168
+ if (journal.public_path !== binding.publicPath || journal.mapping_sha256 !== binding.mappingSha256)
169
+ reject({
170
+ class: "conflict",
171
+ message: "TODO reconciliation mapping changed while a transaction is pending",
172
+ recovery: `Restore the docs mapping that resolves TODO.md to '${journal.public_path}', then retry the exact non-dry-run mutation once; no state was changed.`,
173
+ });
174
+ }
175
+ function fsyncDirectory(directory) {
176
+ if (process.platform === "win32")
177
+ return;
178
+ const fd = fs.openSync(directory, "r");
179
+ try {
180
+ fs.fsyncSync(fd);
181
+ }
182
+ finally {
183
+ fs.closeSync(fd);
184
+ }
185
+ }
186
+ function removeExactRole(file, expected) {
187
+ if (!fs.readFileSync(file).equals(expected))
188
+ throw new Error(`exact replacement recovery role '${file}' changed`);
189
+ fs.unlinkSync(file);
190
+ }
191
+ function parseFileRecoveryMetadata(file) {
192
+ let parsed;
193
+ try {
194
+ const bytes = fs.readFileSync(file);
195
+ if (bytes.length > 1024)
196
+ throw new Error("over bound");
197
+ parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
198
+ }
199
+ catch {
200
+ invalidJournal(`file replacement recovery metadata '${file}' is invalid`);
201
+ }
202
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
203
+ invalidJournal(`file replacement recovery metadata '${file}' is not a mapping`);
204
+ }
205
+ const value = parsed;
206
+ if (Object.keys(value).sort().join(",") !== "after_sha256,before_sha256,schema_version,target_path"
207
+ || value.schema_version !== FILE_REPLACEMENT_RECOVERY_VERSION
208
+ || typeof value.target_path !== "string"
209
+ || typeof value.before_sha256 !== "string"
210
+ || typeof value.after_sha256 !== "string"
211
+ || !/^[a-f0-9]{64}$/.test(value.before_sha256)
212
+ || !/^[a-f0-9]{64}$/.test(value.after_sha256))
213
+ invalidJournal(`file replacement recovery metadata '${file}' has an invalid canonical record`);
214
+ return value;
215
+ }
216
+ function recoveryConflict(target, paths, detail) {
217
+ const boundedPaths = paths.slice(0, 4).map((file) => path.relative(process.cwd(), file).split(path.sep).join("/"));
218
+ reject({
219
+ class: "conflict",
220
+ message: `TODO reconciliation target '${target.path}' conflicts with retained recovery roles: ${detail}`,
221
+ violations: boundedPaths.length ? boundedPaths.map((file) => `preserved recovery role: ${file}`) : undefined,
222
+ recovery: `Preserve the pending journal, canonical competitor, and every listed recovery role. Choose the intended canonical bytes, restore '${target.path}' to the journal's recorded before or after bytes without deleting the competitor copy, then retry the exact non-dry-run mutation once; this rejection changed no bytes.`,
223
+ });
224
+ }
225
+ function recoverImmutablePublicationStage(root, target) {
226
+ if (target.before !== null)
227
+ return;
228
+ const absolute = path.join(root, target.path);
229
+ const directory = path.dirname(absolute);
230
+ if (!fs.existsSync(directory))
231
+ return;
232
+ const name = path.basename(absolute);
233
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
234
+ const pattern = new RegExp(`^\\.${escaped}\\.\\d+\\.[a-f0-9-]+\\.tmp$`);
235
+ const names = fs.readdirSync(directory).filter((candidate) => pattern.test(candidate));
236
+ if (!names.length)
237
+ return;
238
+ if (names.length > 1)
239
+ recoveryConflict(target, names.map((candidate) => path.join(directory, candidate)), "multiple immutable publication stages claim the same target");
240
+ const stage = path.join(directory, names[0]);
241
+ const stat = fs.lstatSync(stage);
242
+ const after = decode(target.after);
243
+ if (!stat.isFile() || stat.isSymbolicLink() || !fs.readFileSync(stage).equals(after)) {
244
+ recoveryConflict(target, [stage], "an immutable publication stage changed");
245
+ }
246
+ const current = bytesAt(root, target.path);
247
+ if (current !== null && !current.equals(after)) {
248
+ recoveryConflict(target, [stage], "the canonical target contains concurrent bytes");
249
+ }
250
+ removeExactRole(stage, after);
251
+ fsyncDirectory(directory);
252
+ }
253
+ function recoverFileReplacementRoles(context, target, entries, recoveryRoot, recoveryRootIdentity, targetDirectory) {
254
+ const before = target.before === null ? null : decode(target.before);
255
+ if (before === null)
256
+ return false;
257
+ const after = decode(target.after);
258
+ const matches = [];
259
+ for (const entry of entries) {
260
+ if (entry.name === ".gitignore")
261
+ continue;
262
+ const directory = path.join(recoveryRoot, entry.name);
263
+ const attemptIdentity = validateEntityRecoveryDirectory(context.validatedRoot, directory, targetDirectory, `private entity recovery attempt '${path.relative(context.pinnedPath(), directory).split(path.sep).join("/")}'`);
264
+ const metadata = path.join(directory, FILE_REPLACEMENT_METADATA_NAME);
265
+ if (!fs.existsSync(metadata))
266
+ continue;
267
+ const value = parseFileRecoveryMetadata(metadata);
268
+ if (value.target_path !== target.path)
269
+ continue;
270
+ if (value.before_sha256 !== createHash("sha256").update(before).digest("hex")
271
+ || value.after_sha256 !== createHash("sha256").update(after).digest("hex"))
272
+ recoveryConflict(target, [metadata], "the role digest does not match the pending journal");
273
+ const roleNames = fs.readdirSync(directory).sort();
274
+ if (roleNames.some((name) => !["original.previous", "replacement.tmp", FILE_REPLACEMENT_METADATA_NAME].includes(name))) {
275
+ recoveryConflict(target, roleNames.map((name) => path.join(directory, name)), "the recovery attempt contains an unknown role");
276
+ }
277
+ const previous = path.join(directory, "original.previous");
278
+ const stage = path.join(directory, "replacement.tmp");
279
+ if (fs.existsSync(previous)) {
280
+ const stat = fs.lstatSync(previous);
281
+ if (!stat.isFile() || stat.isSymbolicLink() || !fs.readFileSync(previous).equals(before)) {
282
+ recoveryConflict(target, [metadata, previous], "the retained baseline role changed");
283
+ }
284
+ }
285
+ if (fs.existsSync(stage)) {
286
+ const stat = fs.lstatSync(stage);
287
+ if (!stat.isFile() || stat.isSymbolicLink() || !fs.readFileSync(stage).equals(after)) {
288
+ recoveryConflict(target, [metadata, stage], "the replacement stage changed");
289
+ }
290
+ }
291
+ matches.push({
292
+ directory,
293
+ identity: attemptIdentity,
294
+ metadata,
295
+ ...(fs.existsSync(previous) ? { previous } : {}),
296
+ ...(fs.existsSync(stage) ? { stage } : {}),
297
+ });
298
+ }
299
+ if (matches.length > 1)
300
+ recoveryConflict(target, matches.map(({ metadata }) => metadata), "multiple recovery attempts claim the same target");
301
+ const match = matches[0];
302
+ if (!match)
303
+ return false;
304
+ const current = bytesAt(context.pinnedPath(), target.path);
305
+ if (!same(current, before) && !same(current, after)) {
306
+ recoveryConflict(target, [match.metadata, ...(match.previous ? [match.previous] : []), ...(match.stage ? [match.stage] : [])], current === null ? "the canonical target is absent" : "the canonical target contains concurrent bytes");
307
+ }
308
+ validateEntityRecoveryDirectory(context.validatedRoot, recoveryRoot, targetDirectory, "private entity recovery root '.agentera/.entity-recovery'", recoveryRootIdentity);
309
+ validateEntityRecoveryDirectory(context.validatedRoot, match.directory, targetDirectory, `private entity recovery attempt '${path.relative(context.pinnedPath(), match.directory).split(path.sep).join("/")}'`, match.identity);
310
+ if (match.stage)
311
+ removeExactRole(match.stage, after);
312
+ if (match.previous)
313
+ removeExactRole(match.previous, before);
314
+ removeExactRole(match.metadata, fs.readFileSync(match.metadata));
315
+ fs.rmdirSync(match.directory);
316
+ fsyncDirectory(recoveryRoot);
317
+ return true;
318
+ }
319
+ function recoverFileReplacement(context, target) {
320
+ if (target.before === null)
321
+ return;
322
+ const recoveryRoot = path.join(context.pinnedPath(), ".agentera/.entity-recovery");
323
+ if (!fs.existsSync(recoveryRoot))
324
+ return;
325
+ const targetDirectory = path.dirname(context.pinnedPath(target.path));
326
+ const recoveryRootIdentity = validateEntityRecoveryDirectory(context.validatedRoot, recoveryRoot, targetDirectory, "private entity recovery root '.agentera/.entity-recovery'");
327
+ const entries = fs.readdirSync(recoveryRoot, { withFileTypes: true });
328
+ if (entries.length > 128)
329
+ invalidJournal("file replacement recovery root exceeds its bounded entry count");
330
+ recoverFileReplacementRoles(context, target, entries, recoveryRoot, recoveryRootIdentity, targetDirectory);
331
+ }
332
+ function applyTarget(context, root, target, sourceRoot, publicPath) {
333
+ const before = target.before === null ? null : decode(target.before);
334
+ const after = decode(target.after);
335
+ recoverImmutablePublicationStage(root, target);
336
+ recoverFileReplacement(context, target);
337
+ const current = bytesAt(root, target.path);
338
+ if (same(current, after))
339
+ return null;
340
+ if (!same(current, before))
341
+ reject({
342
+ class: "conflict",
343
+ message: `TODO reconciliation target '${target.path}' changed after transaction preparation`,
344
+ recovery: "Preserve the pending journal and both repository changes, restore every target to either the recorded before or after bytes, then retry once; no additional state was changed.",
345
+ });
346
+ if (before === null) {
347
+ const identity = context.publishImmutable(target.path, after.toString("utf8"));
348
+ if (!identity)
349
+ reject({
350
+ class: "conflict",
351
+ message: `TODO reconciliation target '${target.path}' appeared during publication`,
352
+ recovery: `Preserve the competing target and retry the exact TODO mutation after reconciling it with the pending transaction; no competing bytes were overwritten.`,
353
+ });
354
+ return identity;
355
+ }
356
+ const replacement = target.path === publicPath
357
+ ? context.replaceVisible(target.path, before, after.toString("utf8"), targetLimit(target, sourceRoot))
358
+ : context.replaceExisting(target.path, before, after.toString("utf8"), targetLimit(target, sourceRoot));
359
+ return replacement.publishedIdentity;
360
+ }
361
+ function rollback(context, applied, sourceRoot, publicPath) {
362
+ const issues = [];
363
+ for (const { target, identity } of [...applied].reverse()) {
364
+ try {
365
+ if (target.before === null) {
366
+ const result = context.removeExact(target.path, identity, false);
367
+ if (result !== "removed")
368
+ throw new Error(`exact removal returned ${result}`);
369
+ }
370
+ else {
371
+ if (target.path === publicPath) {
372
+ context.restoreVisible(target.path, identity, decode(target.before).toString("utf8"), targetLimit(target, sourceRoot));
373
+ }
374
+ else {
375
+ context.restoreExact(target.path, identity, decode(target.before).toString("utf8"), targetLimit(target, sourceRoot));
376
+ }
377
+ }
378
+ }
379
+ catch (error) {
380
+ issues.push({
381
+ path: target.path,
382
+ message: (error instanceof Error ? error.message : String(error)).slice(0, 512),
383
+ retainedPaths: error instanceof ExactReplacementConflictError
384
+ ? error.retainedPaths.slice(0, 8).map((retainedPath) => retainedPath.slice(0, 512))
385
+ : [],
386
+ });
387
+ }
388
+ }
389
+ return issues;
390
+ }
391
+ function rejectIncompleteRollback(primary, issues) {
392
+ const primaryMessage = (primary instanceof Error ? primary.message : String(primary)).slice(0, 512);
393
+ const violations = issues.slice(0, 8).map(({ path: targetPath, message }) => `rollback target '${targetPath}': ${message}`);
394
+ const retained = [...new Set(issues.flatMap(({ retainedPaths }) => retainedPaths))].slice(0, 8);
395
+ violations.push(...retained.map((role) => `preserved recovery role: ${role}`));
396
+ reject({
397
+ class: "conflict",
398
+ message: `TODO reconciliation attempted rollback for every published target after '${primaryMessage}', but ${issues.length} target${issues.length === 1 ? "" : "s"} could not be restored`,
399
+ violations,
400
+ recovery: "Preserve the pending journal, each listed canonical target, and every listed recovery role. Targets not listed were restored. Reconcile each listed target to the journal's recorded before or after bytes without deleting concurrent bytes, then retry the exact non-dry-run mutation once.",
401
+ });
402
+ }
403
+ function rejectPublicationFailure(error, pendingJournal) {
404
+ reject({
405
+ class: "unsupported_target",
406
+ message: `recoverable complete-file replacement is unavailable for this target${error.code ? ` (${error.code})` : ""}`,
407
+ violations: [error.message.slice(0, 512)],
408
+ recovery: `${pendingJournal ? "Preserve the pending journal. " : ""}Use an owner-controlled regular file on the project-state filesystem with standard rename support, correct the reported capability or permission, then retry the exact non-dry-run mutation; all attempted target bytes were restored.`,
409
+ });
410
+ }
411
+ function rejectReplacementConflict(error) {
412
+ reject({
413
+ class: "conflict",
414
+ message: `TODO reconciliation retained a concurrent target without overwriting it: ${error.message.slice(0, 1024)}`,
415
+ violations: error.retainedPaths.slice(0, 4).map((role) => `preserved recovery role: ${role.slice(0, 512)}`),
416
+ recovery: "Preserve the pending journal, canonical competitor, and listed recovery roles. Choose the intended canonical bytes, restore the conflicted target to the journal's recorded before or after bytes without deleting the competitor copy, then retry the exact non-dry-run mutation once; no competitor bytes were overwritten.",
417
+ });
418
+ }
419
+ function journalPath(id) {
420
+ return `${DIRECTORY}/${id}.json`;
421
+ }
422
+ function finishJournal(context, relative, identity) {
423
+ if (context.removeExact(relative, identity) !== "removed")
424
+ throw new Error(`TODO reconciliation journal '${relative}' changed before cleanup`);
425
+ }
426
+ export function inspectTodoReconciliation(root, binding) {
427
+ const directory = path.join(root, DIRECTORY);
428
+ if (!fs.existsSync(directory))
429
+ return [];
430
+ const names = fs.readdirSync(directory).filter((name) => name.endsWith(".json")).sort();
431
+ if (names.length > 1)
432
+ reject({ class: "conflict", message: "multiple pending TODO reconciliation journals exist", recovery: "Preserve the journals and reconcile them to one transaction before retrying; no state was changed." });
433
+ return names.map((name) => { const journal = parseJournal(fs.readFileSync(path.join(directory, name)), name); assertBinding(journal, binding); return journal.id; });
434
+ }
435
+ export function recoverTodoReconciliation(context, sourceRoot, binding, options = {}) {
436
+ const root = context.pinnedPath();
437
+ const directory = path.join(root, DIRECTORY);
438
+ if (!fs.existsSync(directory))
439
+ return [];
440
+ const names = fs.readdirSync(directory).filter((name) => name.endsWith(".json")).sort();
441
+ if (names.length > 1)
442
+ reject({ class: "conflict", message: "multiple pending TODO reconciliation journals exist", recovery: "Preserve the journals and reconcile them to one transaction before retrying; no state was changed." });
443
+ const recovered = [];
444
+ for (const name of names) {
445
+ const relative = `${DIRECTORY}/${name}`;
446
+ const journalBytes = fs.readFileSync(path.join(root, relative));
447
+ const journal = parseJournal(journalBytes, name);
448
+ assertBinding(journal, binding);
449
+ if (journal.create && options.createRequestSha256 !== journal.create.request_sha256)
450
+ reject({
451
+ class: "conflict",
452
+ message: `pending TODO create for '${journal.create.created_id}' does not match this request`,
453
+ recovery: `Retry the exact original TODO create input to recover '${journal.create.created_id}'; no transaction target bytes were changed.`,
454
+ });
455
+ if (journal.activation_effect_sha256 && options.activationEffectSha256 !== journal.activation_effect_sha256)
456
+ reject({
457
+ class: "conflict",
458
+ message: "pending TODO activation does not match the authorized preview effect",
459
+ recovery: "Retry the exact activation apply command returned by the original preview; no transaction target bytes were changed.",
460
+ });
461
+ if (journal.owner_mapping_sha256 && options.ownerMappingSha256 !== journal.owner_mapping_sha256)
462
+ reject({
463
+ class: "conflict",
464
+ message: "pending TODO owner correction does not match the supplied owner mapping",
465
+ recovery: "Retry the exact correction input and apply command returned by the original preview; no transaction target bytes were changed.",
466
+ });
467
+ options.beforeRecovery?.(journal.targets.map((target) => ({
468
+ path: target.path,
469
+ before: target.before === null ? null : decode(target.before),
470
+ after: decode(target.after),
471
+ })));
472
+ const applied = [];
473
+ try {
474
+ for (const target of journal.targets) {
475
+ if (target.path === ENTITY_MODE_MARKER)
476
+ options.beforeActivation?.();
477
+ const identity = applyTarget(context, root, target, sourceRoot, journal.public_path);
478
+ if (identity)
479
+ applied.push({ target, identity });
480
+ }
481
+ options.beforeCommit?.();
482
+ context.assertValid();
483
+ const journalIdentity = context.replaceExisting(relative, journalBytes, journalBytes.toString("utf8"), MAX_JOURNAL_BYTES).publishedIdentity;
484
+ finishJournal(context, relative, journalIdentity);
485
+ recovered.push({
486
+ transaction_id: journal.id,
487
+ target_count: journal.targets.length,
488
+ ...(journal.create ? { create: journal.create } : {}),
489
+ });
490
+ }
491
+ catch (error) {
492
+ const rollbackIssues = applied.length ? rollback(context, applied, sourceRoot, journal.public_path) : [];
493
+ if (rollbackIssues.length)
494
+ rejectIncompleteRollback(error, rollbackIssues);
495
+ if (error instanceof ExactReplacementConflictError)
496
+ rejectReplacementConflict(error);
497
+ if (error instanceof FileReplacementError)
498
+ rejectPublicationFailure(error, true);
499
+ throw error;
500
+ }
501
+ }
502
+ return recovered;
503
+ }
504
+ export function publishTodoReconciliation(context, sourceRoot, binding, targets, options = {}) {
505
+ const normalized = targets
506
+ .filter((target) => options.retainUnchangedTargets || !same(target.before, Buffer.from(target.after)))
507
+ .sort((left, right) => Number(left.path === ENTITY_MODE_MARKER) - Number(right.path === ENTITY_MODE_MARKER)
508
+ || Number(left.path === binding.publicPath) - Number(right.path === binding.publicPath)
509
+ || left.path.localeCompare(right.path));
510
+ const body = normalized.map((target) => ({ path: target.path, before: target.before === null ? null : encode(target.before), after: encode(target.after) }));
511
+ if ((options.activationEffectSha256 || options.ownerMappingSha256) && !normalized.some((target) => target.path === TODO_RECONCILIATION_ACTIVATION_PATH))
512
+ reject({ class: "schema_violation", message: "TODO activation authorization requires its activation target", recovery: "Recompute the complete activation target set from a fresh dry-run; no state was changed." });
513
+ if (options.ownerMappingSha256 && !options.activationEffectSha256)
514
+ reject({ class: "schema_violation", message: "TODO owner-mapping authorization requires its effect authorization", recovery: "Recompute the complete owner correction target set from a fresh dry-run; no state was changed." });
515
+ const identity = options.create || options.activationEffectSha256 || options.ownerMappingSha256
516
+ ? { ...(options.create ? { create: options.create } : {}), ...(options.activationEffectSha256 ? { activation_effect_sha256: options.activationEffectSha256 } : {}), ...(options.ownerMappingSha256 ? { owner_mapping_sha256: options.ownerMappingSha256 } : {}), targets: body }
517
+ : body;
518
+ const id = createHash("sha256").update(canonicalRecordJson(identity)).digest("hex").slice(0, 24);
519
+ if (!normalized.length)
520
+ return { id, targetCount: 0 };
521
+ if (body.length > MAX_TARGETS
522
+ || new Set(body.map(({ path: targetPath }) => targetPath)).size !== body.length
523
+ || body.some((target) => !validTarget(target.path, binding.publicPath)))
524
+ reject({
525
+ class: "schema_violation",
526
+ message: "TODO reconciliation transaction has invalid or duplicate bounded targets",
527
+ recovery: "Reduce the managed TODO working set or cutover entity inventory below the declared journal bounds and retry; no state was changed.",
528
+ });
529
+ const publicTarget = normalized.find((target) => target.path === binding.publicPath && target.before !== null);
530
+ if (publicTarget) {
531
+ const root = context.pinnedPath();
532
+ const publicDevice = fs.statSync(path.dirname(path.join(root, binding.publicPath)), { bigint: true }).dev;
533
+ const recoveryDevice = fs.statSync(path.join(root, ".agentera"), { bigint: true }).dev;
534
+ if (publicDevice !== recoveryDevice)
535
+ reject({
536
+ class: "unsupported_target",
537
+ message: `mapped TODO target '${binding.publicPath}' is on a different filesystem from its private recovery root`,
538
+ recovery: "Map TODO.md to a regular file on the project-state filesystem, then retry the exact mutation; no journal or target bytes were changed.",
539
+ });
540
+ }
541
+ const journal = {
542
+ schema_version: VERSION,
543
+ id,
544
+ public_path: binding.publicPath,
545
+ mapping_sha256: binding.mappingSha256,
546
+ ...(options.create ? { create: options.create } : {}),
547
+ ...(options.activationEffectSha256 ? { activation_effect_sha256: options.activationEffectSha256 } : {}),
548
+ ...(options.ownerMappingSha256 ? { owner_mapping_sha256: options.ownerMappingSha256 } : {}),
549
+ targets: body,
550
+ };
551
+ const bytes = `${JSON.stringify(journal)}\n`;
552
+ if (Buffer.byteLength(bytes) > MAX_JOURNAL_BYTES)
553
+ reject({ class: "schema_violation", message: "TODO reconciliation transaction exceeds its byte bound", recovery: "Reduce the managed TODO working set below the declared transaction bound and retry; no state was changed." });
554
+ const relativeJournal = journalPath(id);
555
+ const journalIdentity = context.publishImmutable(relativeJournal, bytes);
556
+ if (!journalIdentity)
557
+ reject({
558
+ class: "conflict",
559
+ message: `TODO reconciliation journal '${id}' already exists`,
560
+ recovery: "Retry the exact non-dry-run TODO mutation once so the existing journal is inspected and recovered before another transaction is prepared; no target bytes were changed.",
561
+ });
562
+ if (options.interruptAfterTarget === 0)
563
+ throw new InjectedTodoReconciliationInterruption(0);
564
+ const applied = [];
565
+ try {
566
+ for (const target of journal.targets) {
567
+ if (target.path === ENTITY_MODE_MARKER)
568
+ options.beforeActivation?.();
569
+ const identity = applyTarget(context, context.pinnedPath(), target, sourceRoot, journal.public_path);
570
+ if (identity)
571
+ applied.push({ target, identity });
572
+ if (options.interruptAfterTarget === applied.length)
573
+ throw new InjectedTodoReconciliationInterruption(applied.length);
574
+ }
575
+ options.beforeCommit?.();
576
+ context.assertValid();
577
+ finishJournal(context, relativeJournal, journalIdentity);
578
+ return { id, targetCount: normalized.length };
579
+ }
580
+ catch (error) {
581
+ if (error instanceof InjectedTodoReconciliationInterruption)
582
+ throw error;
583
+ const rollbackIssues = rollback(context, applied, sourceRoot, journal.public_path);
584
+ if (rollbackIssues.length)
585
+ rejectIncompleteRollback(error, rollbackIssues);
586
+ if (error instanceof ExactReplacementConflictError)
587
+ rejectReplacementConflict(error);
588
+ if (error instanceof FileReplacementError) {
589
+ finishJournal(context, relativeJournal, journalIdentity);
590
+ rejectPublicationFailure(error, false);
591
+ }
592
+ finishJournal(context, relativeJournal, journalIdentity);
593
+ throw error;
594
+ }
595
+ }
@@ -0,0 +1,20 @@
1
+ import { yamlEntryNumber } from "../../hooks/compaction/index.js";
2
+ function list(doc, key) {
3
+ return Array.isArray(doc[key]) ? doc[key] : [];
4
+ }
5
+ export function nextEntryNumber(doc, activeKey) {
6
+ const numbers = [...list(doc, activeKey), ...list(doc, "archive")].map(yamlEntryNumber);
7
+ return Math.max(0, ...numbers) + 1;
8
+ }
9
+ export function nextTaskNumber(doc) {
10
+ return Math.max(0, ...list(doc, "tasks").map(yamlEntryNumber)) + 1;
11
+ }
12
+ export function localDate(now = new Date()) {
13
+ const y = now.getFullYear();
14
+ const m = String(now.getMonth() + 1).padStart(2, "0");
15
+ const d = String(now.getDate()).padStart(2, "0");
16
+ return `${y}-${m}-${d}`;
17
+ }
18
+ export function localTimestamp(now = new Date()) {
19
+ return `${localDate(now)} ${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
20
+ }