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,219 @@
1
+ import fs from "node:fs";
2
+ import { loadProfileDecayParameters } from "../capabilities/profile/instructions.js";
3
+ import { writeFileAtomic } from "../core/atomicWriter.js";
4
+ import { GlossaryEntryBoundError, validateGlossaryEntry, } from "../registries/glossaryEntryContract.js";
5
+ import { unicodeCaselessExact } from "../registries/glossaryTermIdentity.js";
6
+ const START = "<!-- agentera:personal-glossary:start -->";
7
+ const END = "<!-- agentera:personal-glossary:end -->";
8
+ const HEADING = "## Glossary";
9
+ const SCHEMA_VERSION = "agentera.personalGlossarySection.v1";
10
+ const DECAY = loadProfileDecayParameters();
11
+ function compareText(left, right) {
12
+ return left < right ? -1 : left > right ? 1 : 0;
13
+ }
14
+ function calendarDate(value) {
15
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value))
16
+ throw new Error(`expected ISO calendar date, received '${value}'`);
17
+ const date = new Date(`${value}T00:00:00.000Z`);
18
+ if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) {
19
+ throw new Error(`expected ISO calendar date, received '${value}'`);
20
+ }
21
+ return date;
22
+ }
23
+ function daysBetween(from, to) {
24
+ const days = (calendarDate(to).getTime() - calendarDate(from).getTime()) / 86_400_000;
25
+ if (days < 0)
26
+ throw new Error(`as_of ${to} precedes last_confirmed_at ${from}`);
27
+ return days;
28
+ }
29
+ function count(text, token) {
30
+ return text.split(token).length - 1;
31
+ }
32
+ function persistedContext(entry) {
33
+ const retained = new Map();
34
+ for (const evidence of entry.provenance.evidence) {
35
+ retained.set(evidence.evidence_anchor, {
36
+ sourceId: evidence.source_id,
37
+ sourceKind: "source_kind" in evidence ? evidence.source_kind : "conversation_turn",
38
+ signalType: "signal_type" in evidence ? evidence.signal_type : "instruction",
39
+ });
40
+ }
41
+ return { retainedHistory: retained };
42
+ }
43
+ function validateEntry(entry, context) {
44
+ const errors = validateGlossaryEntry(entry, "personal", context);
45
+ if (errors.length > 0)
46
+ throw new Error(`invalid personal glossary entry '${String(entry.term)}': ${errors.join("; ")}`);
47
+ }
48
+ function validateUnique(entries, label) {
49
+ for (const [index, entry] of entries.entries()) {
50
+ if (entries.slice(0, index).some((candidate) => unicodeCaselessExact(candidate.term, entry.term))) {
51
+ throw new Error(`${label} contains duplicate Unicode caseless-exact term '${entry.term}'`);
52
+ }
53
+ }
54
+ }
55
+ function matchingIndex(entries, term) {
56
+ return entries.findIndex((entry) => unicodeCaselessExact(entry.term, term));
57
+ }
58
+ function confidenceBasisFor(document, term) {
59
+ const key = Object.keys(document.confidence_basis).find((candidate) => unicodeCaselessExact(candidate, term));
60
+ return key === undefined ? Number.NaN : document.confidence_basis[key];
61
+ }
62
+ function parseSection(profile, maxEntries = Number.POSITIVE_INFINITY) {
63
+ const starts = count(profile, START);
64
+ const ends = count(profile, END);
65
+ const headings = [...profile.matchAll(/^## Glossary\s*$/gm)].length;
66
+ if (starts === 0 && ends === 0 && headings === 0)
67
+ return { document: null, start: -1, end: -1 };
68
+ if (starts > 1 || ends > 1 || headings > 1 || (headings > 0 && starts === 0 && ends === 0))
69
+ throw new PersonalGlossaryBoundaryError("ambiguous");
70
+ if (starts !== 1 || ends !== 1 || headings !== 1)
71
+ throw new PersonalGlossaryBoundaryError("malformed");
72
+ const start = profile.indexOf(START);
73
+ const end = profile.indexOf(END, start) + END.length;
74
+ if (start < 0 || end < END.length || end <= start)
75
+ throw new Error("PROFILE.md Glossary section has malformed or ambiguous owned boundaries");
76
+ const owned = profile.slice(start, end);
77
+ const newline = "\\r?\\n";
78
+ const match = new RegExp(`^${START}${newline}${HEADING}${newline}${newline}\`\`\`json${newline}([\\s\\S]+)${newline}\`\`\`${newline}${END}$`).exec(owned);
79
+ if (!match)
80
+ throw new Error("PROFILE.md Glossary section is malformed");
81
+ let value;
82
+ try {
83
+ value = JSON.parse(match[1]);
84
+ }
85
+ catch {
86
+ throw new Error("PROFILE.md Glossary section contains invalid JSON");
87
+ }
88
+ if (!value || typeof value !== "object" || Array.isArray(value))
89
+ throw new Error("PROFILE.md Glossary section document is malformed");
90
+ const document = value;
91
+ if (JSON.stringify(Object.keys(document)) !== JSON.stringify(["schema_version", "as_of", "confidence_basis", "entries"]) || document.schema_version !== SCHEMA_VERSION || !Array.isArray(document.entries) || !document.confidence_basis || typeof document.confidence_basis !== "object" || Array.isArray(document.confidence_basis)) {
92
+ throw new Error("PROFILE.md Glossary section document is malformed");
93
+ }
94
+ if (document.entries.length > maxEntries)
95
+ throw new GlossaryEntryBoundError("personal glossary exceeds the consumer entry bound");
96
+ calendarDate(document.as_of);
97
+ validateUnique(document.entries, "existing personal glossary");
98
+ const basisKeys = Object.keys(document.confidence_basis);
99
+ if (basisKeys.length !== document.entries.length || basisKeys.some((key, index) => basisKeys.slice(0, index).some((candidate) => unicodeCaselessExact(candidate, key)) || matchingIndex(document.entries, key) < 0)) {
100
+ throw new Error("PROFILE.md Glossary section confidence basis is malformed");
101
+ }
102
+ for (const entry of document.entries) {
103
+ validateEntry(entry, persistedContext(entry));
104
+ const basis = confidenceBasisFor(document, entry.term);
105
+ if (!Number.isInteger(basis) || basis < 0 || basis > 100)
106
+ throw new Error("PROFILE.md Glossary section confidence basis is malformed");
107
+ daysBetween(entry.temporal.last_confirmed_at, document.as_of);
108
+ }
109
+ return { document, start, end };
110
+ }
111
+ export class PersonalGlossaryBoundaryError extends Error {
112
+ availability;
113
+ constructor(availability) {
114
+ super("PROFILE.md Glossary section has malformed or ambiguous owned boundaries");
115
+ this.availability = availability;
116
+ }
117
+ }
118
+ /** Parse only the owned glossary range and project only consumer-safe fields. */
119
+ export function personalGlossaryConsumerEntries(profile, maxEntries) {
120
+ const document = parseSection(profile, maxEntries).document;
121
+ return document?.entries.map(({ term, meaning }) => ({ term, meaning })) ?? null;
122
+ }
123
+ /** Return profile grounding with the validated owned glossary range excluded byte-for-byte. */
124
+ export function personalProfileGrounding(profile) {
125
+ const section = parseSection(profile);
126
+ return section.document === null
127
+ ? profile
128
+ : `${profile.slice(0, section.start)}${profile.slice(section.end)}`;
129
+ }
130
+ function orderedEntry(entry) {
131
+ return {
132
+ term: entry.term,
133
+ meaning: entry.meaning,
134
+ confidence: entry.confidence,
135
+ permanence: entry.permanence,
136
+ temporal: {
137
+ observed_at: entry.temporal.observed_at,
138
+ last_confirmed_at: entry.temporal.last_confirmed_at,
139
+ },
140
+ provenance: {
141
+ kind: entry.provenance.kind,
142
+ evidence: entry.provenance.evidence.map((item) => ({ ...item })),
143
+ },
144
+ };
145
+ }
146
+ function render(document) {
147
+ return `${START}\n${HEADING}\n\n\`\`\`json\n${JSON.stringify(document, null, 2)}\n\`\`\`\n${END}`;
148
+ }
149
+ export function updatePersonalGlossaryProfile(input) {
150
+ calendarDate(input.asOf);
151
+ const original = fs.readFileSync(input.profilePath, "utf8");
152
+ const section = parseSection(original);
153
+ if (section.document && calendarDate(input.asOf).getTime() < calendarDate(section.document.as_of).getTime()) {
154
+ throw new Error("personal glossary as_of cannot move backward");
155
+ }
156
+ validateUnique(input.freshEntries, "fresh personal glossary evidence");
157
+ for (const entry of input.freshEntries)
158
+ validateEntry(entry, input.retainedHistory);
159
+ const fresh = input.freshEntries;
160
+ const established = section.document?.entries ?? [];
161
+ const merged = [];
162
+ const confidenceBasis = new Map();
163
+ const usedFresh = new Set();
164
+ for (const previous of established) {
165
+ const freshIndex = matchingIndex(fresh, previous.term);
166
+ const current = freshIndex >= 0 ? fresh[freshIndex] : undefined;
167
+ if (freshIndex >= 0)
168
+ usedFresh.add(freshIndex);
169
+ let entry;
170
+ let entryBasis;
171
+ if (current) {
172
+ if (previous.meaning !== current.meaning || previous.provenance.kind !== current.provenance.kind) {
173
+ throw new Error(`personal glossary conflict for established term '${previous.term}'`);
174
+ }
175
+ daysBetween(previous.temporal.last_confirmed_at, input.asOf);
176
+ entryBasis = current.confidence;
177
+ entry = orderedEntry({
178
+ ...current,
179
+ term: previous.term,
180
+ permanence: previous.permanence,
181
+ temporal: { observed_at: previous.temporal.observed_at, last_confirmed_at: input.asOf },
182
+ });
183
+ }
184
+ else {
185
+ entryBasis = confidenceBasisFor(section.document, previous.term);
186
+ const days = daysBetween(previous.temporal.last_confirmed_at, input.asOf);
187
+ entry = orderedEntry({
188
+ ...previous,
189
+ confidence: Math.max(DECAY.floor, Math.round(entryBasis * Math.exp(-DECAY.lambdas[previous.permanence] * days))),
190
+ });
191
+ }
192
+ merged.push(entry);
193
+ confidenceBasis.set(entry.term, entryBasis);
194
+ }
195
+ for (const [index, current] of fresh.entries()) {
196
+ if (usedFresh.has(index))
197
+ continue;
198
+ const entryBasis = current.confidence;
199
+ if (calendarDate(current.temporal.observed_at).getTime() > calendarDate(input.asOf).getTime())
200
+ throw new Error(`observed_at for '${current.term}' is after as_of`);
201
+ const entry = orderedEntry({
202
+ ...current,
203
+ temporal: { observed_at: current.temporal.observed_at, last_confirmed_at: input.asOf },
204
+ });
205
+ merged.push(entry);
206
+ confidenceBasis.set(entry.term, entryBasis);
207
+ }
208
+ merged.sort((left, right) => compareText(left.term, right.term));
209
+ const orderedBasis = Object.fromEntries(merged.map((entry) => [entry.term, confidenceBasis.get(entry.term)]));
210
+ const document = { schema_version: SCHEMA_VERSION, as_of: input.asOf, confidence_basis: orderedBasis, entries: merged };
211
+ const rendered = render(document);
212
+ const candidate = section.document
213
+ ? `${original.slice(0, section.start)}${rendered}${original.slice(section.end)}`
214
+ : `${original}${original.endsWith("\n") ? "\n" : "\n\n"}${rendered}\n`;
215
+ const changed = candidate !== original;
216
+ if (changed && !input.dryRun)
217
+ writeFileAtomic(input.profilePath, candidate);
218
+ return { changed, profilePath: input.profilePath, entries: merged };
219
+ }
@@ -0,0 +1,211 @@
1
+ import path from "node:path";
2
+ import { PROFILE_SIGNAL_TYPES, profileSufficiency, } from "../registries/evidenceTierContract.js";
3
+ import { readCurrentPointer, readSignalTier, resolveEvidenceAnchor, } from "./extractCorpus/evidenceTiers.js";
4
+ import { assessTiers, recoveryForState, resolveTiersDir, } from "./extractCorpus/tierReader.js";
5
+ const PROFILE_TYPES_SET = new Set(PROFILE_SIGNAL_TYPES);
6
+ /** Resolve the absolute signal tier file path from the current generation. */
7
+ function signalTierPath(tiersDir) {
8
+ const pointer = readCurrentPointer(tiersDir);
9
+ if (!pointer)
10
+ return null;
11
+ return path.join(tiersDir, "generations", pointer.generation, "signal.json");
12
+ }
13
+ /** Resolve the co-located corpus path for legacy compatibility assessment. */
14
+ function corpusPathFromTiersDir(tiersDir) {
15
+ const idx = tiersDir.lastIndexOf(path.sep + "tiers");
16
+ if (idx === -1)
17
+ return undefined;
18
+ return path.join(tiersDir.slice(0, idx), "corpus.json");
19
+ }
20
+ /**
21
+ * Assess whether the retained profile-relevant signal distribution is
22
+ * sufficient against the contract threshold. The prior intended distribution
23
+ * is reconstructed from the signal tier's selection report (total per
24
+ * family); the retained distribution from the published signal records.
25
+ * No separate full-corpus read is needed — the selection report carries both.
26
+ *
27
+ * When the tier is uncapped, retained == total, so the bounded and intended
28
+ * distributions are identical and sufficiency is trivially met. When capped,
29
+ * the selection report's per-family total/retained is the authoritative prior
30
+ * distribution; the profile-relevant intended count is scaled from the
31
+ * retained profile-relevant count by the family's overall retention ratio.
32
+ */
33
+ export function assessProfileSufficiency(selection, signals, contractPath) {
34
+ const suff = profileSufficiency(contractPath);
35
+ const threshold = suff.minimumFamilyRetention;
36
+ const profileRetainedPerFamily = new Map();
37
+ for (const sig of signals) {
38
+ const family = sig.source_product || "unknown";
39
+ profileRetainedPerFamily.set(family, (profileRetainedPerFamily.get(family) ?? 0) + 1);
40
+ }
41
+ const profileIntendedPerFamily = new Map();
42
+ if (!selection.capped) {
43
+ // Uncapped: retained == intended, so the retained counts ARE the intended.
44
+ for (const [family, retained] of profileRetainedPerFamily) {
45
+ profileIntendedPerFamily.set(family, retained);
46
+ }
47
+ }
48
+ else {
49
+ // Capped: the selection report's per_family is the authoritative source
50
+ // of which families had records. For families with profile-relevant
51
+ // retained signals, scale the intended count by the family's overall
52
+ // retention ratio. For families where all records were capped
53
+ // (retained=0, total>0), flag them as insufficient — no data survived
54
+ // to contribute to the profile.
55
+ for (const sel of selection.per_family) {
56
+ if (sel.total === 0)
57
+ continue;
58
+ const profileRetained = profileRetainedPerFamily.get(sel.family) ?? 0;
59
+ if (sel.retained > 0 && profileRetained > 0) {
60
+ profileIntendedPerFamily.set(sel.family, Math.round(profileRetained * (sel.total / sel.retained)));
61
+ }
62
+ else if (sel.retained === 0 && sel.total > 0) {
63
+ // All records for this family were capped — insufficient by definition.
64
+ profileIntendedPerFamily.set(sel.family, sel.total);
65
+ }
66
+ // If sel.retained > 0 but profileRetained == 0, the family's retained
67
+ // records were simply non-profile-relevant; leave it as sufficient.
68
+ }
69
+ // Also include any family that appears in retained signals but not in the
70
+ // selection report (should not normally happen, but handle gracefully).
71
+ for (const [family, retained] of profileRetainedPerFamily) {
72
+ if (!profileIntendedPerFamily.has(family)) {
73
+ profileIntendedPerFamily.set(family, retained);
74
+ }
75
+ }
76
+ }
77
+ const perFamily = [];
78
+ const allFamilies = new Set([...profileIntendedPerFamily.keys(), ...profileRetainedPerFamily.keys()]);
79
+ for (const family of [...allFamilies].sort()) {
80
+ const intended = profileIntendedPerFamily.get(family) ?? 0;
81
+ const retained = profileRetainedPerFamily.get(family) ?? 0;
82
+ const retention = intended > 0 ? retained / intended : 1;
83
+ const sufficient = intended === 0 || retention >= threshold;
84
+ perFamily.push({ family, intended, retained, retention, sufficient });
85
+ }
86
+ const insufficientFamilies = perFamily.filter((f) => !f.sufficient);
87
+ const sufficient = !selection.capped || insufficientFamilies.length === 0;
88
+ const reason = sufficient
89
+ ? selection.capped
90
+ ? "signal tier capped but per-family retention meets threshold"
91
+ : "signal tier uncapped; bounded and intended distributions identical"
92
+ : `insufficient retention for families: ${insufficientFamilies.map((f) => `${f.family} (${f.retained}/${f.intended}, ${(f.retention * 100).toFixed(0)}%)`).join(", ")}`;
93
+ return { sufficient, reason, threshold, capped: selection.capped, per_family: perFamily };
94
+ }
95
+ /**
96
+ * Read the bounded signal tier and return profile-relevant signals with a
97
+ * sufficiency assessment. This is the bounded profile-synthesis input: it
98
+ * loads only the signal tier (bounded by construction), never the full-
99
+ * evidence shards. Each signal's `evidence_anchor` resolves to retained full
100
+ * evidence via resolveProfileEvidence.
101
+ */
102
+ export function readProfileSignals(tiersDir, corpusPath, contractPath) {
103
+ const assessment = assessTiers(tiersDir, corpusPath);
104
+ const recovery = recoveryForState(assessment.state);
105
+ const threshold = profileSufficiency(contractPath).minimumFamilyRetention;
106
+ if (!assessment.analyzable) {
107
+ return {
108
+ state: assessment.state,
109
+ tiers_dir: tiersDir,
110
+ signal_path: null,
111
+ signals: [],
112
+ profile_signal_count: 0,
113
+ sufficiency: {
114
+ sufficient: false,
115
+ reason: assessment.state === "missing"
116
+ ? "no evidence tiers published"
117
+ : assessment.state === "legacy"
118
+ ? "legacy monolithic state; refresh required"
119
+ : `tier state ${assessment.state}; ${recovery ?? "recovery unavailable"}`,
120
+ threshold,
121
+ capped: false,
122
+ per_family: [],
123
+ },
124
+ recovery,
125
+ };
126
+ }
127
+ const tier = readSignalTier(tiersDir);
128
+ if (!tier) {
129
+ return {
130
+ state: "corrupt",
131
+ tiers_dir: tiersDir,
132
+ signal_path: null,
133
+ signals: [],
134
+ profile_signal_count: 0,
135
+ sufficiency: {
136
+ sufficient: false,
137
+ reason: "signal tier unreadable or not found",
138
+ threshold,
139
+ capped: false,
140
+ per_family: [],
141
+ },
142
+ recovery,
143
+ };
144
+ }
145
+ const profileSignals = tier.records.filter((s) => PROFILE_TYPES_SET.has(s.signal_type));
146
+ const sufficiency = assessProfileSufficiency(tier.manifest.signal.selection, profileSignals, contractPath);
147
+ return {
148
+ state: assessment.state,
149
+ tiers_dir: tiersDir,
150
+ signal_path: signalTierPath(tiersDir),
151
+ signals: profileSignals,
152
+ profile_signal_count: profileSignals.length,
153
+ sufficiency,
154
+ recovery,
155
+ };
156
+ }
157
+ /**
158
+ * Resolve a synthesized claim's evidence anchor to its retained full-evidence
159
+ * record. Loads only the owning shard, never the whole tier. Returns null
160
+ * when the anchor does not resolve (the claim cannot be checked).
161
+ */
162
+ export function resolveProfileEvidence(anchor, tiersDir) {
163
+ return resolveEvidenceAnchor(anchor, tiersDir);
164
+ }
165
+ /**
166
+ * Lightweight status for profile_context — assesses the tiers, reads the
167
+ * signal tier, and computes sufficiency. The signal records are counted but
168
+ * not returned in the status payload (the synthesis step reads them via
169
+ * readProfileSignals or the signal_path). This status tells the agent
170
+ * whether synthesis can proceed and where to read.
171
+ */
172
+ export function profileSignalsStatus(env = process.env, platform = process.platform, contractPath) {
173
+ const tiersDir = resolveTiersDir(env, platform);
174
+ const corpusPath = corpusPathFromTiersDir(tiersDir);
175
+ const assessment = assessTiers(tiersDir, corpusPath);
176
+ const recovery = recoveryForState(assessment.state);
177
+ if (!assessment.analyzable) {
178
+ return {
179
+ state: assessment.state,
180
+ tiers_dir: tiersDir,
181
+ signal_path: null,
182
+ signal_count: 0,
183
+ profile_signal_count: 0,
184
+ sufficiency: null,
185
+ recovery,
186
+ };
187
+ }
188
+ const tier = readSignalTier(tiersDir);
189
+ if (!tier) {
190
+ return {
191
+ state: "corrupt",
192
+ tiers_dir: tiersDir,
193
+ signal_path: null,
194
+ signal_count: 0,
195
+ profile_signal_count: 0,
196
+ sufficiency: null,
197
+ recovery,
198
+ };
199
+ }
200
+ const profileSignals = tier.records.filter((s) => PROFILE_TYPES_SET.has(s.signal_type));
201
+ const sufficiency = assessProfileSufficiency(tier.manifest.signal.selection, profileSignals, contractPath);
202
+ return {
203
+ state: assessment.state,
204
+ tiers_dir: tiersDir,
205
+ signal_path: signalTierPath(tiersDir),
206
+ signal_count: tier.records.length,
207
+ profile_signal_count: profileSignals.length,
208
+ sufficiency,
209
+ recovery,
210
+ };
211
+ }