agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -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 +236 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  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 +191 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3022 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  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 +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +224 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +56 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +272 -223
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +229 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +385 -0
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -0
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +982 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,622 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { emptyLifecycleOwnershipLedger, validateLifecycleOwnershipLedger, } from "./lifecycleOperations.js";
5
+ import { secureLifecycleRemovalAvailable } from "./lifecyclePublication.js";
6
+ export const LIFECYCLE_OWNERSHIP_JOURNAL_SCHEMA = "agentera.lifecycleOwnershipJournalEvent.v1";
7
+ const LIFECYCLE_OWNERSHIP_LOCK_SCHEMA = "agentera.lifecycleOwnershipJournalLock.v1";
8
+ const UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
9
+ const EVENT_NAME = new RegExp(`^(\\d{20})-(${UUID_PATTERN})\\.json$`);
10
+ const TEMP_EVENT_NAME = new RegExp(`^\\.event-(\\d{20})-(${UUID_PATTERN})\\.tmp$`);
11
+ const TEMP_LOCK_NAME = new RegExp(`^\\.apply-lock-(${UUID_PATTERN})\\.tmp$`);
12
+ const LOCK_RECORD_NAME = "owner.json";
13
+ const DIRECTORY_FLAGS = fs.constants.O_RDONLY
14
+ | (fs.constants.O_DIRECTORY ?? 0)
15
+ | (fs.constants.O_NOFOLLOW ?? 0);
16
+ function digestBody(body) {
17
+ return `sha256:${crypto.createHash("sha256").update(JSON.stringify(body)).digest("hex")}`;
18
+ }
19
+ function isObject(value) {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value);
21
+ }
22
+ function eventFromValue(value) {
23
+ if (!isObject(value))
24
+ return null;
25
+ if (value.schemaVersion !== LIFECYCLE_OWNERSHIP_JOURNAL_SCHEMA
26
+ || !Number.isSafeInteger(value.sequence)
27
+ || typeof value.eventId !== "string"
28
+ || typeof value.recordedAt !== "string"
29
+ || (value.previousDigest !== null && typeof value.previousDigest !== "string")
30
+ || typeof value.digest !== "string") {
31
+ return null;
32
+ }
33
+ const ledgerErrors = validateLifecycleOwnershipLedger(value.ledger);
34
+ if (ledgerErrors.length > 0)
35
+ return null;
36
+ return value;
37
+ }
38
+ function incompleteJsonAtEnd(text, error) {
39
+ const trimmed = text.trimEnd();
40
+ if (trimmed.length === 0)
41
+ return true;
42
+ const message = error instanceof Error ? error.message : "";
43
+ const position = /position (\d+)/i.exec(message);
44
+ const failedAtEnd = message.toLowerCase().includes("end of json input")
45
+ || (position !== null && Number(position[1]) >= trimmed.length - 1);
46
+ if (!failedAtEnd)
47
+ return false;
48
+ const stack = [];
49
+ let inString = false;
50
+ let escaped = false;
51
+ for (const character of trimmed) {
52
+ if (inString) {
53
+ if (escaped)
54
+ escaped = false;
55
+ else if (character === "\\")
56
+ escaped = true;
57
+ else if (character === '"')
58
+ inString = false;
59
+ continue;
60
+ }
61
+ if (character === '"')
62
+ inString = true;
63
+ else if (character === "{" || character === "[")
64
+ stack.push(character);
65
+ else if (character === "}" || character === "]") {
66
+ const expected = character === "}" ? "{" : "[";
67
+ if (stack.pop() !== expected)
68
+ return false;
69
+ }
70
+ }
71
+ return inString || stack.length > 0 || /[:,]$/.test(trimmed);
72
+ }
73
+ function readEvent(eventPath) {
74
+ let fd = null;
75
+ try {
76
+ const stat = fs.lstatSync(eventPath);
77
+ if (!stat.isFile() || stat.isSymbolicLink()) {
78
+ return { state: "invalid", reason: "unsafe journal event type" };
79
+ }
80
+ fd = fs.openSync(eventPath, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
81
+ const text = fs.readFileSync(fd, "utf8");
82
+ let value;
83
+ try {
84
+ value = JSON.parse(text);
85
+ }
86
+ catch (error) {
87
+ return incompleteJsonAtEnd(text, error)
88
+ ? { state: "incomplete", reason: "syntactically incomplete publication" }
89
+ : { state: "invalid", reason: "malformed complete JSON publication" };
90
+ }
91
+ const event = eventFromValue(value);
92
+ return event
93
+ ? { state: "valid", event }
94
+ : { state: "invalid", reason: "complete event does not satisfy the journal schema" };
95
+ }
96
+ catch (error) {
97
+ return { state: "invalid", reason: `unreadable journal event: ${error.message}` };
98
+ }
99
+ finally {
100
+ if (fd !== null)
101
+ fs.closeSync(fd);
102
+ }
103
+ }
104
+ function safeDirectoryState(directory) {
105
+ const resolved = path.resolve(directory);
106
+ const root = path.parse(resolved).root;
107
+ let cursor = root;
108
+ for (const segment of path.relative(root, resolved).split(path.sep).filter(Boolean)) {
109
+ cursor = path.join(cursor, segment);
110
+ try {
111
+ const stat = fs.lstatSync(cursor);
112
+ if (!stat.isDirectory() || stat.isSymbolicLink())
113
+ return "unsafe";
114
+ }
115
+ catch (error) {
116
+ if (error.code === "ENOENT")
117
+ return "absent";
118
+ return "unsafe";
119
+ }
120
+ }
121
+ return "directory";
122
+ }
123
+ function baseRead(pathname, state) {
124
+ return {
125
+ schemaVersion: "agentera.lifecycleOwnershipJournalRead.v1",
126
+ path: pathname,
127
+ state,
128
+ ledger: emptyLifecycleOwnershipLedger(),
129
+ validEvents: 0,
130
+ ignoredEvents: 0,
131
+ temporaryArtifacts: 0,
132
+ diagnostics: [],
133
+ lastDigest: null,
134
+ };
135
+ }
136
+ function corruptRead(current, reason, finalEventCount) {
137
+ return {
138
+ ...current,
139
+ state: "corrupt",
140
+ ignoredEvents: Math.max(current.ignoredEvents, finalEventCount - current.validEvents),
141
+ diagnostics: [...current.diagnostics, reason],
142
+ };
143
+ }
144
+ function readJournal(journalPath) {
145
+ const resolved = path.resolve(journalPath);
146
+ const directoryState = safeDirectoryState(resolved);
147
+ if (directoryState === "absent")
148
+ return baseRead(resolved, "absent");
149
+ if (directoryState === "unsafe") {
150
+ return corruptRead(baseRead(resolved, "corrupt"), "ownership journal path contains a symlink, non-directory, or unreadable component", 0);
151
+ }
152
+ const current = baseRead(resolved, "clean");
153
+ const events = [];
154
+ for (const entry of fs.readdirSync(resolved, { withFileTypes: true })) {
155
+ const eventMatch = EVENT_NAME.exec(entry.name);
156
+ if (eventMatch) {
157
+ events.push({ name: entry.name, sequence: Number(eventMatch[1]), eventId: eventMatch[2] });
158
+ continue;
159
+ }
160
+ if (TEMP_EVENT_NAME.test(entry.name) && entry.isFile() && !entry.isSymbolicLink()) {
161
+ current.temporaryArtifacts += 1;
162
+ current.diagnostics.push(`${entry.name}: ignored non-authoritative journal publication temporary`);
163
+ continue;
164
+ }
165
+ return corruptRead(current, `${entry.name}: unrecognized or unsafe ownership journal entry`, events.length);
166
+ }
167
+ events.sort((left, right) => left.sequence - right.sequence || left.name.localeCompare(right.name));
168
+ for (let index = 0; index < events.length; index += 1) {
169
+ const item = events[index];
170
+ const expectedSequence = current.validEvents + 1;
171
+ if (item.sequence !== expectedSequence) {
172
+ const kind = item.sequence < expectedSequence ? "duplicate sequence or fork" : "sequence gap";
173
+ return corruptRead(current, `${item.name}: ${kind}; expected sequence ${expectedSequence}`, events.length);
174
+ }
175
+ if (events[index + 1]?.sequence === item.sequence) {
176
+ return corruptRead(current, `${item.name}: duplicate sequence or fork`, events.length);
177
+ }
178
+ const parsed = readEvent(path.join(resolved, item.name));
179
+ if (parsed.state === "incomplete") {
180
+ if (index === events.length - 1) {
181
+ current.state = "recoverable_terminal_tail";
182
+ current.ignoredEvents = 1;
183
+ current.diagnostics.push(`${item.name}: recoverable terminal tail (${parsed.reason}); mutation remains blocked until removed`);
184
+ return current;
185
+ }
186
+ return corruptRead(current, `${item.name}: incomplete publication occurs before a successor event`, events.length);
187
+ }
188
+ if (parsed.state === "invalid") {
189
+ return corruptRead(current, `${item.name}: ${parsed.reason}`, events.length);
190
+ }
191
+ const event = parsed.event;
192
+ if (event.sequence !== item.sequence) {
193
+ return corruptRead(current, `${item.name}: filename and body sequence differ`, events.length);
194
+ }
195
+ if (event.eventId !== item.eventId) {
196
+ return corruptRead(current, `${item.name}: filename and body event ID differ`, events.length);
197
+ }
198
+ if (event.previousDigest !== current.lastDigest) {
199
+ return corruptRead(current, `${item.name}: previous digest disconnects the hash chain`, events.length);
200
+ }
201
+ const { digest, ...body } = event;
202
+ if (digest !== digestBody(body)) {
203
+ return corruptRead(current, `${item.name}: event digest mismatch`, events.length);
204
+ }
205
+ current.ledger = event.ledger;
206
+ current.lastDigest = digest;
207
+ current.validEvents += 1;
208
+ }
209
+ return current;
210
+ }
211
+ export function lifecycleOwnershipJournalPath(appHome) {
212
+ return path.join(path.resolve(appHome), ".agentera", "runtime-lifecycle", "ownership-journal-v1");
213
+ }
214
+ function ownedLockDirectory(directory) {
215
+ try {
216
+ const entries = fs.readdirSync(directory, { withFileTypes: true });
217
+ return entries.length === 1
218
+ && entries[0]?.name === LOCK_RECORD_NAME
219
+ && entries[0].isFile()
220
+ && !entries[0].isSymbolicLink();
221
+ }
222
+ catch {
223
+ return false;
224
+ }
225
+ }
226
+ export function isLifecycleOwnershipStateDirectory(directory) {
227
+ if (safeDirectoryState(directory) !== "directory")
228
+ return false;
229
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
230
+ const full = path.join(directory, entry.name);
231
+ if (entry.name === "apply.lock" && entry.isDirectory() && !entry.isSymbolicLink()) {
232
+ if (ownedLockDirectory(full))
233
+ continue;
234
+ return false;
235
+ }
236
+ if (TEMP_LOCK_NAME.test(entry.name) && entry.isDirectory() && !entry.isSymbolicLink()) {
237
+ if (ownedLockDirectory(full))
238
+ continue;
239
+ return false;
240
+ }
241
+ if (entry.name === "ownership-journal-v1" && entry.isDirectory() && !entry.isSymbolicLink()) {
242
+ const journalEntries = fs.readdirSync(full, { withFileTypes: true });
243
+ if (journalEntries.every((event) => (event.isFile() && !event.isSymbolicLink() && EVENT_NAME.test(event.name))
244
+ || (event.isFile() && !event.isSymbolicLink() && TEMP_EVENT_NAME.test(event.name))))
245
+ continue;
246
+ }
247
+ return false;
248
+ }
249
+ return true;
250
+ }
251
+ export function readLifecycleOwnershipJournal(journalPath) {
252
+ const { lastDigest: _lastDigest, ...result } = readJournal(journalPath);
253
+ return result;
254
+ }
255
+ function ensureDirectoryTreePinned(directory) {
256
+ if (!secureLifecycleRemovalAvailable()) {
257
+ throw new Error("ownership journal publication requires Linux /proc/self/fd directory-relative access");
258
+ }
259
+ const resolved = path.resolve(directory);
260
+ const root = path.parse(resolved).root;
261
+ let currentFd = fs.openSync(root, DIRECTORY_FLAGS);
262
+ try {
263
+ for (const segment of path.relative(root, resolved).split(path.sep).filter(Boolean)) {
264
+ const target = `/proc/self/fd/${currentFd}/${segment}`;
265
+ try {
266
+ fs.mkdirSync(target, { mode: 0o700 });
267
+ }
268
+ catch (error) {
269
+ if (error.code !== "EEXIST")
270
+ throw error;
271
+ }
272
+ const nextFd = fs.openSync(target, DIRECTORY_FLAGS);
273
+ fs.closeSync(currentFd);
274
+ currentFd = nextFd;
275
+ }
276
+ return currentFd;
277
+ }
278
+ catch (error) {
279
+ fs.closeSync(currentFd);
280
+ throw error;
281
+ }
282
+ }
283
+ function writeAll(fd, bytes, errorMessage) {
284
+ let offset = 0;
285
+ while (offset < bytes.length) {
286
+ const written = fs.writeSync(fd, bytes, offset, bytes.length - offset, offset);
287
+ if (written === 0)
288
+ throw new Error(errorMessage);
289
+ offset += written;
290
+ }
291
+ }
292
+ function appendEventFile(journalPath, name, eventId, bytes) {
293
+ const directoryFd = ensureDirectoryTreePinned(journalPath);
294
+ const temporaryName = `.event-${name.slice(0, 20)}-${eventId}.tmp`;
295
+ const temporaryPath = `/proc/self/fd/${directoryFd}/${temporaryName}`;
296
+ const finalPath = `/proc/self/fd/${directoryFd}/${name}`;
297
+ let fileFd = null;
298
+ let temporaryCreated = false;
299
+ try {
300
+ fileFd = fs.openSync(temporaryPath, fs.constants.O_WRONLY
301
+ | fs.constants.O_CREAT
302
+ | fs.constants.O_EXCL
303
+ | (fs.constants.O_NOFOLLOW ?? 0), 0o600);
304
+ temporaryCreated = true;
305
+ writeAll(fileFd, bytes, "ownership journal write made no progress");
306
+ fs.fsyncSync(fileFd);
307
+ fs.closeSync(fileFd);
308
+ fileFd = null;
309
+ fs.linkSync(temporaryPath, finalPath);
310
+ fs.fsyncSync(directoryFd);
311
+ fs.unlinkSync(temporaryPath);
312
+ temporaryCreated = false;
313
+ fs.fsyncSync(directoryFd);
314
+ }
315
+ finally {
316
+ if (fileFd !== null)
317
+ fs.closeSync(fileFd);
318
+ if (temporaryCreated) {
319
+ try {
320
+ fs.unlinkSync(temporaryPath);
321
+ fs.fsyncSync(directoryFd);
322
+ }
323
+ catch {
324
+ // A crash may leave a uniquely named non-authoritative temporary; readers ignore it.
325
+ }
326
+ }
327
+ fs.closeSync(directoryFd);
328
+ }
329
+ }
330
+ function bootId() {
331
+ const value = fs.readFileSync("/proc/sys/kernel/random/boot_id", "utf8").trim();
332
+ if (!/^[0-9a-f-]{36}$/i.test(value))
333
+ throw new Error("Linux boot identity is unavailable");
334
+ return value;
335
+ }
336
+ function processStartTicks(pid) {
337
+ try {
338
+ const stat = fs.readFileSync(`/proc/${pid}/stat`, "utf8").trim();
339
+ const close = stat.lastIndexOf(") ");
340
+ if (close < 0)
341
+ throw new Error("malformed proc stat record");
342
+ const fields = stat.slice(close + 2).split(/\s+/);
343
+ const value = fields[19];
344
+ if (!value || !/^\d+$/.test(value))
345
+ throw new Error("proc start ticks are unavailable");
346
+ return value;
347
+ }
348
+ catch (error) {
349
+ if (error.code === "ENOENT")
350
+ return null;
351
+ throw error;
352
+ }
353
+ }
354
+ function currentLockRecord(token = crypto.randomUUID()) {
355
+ const startTicks = processStartTicks(process.pid);
356
+ if (startTicks === null)
357
+ throw new Error("current process identity is unavailable");
358
+ return {
359
+ schemaVersion: LIFECYCLE_OWNERSHIP_LOCK_SCHEMA,
360
+ pid: process.pid,
361
+ bootId: bootId(),
362
+ processStartTicks: startTicks,
363
+ token,
364
+ };
365
+ }
366
+ function lockRecord(value) {
367
+ if (!isObject(value))
368
+ return null;
369
+ if (value.schemaVersion !== LIFECYCLE_OWNERSHIP_LOCK_SCHEMA
370
+ || !Number.isSafeInteger(value.pid)
371
+ || value.pid <= 0
372
+ || typeof value.bootId !== "string"
373
+ || typeof value.processStartTicks !== "string"
374
+ || !/^\d+$/.test(value.processStartTicks)
375
+ || typeof value.token !== "string"
376
+ || value.token.length === 0)
377
+ return null;
378
+ return value;
379
+ }
380
+ function readLock(lockPath) {
381
+ let directoryFd = null;
382
+ let recordFd = null;
383
+ try {
384
+ const stat = fs.lstatSync(lockPath);
385
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
386
+ return { state: "malformed", reason: "final lock is not a safe directory" };
387
+ }
388
+ directoryFd = fs.openSync(lockPath, DIRECTORY_FLAGS);
389
+ const entries = fs.readdirSync(`/proc/self/fd/${directoryFd}`);
390
+ if (entries.length !== 1 || entries[0] !== LOCK_RECORD_NAME) {
391
+ return { state: "malformed", reason: "final lock does not contain exactly one owner record" };
392
+ }
393
+ recordFd = fs.openSync(`/proc/self/fd/${directoryFd}/${LOCK_RECORD_NAME}`, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
394
+ const value = JSON.parse(fs.readFileSync(recordFd, "utf8"));
395
+ const record = lockRecord(value);
396
+ return record
397
+ ? { state: "valid", record }
398
+ : { state: "malformed", reason: "final lock owner record does not satisfy its schema" };
399
+ }
400
+ catch (error) {
401
+ if (error.code === "ENOENT")
402
+ return { state: "absent" };
403
+ return { state: "malformed", reason: `final lock is unreadable: ${error.message}` };
404
+ }
405
+ finally {
406
+ if (recordFd !== null)
407
+ fs.closeSync(recordFd);
408
+ if (directoryFd !== null)
409
+ fs.closeSync(directoryFd);
410
+ }
411
+ }
412
+ function sameLockRecord(left, right) {
413
+ return left.schemaVersion === right.schemaVersion
414
+ && left.pid === right.pid
415
+ && left.bootId === right.bootId
416
+ && left.processStartTicks === right.processStartTicks
417
+ && left.token === right.token;
418
+ }
419
+ function lockOwnerState(record) {
420
+ if (record.bootId !== bootId())
421
+ return "stale";
422
+ const startTicks = processStartTicks(record.pid);
423
+ return startTicks === record.processStartTicks ? "live" : "stale";
424
+ }
425
+ function cleanupPreparedLock(parentFd, temporaryName) {
426
+ const temporaryPath = `/proc/self/fd/${parentFd}/${temporaryName}`;
427
+ try {
428
+ const temporaryFd = fs.openSync(temporaryPath, DIRECTORY_FLAGS);
429
+ try {
430
+ fs.unlinkSync(`/proc/self/fd/${temporaryFd}/${LOCK_RECORD_NAME}`);
431
+ fs.fsyncSync(temporaryFd);
432
+ }
433
+ finally {
434
+ fs.closeSync(temporaryFd);
435
+ }
436
+ fs.rmdirSync(temporaryPath);
437
+ fs.fsyncSync(parentFd);
438
+ }
439
+ catch {
440
+ // Cleanup is limited to this acquisition's unique temporary directory.
441
+ }
442
+ }
443
+ function recoverPreparedLocks(parentFd) {
444
+ const parentPath = `/proc/self/fd/${parentFd}`;
445
+ for (const entry of fs.readdirSync(parentPath, { withFileTypes: true })) {
446
+ const match = TEMP_LOCK_NAME.exec(entry.name);
447
+ if (!match || !entry.isDirectory() || entry.isSymbolicLink())
448
+ continue;
449
+ const prepared = readLock(`${parentPath}/${entry.name}`);
450
+ if (prepared.state !== "valid" || prepared.record.token !== match[1])
451
+ continue;
452
+ if (lockOwnerState(prepared.record) === "live") {
453
+ throw new Error(`lifecycle apply lock publication already in progress (pid ${prepared.record.pid})`);
454
+ }
455
+ cleanupPreparedLock(parentFd, entry.name);
456
+ }
457
+ }
458
+ function publishLock(parentFd, record) {
459
+ const temporaryName = `.apply-lock-${record.token}.tmp`;
460
+ const temporaryPath = `/proc/self/fd/${parentFd}/${temporaryName}`;
461
+ const lockPath = `/proc/self/fd/${parentFd}/apply.lock`;
462
+ let recordFd = null;
463
+ let temporaryCreated = false;
464
+ try {
465
+ fs.mkdirSync(temporaryPath, { mode: 0o700 });
466
+ temporaryCreated = true;
467
+ recordFd = fs.openSync(`${temporaryPath}/${LOCK_RECORD_NAME}`, fs.constants.O_WRONLY
468
+ | fs.constants.O_CREAT
469
+ | fs.constants.O_EXCL
470
+ | (fs.constants.O_NOFOLLOW ?? 0), 0o600);
471
+ writeAll(recordFd, Buffer.from(`${JSON.stringify(record)}\n`), "lifecycle ownership journal lock write made no progress");
472
+ fs.fsyncSync(recordFd);
473
+ fs.closeSync(recordFd);
474
+ recordFd = null;
475
+ const temporaryFd = fs.openSync(temporaryPath, DIRECTORY_FLAGS);
476
+ fs.fsyncSync(temporaryFd);
477
+ fs.closeSync(temporaryFd);
478
+ try {
479
+ fs.lstatSync(lockPath);
480
+ const collision = new Error("final lifecycle apply lock already exists");
481
+ collision.code = "EEXIST";
482
+ throw collision;
483
+ }
484
+ catch (error) {
485
+ if (error.code !== "ENOENT")
486
+ throw error;
487
+ }
488
+ fs.renameSync(temporaryPath, lockPath);
489
+ temporaryCreated = false;
490
+ fs.fsyncSync(parentFd);
491
+ }
492
+ finally {
493
+ if (recordFd !== null)
494
+ fs.closeSync(recordFd);
495
+ if (temporaryCreated)
496
+ cleanupPreparedLock(parentFd, temporaryName);
497
+ }
498
+ }
499
+ function removeStaleLock(parentFd, expected) {
500
+ const lockPath = `/proc/self/fd/${parentFd}/apply.lock`;
501
+ const observed = readLock(lockPath);
502
+ if (observed.state !== "valid" || !sameLockRecord(observed.record, expected))
503
+ return false;
504
+ const lockFd = fs.openSync(lockPath, DIRECTORY_FLAGS);
505
+ try {
506
+ fs.unlinkSync(`/proc/self/fd/${lockFd}/${LOCK_RECORD_NAME}`);
507
+ fs.fsyncSync(lockFd);
508
+ }
509
+ catch (error) {
510
+ if (error.code === "ENOENT")
511
+ return false;
512
+ throw error;
513
+ }
514
+ finally {
515
+ fs.closeSync(lockFd);
516
+ }
517
+ fs.rmdirSync(lockPath);
518
+ fs.fsyncSync(parentFd);
519
+ return true;
520
+ }
521
+ export function acquireLifecycleOwnershipJournalLock(journalPath) {
522
+ const directory = path.dirname(path.resolve(journalPath));
523
+ const directoryFd = ensureDirectoryTreePinned(directory);
524
+ const lockPath = `/proc/self/fd/${directoryFd}/apply.lock`;
525
+ const record = currentLockRecord();
526
+ try {
527
+ for (let attempt = 0; attempt < 3; attempt += 1) {
528
+ try {
529
+ recoverPreparedLocks(directoryFd);
530
+ publishLock(directoryFd, record);
531
+ return {
532
+ directory,
533
+ token: record.token,
534
+ bootId: record.bootId,
535
+ processStartTicks: record.processStartTicks,
536
+ };
537
+ }
538
+ catch (error) {
539
+ const code = error.code;
540
+ if (!["EEXIST", "ENOTEMPTY", "EISDIR"].includes(code ?? ""))
541
+ throw error;
542
+ const existing = readLock(lockPath);
543
+ if (existing.state === "malformed") {
544
+ throw new Error(`lifecycle apply lock is malformed; refusing recovery: ${existing.reason}`);
545
+ }
546
+ if (existing.state === "absent")
547
+ continue;
548
+ if (lockOwnerState(existing.record) === "live") {
549
+ throw new Error(`lifecycle apply already in progress (pid ${existing.record.pid})`);
550
+ }
551
+ if (!removeStaleLock(directoryFd, existing.record))
552
+ continue;
553
+ }
554
+ }
555
+ throw new Error("could not acquire lifecycle ownership journal lock");
556
+ }
557
+ finally {
558
+ fs.closeSync(directoryFd);
559
+ }
560
+ }
561
+ export function releaseLifecycleOwnershipJournalLock(lock) {
562
+ const directoryFd = fs.openSync(lock.directory, DIRECTORY_FLAGS);
563
+ const lockPath = `/proc/self/fd/${directoryFd}/apply.lock`;
564
+ try {
565
+ const existing = readLock(lockPath);
566
+ const current = currentLockRecord(lock.token);
567
+ if (existing.state !== "valid"
568
+ || existing.record.pid !== process.pid
569
+ || existing.record.token !== lock.token
570
+ || existing.record.bootId !== lock.bootId
571
+ || existing.record.processStartTicks !== lock.processStartTicks
572
+ || !sameLockRecord(existing.record, current)) {
573
+ throw new Error("lifecycle ownership journal lock identity changed before release");
574
+ }
575
+ const lockFd = fs.openSync(lockPath, DIRECTORY_FLAGS);
576
+ try {
577
+ fs.unlinkSync(`/proc/self/fd/${lockFd}/${LOCK_RECORD_NAME}`);
578
+ fs.fsyncSync(lockFd);
579
+ }
580
+ finally {
581
+ fs.closeSync(lockFd);
582
+ }
583
+ fs.rmdirSync(lockPath);
584
+ fs.fsyncSync(directoryFd);
585
+ }
586
+ finally {
587
+ fs.closeSync(directoryFd);
588
+ }
589
+ }
590
+ export function appendLifecycleOwnershipJournal(journalPath, ledger) {
591
+ const ledgerErrors = validateLifecycleOwnershipLedger(ledger);
592
+ if (ledgerErrors.length > 0)
593
+ throw new Error(ledgerErrors.join("; "));
594
+ const resolved = path.resolve(journalPath);
595
+ for (let attempt = 0; attempt < 8; attempt += 1) {
596
+ const previous = readJournal(resolved);
597
+ if (!["absent", "clean"].includes(previous.state)) {
598
+ throw new Error(`ownership journal is not appendable (${previous.state}): ${previous.diagnostics.join("; ")}`);
599
+ }
600
+ const sequence = previous.validEvents + 1;
601
+ const eventId = crypto.randomUUID();
602
+ const body = {
603
+ schemaVersion: LIFECYCLE_OWNERSHIP_JOURNAL_SCHEMA,
604
+ sequence,
605
+ eventId,
606
+ previousDigest: previous.lastDigest,
607
+ recordedAt: new Date().toISOString(),
608
+ ledger,
609
+ };
610
+ const event = { ...body, digest: digestBody(body) };
611
+ const name = `${String(sequence).padStart(20, "0")}-${eventId}.json`;
612
+ try {
613
+ appendEventFile(resolved, name, eventId, Buffer.from(`${JSON.stringify(event, null, 2)}\n`));
614
+ return readLifecycleOwnershipJournal(resolved);
615
+ }
616
+ catch (error) {
617
+ if (error.code !== "EEXIST")
618
+ throw error;
619
+ }
620
+ }
621
+ throw new Error("ownership journal remained busy after bounded append retries");
622
+ }