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,781 @@
1
+ import { createHash, createHmac, timingSafeEqual } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { loadYamlMapping } from "../core/yaml.js";
5
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
6
+ import { assertRealpathBoundary } from "../registries/artifactRegistry.js";
7
+ import { canonicalRecordJson, decisionOverlayContract, discoverNumberedArchives, numberedArchiveContract, stateCurrentProjectionPath, validateStateRecord, } from "./archiveDiscovery.js";
8
+ import { decisionOverlayPath, loadDecisionOverlay } from "./decisionOverlay.js";
9
+ import { loadProjectionPolicy, serializedProjectionBytes } from "./projectionPolicy.js";
10
+ import { StateRetrievalFailure } from "./directRetrieval.js";
11
+ import { physicalCounts, provenanceCounts } from "./listAccounting.js";
12
+ import { legacyIdentity } from "./legacyIdentity.js";
13
+ import { classifyStateRows } from "./listClassification.js";
14
+ const CURSOR_VERSION = 1;
15
+ const LIST_ORDER = "entry_number_desc";
16
+ const LIST_AUTHORITY = "references/artifacts/state-storage-authority.yaml";
17
+ function isMapping(value) {
18
+ return value !== null && typeof value === "object" && !Array.isArray(value);
19
+ }
20
+ function jsonValue(value) {
21
+ if (value === null || typeof value === "string" || typeof value === "boolean")
22
+ return value;
23
+ if (typeof value === "number" && Number.isFinite(value))
24
+ return value;
25
+ if (Array.isArray(value)) {
26
+ const values = [];
27
+ for (const item of value) {
28
+ const converted = jsonValue(item);
29
+ if (converted === undefined)
30
+ return undefined;
31
+ values.push(converted);
32
+ }
33
+ return values;
34
+ }
35
+ if (isMapping(value)) {
36
+ const object = {};
37
+ for (const [key, child] of Object.entries(value)) {
38
+ const converted = jsonValue(child);
39
+ if (converted === undefined)
40
+ return undefined;
41
+ object[key] = converted;
42
+ }
43
+ return object;
44
+ }
45
+ return undefined;
46
+ }
47
+ function positiveNumber(value) {
48
+ if (typeof value === "number" && Number.isSafeInteger(value) && value > 0)
49
+ return value;
50
+ if (typeof value === "string" && /^[1-9][0-9]*$/.test(value)) {
51
+ const parsed = Number(value);
52
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;
53
+ }
54
+ return null;
55
+ }
56
+ function compactSummary(value) {
57
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
58
+ return value;
59
+ }
60
+ if (!isMapping(value))
61
+ return undefined;
62
+ const selected = {};
63
+ for (const key of [
64
+ "number",
65
+ "date",
66
+ "timestamp",
67
+ "summary",
68
+ "what",
69
+ "choice",
70
+ "question",
71
+ "trajectory",
72
+ "type",
73
+ "phase",
74
+ ]) {
75
+ const converted = jsonValue(value[key]);
76
+ if (converted !== undefined && (typeof converted !== "object" || converted === null))
77
+ selected[key] = converted;
78
+ }
79
+ return Object.keys(selected).length > 0 ? selected : undefined;
80
+ }
81
+ function hashValue(value) {
82
+ return createHash("sha256").update(canonicalRecordJson(value), "utf8").digest("hex");
83
+ }
84
+ function listSyntax(artifactId = "<artifact-id>") {
85
+ return `agentera state ${artifactId} list [--limit N] [--cursor TOKEN] --format json`;
86
+ }
87
+ function listExample(artifactId, cursor = false) {
88
+ return cursor
89
+ ? `agentera state ${artifactId} list --limit 20 --cursor TOKEN --format json`
90
+ : `agentera state ${artifactId} list --limit 20 --format json`;
91
+ }
92
+ function listFailure(exitCode, className, message, artifactId, recovery, details, validValues) {
93
+ return new StateRetrievalFailure({
94
+ schemaVersion: "agentera.stateFailure.v1",
95
+ status: "fail",
96
+ error: {
97
+ class: className,
98
+ message,
99
+ syntax: listSyntax(artifactId),
100
+ example: listExample(artifactId, className === "cursor_invalid" || className === "cursor_snapshot_unavailable"),
101
+ recovery,
102
+ artifact_id: artifactId,
103
+ ...(details ? { details } : {}),
104
+ ...(validValues ? { valid_values: validValues } : {}),
105
+ },
106
+ }, exitCode);
107
+ }
108
+ function cursorKey(projectRoot, sourceRoot) {
109
+ return createHash("sha256")
110
+ .update(`agentera-state-list-cursor\0${path.resolve(projectRoot)}\0${path.resolve(sourceRoot)}`, "utf8")
111
+ .digest();
112
+ }
113
+ function cursorSignature(payload, projectRoot, sourceRoot) {
114
+ return createHmac("sha256", cursorKey(projectRoot, sourceRoot))
115
+ .update(canonicalRecordJson(payload), "utf8")
116
+ .digest("hex");
117
+ }
118
+ function encodeCursor(payload, projectRoot, sourceRoot) {
119
+ const signed = { ...payload, signature: cursorSignature(payload, projectRoot, sourceRoot) };
120
+ return Buffer.from(JSON.stringify(signed), "utf8").toString("base64url");
121
+ }
122
+ function invalidCursor(artifactId, message, projectRoot, sourceRoot) {
123
+ return listFailure(2, "cursor_invalid", message, artifactId, "Copy response.next_cursor exactly, or omit --cursor to establish a new snapshot.", { cursor: "opaque; do not parse or construct cursor tokens", project_root: path.resolve(projectRoot), source_root: path.resolve(sourceRoot) });
124
+ }
125
+ function parseCursor(artifactId, token, filters, projectRoot, sourceRoot) {
126
+ if (token.length === 0 || token.length > 100_000 || !/^[A-Za-z0-9_-]+$/.test(token)) {
127
+ throw invalidCursor(artifactId, "cursor is not a valid opaque token", projectRoot, sourceRoot);
128
+ }
129
+ let decoded;
130
+ try {
131
+ const bytes = Buffer.from(token, "base64url");
132
+ if (bytes.length === 0 || Buffer.from(bytes).toString("base64url") !== token)
133
+ throw new Error("non-canonical encoding");
134
+ decoded = JSON.parse(bytes.toString("utf8"));
135
+ }
136
+ catch {
137
+ throw invalidCursor(artifactId, "cursor is not a valid opaque token", projectRoot, sourceRoot);
138
+ }
139
+ if (!isMapping(decoded))
140
+ throw invalidCursor(artifactId, "cursor payload is not a valid opaque token", projectRoot, sourceRoot);
141
+ const signature = decoded.signature;
142
+ const unsigned = { ...decoded };
143
+ delete unsigned.signature;
144
+ if (typeof signature !== "string" || !/^[0-9a-f]{64}$/.test(signature)) {
145
+ throw invalidCursor(artifactId, "cursor signature is missing or malformed", projectRoot, sourceRoot);
146
+ }
147
+ const expected = cursorSignature(unsigned, projectRoot, sourceRoot);
148
+ if (!timingSafeEqual(Buffer.from(signature, "hex"), Buffer.from(expected, "hex"))) {
149
+ throw invalidCursor(artifactId, "cursor signature is invalid; the token may be tampered or copied from another project", projectRoot, sourceRoot);
150
+ }
151
+ const payload = unsigned;
152
+ if (payload.version !== CURSOR_VERSION ||
153
+ payload.artifact_id !== artifactId ||
154
+ payload.order !== LIST_ORDER ||
155
+ !isMapping(payload.filters) ||
156
+ canonicalRecordJson(payload.filters) !== canonicalRecordJson(filters) ||
157
+ typeof payload.snapshot_id !== "string" ||
158
+ !/^[0-9a-f]{64}$/.test(payload.snapshot_id) ||
159
+ !Number.isSafeInteger(payload.candidate_count) ||
160
+ payload.candidate_count < 1 ||
161
+ !Number.isSafeInteger(payload.candidate_max) ||
162
+ payload.candidate_max < 1 ||
163
+ typeof payload.candidate_start_key !== "string" ||
164
+ typeof payload.candidate_end_key !== "string" ||
165
+ typeof payload.after_key !== "string" ||
166
+ !Number.isSafeInteger(payload.after) ||
167
+ payload.after < 1 ||
168
+ payload.after > payload.candidate_max + 1) {
169
+ throw invalidCursor(artifactId, "cursor payload is invalid or bound to a different list", projectRoot, sourceRoot);
170
+ }
171
+ return { payload };
172
+ }
173
+ function projectionHash(current) {
174
+ return hashValue(current.record ?? current.summary ?? null);
175
+ }
176
+ function readCurrentProjection(projectRoot, artifactId, contract, sourceRoot) {
177
+ const projectionPath = stateCurrentProjectionPath(projectRoot, artifactId, sourceRoot);
178
+ try {
179
+ assertRealpathBoundary(projectRoot, projectionPath, `${artifactId} projection`);
180
+ }
181
+ catch (error) {
182
+ throw listFailure(1, "corrupt", `current ${artifactId} projection path is unsafe`, artifactId, "Repair the declared current projection path, then retry the list command.", {
183
+ path: projectionPath,
184
+ reason: error.message,
185
+ });
186
+ }
187
+ let stat;
188
+ try {
189
+ stat = fs.lstatSync(projectionPath);
190
+ }
191
+ catch (error) {
192
+ if (error.code === "ENOENT")
193
+ return { path: projectionPath, exists: false, entries: [] };
194
+ throw listFailure(1, "corrupt", `cannot read current ${artifactId} projection`, artifactId, "Repair the current projection file and retry the list command.", { path: projectionPath });
195
+ }
196
+ if (stat.isSymbolicLink() || !stat.isFile()) {
197
+ throw listFailure(1, "corrupt", `current ${artifactId} projection is not a regular file`, artifactId, "Restore the declared projection as a regular project-local file, then retry the list command.", { path: projectionPath });
198
+ }
199
+ let document;
200
+ try {
201
+ document = loadYamlMapping(fs.readFileSync(projectionPath, "utf8"));
202
+ }
203
+ catch (error) {
204
+ throw listFailure(1, "corrupt", `cannot parse current ${artifactId} projection: ${error.message}`, artifactId, "Repair the current projection YAML and retry the list command.", { path: projectionPath });
205
+ }
206
+ const collection = document[contract.entryCollection];
207
+ if (!Array.isArray(collection)) {
208
+ throw listFailure(1, "corrupt", `current ${artifactId} projection is missing its '${contract.entryCollection}' collection`, artifactId, "Restore the declared current entry collection and retry the list command.", { path: projectionPath });
209
+ }
210
+ const entries = [];
211
+ for (const [index, candidate] of collection.entries()) {
212
+ const identity = legacyIdentity(candidate, artifactId, contract.entryNumberField);
213
+ let representation = "summary";
214
+ if (isMapping(candidate)) {
215
+ try {
216
+ const violations = validateStateRecord(sourceRoot, artifactId, candidate);
217
+ representation = violations.every((violation) => /number|entry/i.test(violation)) ? "full" : violations.length === 0 ? "full" : "summary";
218
+ }
219
+ catch (error) {
220
+ throw listFailure(1, "unsupported_state", `current ${artifactId} projection could not be validated: ${error.message}`, artifactId, "Use a state schema supported by the storage authority, repair the current projection, then retry the list command.", { path: projectionPath });
221
+ }
222
+ }
223
+ const current = {
224
+ path: projectionPath,
225
+ rowKey: `${projectionPath}#${contract.entryCollection}:${index}`,
226
+ origin: "active",
227
+ identity: identity.kind,
228
+ entryNumber: identity.number,
229
+ representation,
230
+ ...(representation === "full" && isMapping(candidate) ? { record: candidate } : { summary: compactSummary(candidate) }),
231
+ projectionHash: "",
232
+ };
233
+ current.projectionHash = projectionHash(current);
234
+ entries.push(current);
235
+ }
236
+ const archive = document.archive;
237
+ if (Array.isArray(archive)) {
238
+ for (const [index, candidate] of archive.entries()) {
239
+ const identity = legacyIdentity(candidate, artifactId, contract.entryNumberField);
240
+ const current = {
241
+ path: projectionPath,
242
+ rowKey: `${projectionPath}#archive:${index}`,
243
+ origin: "summary",
244
+ identity: identity.kind,
245
+ entryNumber: identity.number,
246
+ representation: "summary",
247
+ summary: compactSummary(candidate),
248
+ projectionHash: "",
249
+ };
250
+ current.projectionHash = projectionHash(current);
251
+ entries.push(current);
252
+ }
253
+ }
254
+ return { path: projectionPath, exists: true, entries };
255
+ }
256
+ function overlayState(projectRoot, artifactId, sourceRoot) {
257
+ if (artifactId !== "decisions")
258
+ return null;
259
+ const contract = decisionOverlayContract(sourceRoot);
260
+ const overlayPath = decisionOverlayPath(projectRoot, sourceRoot);
261
+ let document;
262
+ try {
263
+ document = loadDecisionOverlay(projectRoot, sourceRoot);
264
+ }
265
+ catch (error) {
266
+ throw listFailure(1, "corrupt", `cannot read decision overlay: ${error.message}`, artifactId, "Repair the authority-declared decision overlay, then retry the list command.", { path: overlayPath });
267
+ }
268
+ return {
269
+ path: overlayPath,
270
+ revision: hashValue(document),
271
+ document,
272
+ mutablePaths: contract.mutablePaths,
273
+ };
274
+ }
275
+ function rejectionNumber(rejected, artifactId) {
276
+ const expected = path.join(`${path.sep}${artifactId}`, "");
277
+ if (!rejected.path.includes(expected))
278
+ return null;
279
+ const match = /(?:^|[\\/])([1-9][0-9]*)\.yaml$/.exec(rejected.path);
280
+ return match ? positiveNumber(match[1]) : null;
281
+ }
282
+ function rejectionBelongsToArtifact(rejected, artifactId) {
283
+ return rejected.path.includes(path.join(`${path.sep}${artifactId}`, ""));
284
+ }
285
+ function physicalRowFromCurrent(current) {
286
+ return {
287
+ rowKey: current.rowKey,
288
+ source: "current_projection",
289
+ origin: current.origin,
290
+ path: current.path,
291
+ identity: current.identity,
292
+ entryNumber: current.entryNumber,
293
+ representation: current.representation,
294
+ projectionHash: current.projectionHash,
295
+ ...(current.record ? { record: current.record } : {}),
296
+ ...(current.summary !== undefined ? { summary: current.summary } : {}),
297
+ };
298
+ }
299
+ function physicalRowFromArchive(entry) {
300
+ return {
301
+ rowKey: entry.path,
302
+ source: "archive",
303
+ origin: "numbered_archive",
304
+ path: entry.path,
305
+ identity: "canonical_number",
306
+ entryNumber: entry.entryNumber,
307
+ representation: "full",
308
+ projectionHash: entry.recordSha256,
309
+ record: entry.record,
310
+ };
311
+ }
312
+ function physicalRowFromRejection(rejected, entryNumber) {
313
+ return {
314
+ rowKey: rejected.path,
315
+ source: "archive",
316
+ origin: "rejected_archive",
317
+ path: rejected.path,
318
+ identity: entryNumber === null ? "unaddressable" : "canonical_number",
319
+ entryNumber,
320
+ representation: "unavailable",
321
+ projectionHash: hashValue({ path: rejected.path, reason: rejected.reason, message: rejected.message }),
322
+ rejection: rejected,
323
+ };
324
+ }
325
+ function sortKey(artifactId, entryNumber, rowKey) {
326
+ if (entryNumber !== null) {
327
+ const descending = String(Number.MAX_SAFE_INTEGER - entryNumber).padStart(16, "0");
328
+ return `0:${descending}:${artifactId}:${entryNumber}`;
329
+ }
330
+ return `1:${rowKey}`;
331
+ }
332
+ function buildCandidates(projectRoot, artifactId, contract, sourceRoot) {
333
+ const current = readCurrentProjection(projectRoot, artifactId, contract, sourceRoot);
334
+ const discovery = discoverNumberedArchives(projectRoot, { sourceRoot, artifactId });
335
+ const grouped = new Map();
336
+ const unaddressable = [];
337
+ const addRow = (row, archive, corruptArchive) => {
338
+ if (row.entryNumber === null || row.identity === "ambiguous") {
339
+ unaddressable.push(row);
340
+ return;
341
+ }
342
+ const group = grouped.get(row.entryNumber) ?? { rows: [] };
343
+ group.rows.push(row);
344
+ if (archive)
345
+ group.archive = archive;
346
+ if (corruptArchive)
347
+ group.corruptArchive = corruptArchive;
348
+ grouped.set(row.entryNumber, group);
349
+ };
350
+ for (const entry of discovery.entries)
351
+ addRow(physicalRowFromArchive(entry), entry);
352
+ for (const rejected of discovery.rejected) {
353
+ if (!rejectionBelongsToArtifact(rejected, artifactId))
354
+ continue;
355
+ const number = rejectionNumber(rejected, artifactId);
356
+ addRow(physicalRowFromRejection(rejected, number), undefined, number === null ? undefined : rejected);
357
+ }
358
+ for (const entry of current.entries)
359
+ addRow(physicalRowFromCurrent(entry));
360
+ const candidates = [];
361
+ for (const [entryNumber, group] of grouped) {
362
+ const rows = group.rows;
363
+ const currentRow = rows.find((row) => row.source === "current_projection");
364
+ const identity = rows.find((row) => row.identity === "explicit_decision_shorthand")?.identity ?? "canonical_number";
365
+ candidates.push({
366
+ stableId: `${artifactId}:${entryNumber}`,
367
+ artifactId,
368
+ entryNumber,
369
+ identity,
370
+ classification: classifyStateRows(rows),
371
+ rows,
372
+ sortKey: sortKey(artifactId, entryNumber, rows[0]?.rowKey ?? ""),
373
+ ...(group.archive ? { archive: group.archive } : {}),
374
+ ...(group.corruptArchive ? { corruptArchive: group.corruptArchive } : {}),
375
+ ...(currentRow ? { current: current.entries.find((entry) => entry.rowKey === currentRow.rowKey) } : {}),
376
+ });
377
+ }
378
+ for (const row of unaddressable) {
379
+ candidates.push({
380
+ stableId: null,
381
+ artifactId,
382
+ entryNumber: null,
383
+ identity: row.identity,
384
+ classification: row.rejection ? "corrupt" : row.identity === "ambiguous" ? "ambiguous" : "unaddressable",
385
+ rows: [row],
386
+ sortKey: sortKey(artifactId, null, row.rowKey),
387
+ });
388
+ }
389
+ candidates.sort((left, right) => left.sortKey.localeCompare(right.sortKey));
390
+ return { candidates, projection: { path: current.path, exists: current.exists }, rejected: discovery.rejected };
391
+ }
392
+ function stringValues(value) {
393
+ if (typeof value === "string")
394
+ return [value];
395
+ if (Array.isArray(value))
396
+ return value.flatMap(stringValues);
397
+ if (isMapping(value))
398
+ return Object.entries(value).flatMap(([key, child]) => [key, ...stringValues(child)]);
399
+ return [];
400
+ }
401
+ function matchesFilter(candidate, filters) {
402
+ const value = candidate.archive?.record ?? candidate.current?.record ?? candidate.current?.summary ?? candidate.rows[0]?.summary;
403
+ if (filters.topic && !stringValues(value).some((item) => item.toLowerCase().includes(filters.topic.toLowerCase())))
404
+ return false;
405
+ if (filters.status) {
406
+ const record = isMapping(value) ? value : {};
407
+ const status = candidate.artifactId === "progress" ? record.type : record.status;
408
+ if (String(status ?? "").toLowerCase() !== filters.status.toLowerCase())
409
+ return false;
410
+ }
411
+ if (filters.dimension) {
412
+ const record = isMapping(value) ? value : {};
413
+ const needle = filters.dimension.toLowerCase();
414
+ const grades = record.grades;
415
+ const details = record.dimensions_detail;
416
+ const gradeMatch = isMapping(grades) && Object.keys(grades).some((key) => key.toLowerCase().includes(needle));
417
+ const detailMatch = Array.isArray(details) && details.some((detail) => isMapping(detail) && String(detail.name ?? "").toLowerCase().includes(needle));
418
+ if (!gradeMatch && !detailMatch)
419
+ return false;
420
+ }
421
+ return true;
422
+ }
423
+ function filtersObject(artifactId, filters) {
424
+ if (artifactId === "progress")
425
+ return { topic: filters.topic ?? null, status: filters.status ?? null };
426
+ if (artifactId === "decisions")
427
+ return { topic: filters.topic ?? null };
428
+ if (artifactId === "health")
429
+ return { dimension: filters.dimension ?? null };
430
+ return {};
431
+ }
432
+ function validateListFilters(artifactId, filters) {
433
+ const allowed = artifactId === "progress" ? ["topic", "status"] : artifactId === "decisions" ? ["topic"] : ["dimension"];
434
+ for (const [key, value] of Object.entries(filters)) {
435
+ if (value === null || value === undefined)
436
+ continue;
437
+ if (!allowed.includes(key) || typeof value !== "string" || value.length === 0) {
438
+ throw listFailure(2, "invalid_request", `unsupported or empty list filter '${key}' for ${artifactId}; valid filters: ${allowed.join(", ")}`, artifactId, `Use ${listSyntax(artifactId)} with an allowed filter value.`);
439
+ }
440
+ }
441
+ }
442
+ function snapshotId(candidates, artifactId, filters, overlayRevision) {
443
+ const identity = {
444
+ artifact_id: artifactId,
445
+ order: LIST_ORDER,
446
+ filters,
447
+ overlay_revision: overlayRevision,
448
+ candidates: candidates.map((candidate) => ({
449
+ stable_id: candidate.stableId,
450
+ sort_key: candidate.sortKey,
451
+ physical_rows: candidate.rows.map((row) => ({
452
+ row_key: row.rowKey,
453
+ source: row.source,
454
+ identity: row.identity,
455
+ entry_number: row.entryNumber,
456
+ hash: row.projectionHash,
457
+ rejection: row.rejection?.reason ?? null,
458
+ })),
459
+ })),
460
+ };
461
+ return hashValue(identity);
462
+ }
463
+ function overlayFields(overlay, stableId) {
464
+ if (!overlay || !overlay.document[stableId])
465
+ return [];
466
+ const selected = overlay.document[stableId];
467
+ return overlay.mutablePaths.filter((field) => {
468
+ let value = selected;
469
+ for (const part of field.split(".")) {
470
+ if (!isMapping(value))
471
+ return false;
472
+ value = value[part];
473
+ }
474
+ return value !== undefined;
475
+ });
476
+ }
477
+ function recordStatus(candidate, overlay) {
478
+ if (overlay && candidate.stableId !== null) {
479
+ const selected = overlay.document[candidate.stableId];
480
+ const state = isMapping(selected?.satisfaction) ? selected.satisfaction.state : undefined;
481
+ if (typeof state === "string")
482
+ return state;
483
+ }
484
+ const record = candidate.archive?.record ?? candidate.current?.record;
485
+ if (!record)
486
+ return "unknown";
487
+ if (typeof record.status === "string")
488
+ return record.status;
489
+ if (typeof record.type === "string")
490
+ return record.type;
491
+ if (typeof record.trajectory === "string")
492
+ return record.trajectory;
493
+ const satisfaction = record.satisfaction;
494
+ if (isMapping(satisfaction) && typeof satisfaction.state === "string")
495
+ return satisfaction.state;
496
+ return "unknown";
497
+ }
498
+ function listEntry(candidate, overlay, projectRoot, contract) {
499
+ const archivePath = candidate.archive?.path ?? candidate.corruptArchive?.path ?? path.join(path.resolve(projectRoot), contract.archiveRoot, candidate.artifactId, `${candidate.entryNumber ?? "unaddressable"}${contract.archiveExtension}`);
500
+ const hasArchive = candidate.archive !== undefined;
501
+ const currentStatus = candidate.current ? (candidate.current.representation === "full" ? "active" : "summary") : "archive_only";
502
+ const source = hasArchive ? "archive" : candidate.corruptArchive ? "archive" : candidate.current?.representation === "full" ? "legacy_full" : "legacy_summary";
503
+ const detailAvailability = hasArchive ? "full" : candidate.current?.representation === "full" ? "full" : candidate.current ? "summary" : candidate.rows[0]?.representation ?? "unavailable";
504
+ const overlayFieldsForEntry = overlayFields(overlay, candidate.stableId ?? "");
505
+ const addressable = candidate.stableId !== null;
506
+ const physicalRows = candidate.rows.map((row) => ({
507
+ row_id: row.rowKey,
508
+ source: row.source,
509
+ origin: row.origin,
510
+ path: row.path,
511
+ identity: row.identity,
512
+ entry_number: row.entryNumber,
513
+ representation: row.representation,
514
+ ...(row.rejection ? { rejection: row.rejection.reason } : {}),
515
+ }));
516
+ const entry = {
517
+ stable_id: candidate.stableId,
518
+ artifact_id: candidate.artifactId,
519
+ entry_number: candidate.entryNumber,
520
+ addressable,
521
+ identity: candidate.identity,
522
+ classification: candidate.classification,
523
+ physical_count: candidate.rows.length,
524
+ cursor_key: candidate.sortKey,
525
+ current_status: currentStatus,
526
+ detail_availability: detailAvailability,
527
+ source,
528
+ compatibility: candidate.classification === "conflict" || candidate.classification === "ambiguous" || candidate.classification === "corrupt"
529
+ ? "blocked"
530
+ : hasArchive && !candidate.corruptArchive ? "complete" : "degraded",
531
+ record_status: recordStatus(candidate, overlay),
532
+ provenance: {
533
+ archive: {
534
+ path: archivePath,
535
+ available: hasArchive || candidate.corruptArchive !== undefined,
536
+ verified: hasArchive,
537
+ ...(candidate.archive ? { record_sha256: candidate.archive.recordSha256 } : {}),
538
+ ...(candidate.corruptArchive ? { rejection: candidate.corruptArchive.reason } : {}),
539
+ },
540
+ current_projection: {
541
+ path: candidate.current?.path ?? path.join(path.resolve(projectRoot), `.agentera/${candidate.artifactId}.yaml`),
542
+ present: candidate.current !== undefined,
543
+ representation: candidate.current?.representation ?? "missing",
544
+ },
545
+ physical_rows: physicalRows,
546
+ },
547
+ ...(addressable
548
+ ? { retrieval: { command: `agentera state ${candidate.artifactId} get --number ${candidate.entryNumber} --format json`, available: candidate.classification !== "conflict" && candidate.classification !== "ambiguous" && candidate.classification !== "corrupt" } }
549
+ : { retrieval: { available: false, reason: "unaddressable", message: "No stable ID was inferred from this physical row; list output is the only supported view." } }),
550
+ };
551
+ if (overlay && addressable) {
552
+ entry.overlay_applied = overlayFieldsForEntry.length > 0;
553
+ entry.provenance = {
554
+ ...entry.provenance,
555
+ overlay: { path: overlay.path, applied: overlayFieldsForEntry.length > 0, fields: overlayFieldsForEntry, revision: overlay.revision },
556
+ };
557
+ }
558
+ const baseSourceValue = candidate.current?.summary ?? candidate.archive?.record ?? candidate.current?.record;
559
+ const summary = compactSummary(baseSourceValue);
560
+ if (summary !== undefined)
561
+ entry.summary = summary;
562
+ return entry;
563
+ }
564
+ function textList(value) {
565
+ const lines = [
566
+ `command: ${value.command}`,
567
+ `status: ${value.status}`,
568
+ `snapshot: ${String(value.snapshot.id)}${value.snapshot.has_more ? " (more)" : ""}`,
569
+ `counts: ${JSON.stringify(value.counts)}`,
570
+ `filters: ${JSON.stringify(value.filters)}`,
571
+ "entries:",
572
+ ];
573
+ for (const raw of value.entries ?? []) {
574
+ const entry = raw;
575
+ lines.push(`- ${entry.stable_id} current=${entry.current_status} detail=${entry.detail_availability} source=${entry.source} compatibility=${entry.compatibility} status=${entry.record_status}`);
576
+ lines.push(` provenance: ${JSON.stringify(entry.provenance)}`);
577
+ if (entry.summary !== undefined)
578
+ lines.push(` summary: ${JSON.stringify(entry.summary)}`);
579
+ }
580
+ if (value.next_cursor)
581
+ lines.push(`next_cursor: ${value.next_cursor}`);
582
+ if (value.omitted)
583
+ lines.push(`omitted: ${value.omitted_count} (${value.omission_reason})`);
584
+ return lines.join("\n") + "\n";
585
+ }
586
+ function responseBytes(value, format) {
587
+ return format === "text"
588
+ ? Buffer.byteLength(textList(value), "utf8")
589
+ : serializedProjectionBytes(value, format);
590
+ }
591
+ function copyEntryWithoutOptionalDetails(entry) {
592
+ const copy = { ...entry };
593
+ delete copy.summary;
594
+ delete copy.record_status;
595
+ return copy;
596
+ }
597
+ function omissionMetadata(command, count, entries) {
598
+ return {
599
+ omitted: count > 0,
600
+ omitted_count: count,
601
+ omission_reason: "list_output_byte_budget",
602
+ retrieval: { available: true, command: `agentera ${command} [--cursor TOKEN] --format json` },
603
+ omission_provenance: provenanceCounts(entries),
604
+ };
605
+ }
606
+ export function listStateEntries(projectRoot, artifactId, limit, filters = {}, cursor, options = {}) {
607
+ const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
608
+ let contract;
609
+ try {
610
+ contract = numberedArchiveContract(artifactId, sourceRoot);
611
+ }
612
+ catch (error) {
613
+ throw listFailure(2, "unsupported_artifact", `unsupported state artifact '${artifactId}'`, artifactId, "Use one of the numbered archive artifacts and retry the list command.", { reason: error.message }, ["progress", "decisions", "health"]);
614
+ }
615
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) {
616
+ throw listFailure(2, "invalid_request", "list limit must be an integer from 1 through 100", artifactId, "Use --limit with a value from 1 through 100, or omit it for the default of 20.");
617
+ }
618
+ validateListFilters(artifactId, filters);
619
+ const normalizedFilters = filtersObject(artifactId, filters);
620
+ const parsed = cursor !== undefined ? parseCursor(artifactId, cursor, normalizedFilters, projectRoot, sourceRoot) : null;
621
+ const built = buildCandidates(projectRoot, artifactId, contract, sourceRoot);
622
+ const overlay = overlayState(projectRoot, artifactId, sourceRoot);
623
+ const allCandidates = built.candidates.filter((candidate) => matchesFilter(candidate, filters));
624
+ const overlayRevision = overlay?.revision ?? "not_applicable";
625
+ const currentSnapshotId = snapshotId(allCandidates, artifactId, normalizedFilters, overlayRevision);
626
+ let snapshotCandidates = allCandidates;
627
+ let firstPage = parsed === null;
628
+ if (parsed) {
629
+ const oldCandidates = allCandidates.filter((candidate) => candidate.sortKey >= parsed.payload.candidate_start_key && candidate.sortKey <= parsed.payload.candidate_end_key);
630
+ const oldSnapshotId = snapshotId(oldCandidates, artifactId, normalizedFilters, overlayRevision);
631
+ if (oldSnapshotId !== parsed.payload.snapshot_id ||
632
+ oldCandidates.length !== parsed.payload.candidate_count ||
633
+ (oldCandidates.length > 0 && oldCandidates[0].sortKey !== parsed.payload.candidate_start_key)) {
634
+ throw listFailure(1, "cursor_snapshot_unavailable", `cursor snapshot for state ${artifactId} is no longer available; an existing candidate changed or disappeared`, artifactId, "Start a new listing without --cursor to establish a current snapshot.", {
635
+ snapshot_id: parsed.payload.snapshot_id,
636
+ current_snapshot_id: currentSnapshotId,
637
+ });
638
+ }
639
+ snapshotCandidates = oldCandidates;
640
+ firstPage = false;
641
+ }
642
+ const snapshot = snapshotId(snapshotCandidates, artifactId, normalizedFilters, overlayRevision);
643
+ const pageCandidates = parsed ? snapshotCandidates.filter((candidate) => candidate.sortKey > parsed.payload.after_key) : snapshotCandidates;
644
+ const selected = pageCandidates.slice(0, limit);
645
+ const rows = selected.map((candidate) => listEntry(candidate, overlay, projectRoot, contract));
646
+ const remaining = pageCandidates.length - selected.length;
647
+ const nextAfterCandidate = selected.at(-1);
648
+ const nextAfterKey = nextAfterCandidate?.sortKey ?? parsed?.payload.after_key ?? "";
649
+ const nextAfter = nextAfterCandidate?.entryNumber ?? parsed?.payload.after ?? 1;
650
+ const nextCursor = remaining > 0
651
+ ? encodeCursor({
652
+ version: CURSOR_VERSION,
653
+ artifact_id: artifactId,
654
+ filters: normalizedFilters,
655
+ order: LIST_ORDER,
656
+ snapshot_id: snapshot,
657
+ candidate_count: snapshotCandidates.length,
658
+ candidate_max: snapshotCandidates[0]?.entryNumber ?? 1,
659
+ candidate_start_key: snapshotCandidates[0]?.sortKey ?? "",
660
+ candidate_end_key: snapshotCandidates.at(-1)?.sortKey ?? "",
661
+ after_key: nextAfterKey,
662
+ after: nextAfter,
663
+ }, projectRoot, sourceRoot)
664
+ : undefined;
665
+ const rowCounts = { active: 0, summary: 0, archive_only: 0 };
666
+ for (const candidate of snapshotCandidates) {
667
+ const state = candidate.current ? (candidate.current.representation === "full" ? "active" : "summary") : "archive_only";
668
+ rowCounts[state] += 1;
669
+ }
670
+ const allPhysicalCounts = physicalCounts(snapshotCandidates);
671
+ const selectedPhysical = selected.reduce((total, candidate) => total + candidate.rows.length, 0);
672
+ const blocked = snapshotCandidates.some((candidate) => ["conflict", "ambiguous", "corrupt"].includes(candidate.classification));
673
+ const degraded = snapshotCandidates.some((candidate) => candidate.classification !== "canonical" || !candidate.archive);
674
+ return {
675
+ command: `state ${artifactId} list`,
676
+ status: built.rejected.length > 0 || degraded ? "degraded" : "ok",
677
+ entries: rows,
678
+ counts: {
679
+ total: snapshotCandidates.length,
680
+ returned: rows.length,
681
+ remaining,
682
+ ...allPhysicalCounts,
683
+ returned_physical: selectedPhysical,
684
+ omitted: Math.max(0, Number(allPhysicalCounts.physical ?? 0) - selectedPhysical),
685
+ active: rowCounts.active,
686
+ summary: rowCounts.summary,
687
+ archive_only: rowCounts.archive_only,
688
+ },
689
+ source: {
690
+ artifact: artifactId,
691
+ current_projection: { path: built.projection.path, exists: built.projection.exists },
692
+ archive: { root: path.join(path.resolve(projectRoot), contract.archiveRoot, artifactId), validated_entries: snapshotCandidates.reduce((count, candidate) => count + candidate.rows.filter((row) => row.origin === "numbered_archive").length, 0), rejected_count: built.rejected.length },
693
+ },
694
+ filters: normalizedFilters,
695
+ snapshot: {
696
+ id: snapshot,
697
+ first_page: firstPage,
698
+ order: LIST_ORDER,
699
+ has_more: remaining > 0,
700
+ candidate_count: snapshotCandidates.length,
701
+ candidate_max: snapshotCandidates[0]?.entryNumber ?? 0,
702
+ candidate_start_key: snapshotCandidates[0]?.sortKey ?? "",
703
+ candidate_end_key: snapshotCandidates.at(-1)?.sortKey ?? "",
704
+ page_start: parsed?.payload.after ?? (snapshotCandidates[0]?.entryNumber ?? 0) + 1,
705
+ append_behavior: "entries appended after this snapshot are excluded",
706
+ },
707
+ source_contract: {
708
+ authority: LIST_AUTHORITY,
709
+ compatibility: blocked ? "blocked" : degraded ? "degraded" : "complete",
710
+ detail: "Rows preserve explicit canonical numbers and decision Dnn shorthand. Unaddressable rows remain list-only; mirrors, duplicates, conflicts, and ambiguity are classified without inferred identity.",
711
+ retrieval: `agentera state ${artifactId} get --number N --format json`,
712
+ cursor: "opaque; bound to artifact, filters, order, candidate identity, archive hashes, and overlay revision",
713
+ },
714
+ ...(nextCursor ? { next_cursor: nextCursor } : {}),
715
+ };
716
+ }
717
+ export function boundStateList(response, format, sourceRoot = resolveSourceRoot(), projectRoot = process.cwd()) {
718
+ const policy = loadProjectionPolicy(sourceRoot);
719
+ if (responseBytes(response, format) <= policy.maxUtf8Bytes)
720
+ return response;
721
+ const originalEntries = response.entries.map((entry) => entry);
722
+ const entriesWithoutOptionalDetails = originalEntries.map((entry) => copyEntryWithoutOptionalDetails(entry));
723
+ const optionalDetailOmitted = originalEntries.filter((entry, index) => Object.keys(entry).length !== Object.keys(entriesWithoutOptionalDetails[index]).length).length;
724
+ const boundedPage = (entries, omittedRows) => {
725
+ const snapshot = response.snapshot;
726
+ const artifactId = String(response.source.artifact ?? "state");
727
+ const candidateMax = Number(snapshot.candidate_max ?? 0);
728
+ const candidateCount = Number(snapshot.candidate_count ?? response.counts.total ?? 0);
729
+ const lastEntry = entries.at(-1);
730
+ const lastNumber = lastEntry ? positiveNumber(String(lastEntry.entry_number)) : null;
731
+ const lastKey = typeof lastEntry?.cursor_key === "string" ? lastEntry.cursor_key : null;
732
+ const continuation = omittedRows > 0 && lastKey !== null
733
+ ? encodeCursor({
734
+ version: CURSOR_VERSION,
735
+ artifact_id: artifactId,
736
+ filters: response.filters,
737
+ order: LIST_ORDER,
738
+ snapshot_id: String(snapshot.id),
739
+ candidate_count: candidateCount,
740
+ candidate_max: candidateMax,
741
+ candidate_start_key: String(snapshot.candidate_start_key ?? ""),
742
+ candidate_end_key: String(snapshot.candidate_end_key ?? ""),
743
+ after_key: lastKey,
744
+ after: lastNumber ?? 1,
745
+ }, projectRoot, sourceRoot)
746
+ : omittedRows === 0
747
+ ? response.next_cursor
748
+ : undefined;
749
+ const bounded = {
750
+ ...response,
751
+ status: optionalDetailOmitted + omittedRows > 0 ? "degraded" : response.status,
752
+ entries,
753
+ counts: {
754
+ ...response.counts,
755
+ returned: entries.length,
756
+ remaining: Number(response.counts.remaining ?? 0) + omittedRows,
757
+ returned_physical: entries.reduce((total, entry) => total + Number(entry.physical_count ?? 1), 0),
758
+ omitted: Math.max(0, Number(response.counts.physical ?? response.counts.total ?? 0) - entries.reduce((total, entry) => total + Number(entry.physical_count ?? 1), 0)),
759
+ },
760
+ snapshot: { ...snapshot, has_more: continuation !== undefined },
761
+ ...(optionalDetailOmitted + omittedRows > 0
762
+ ? omissionMetadata(response.command, optionalDetailOmitted + omittedRows, entries)
763
+ : {}),
764
+ };
765
+ delete bounded.next_cursor;
766
+ if (continuation)
767
+ bounded.next_cursor = continuation;
768
+ return bounded;
769
+ };
770
+ for (let retainedCount = entriesWithoutOptionalDetails.length; retainedCount > 0; retainedCount -= 1) {
771
+ const entries = entriesWithoutOptionalDetails.slice(0, retainedCount);
772
+ const omittedRows = entriesWithoutOptionalDetails.length - retainedCount;
773
+ const bounded = boundedPage(entries, omittedRows);
774
+ if (responseBytes(bounded, format) <= policy.maxUtf8Bytes)
775
+ return bounded;
776
+ }
777
+ throw listFailure(1, "unsupported_state", `list output cannot emit an advancing row page within the ${policy.maxUtf8Bytes}-byte ${format} authority budget`, String(response.source.artifact ?? "state"), "Reduce the requested output to a supported state artifact or repair the authority budget before retrying; no continuation cursor was issued.", { format, candidate_count: Number(response.snapshot.candidate_count ?? response.counts.total ?? 0) });
778
+ }
779
+ export function renderStateListText(response) {
780
+ return textList(response);
781
+ }