agentera 3.0.0-dev.4 → 3.0.0-dev.46

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 (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  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/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /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
+ }