agentera 3.0.0-dev.6 → 3.0.0-dev.69
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.
- package/LICENSE +201 -0
- package/README.md +118 -22
- package/bundle/CHANGELOG.md +1361 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +143 -0
- package/bundle/UPGRADE.md +252 -0
- package/bundle/extract-corpus-parity.json +21 -0
- package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
- package/bundle/references/adapters/package-publication.json +488 -0
- package/bundle/references/adapters/package-registry.yaml +435 -188
- package/bundle/references/adapters/package-surface-characterization.md +66 -34
- package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
- package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
- package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
- package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
- package/bundle/references/analysis/verification-policy.yaml +266 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
- package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
- package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
- package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
- package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
- package/bundle/references/cli/routing-model.md +155 -0
- package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
- package/bundle/references/cli/update-channels.yaml +19 -2
- package/bundle/references/cli/vocabulary-index.yaml +20 -17
- package/bundle/references/cli/vocabulary.md +325 -362
- package/bundle/references/meta/retained-reference-authority.yaml +151 -0
- package/bundle/registry.json +13 -13
- package/bundle/skills/agentera/SKILL.md +226 -422
- package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
- package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +103 -0
- package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +8 -6
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +184 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
- package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
- package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
- package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
- package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
- package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
- package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
- package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
- package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
- package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
- package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
- package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
- package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
- package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
- package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
- package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
- package/bundle/skills/agentera/protocol.yaml +31 -31
- package/bundle/skills/agentera/route-phrases.yaml +81 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +461 -36
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +133 -20
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
- package/dist/analytics/extractCorpus/cli.js +101 -12
- package/dist/analytics/extractCorpus/copilotSessions.js +53 -9
- package/dist/analytics/extractCorpus/core.js +59 -24
- package/dist/analytics/extractCorpus/corpus.js +58 -23
- package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
- package/dist/analytics/extractCorpus/cursorSessions.js +12 -7
- package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
- package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
- package/dist/analytics/extractCorpus/index.js +6 -1
- package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
- package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
- package/dist/analytics/extractCorpus/sqliteSessions.js +98 -6
- package/dist/analytics/extractCorpus/tierReader.js +108 -0
- package/dist/analytics/extractCorpus.js +0 -1
- package/dist/analytics/glossaryAdviceResolution.js +166 -0
- package/dist/analytics/glossaryInputAcquisition.js +319 -0
- package/dist/analytics/personalGlossaryAdmission.js +133 -0
- package/dist/analytics/personalGlossaryProfile.js +219 -0
- package/dist/analytics/profileSignals.js +211 -0
- package/dist/analytics/usageStats.js +169 -42
- package/dist/audit/terminologyDrift.js +281 -0
- package/dist/bin/agentera.js +3 -2
- package/dist/capabilities/audit/instructions.js +16 -0
- package/dist/capabilities/build/instructions.js +59 -0
- package/dist/capabilities/design/instructions.js +4 -0
- package/dist/capabilities/discuss/instructions.js +29 -0
- package/dist/capabilities/document/instructions.js +11 -0
- package/dist/capabilities/index.js +29 -27
- package/dist/capabilities/optimize/instructions.js +14 -0
- package/dist/capabilities/orchestrate/instructions.js +42 -0
- package/dist/capabilities/plan/instructions.js +33 -0
- package/dist/capabilities/profile/instructions.js +70 -0
- package/dist/capabilities/research/instructions.js +5 -0
- package/dist/capabilities/status/instructions.js +15 -0
- package/dist/capabilities/status/startupInstructions.js +34 -0
- package/dist/capabilities/vision/instructions.js +4 -0
- package/dist/cli/appContext.js +30 -24
- package/dist/cli/argvalidate.js +0 -1
- package/dist/cli/capabilityContext/benchmark.js +25 -17
- package/dist/cli/capabilityContext/bespoke.js +31 -12
- package/dist/cli/capabilityContext/build.js +251 -0
- package/dist/cli/capabilityContext/closeout.js +33 -30
- package/dist/cli/capabilityContext/contract.js +39 -46
- package/dist/cli/capabilityContext/evidence.js +90 -73
- package/dist/cli/capabilityContext/index.js +1 -2
- package/dist/cli/capabilityContext/orchestration.js +45 -21
- package/dist/cli/capabilityContext/planState.js +93 -100
- package/dist/cli/capabilityContext/progress.js +60 -14
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +9 -20
- package/dist/cli/capabilityContext/slim.js +56 -10
- package/dist/cli/capabilityContext/startup.js +57 -115
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +37 -24
- package/dist/cli/capabilityContext.js +1 -2
- package/dist/cli/commands/appHome.js +22 -0
- package/dist/cli/commands/capability.js +4 -4
- package/dist/cli/commands/compact.js +163 -13
- package/dist/cli/commands/doctor.js +122 -114
- package/dist/cli/commands/durability.js +81 -0
- package/dist/cli/commands/glossaryAdvice.js +138 -0
- package/dist/cli/commands/lint.js +22 -8
- package/dist/cli/commands/personalGlossary.js +176 -0
- package/dist/cli/commands/prime/briefOrientation.js +746 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/bundleStatus.js +190 -0
- package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
- package/dist/cli/commands/prime/collectOrientationState.js +219 -0
- package/dist/cli/commands/prime/orientationOutput.js +421 -0
- package/dist/cli/commands/prime/types.js +1 -0
- package/dist/cli/commands/prime/v1Migration.js +38 -0
- package/dist/cli/commands/prime.js +80 -558
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +77 -52
- package/dist/cli/commands/report.js +88 -26
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +266 -142
- package/dist/cli/commands/state/decisions.js +51 -61
- package/dist/cli/commands/state/docs.js +63 -86
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +11 -64
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +11 -111
- package/dist/cli/commands/state/index.js +6 -41
- package/dist/cli/commands/state/list.js +194 -0
- package/dist/cli/commands/state/objective.js +21 -64
- package/dist/cli/commands/state/plan.js +11 -169
- package/dist/cli/commands/state/planTasks.js +154 -0
- package/dist/cli/commands/state/plans.js +154 -0
- package/dist/cli/commands/state/progress.js +11 -45
- package/dist/cli/commands/state/shared.js +0 -1
- package/dist/cli/commands/state/todo.js +29 -108
- package/dist/cli/commands/state/write.js +433 -0
- package/dist/cli/commands/upgrade.js +146 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +246 -211
- package/dist/cli/commands/verify.js +24 -9
- package/dist/cli/contracts/bundleStatus.js +1 -0
- package/dist/cli/contracts/orientationState.js +1 -0
- package/dist/cli/dispatch/argvParser.js +32 -0
- package/dist/cli/dispatch/check.js +94 -50
- package/dist/cli/dispatch/commands.js +27 -0
- package/dist/cli/dispatch/index.js +82 -52
- package/dist/cli/dispatch/lifecycle.js +268 -108
- package/dist/cli/dispatch/prime.js +68 -29
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +1 -2
- package/dist/cli/dispatch/state.js +68 -77
- package/dist/cli/dispatch.js +0 -1
- package/dist/cli/errors.js +16 -17
- package/dist/cli/help.js +395 -41
- package/dist/cli/migrationRequired.js +122 -0
- package/dist/cli/orientation/attention.js +61 -0
- package/dist/cli/orientation/corpusCoverage.js +102 -0
- package/dist/cli/orientation.js +438 -170
- package/dist/cli/planArtifacts.js +350 -0
- package/dist/cli/planEvidence.js +157 -0
- package/dist/cli/planLifecycleState.js +36 -0
- package/dist/cli/planTaskIndex.js +11 -0
- package/dist/cli/preCutoverCommand.js +32 -0
- package/dist/cli/prime-blob.js +71 -3
- package/dist/cli/profileAcquisition.js +167 -0
- package/dist/cli/startupCompletenessContract.js +59 -0
- package/dist/cli/stateQuery.js +56 -14
- package/dist/cli/structured.js +0 -1
- package/dist/cli/todoMarkdown.js +25 -12
- package/dist/cli/todoReadinessSelection.js +192 -0
- package/dist/cli/todoSeverity.js +18 -0
- package/dist/core/atomicWriter.js +20 -0
- package/dist/core/developmentChannel.js +1 -0
- package/dist/core/developmentInvocation.js +374 -0
- package/dist/core/difflib.js +0 -1
- package/dist/core/envPaths.js +20 -0
- package/dist/core/jsonValue.js +5 -0
- package/dist/core/paths.js +0 -1
- package/dist/core/pyjson.js +67 -3
- package/dist/core/shell.js +4 -0
- package/dist/core/skillIdentity.js +23 -0
- package/dist/core/sourceRoot.js +9 -12
- package/dist/core/text.js +10 -0
- package/dist/core/toml.js +0 -1
- package/dist/core/yaml.js +8 -1
- package/dist/eval/evalSkills.js +30 -26
- package/dist/eval/hybridRouteEvaluation.js +155 -0
- package/dist/eval/semanticEval.js +43 -20
- package/dist/eval/semanticFixtures.js +16 -5
- package/dist/hooks/common.js +3 -56
- package/dist/hooks/compaction/apply.js +252 -50
- package/dist/hooks/compaction/dryRun.js +7 -4
- package/dist/hooks/compaction/index.js +5 -6
- package/dist/hooks/compaction/parse.js +201 -5
- package/dist/hooks/compaction/retention.js +30 -25
- package/dist/hooks/compaction/status.js +149 -32
- package/dist/hooks/compaction/types.js +0 -1
- package/dist/hooks/validateArtifact/agentFacing.js +0 -1
- package/dist/hooks/validateArtifact/index.js +7 -64
- package/dist/hooks/validateArtifact/markdown.js +57 -7
- package/dist/hooks/validateArtifact/schema.js +110 -19
- package/dist/hooks/validateArtifact/traversal.js +13 -11
- package/dist/hooks/validateArtifact/violations.js +7 -5
- package/dist/migrate/v2HandoffManifest.js +127 -8
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +108 -0
- package/dist/registries/artifactProtocolIds.js +2 -1
- package/dist/registries/artifactRegistry.js +224 -63
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +129 -2
- package/dist/registries/evaluatorHandoffContract.js +2 -3
- package/dist/registries/evidenceTierContract.js +371 -0
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryCaveatContract.js +67 -0
- package/dist/registries/glossaryConsumerContractValidation.js +787 -0
- package/dist/registries/glossaryEntryContract.js +757 -0
- package/dist/registries/glossaryTermIdentity.js +17 -0
- package/dist/registries/glossaryTermOccurrence.js +20 -0
- package/dist/registries/hybridRoute.js +274 -0
- package/dist/registries/hybridRouteReceipt.js +221 -0
- package/dist/registries/packagePublication.js +273 -0
- package/dist/registries/packageRegistry.js +187 -211
- package/dist/registries/todoReadinessContract.js +448 -0
- package/dist/registries/triggerLoader.js +174 -0
- package/dist/registries/verbosityBudgetContract.js +205 -0
- package/dist/release/releaseMetadata.js +156 -6
- package/dist/runtime/lifecycleAdapterContract.js +457 -0
- package/dist/runtime/lifecycleAdapters.js +777 -0
- package/dist/runtime/lifecycleAuthority.js +453 -0
- package/dist/runtime/lifecycleOperationContract.js +123 -0
- package/dist/runtime/lifecycleOperations.js +634 -0
- package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
- package/dist/runtime/lifecyclePublication.js +415 -0
- package/dist/runtime/lifecycleSnapshot.js +438 -0
- package/dist/runtime/nativeResourceCleanup.js +502 -0
- package/dist/setup/opencode.js +20 -13
- package/dist/setup/opencodeConstants.js +1 -0
- package/dist/setup/sharedSkill.js +45 -0
- package/dist/setup/smokeChecks.js +21 -82
- package/dist/state/archiveDiscovery.js +580 -0
- package/dist/state/archivePublication.js +225 -0
- package/dist/state/archiveRecovery.js +237 -0
- package/dist/state/archiveReplay.js +53 -0
- package/dist/state/canonicalMigrationRecord.js +36 -0
- package/dist/state/changelog.js +221 -0
- package/dist/state/decisionEntities.js +367 -0
- package/dist/state/decisionLegacyValidation.js +215 -0
- package/dist/state/decisionMigrationProvenance.js +199 -0
- package/dist/state/decisionOverlay.js +254 -0
- package/dist/state/decisionRevision.js +256 -0
- package/dist/state/decisionRevisionMigration.js +89 -0
- package/dist/state/directRetrieval.js +323 -0
- package/dist/state/durability.js +324 -0
- package/dist/state/entityCutover.js +459 -0
- package/dist/state/entityCutoverGit.js +127 -0
- package/dist/state/entityGlossaryAuthority.js +13 -0
- package/dist/state/entityListProjection.js +187 -0
- package/dist/state/entityListRuntimeRegistry.js +85 -0
- package/dist/state/entityMigrationCausality.js +97 -0
- package/dist/state/entityMigrationIdentity.js +5 -0
- package/dist/state/entityMigrationPreview.js +840 -0
- package/dist/state/entityMigrationTodo.js +133 -0
- package/dist/state/entityPublicationContext.js +859 -0
- package/dist/state/entityRetrievalHelp.js +506 -0
- package/dist/state/entityStorage.js +899 -0
- package/dist/state/exactReplacementRecovery.js +18 -0
- package/dist/state/experimentArchive.js +63 -0
- package/dist/state/experimentIdentity.js +202 -0
- package/dist/state/healthEntities.js +262 -0
- package/dist/state/healthEntityValidation.js +18 -0
- package/dist/state/healthRepair.js +69 -0
- package/dist/state/installRoot.js +64 -25
- package/dist/state/legacyEntityCutoverEvidence.js +65 -0
- package/dist/state/legacyIdentity.js +47 -0
- package/dist/state/legacySummaryRecord.js +6 -0
- package/dist/state/listAccounting.js +54 -0
- package/dist/state/listClassification.js +17 -0
- package/dist/state/listCursor.js +42 -0
- package/dist/state/listRetrieval.js +781 -0
- package/dist/state/migrationSourceBinding.js +30 -0
- package/dist/state/objectiveExperimentEntities.js +322 -0
- package/dist/state/planEntities.js +1027 -0
- package/dist/state/planIdentity.js +47 -0
- package/dist/state/planLineageValidation.js +52 -0
- package/dist/state/planReplacementTransaction.js +475 -0
- package/dist/state/planRetrieval.js +313 -0
- package/dist/state/planTaskRetrieval.js +294 -0
- package/dist/state/progressEntities.js +512 -0
- package/dist/state/progressGlossaryCaveat.js +168 -0
- package/dist/state/progressPublicationOrder.js +19 -0
- package/dist/state/progressWritePolicy.js +33 -0
- package/dist/state/projectRoot.js +62 -0
- package/dist/state/projectionPolicy.js +190 -0
- package/dist/state/retrievalAuthority.js +156 -0
- package/dist/state/safeProjectFile.js +155 -0
- package/dist/state/startupAnalysis/benchmark.js +92 -27
- package/dist/state/startupAnalysis/contract.js +48 -10
- package/dist/state/startupAnalysis/helpers.js +27 -73
- package/dist/state/startupAnalysis/index.js +0 -1
- package/dist/state/startupAnalysis/metrics.js +25 -19
- package/dist/state/startupAnalysis/records.js +13 -10
- package/dist/state/startupAnalysis/report.js +26 -38
- package/dist/state/startupAnalysis/threshold.js +19 -7
- package/dist/state/startupAnalysis.js +0 -1
- package/dist/state/startupProjection.js +499 -0
- package/dist/state/stateMode.js +222 -0
- package/dist/state/stateStorageAuthority.js +47 -0
- package/dist/state/summaryEntityRead.js +25 -0
- package/dist/state/summaryMigrationProvenance.js +66 -0
- package/dist/state/summarySourceRowAuthority.js +36 -0
- package/dist/state/todoActivationSafety.js +58 -0
- package/dist/state/todoDocsEntities.js +1124 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +51 -0
- package/dist/state/todoReconciliationActivation.js +182 -0
- package/dist/state/todoReconciliationInspection.js +171 -0
- package/dist/state/todoReconciliationRepair.js +318 -0
- package/dist/state/todoReconciliationTransaction.js +595 -0
- package/dist/state/write/assign.js +20 -0
- package/dist/state/write/candidateMutation.js +269 -0
- package/dist/state/write/errors.js +11 -0
- package/dist/state/write/experimentPublication.js +192 -0
- package/dist/state/write/explain.js +377 -0
- package/dist/state/write/fields.js +61 -0
- package/dist/state/write/glossaryPublication.js +263 -0
- package/dist/state/write/grammar.js +285 -0
- package/dist/state/write/helpers.js +29 -0
- package/dist/state/write/index.js +12 -0
- package/dist/state/write/input.js +391 -0
- package/dist/state/write/lock.js +837 -0
- package/dist/state/write/mutation.js +234 -0
- package/dist/state/write/operations.js +170 -0
- package/dist/state/write/planEvaluation.js +128 -0
- package/dist/state/write/planPublication.js +179 -0
- package/dist/state/write/runtimeOperations.js +146 -0
- package/dist/state/write/serialize.js +1 -0
- package/dist/state/write/transaction.js +57 -0
- package/dist/state/write/validate.js +7 -0
- package/dist/upgrade/appContentRefresh.js +383 -0
- package/dist/upgrade/appModel.js +8 -7
- package/dist/upgrade/atomicWriter.js +1 -0
- package/dist/upgrade/bundleEvidence.js +33 -0
- package/dist/upgrade/channels.js +12 -8
- package/dist/upgrade/compatibility.js +56 -21
- package/dist/upgrade/doctor.js +165 -199
- package/dist/upgrade/doctorClassifier.js +187 -0
- package/dist/upgrade/installedHooksRetirement.js +196 -0
- package/dist/upgrade/legacyAgentCleanup.js +282 -0
- package/dist/upgrade/lifecycleUpgrade.js +113 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +375 -79
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +29 -10
- package/dist/upgrade/npxPlatformStatus.js +22 -0
- package/dist/upgrade/projectIntegration.js +145 -189
- package/dist/upgrade/projectIntegrationDecision.js +50 -0
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +272 -373
- package/dist/upgrade/upgradeCommands.js +14 -1
- package/dist/upgrade/upgradeLock.js +85 -0
- package/dist/upgrade/upgradeOrchestrator.js +263 -59
- package/dist/upgrade/v3CapabilitySurface.js +2 -3
- package/dist/upgrade/versionResolution.js +2 -3
- package/dist/validate/activationArtifactEvidence.js +852 -0
- package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +531 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +2 -8
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +133 -12
- package/dist/validate/crossCapability.js +15 -10
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +39 -45
- package/dist/validate/v1LegacyCruft.js +131 -0
- package/dist/validate/vocabularyAuthority.js +18 -13
- package/package.json +60 -29
- package/bundle/references/adapters/cursor.md +0 -213
- package/bundle/references/adapters/opencode.md +0 -530
- package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
- package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
- package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
- package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
- package/bundle/references/adapters/runtime-feature-parity.md +0 -189
- package/bundle/references/analysis/benchmark.md +0 -267
- package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
- package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
- package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
- package/bundle/references/cli/capability-tool-classification.yaml +0 -53
- package/bundle/references/cli/coexistence-probe.yaml +0 -9
- package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
- package/bundle/references/cli/single-name-protocol.yaml +0 -42
- package/bundle/references/cli/upgrade-repair-wording.md +0 -31
- package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
- package/bundle/references/meta/documentation-inventory.md +0 -49
- package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
- package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
- package/bundle/skills/agentera/agents/hej.toml +0 -6
- package/bundle/skills/agentera/agents/inspektera.toml +0 -6
- package/bundle/skills/agentera/agents/inspirera.toml +0 -6
- package/bundle/skills/agentera/agents/optimera.toml +0 -6
- package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
- package/bundle/skills/agentera/agents/planera.toml +0 -6
- package/bundle/skills/agentera/agents/profilera.toml +0 -6
- package/bundle/skills/agentera/agents/realisera.toml +0 -6
- package/bundle/skills/agentera/agents/resonera.toml +0 -6
- package/bundle/skills/agentera/agents/visionera.toml +0 -6
- package/bundle/skills/agentera/agents/visualisera.toml +0 -6
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
- package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
- package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
- package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
- package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
- package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
- package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
- package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
- package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
- package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
- package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
- package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
- package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
- package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
- package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
- package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
- package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
- package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
- package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
- package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
- package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
- package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
- package/bundle/skills/agentera/references/contract.md +0 -1039
- package/dist/analytics/extractCorpus/cli.js.map +0 -1
- package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/core.js.map +0 -1
- package/dist/analytics/extractCorpus/corpus.js.map +0 -1
- package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
- package/dist/analytics/extractCorpus/index.js.map +0 -1
- package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
- package/dist/analytics/extractCorpus.js.map +0 -1
- package/dist/analytics/usageStats.js.map +0 -1
- package/dist/bin/agentera.js.map +0 -1
- package/dist/capabilities/dokumentera/instructions.js +0 -6
- package/dist/capabilities/dokumentera/instructions.js.map +0 -1
- package/dist/capabilities/hej/instructions.js +0 -6
- package/dist/capabilities/hej/instructions.js.map +0 -1
- package/dist/capabilities/index.js.map +0 -1
- package/dist/capabilities/inspektera/instructions.js +0 -6
- package/dist/capabilities/inspektera/instructions.js.map +0 -1
- package/dist/capabilities/inspirera/instructions.js +0 -6
- package/dist/capabilities/inspirera/instructions.js.map +0 -1
- package/dist/capabilities/optimera/instructions.js +0 -6
- package/dist/capabilities/optimera/instructions.js.map +0 -1
- package/dist/capabilities/orkestrera/instructions.js +0 -6
- package/dist/capabilities/orkestrera/instructions.js.map +0 -1
- package/dist/capabilities/planera/instructions.js +0 -6
- package/dist/capabilities/planera/instructions.js.map +0 -1
- package/dist/capabilities/profilera/instructions.js +0 -6
- package/dist/capabilities/profilera/instructions.js.map +0 -1
- package/dist/capabilities/realisera/instructions.js +0 -6
- package/dist/capabilities/realisera/instructions.js.map +0 -1
- package/dist/capabilities/resonera/instructions.js +0 -6
- package/dist/capabilities/resonera/instructions.js.map +0 -1
- package/dist/capabilities/visionera/instructions.js +0 -6
- package/dist/capabilities/visionera/instructions.js.map +0 -1
- package/dist/capabilities/visualisera/instructions.js +0 -6
- package/dist/capabilities/visualisera/instructions.js.map +0 -1
- package/dist/cli/appContext.js.map +0 -1
- package/dist/cli/argvalidate.js.map +0 -1
- package/dist/cli/capabilityContext/benchmark.js.map +0 -1
- package/dist/cli/capabilityContext/bespoke.js.map +0 -1
- package/dist/cli/capabilityContext/closeout.js.map +0 -1
- package/dist/cli/capabilityContext/contract.js.map +0 -1
- package/dist/cli/capabilityContext/evidence.js.map +0 -1
- package/dist/cli/capabilityContext/index.js.map +0 -1
- package/dist/cli/capabilityContext/orchestration.js.map +0 -1
- package/dist/cli/capabilityContext/planState.js.map +0 -1
- package/dist/cli/capabilityContext/progress.js.map +0 -1
- package/dist/cli/capabilityContext/realisera.js +0 -174
- package/dist/cli/capabilityContext/realisera.js.map +0 -1
- package/dist/cli/capabilityContext/shared.js.map +0 -1
- package/dist/cli/capabilityContext/slim.js.map +0 -1
- package/dist/cli/capabilityContext/startup.js.map +0 -1
- package/dist/cli/capabilityContext/types.js.map +0 -1
- package/dist/cli/capabilityContext.js.map +0 -1
- package/dist/cli/commands/backfill.js +0 -84
- package/dist/cli/commands/backfill.js.map +0 -1
- package/dist/cli/commands/capability.js.map +0 -1
- package/dist/cli/commands/compact.js.map +0 -1
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/lint.js.map +0 -1
- package/dist/cli/commands/prime.js.map +0 -1
- package/dist/cli/commands/query.js.map +0 -1
- package/dist/cli/commands/report.js.map +0 -1
- package/dist/cli/commands/schema.js.map +0 -1
- package/dist/cli/commands/state/decisions.js.map +0 -1
- package/dist/cli/commands/state/docs.js.map +0 -1
- package/dist/cli/commands/state/experiments.js.map +0 -1
- package/dist/cli/commands/state/health.js.map +0 -1
- package/dist/cli/commands/state/index.js.map +0 -1
- package/dist/cli/commands/state/objective.js.map +0 -1
- package/dist/cli/commands/state/plan.js.map +0 -1
- package/dist/cli/commands/state/progress.js.map +0 -1
- package/dist/cli/commands/state/shared.js.map +0 -1
- package/dist/cli/commands/state/todo.js.map +0 -1
- package/dist/cli/commands/state.js +0 -1023
- package/dist/cli/commands/state.js.map +0 -1
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/dispatch/check.js.map +0 -1
- package/dist/cli/dispatch/index.js.map +0 -1
- package/dist/cli/dispatch/lifecycle.js.map +0 -1
- package/dist/cli/dispatch/prime.js.map +0 -1
- package/dist/cli/dispatch/shared.js.map +0 -1
- package/dist/cli/dispatch/state.js.map +0 -1
- package/dist/cli/dispatch.js.map +0 -1
- package/dist/cli/errors.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/orientation.js.map +0 -1
- package/dist/cli/prime-blob.js.map +0 -1
- package/dist/cli/stateQuery.js.map +0 -1
- package/dist/cli/structured.js.map +0 -1
- package/dist/cli/todoMarkdown.js.map +0 -1
- package/dist/core/difflib.js.map +0 -1
- package/dist/core/git.js +0 -43
- package/dist/core/git.js.map +0 -1
- package/dist/core/paths.js.map +0 -1
- package/dist/core/pyjson.js.map +0 -1
- package/dist/core/sourceRoot.js.map +0 -1
- package/dist/core/toml.js.map +0 -1
- package/dist/core/yaml.js.map +0 -1
- package/dist/eval/evalSkills.js.map +0 -1
- package/dist/eval/semanticEval.js.map +0 -1
- package/dist/eval/semanticFixtures.js.map +0 -1
- package/dist/hooks/common.js.map +0 -1
- package/dist/hooks/compaction/apply.js.map +0 -1
- package/dist/hooks/compaction/dryRun.js.map +0 -1
- package/dist/hooks/compaction/index.js.map +0 -1
- package/dist/hooks/compaction/parse.js.map +0 -1
- package/dist/hooks/compaction/retention.js.map +0 -1
- package/dist/hooks/compaction/status.js.map +0 -1
- package/dist/hooks/compaction/types.js.map +0 -1
- package/dist/hooks/compaction.js +0 -935
- package/dist/hooks/compaction.js.map +0 -1
- package/dist/hooks/cursorPreToolUse.js +0 -19
- package/dist/hooks/cursorPreToolUse.js.map +0 -1
- package/dist/hooks/cursorSessionStart.js +0 -71
- package/dist/hooks/cursorSessionStart.js.map +0 -1
- package/dist/hooks/sessionStart.js +0 -209
- package/dist/hooks/sessionStart.js.map +0 -1
- package/dist/hooks/sessionStop.js +0 -203
- package/dist/hooks/sessionStop.js.map +0 -1
- package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
- package/dist/hooks/validateArtifact/index.js.map +0 -1
- package/dist/hooks/validateArtifact/markdown.js.map +0 -1
- package/dist/hooks/validateArtifact/runtime.js +0 -83
- package/dist/hooks/validateArtifact/runtime.js.map +0 -1
- package/dist/hooks/validateArtifact/schema.js.map +0 -1
- package/dist/hooks/validateArtifact/traversal.js.map +0 -1
- package/dist/hooks/validateArtifact/violations.js.map +0 -1
- package/dist/hooks/validateArtifact.js +0 -924
- package/dist/hooks/validateArtifact.js.map +0 -1
- package/dist/migrate/v2HandoffManifest.js.map +0 -1
- package/dist/registries/artifactProtocolIds.js.map +0 -1
- package/dist/registries/artifactRegistry.js.map +0 -1
- package/dist/registries/capabilityContract.js.map +0 -1
- package/dist/registries/evaluatorHandoffContract.js.map +0 -1
- package/dist/registries/packageRegistry.js.map +0 -1
- package/dist/registries/runtimeAdapterRegistry.js +0 -315
- package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
- package/dist/release/releaseMetadata.js.map +0 -1
- package/dist/setup/codex/agents.js +0 -96
- package/dist/setup/codex/agents.js.map +0 -1
- package/dist/setup/codex/cli.js +0 -161
- package/dist/setup/codex/cli.js.map +0 -1
- package/dist/setup/codex/configToml.js +0 -644
- package/dist/setup/codex/configToml.js.map +0 -1
- package/dist/setup/codex/constants.js +0 -29
- package/dist/setup/codex/constants.js.map +0 -1
- package/dist/setup/codex/installRoot.js +0 -64
- package/dist/setup/codex/installRoot.js.map +0 -1
- package/dist/setup/codex/state.js +0 -270
- package/dist/setup/codex/state.js.map +0 -1
- package/dist/setup/codex.js +0 -12
- package/dist/setup/codex.js.map +0 -1
- package/dist/setup/copilot.js +0 -227
- package/dist/setup/copilot.js.map +0 -1
- package/dist/setup/cursor.js +0 -127
- package/dist/setup/cursor.js.map +0 -1
- package/dist/setup/doctor/core.js +0 -300
- package/dist/setup/doctor/core.js.map +0 -1
- package/dist/setup/doctor/diagnostics.js +0 -247
- package/dist/setup/doctor/diagnostics.js.map +0 -1
- package/dist/setup/doctor/opencode.js +0 -281
- package/dist/setup/doctor/opencode.js.map +0 -1
- package/dist/setup/doctor/report.js +0 -474
- package/dist/setup/doctor/report.js.map +0 -1
- package/dist/setup/doctor.js +0 -10
- package/dist/setup/doctor.js.map +0 -1
- package/dist/setup/opencode.js.map +0 -1
- package/dist/setup/smokeChecks.js.map +0 -1
- package/dist/state/installRoot.js.map +0 -1
- package/dist/state/progressCommit.js +0 -289
- package/dist/state/progressCommit.js.map +0 -1
- package/dist/state/startupAnalysis/benchmark.js.map +0 -1
- package/dist/state/startupAnalysis/contract.js.map +0 -1
- package/dist/state/startupAnalysis/helpers.js.map +0 -1
- package/dist/state/startupAnalysis/index.js.map +0 -1
- package/dist/state/startupAnalysis/metrics.js.map +0 -1
- package/dist/state/startupAnalysis/records.js.map +0 -1
- package/dist/state/startupAnalysis/report.js.map +0 -1
- package/dist/state/startupAnalysis/threshold.js.map +0 -1
- package/dist/state/startupAnalysis.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/channels.js.map +0 -1
- package/dist/upgrade/coexistenceProbe.js +0 -83
- package/dist/upgrade/coexistenceProbe.js.map +0 -1
- package/dist/upgrade/compatibility.js.map +0 -1
- package/dist/upgrade/doctor.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
- package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
- package/dist/upgrade/nextMajorDoctor.js.map +0 -1
- package/dist/upgrade/projectIntegration.js.map +0 -1
- package/dist/upgrade/runtimeMigration.js.map +0 -1
- package/dist/upgrade/upgradeCommands.js.map +0 -1
- package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
- package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
- package/dist/upgrade/versionResolution.js.map +0 -1
- package/dist/validate/appHomeContract.js.map +0 -1
- package/dist/validate/capability.js.map +0 -1
- package/dist/validate/crossCapability.js.map +0 -1
- package/dist/validate/lifecycleAdapters.js +0 -772
- package/dist/validate/lifecycleAdapters.js.map +0 -1
- package/dist/validate/selfAudit.js.map +0 -1
- package/dist/validate/vocabularyAuthority.js.map +0 -1
- /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
- /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
- /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ADAPTER_VERSION, COPILOT_SPARSE_REMEDIATION, FAMILIES, MAX_SQLITE_ROWS, MAX_SQLITE_SESSIONS, MAX_TOOL_ARG_TEXT, RUNTIME_STORE_GLOBS, discoverRuntimeStore, } from "./core.js";
|
|
4
|
+
import { buildCorpus } from "./corpus.js";
|
|
5
|
+
import { runCoverageAudit } from "./coverageAudit.js";
|
|
6
|
+
import { extractOpencodeSessions } from "./sqliteSessions.js";
|
|
7
|
+
export const EXTRACT_CORPUS_PARITY_SCHEMA = "agentera-extract-corpus-parity-v1";
|
|
8
|
+
export function buildExtractCorpusParityManifest() {
|
|
9
|
+
return {
|
|
10
|
+
schema_version: EXTRACT_CORPUS_PARITY_SCHEMA,
|
|
11
|
+
adapter_version: ADAPTER_VERSION,
|
|
12
|
+
max_sqlite_sessions: MAX_SQLITE_SESSIONS,
|
|
13
|
+
max_sqlite_rows: MAX_SQLITE_ROWS,
|
|
14
|
+
max_tool_arg_text: MAX_TOOL_ARG_TEXT,
|
|
15
|
+
copilot_sparse_remediation: COPILOT_SPARSE_REMEDIATION,
|
|
16
|
+
runtime_store_globs: { ...RUNTIME_STORE_GLOBS },
|
|
17
|
+
families: [...FAMILIES],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function trackEarliest(current, candidate) {
|
|
21
|
+
if (!candidate)
|
|
22
|
+
return current;
|
|
23
|
+
if (current === null)
|
|
24
|
+
return candidate;
|
|
25
|
+
return candidate < current ? candidate : current;
|
|
26
|
+
}
|
|
27
|
+
function trackLatest(current, candidate) {
|
|
28
|
+
if (!candidate)
|
|
29
|
+
return current;
|
|
30
|
+
if (current === null)
|
|
31
|
+
return candidate;
|
|
32
|
+
return candidate > current ? candidate : current;
|
|
33
|
+
}
|
|
34
|
+
function boundsFromRecords(records) {
|
|
35
|
+
let earliest = null;
|
|
36
|
+
let latest = null;
|
|
37
|
+
for (const item of records) {
|
|
38
|
+
const ts = typeof item.timestamp === "string" ? item.timestamp : null;
|
|
39
|
+
earliest = trackEarliest(earliest, ts);
|
|
40
|
+
latest = trackLatest(latest, ts);
|
|
41
|
+
}
|
|
42
|
+
return { earliest, latest };
|
|
43
|
+
}
|
|
44
|
+
/** Production opencode parity snapshot compared with the generated independent Python oracle. */
|
|
45
|
+
export function opencodeParitySnapshot(dbPath) {
|
|
46
|
+
if (!fs.existsSync(dbPath)) {
|
|
47
|
+
throw new Error(`extract-corpus parity: missing opencode db at ${dbPath}`);
|
|
48
|
+
}
|
|
49
|
+
const audit = runCoverageAudit({
|
|
50
|
+
output: dbPath,
|
|
51
|
+
tierOutput: null,
|
|
52
|
+
projectRoot: [path.dirname(dbPath)],
|
|
53
|
+
codexSessionsDir: path.join(path.dirname(dbPath), "unused-codex"),
|
|
54
|
+
claudeProjectsDir: null,
|
|
55
|
+
opencodeConversationsDir: dbPath,
|
|
56
|
+
copilotConversationsDir: null,
|
|
57
|
+
cursorProjectsDir: null,
|
|
58
|
+
cursorChatsDir: null,
|
|
59
|
+
noCodex: true,
|
|
60
|
+
importSources: [],
|
|
61
|
+
noOpencode: false,
|
|
62
|
+
noCopilot: true,
|
|
63
|
+
noCursor: true,
|
|
64
|
+
acceptCoverageGap: false,
|
|
65
|
+
coverageAuditOnly: false,
|
|
66
|
+
format: "text",
|
|
67
|
+
}, {});
|
|
68
|
+
const coverageEntry = audit.runtimes.find((entry) => entry.runtime === "opencode");
|
|
69
|
+
const coverageProbe = {
|
|
70
|
+
record_count: 0,
|
|
71
|
+
earliest: coverageEntry?.earliest_session ?? null,
|
|
72
|
+
latest: coverageEntry?.latest_session ?? null,
|
|
73
|
+
};
|
|
74
|
+
const errors = [];
|
|
75
|
+
const extracted = extractOpencodeSessions(dbPath, errors);
|
|
76
|
+
const extractionBounds = boundsFromRecords(extracted);
|
|
77
|
+
const extractionProbe = {
|
|
78
|
+
record_count: extracted.length,
|
|
79
|
+
earliest: extractionBounds.earliest,
|
|
80
|
+
latest: extractionBounds.latest,
|
|
81
|
+
};
|
|
82
|
+
const corpus = buildCorpus({
|
|
83
|
+
projectRoots: [],
|
|
84
|
+
codexSessionsDir: null,
|
|
85
|
+
claudeProjectsDir: null,
|
|
86
|
+
opencodeConversationsDir: dbPath,
|
|
87
|
+
});
|
|
88
|
+
const runtimeStatus = corpus.metadata.runtime_statuses.find((status) => status.runtime === "opencode");
|
|
89
|
+
const recordCount = runtimeStatus?.record_count ?? extracted.length;
|
|
90
|
+
const discovery = discoverRuntimeStore("opencode", dbPath);
|
|
91
|
+
const discoveryShape = {
|
|
92
|
+
status: String(discovery.status),
|
|
93
|
+
file_count: typeof discovery.file_count === "number" ? discovery.file_count : null,
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
record_count: recordCount,
|
|
97
|
+
earliest: coverageProbe.earliest,
|
|
98
|
+
latest: coverageProbe.latest,
|
|
99
|
+
probe_shapes: {
|
|
100
|
+
coverage: coverageProbe,
|
|
101
|
+
extraction: extractionProbe,
|
|
102
|
+
discovery: discoveryShape,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -4,10 +4,7 @@ import { resolvePath } from "../../core/paths.js";
|
|
|
4
4
|
import { isPlainObject, isoFromMtime, record, splitLines, } from "./core.js";
|
|
5
5
|
export function extractInstructionDocuments(projectRoots, errors) {
|
|
6
6
|
const records = [];
|
|
7
|
-
const docNames = [
|
|
8
|
-
["AGENTS.md", "agents_md"],
|
|
9
|
-
["CLAUDE.md", "claude_md"],
|
|
10
|
-
];
|
|
7
|
+
const docNames = [["AGENTS.md", "agents_md"]];
|
|
11
8
|
for (const root of projectRoots) {
|
|
12
9
|
for (const [filename, docType] of docNames) {
|
|
13
10
|
const p = path.join(root, filename);
|
|
@@ -119,4 +116,3 @@ export function extractProjectConfigSignals(projectRoots, errors) {
|
|
|
119
116
|
}
|
|
120
117
|
return records;
|
|
121
118
|
}
|
|
122
|
-
//# sourceMappingURL=filesystemSources.js.map
|
|
@@ -5,5 +5,10 @@ export { extractOpencodeSessions, PermissionDeniedError } from "./sqliteSessions
|
|
|
5
5
|
export { extractCopilotSessions } from "./copilotSessions.js";
|
|
6
6
|
export { resolveOpencodeDbPath, resolveCopilotStorePath, resolveCursorProjectsPath, resolveCursorChatsPath, cursorWorkspaceHash, cursorProjectDirSlug, extractCursorSessions, extractCursorAgentSessions, } from "./cursorSessions.js";
|
|
7
7
|
export { ExtractionNotImplementedError, dedupeRecords, buildMetadata, buildCorpus } from "./corpus.js";
|
|
8
|
+
export { formatTruncationWarnings, resolveSqliteCaps, } from "./sqliteCaps.js";
|
|
9
|
+
export { COVERAGE_EXIT_FLAGGED, corpusEnvelopeCoverage, formatCoverageSummaryText, resolveRuntimeStoreConfigs, runCoverageAudit, } from "./coverageAudit.js";
|
|
8
10
|
export { parseExtractArgs, extractCorpusMain } from "./cli.js";
|
|
9
|
-
|
|
11
|
+
export { TIER_SCHEMA_VERSION, CURRENT_POINTER_VERSION, defaultTiersDir, familyOf, deriveSignalRecords, shardFullEvidence, selectSignalsForBound, generationId, publishEvidenceTiers, readCurrentPointer, readCurrentGeneration, readSignalTier, getFullRecord, resolveEvidenceAnchor, evidenceTierCompatibility, iterTierRecords, readTierCorpusMetadata, } from "./evidenceTiers.js";
|
|
12
|
+
export { tiersDirForCorpusPath, resolveTiersDir, isAnalyzable, recoveryForState, assessTiers, readBoundedMetadata, iterBoundedRecords, legacyCorpusReadable, } from "./tierReader.js";
|
|
13
|
+
export { EXTRACT_CORPUS_PARITY_SCHEMA, buildExtractCorpusParityManifest, opencodeParitySnapshot, } from "./extractCorpusParity.js";
|
|
14
|
+
export { readProfileSignals, resolveProfileEvidence, profileSignalsStatus, assessProfileSufficiency, } from "../profileSignals.js";
|
|
@@ -111,7 +111,18 @@ export function extractClaudeProjectSessions(projectsDir, errors) {
|
|
|
111
111
|
const cwd = event.cwd || event.workingDirectory || event.working_directory;
|
|
112
112
|
if (typeof cwd === "string" && cwd)
|
|
113
113
|
projectPath = cwd;
|
|
114
|
-
const toolRecord = toolCallRecord({
|
|
114
|
+
const toolRecord = toolCallRecord({
|
|
115
|
+
event,
|
|
116
|
+
fallbackTimestamp,
|
|
117
|
+
projectPath,
|
|
118
|
+
runtime: null,
|
|
119
|
+
sourceClass: "historical_import",
|
|
120
|
+
sourceProduct: "claude-code",
|
|
121
|
+
activeRuntime: false,
|
|
122
|
+
sourcePath: p,
|
|
123
|
+
index,
|
|
124
|
+
sessionId,
|
|
125
|
+
});
|
|
115
126
|
if (toolRecord !== null) {
|
|
116
127
|
records.push(toolRecord);
|
|
117
128
|
continue;
|
|
@@ -124,7 +135,10 @@ export function extractClaudeProjectSessions(projectsDir, errors) {
|
|
|
124
135
|
event,
|
|
125
136
|
fallbackTimestamp,
|
|
126
137
|
projectPath,
|
|
127
|
-
runtime:
|
|
138
|
+
runtime: null,
|
|
139
|
+
sourceClass: "historical_import",
|
|
140
|
+
sourceProduct: "claude-code",
|
|
141
|
+
activeRuntime: false,
|
|
128
142
|
sourcePath: p,
|
|
129
143
|
index: index * 1000 + contentIndex,
|
|
130
144
|
sessionId,
|
|
@@ -159,7 +173,10 @@ export function extractClaudeProjectSessions(projectsDir, errors) {
|
|
|
159
173
|
sourceKind: "conversation_turn",
|
|
160
174
|
timestamp,
|
|
161
175
|
projectPath,
|
|
162
|
-
runtime:
|
|
176
|
+
runtime: null,
|
|
177
|
+
sourceClass: "historical_import",
|
|
178
|
+
sourceProduct: "claude-code",
|
|
179
|
+
activeRuntime: false,
|
|
163
180
|
sourceParts: [resolvePath(p), index, role, content.slice(0, 80)],
|
|
164
181
|
sessionId,
|
|
165
182
|
data,
|
|
@@ -171,7 +188,10 @@ export function extractClaudeProjectSessions(projectsDir, errors) {
|
|
|
171
188
|
sourceKind: "history_prompt",
|
|
172
189
|
timestamp,
|
|
173
190
|
projectPath,
|
|
174
|
-
runtime:
|
|
191
|
+
runtime: null,
|
|
192
|
+
sourceClass: "historical_import",
|
|
193
|
+
sourceProduct: "claude-code",
|
|
194
|
+
activeRuntime: false,
|
|
175
195
|
sourceParts: [resolvePath(p), index, "history", content.slice(0, 120)],
|
|
176
196
|
sessionId,
|
|
177
197
|
data: { prompt: content, signal_type: sig },
|
|
@@ -182,4 +202,3 @@ export function extractClaudeProjectSessions(projectsDir, errors) {
|
|
|
182
202
|
}
|
|
183
203
|
return records;
|
|
184
204
|
}
|
|
185
|
-
//# sourceMappingURL=jsonlSessions.js.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MAX_SQLITE_ROWS, MAX_SQLITE_SESSIONS, } from "./core.js";
|
|
2
|
+
function parsePositiveCap(value, fallback, label) {
|
|
3
|
+
if (value === undefined || value === "")
|
|
4
|
+
return fallback;
|
|
5
|
+
const parsed = Number.parseInt(value, 10);
|
|
6
|
+
if (!Number.isFinite(parsed) || parsed < 1) {
|
|
7
|
+
throw new Error(`extract-corpus: invalid ${label}: ${value}`);
|
|
8
|
+
}
|
|
9
|
+
return parsed;
|
|
10
|
+
}
|
|
11
|
+
export function resolveSqliteCaps(env = process.env, cliOverrides) {
|
|
12
|
+
return {
|
|
13
|
+
maxSessions: cliOverrides?.maxSessions ??
|
|
14
|
+
parsePositiveCap(env.AGENTERA_EXTRACT_MAX_SQLITE_SESSIONS, MAX_SQLITE_SESSIONS, "max sqlite sessions cap"),
|
|
15
|
+
maxRows: cliOverrides?.maxRows ??
|
|
16
|
+
parsePositiveCap(env.AGENTERA_EXTRACT_MAX_SQLITE_ROWS, MAX_SQLITE_ROWS, "max sqlite rows cap"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function formatTruncationWarnings(runtimeStatuses) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
for (const status of runtimeStatuses) {
|
|
22
|
+
const truncatedAt = status.truncated_at;
|
|
23
|
+
if (typeof truncatedAt !== "string" || !truncatedAt)
|
|
24
|
+
continue;
|
|
25
|
+
const runtime = typeof status.runtime === "string" ? status.runtime : "unknown";
|
|
26
|
+
const cap = typeof status.truncation_cap === "string" ? status.truncation_cap : "cap";
|
|
27
|
+
const limit = status.truncation_limit ?? "?";
|
|
28
|
+
lines.push(` ${runtime}: truncated at ${truncatedAt} (${cap} limit=${limit})`);
|
|
29
|
+
}
|
|
30
|
+
if (lines.length === 0)
|
|
31
|
+
return "";
|
|
32
|
+
return ["SQLite extraction truncated (history beyond cap omitted):", ...lines].join("\n");
|
|
33
|
+
}
|
|
34
|
+
export function applyTruncationToStatus(status, truncation) {
|
|
35
|
+
if (!truncation)
|
|
36
|
+
return status;
|
|
37
|
+
return {
|
|
38
|
+
...status,
|
|
39
|
+
truncated_at: truncation.truncatedAt,
|
|
40
|
+
truncation_cap: truncation.cap,
|
|
41
|
+
truncation_limit: truncation.limit,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { resolvePath } from "../../core/paths.js";
|
|
4
|
-
import {
|
|
4
|
+
import { isoFromMtime, record, signalType, textFromContent, } from "./core.js";
|
|
5
5
|
import { isPlainObject, isFilePath, rglob } from "./core.js";
|
|
6
|
+
import { resolveSqliteCaps, } from "./sqliteCaps.js";
|
|
6
7
|
const requireCjs = createRequire(import.meta.url);
|
|
7
8
|
/** Mirrors Python raising PermissionError on a locked/busy store. */
|
|
8
9
|
export class PermissionDeniedError extends Error {
|
|
@@ -63,7 +64,7 @@ export function qualified(alias, column, label) {
|
|
|
63
64
|
const escaped = column.replace(/"/g, '""');
|
|
64
65
|
return `${alias}."${escaped}" AS ${label}`;
|
|
65
66
|
}
|
|
66
|
-
function
|
|
67
|
+
function resolveOpencodeSchema(conn) {
|
|
67
68
|
const tables = new Set(conn.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((r) => String(r.name)));
|
|
68
69
|
for (const t of ["session", "message", "part"]) {
|
|
69
70
|
if (!tables.has(t)) {
|
|
@@ -96,6 +97,29 @@ function opencodeRows(conn) {
|
|
|
96
97
|
const partId = firstColumn(partCols, ["id", "part_id", "partID"]);
|
|
97
98
|
const sortExpr = `COALESCE(m."${messageTime || messageId}", p."${partTime || partMessage}", s."${sessionTime || sessionId}")`;
|
|
98
99
|
const recentSessionExpr = `s."${sessionUpdated || sessionTime || sessionId}"`;
|
|
100
|
+
return {
|
|
101
|
+
sessionId,
|
|
102
|
+
messageId,
|
|
103
|
+
messageSession,
|
|
104
|
+
partMessage,
|
|
105
|
+
messageData,
|
|
106
|
+
partData,
|
|
107
|
+
roleCol,
|
|
108
|
+
messageTime,
|
|
109
|
+
partTime,
|
|
110
|
+
sessionTime,
|
|
111
|
+
sessionUpdated,
|
|
112
|
+
projectCol,
|
|
113
|
+
messageText,
|
|
114
|
+
partText,
|
|
115
|
+
partType,
|
|
116
|
+
partId,
|
|
117
|
+
sortExpr,
|
|
118
|
+
recentSessionExpr,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function opencodeRows(conn, caps, schema) {
|
|
122
|
+
const { sessionId, messageId, messageSession, partMessage, messageData, partData, roleCol, messageTime, partTime, sessionTime, projectCol, messageText, partText, partType, partId, sortExpr, recentSessionExpr, } = schema;
|
|
99
123
|
const query = `
|
|
100
124
|
WITH recent_sessions AS (
|
|
101
125
|
SELECT s."${sessionId}" AS recent_session_id
|
|
@@ -135,16 +159,81 @@ function opencodeRows(conn) {
|
|
|
135
159
|
FROM recent
|
|
136
160
|
ORDER BY sort_time, message_id, part_id
|
|
137
161
|
`;
|
|
138
|
-
return conn.prepare(query).all(
|
|
162
|
+
return conn.prepare(query).all(caps.maxSessions, caps.maxRows);
|
|
163
|
+
}
|
|
164
|
+
export function probeOpencodeTruncation(conn, caps, fallback) {
|
|
165
|
+
const schema = resolveOpencodeSchema(conn);
|
|
166
|
+
const { sessionId, sessionTime, sessionUpdated, recentSessionExpr } = schema;
|
|
167
|
+
const sessionTimeCol = sessionTime || sessionId;
|
|
168
|
+
const sessionCount = Number(conn.prepare("SELECT COUNT(*) AS c FROM session").get()?.c ?? 0);
|
|
169
|
+
if (sessionCount > caps.maxSessions) {
|
|
170
|
+
const query = `
|
|
171
|
+
SELECT MIN(session_ts) AS truncated_at
|
|
172
|
+
FROM (
|
|
173
|
+
SELECT s."${sessionTimeCol}" AS session_ts
|
|
174
|
+
FROM session s
|
|
175
|
+
ORDER BY ${recentSessionExpr} DESC,
|
|
176
|
+
s."${sessionId}" DESC
|
|
177
|
+
LIMIT -1 OFFSET ?
|
|
178
|
+
)
|
|
179
|
+
`;
|
|
180
|
+
const row = conn.prepare(query).get(caps.maxSessions);
|
|
181
|
+
const truncatedAt = sqliteTimestamp(row?.truncated_at, fallback);
|
|
182
|
+
return { truncatedAt, cap: "sessions", limit: caps.maxSessions };
|
|
183
|
+
}
|
|
184
|
+
const { messageId, messageSession, partMessage, roleCol, messageTime, partTime, messageData, partData, messageText, partText, partType, partId, sortExpr, } = schema;
|
|
185
|
+
const rowCountQuery = `
|
|
186
|
+
WITH recent_sessions AS (
|
|
187
|
+
SELECT s."${sessionId}" AS recent_session_id
|
|
188
|
+
FROM session s
|
|
189
|
+
ORDER BY ${recentSessionExpr} DESC,
|
|
190
|
+
s."${sessionId}" DESC
|
|
191
|
+
LIMIT ?
|
|
192
|
+
)
|
|
193
|
+
SELECT COUNT(*) AS c
|
|
194
|
+
FROM message m
|
|
195
|
+
JOIN session s ON m."${messageSession}" = s."${sessionId}"
|
|
196
|
+
JOIN recent_sessions rs ON rs.recent_session_id = s."${sessionId}"
|
|
197
|
+
LEFT JOIN part p ON p."${partMessage}" = m."${messageId}"
|
|
198
|
+
`;
|
|
199
|
+
const rowCount = Number(conn.prepare(rowCountQuery).get(caps.maxSessions)?.c ?? 0);
|
|
200
|
+
if (rowCount > caps.maxRows) {
|
|
201
|
+
const query = `
|
|
202
|
+
WITH recent_sessions AS (
|
|
203
|
+
SELECT s."${sessionId}" AS recent_session_id
|
|
204
|
+
FROM session s
|
|
205
|
+
ORDER BY ${recentSessionExpr} DESC,
|
|
206
|
+
s."${sessionId}" DESC
|
|
207
|
+
LIMIT ?
|
|
208
|
+
),
|
|
209
|
+
ranked AS (
|
|
210
|
+
SELECT ${sortExpr} AS sort_time
|
|
211
|
+
FROM message m
|
|
212
|
+
JOIN session s ON m."${messageSession}" = s."${sessionId}"
|
|
213
|
+
JOIN recent_sessions rs ON rs.recent_session_id = s."${sessionId}"
|
|
214
|
+
LEFT JOIN part p ON p."${partMessage}" = m."${messageId}"
|
|
215
|
+
ORDER BY sort_time DESC,
|
|
216
|
+
m."${messageId}" DESC,
|
|
217
|
+
p."${partId || partMessage}" DESC
|
|
218
|
+
LIMIT -1 OFFSET ?
|
|
219
|
+
)
|
|
220
|
+
SELECT MIN(sort_time) AS truncated_at FROM ranked
|
|
221
|
+
`;
|
|
222
|
+
const row = conn.prepare(query).get(caps.maxSessions, caps.maxRows);
|
|
223
|
+
const truncatedAt = sqliteTimestamp(row?.truncated_at, fallback);
|
|
224
|
+
return { truncatedAt, cap: "rows", limit: caps.maxRows };
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
139
227
|
}
|
|
140
228
|
function opencodeDbCandidates(storePath) {
|
|
141
229
|
if (isFilePath(storePath))
|
|
142
230
|
return [storePath];
|
|
143
231
|
return rglob(storePath, "opencode.db");
|
|
144
232
|
}
|
|
145
|
-
export function extractOpencodeSessions(storePath, errors) {
|
|
233
|
+
export function extractOpencodeSessions(storePath, errors, ctx) {
|
|
146
234
|
if (storePath === null || !fs.existsSync(storePath))
|
|
147
235
|
return [];
|
|
236
|
+
const caps = ctx?.sqliteCaps ?? resolveSqliteCaps();
|
|
148
237
|
const records = [];
|
|
149
238
|
for (const dbPath of opencodeDbCandidates(storePath).slice(0, 1)) {
|
|
150
239
|
const fallbackTimestamp = isoFromMtime(dbPath);
|
|
@@ -152,7 +241,11 @@ export function extractOpencodeSessions(storePath, errors) {
|
|
|
152
241
|
let conn = null;
|
|
153
242
|
try {
|
|
154
243
|
conn = openSqlite(dbPath);
|
|
155
|
-
|
|
244
|
+
const truncation = probeOpencodeTruncation(conn, caps, fallbackTimestamp);
|
|
245
|
+
if (truncation && ctx)
|
|
246
|
+
ctx.truncation = truncation;
|
|
247
|
+
const schema = resolveOpencodeSchema(conn);
|
|
248
|
+
rows = opencodeRows(conn, caps, schema);
|
|
156
249
|
}
|
|
157
250
|
catch (exc) {
|
|
158
251
|
const msg = exc.message || "";
|
|
@@ -272,4 +365,3 @@ export function extractOpencodeSessions(storePath, errors) {
|
|
|
272
365
|
}
|
|
273
366
|
return records;
|
|
274
367
|
}
|
|
275
|
-
//# sourceMappingURL=sqliteSessions.js.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { compatibilityStates, evidenceTierBounds, } from "../../registries/evidenceTierContract.js";
|
|
4
|
+
import { defaultTiersDir, evidenceTierCompatibility, iterTierRecords, readSignalTier, readTierCorpusMetadata, } from "./evidenceTiers.js";
|
|
5
|
+
/**
|
|
6
|
+
* Bounded tier reader for analytics consumers (plan Task 3).
|
|
7
|
+
*
|
|
8
|
+
* Task 2 publishes bounded full-evidence shards and a bounded signal tier with
|
|
9
|
+
* an atomic generation pointer. This module is the consumer-side surface that
|
|
10
|
+
* projects the contract's compatibility states and recovery guidance, resolves
|
|
11
|
+
* the tiers directory from a corpus path, and exposes bounded reads (full-evidence
|
|
12
|
+
* records one shard at a time; metadata/signal reads without full records). It does
|
|
13
|
+
* not duplicate the tier map, source families, bounds, or compatibility outcomes —
|
|
14
|
+
* those are projected from `evidenceTierContract` and `evidenceTiers`.
|
|
15
|
+
*
|
|
16
|
+
* Consumers preserve their JSON output shape and exit codes. A non-current tier
|
|
17
|
+
* degrades with actionable, contract-projected recovery rather than indefinitely
|
|
18
|
+
* loading an oversized monolithic corpus envelope. `incomplete` is a degrade
|
|
19
|
+
* outcome: consumers analyze available sources and surface the coverage gap, so a
|
|
20
|
+
* host missing some runtimes still gets useful analysis instead of a hard failure.
|
|
21
|
+
*/
|
|
22
|
+
/** A corpus path's co-located tiers directory (`<intermediate>/tiers`). */
|
|
23
|
+
export function tiersDirForCorpusPath(corpusPath) {
|
|
24
|
+
return path.join(path.dirname(corpusPath), "tiers");
|
|
25
|
+
}
|
|
26
|
+
/** Canonical tiers directory for the stats profile. */
|
|
27
|
+
export function resolveTiersDir(env = process.env, platform = process.platform) {
|
|
28
|
+
return defaultTiersDir(env, platform);
|
|
29
|
+
}
|
|
30
|
+
/** Whether a compatibility state still permits analysis of available sources. */
|
|
31
|
+
export function isAnalyzable(state) {
|
|
32
|
+
return state === "current" || state === "incomplete";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Actionable recovery guidance projected from the authority contract for a
|
|
36
|
+
* compatibility state. The contract owns the recovery text; this never
|
|
37
|
+
* duplicates it. Returns `null` for states that proceed (current/incomplete).
|
|
38
|
+
*/
|
|
39
|
+
export function recoveryForState(state) {
|
|
40
|
+
if (state === "current" || state === "incomplete")
|
|
41
|
+
return null;
|
|
42
|
+
const states = compatibilityStates();
|
|
43
|
+
const def = states.find((s) => s.state_id === state);
|
|
44
|
+
return def?.recovery ?? null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Assess the tiers directory against the contract's compatibility states. When a
|
|
48
|
+
* legacy corpus envelope is supplied, a missing tier with an existing envelope
|
|
49
|
+
* surfaces as `legacy` (refresh guidance) rather than a bare missing state.
|
|
50
|
+
*/
|
|
51
|
+
export function assessTiers(tiersDir, corpusPath) {
|
|
52
|
+
const compat = evidenceTierCompatibility(tiersDir, corpusPath);
|
|
53
|
+
const assessment = {
|
|
54
|
+
state: compat.state,
|
|
55
|
+
analyzable: isAnalyzable(compat.state),
|
|
56
|
+
tiersDir,
|
|
57
|
+
corpusPath,
|
|
58
|
+
recovery: recoveryForState(compat.state) ?? undefined,
|
|
59
|
+
};
|
|
60
|
+
if (compat.state === "incomplete")
|
|
61
|
+
assessment.coverageGaps = compat.detail;
|
|
62
|
+
if (compat.state === "oversized")
|
|
63
|
+
assessment.artifact = compat.artifact;
|
|
64
|
+
if (compat.state === "current")
|
|
65
|
+
assessment.generation = compat.generation;
|
|
66
|
+
return assessment;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Read bounded metadata for signal-tier consumers (report status, prime
|
|
70
|
+
* coverage). Reads the manifest and the bounded signal tier only — never the
|
|
71
|
+
* full-evidence shards — so metadata consumers stay bounded at real scale. The
|
|
72
|
+
* signal tier is bounded by construction; a defensively oversized signal tier is
|
|
73
|
+
* reported as null so the caller degrades with the assessment's recovery.
|
|
74
|
+
*/
|
|
75
|
+
export function readBoundedMetadata(tiersDir) {
|
|
76
|
+
const signal = readSignalTier(tiersDir);
|
|
77
|
+
const corpusMetadata = readTierCorpusMetadata(tiersDir);
|
|
78
|
+
const bounds = evidenceTierBounds();
|
|
79
|
+
if (signal && (signal.bytes > bounds.signalByteCap || signal.manifest.signal.bytes > bounds.signalByteCap)) {
|
|
80
|
+
return { corpusMetadata: null, signal: null, manifest: signal.manifest };
|
|
81
|
+
}
|
|
82
|
+
return { corpusMetadata, signal, manifest: signal?.manifest ?? null };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Iterate full-evidence records for the current generation, one bounded shard at
|
|
86
|
+
* a time. Full-record consumers (usage analytics, startup analysis) use this so
|
|
87
|
+
* they never materialize the monolithic corpus envelope. Returns `null` when no
|
|
88
|
+
* current generation exists; callers report the assessment instead.
|
|
89
|
+
*/
|
|
90
|
+
export function iterBoundedRecords(tiersDir) {
|
|
91
|
+
return iterTierRecords(tiersDir);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Legacy fallback: a small monolithic corpus envelope may still be read for
|
|
95
|
+
* backward compatibility when no tiers were published. Oversized legacy state
|
|
96
|
+
* is never loaded whole — it returns `false` so the caller emits refresh guidance.
|
|
97
|
+
*/
|
|
98
|
+
export function legacyCorpusReadable(corpusPath) {
|
|
99
|
+
if (!corpusPath || !fs.existsSync(corpusPath))
|
|
100
|
+
return false;
|
|
101
|
+
const bounds = evidenceTierBounds();
|
|
102
|
+
try {
|
|
103
|
+
return fs.statSync(corpusPath).size <= bounds.readerByteCap;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { glossaryAdviceContract, } from "../registries/glossaryAdviceContract.js";
|
|
2
|
+
import { unicodeCaselessExact } from "../registries/glossaryTermIdentity.js";
|
|
3
|
+
const RECOVERY = {
|
|
4
|
+
invalid_request: "Provide one non-empty bounded requested term and retry advice resolution.",
|
|
5
|
+
invalid_acquisition: "Reacquire bounded glossary inputs and retry advice resolution.",
|
|
6
|
+
invalid_host_review: "Provide one contract-declared relation to a valid acquired personal candidate and retry advice resolution.",
|
|
7
|
+
};
|
|
8
|
+
export class GlossaryAdviceInputError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code) {
|
|
11
|
+
super(RECOVERY[code]);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = "GlossaryAdviceInputError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function hasOnlyKeys(value, expected) {
|
|
17
|
+
const keys = Object.keys(value).sort();
|
|
18
|
+
return (keys.length === expected.length &&
|
|
19
|
+
keys.every((key, index) => key === [...expected].sort()[index]));
|
|
20
|
+
}
|
|
21
|
+
function boundedNonEmpty(value, maxBytes) {
|
|
22
|
+
return (typeof value === "string" &&
|
|
23
|
+
value.trim().length > 0 &&
|
|
24
|
+
Buffer.byteLength(value, "utf8") <= maxBytes);
|
|
25
|
+
}
|
|
26
|
+
function validateEntries(source, owner, maxEntries, maxBytes) {
|
|
27
|
+
if (!Array.isArray(source.entries) || source.entries.length > maxEntries) {
|
|
28
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
29
|
+
}
|
|
30
|
+
const terms = [];
|
|
31
|
+
for (const candidate of source.entries) {
|
|
32
|
+
if (candidate === null ||
|
|
33
|
+
typeof candidate !== "object" ||
|
|
34
|
+
!hasOnlyKeys(candidate, ["term", "meaning", "owner"]) ||
|
|
35
|
+
candidate.owner !== owner ||
|
|
36
|
+
!boundedNonEmpty(candidate.term, maxBytes) ||
|
|
37
|
+
!boundedNonEmpty(candidate.meaning, maxBytes)) {
|
|
38
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
39
|
+
}
|
|
40
|
+
if (terms.some((term) => unicodeCaselessExact(term, candidate.term))) {
|
|
41
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
42
|
+
}
|
|
43
|
+
terms.push(candidate.term);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function validateSource(source, owner, maxEntries, maxBytes, availabilityStates) {
|
|
47
|
+
if (source === null ||
|
|
48
|
+
typeof source !== "object" ||
|
|
49
|
+
!hasOnlyKeys(source, ["owner", "availability", "entries", "gap_proving", "diagnostic"])) {
|
|
50
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
51
|
+
}
|
|
52
|
+
const candidate = source;
|
|
53
|
+
if (candidate.owner !== owner ||
|
|
54
|
+
!availabilityStates.includes(candidate.availability) ||
|
|
55
|
+
typeof candidate.gap_proving !== "boolean") {
|
|
56
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
57
|
+
}
|
|
58
|
+
validateEntries(candidate, owner, maxEntries, maxBytes);
|
|
59
|
+
const valid = ["absent", "valid_empty", "valid_present"].includes(candidate.availability);
|
|
60
|
+
const expectedGap = owner === "project" && ["absent", "valid_empty"].includes(candidate.availability);
|
|
61
|
+
if (valid) {
|
|
62
|
+
const expectedEntryPresence = candidate.availability === "valid_present";
|
|
63
|
+
if (candidate.diagnostic !== null ||
|
|
64
|
+
candidate.gap_proving !== expectedGap ||
|
|
65
|
+
expectedEntryPresence !== candidate.entries.length > 0) {
|
|
66
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const diagnostic = candidate.diagnostic;
|
|
71
|
+
if (candidate.entries.length !== 0 ||
|
|
72
|
+
candidate.gap_proving ||
|
|
73
|
+
diagnostic === null ||
|
|
74
|
+
typeof diagnostic !== "object" ||
|
|
75
|
+
!hasOnlyKeys(diagnostic, ["class", "recovery"]) ||
|
|
76
|
+
diagnostic.class !== candidate.availability ||
|
|
77
|
+
typeof diagnostic.recovery !== "string" ||
|
|
78
|
+
diagnostic.recovery.trim().length === 0) {
|
|
79
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function validateAcquired(acquired, contract) {
|
|
83
|
+
if (acquired === null ||
|
|
84
|
+
typeof acquired !== "object" ||
|
|
85
|
+
!hasOnlyKeys(acquired, ["project", "personal"])) {
|
|
86
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
87
|
+
}
|
|
88
|
+
const candidate = acquired;
|
|
89
|
+
validateSource(candidate.project, "project", contract.maxEntries, contract.maxRequestedTermUtf8Bytes, contract.availabilityStates);
|
|
90
|
+
validateSource(candidate.personal, "personal", contract.maxEntries, contract.maxRequestedTermUtf8Bytes, contract.availabilityStates);
|
|
91
|
+
}
|
|
92
|
+
function exactEntry(entries, requestedTerm) {
|
|
93
|
+
return entries.find((candidate) => unicodeCaselessExact(candidate.term, requestedTerm));
|
|
94
|
+
}
|
|
95
|
+
function validatedHostReview(requestedTerm, personal, hostReview, contract) {
|
|
96
|
+
if (hostReview === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
if (hostReview === null ||
|
|
99
|
+
typeof hostReview !== "object" ||
|
|
100
|
+
!hasOnlyKeys(hostReview, ["relation", "candidate_owner", "candidate_term"])) {
|
|
101
|
+
throw new GlossaryAdviceInputError("invalid_host_review");
|
|
102
|
+
}
|
|
103
|
+
const candidate = hostReview;
|
|
104
|
+
if (!contract.hostReviewRelations.includes(candidate.relation) ||
|
|
105
|
+
!contract.hostReviewCandidateOwners.includes(candidate.candidate_owner) ||
|
|
106
|
+
!boundedNonEmpty(candidate.candidate_term, contract.maxRequestedTermUtf8Bytes) ||
|
|
107
|
+
unicodeCaselessExact(candidate.candidate_term, requestedTerm) ||
|
|
108
|
+
!personal.entries.some((entry) => unicodeCaselessExact(entry.term, candidate.candidate_term))) {
|
|
109
|
+
throw new GlossaryAdviceInputError("invalid_host_review");
|
|
110
|
+
}
|
|
111
|
+
return candidate;
|
|
112
|
+
}
|
|
113
|
+
export function classifyGlossaryAdviceInputs(requestedTerm, acquired, hostReview) {
|
|
114
|
+
const projectExact = exactEntry(acquired.project.entries, requestedTerm);
|
|
115
|
+
const personalExact = exactEntry(acquired.personal.entries, requestedTerm);
|
|
116
|
+
const projectValid = ["absent", "valid_empty", "valid_present"].includes(acquired.project.availability);
|
|
117
|
+
const personalUsable = ["valid_empty", "valid_present"].includes(acquired.personal.availability);
|
|
118
|
+
return {
|
|
119
|
+
project_input: !projectValid ? "invalid" : projectExact ? "valid_exact" : "valid_gap",
|
|
120
|
+
personal_input: personalExact
|
|
121
|
+
? "valid_exact"
|
|
122
|
+
: personalUsable
|
|
123
|
+
? "valid_without_exact"
|
|
124
|
+
: "invalid",
|
|
125
|
+
exact_meaning: projectExact && personalExact
|
|
126
|
+
? projectExact.meaning === personalExact.meaning
|
|
127
|
+
? "equivalent"
|
|
128
|
+
: "divergent"
|
|
129
|
+
: "not_applicable",
|
|
130
|
+
inferred_candidate: hostReview ? "present" : "absent",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function matches(match, state) {
|
|
134
|
+
return Object.entries(state).every(([dimension, value]) => match[dimension]?.includes(value));
|
|
135
|
+
}
|
|
136
|
+
export function resolveGlossaryAdvice(requestedTerm, acquired, hostReview) {
|
|
137
|
+
const contract = glossaryAdviceContract();
|
|
138
|
+
if (!boundedNonEmpty(requestedTerm, contract.maxRequestedTermUtf8Bytes)) {
|
|
139
|
+
throw new GlossaryAdviceInputError("invalid_request");
|
|
140
|
+
}
|
|
141
|
+
validateAcquired(acquired, contract);
|
|
142
|
+
const review = validatedHostReview(requestedTerm, acquired.personal, hostReview, contract);
|
|
143
|
+
const state = classifyGlossaryAdviceInputs(requestedTerm, acquired, review);
|
|
144
|
+
const rows = contract.rows.filter((row) => matches(row.match, state));
|
|
145
|
+
if (rows.length !== 1)
|
|
146
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
147
|
+
const row = rows[0];
|
|
148
|
+
const selectedOwner = row.selectedOwner === "project" || row.selectedOwner === "personal" ? row.selectedOwner : null;
|
|
149
|
+
const selectedEntry = selectedOwner
|
|
150
|
+
? exactEntry(acquired[selectedOwner].entries, requestedTerm)
|
|
151
|
+
: undefined;
|
|
152
|
+
const advisories = contract.advisories.filter((advisory) => advisory.primaryOutcome === row.name && matches(advisory.match, state));
|
|
153
|
+
if (advisories.length > 1)
|
|
154
|
+
throw new GlossaryAdviceInputError("invalid_acquisition");
|
|
155
|
+
const advisory = advisories[0];
|
|
156
|
+
return {
|
|
157
|
+
outcome: row.name,
|
|
158
|
+
applicable_meaning: selectedEntry?.meaning ?? null,
|
|
159
|
+
applicable_owner: selectedOwner,
|
|
160
|
+
review: advisory?.review ?? row.review,
|
|
161
|
+
tension: row.tension,
|
|
162
|
+
advisory: advisory
|
|
163
|
+
? { reason: advisory.caveatReason, ownership_state: advisory.ownershipState }
|
|
164
|
+
: null,
|
|
165
|
+
};
|
|
166
|
+
}
|