agentera 3.0.0-dev.4 → 3.0.0-dev.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +108 -22
- package/bundle/.agentera-npx-bundle.json +1 -1
- package/bundle/CHANGELOG.md +1351 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +143 -0
- package/bundle/UPGRADE.md +236 -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 +437 -0
- package/bundle/references/adapters/package-registry.yaml +434 -189
- package/bundle/references/adapters/package-surface-characterization.md +66 -35
- 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 +191 -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 +2982 -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 +97 -59
- 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 +35 -2
- package/bundle/references/cli/vocabulary-index.yaml +23 -20
- package/bundle/references/cli/vocabulary.md +337 -366
- package/bundle/references/meta/retained-reference-authority.yaml +151 -0
- package/bundle/registry.json +14 -14
- package/bundle/skills/agentera/SKILL.md +218 -408
- 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 +102 -0
- package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -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 +200 -37
- 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 +40 -22
- 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 +421 -33
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
- package/dist/analytics/extractCorpus/cli.js +190 -0
- package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
- package/dist/analytics/extractCorpus/core.js +392 -0
- package/dist/analytics/extractCorpus/corpus.js +167 -0
- package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
- package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
- package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
- package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
- package/dist/analytics/extractCorpus/index.js +14 -0
- package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
- package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
- package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
- package/dist/analytics/extractCorpus/tierReader.js +108 -0
- package/dist/analytics/extractCorpus.js +2 -1791
- 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 +56 -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 +40 -0
- package/dist/capabilities/optimize/instructions.js +14 -0
- package/dist/capabilities/orchestrate/instructions.js +40 -0
- package/dist/capabilities/plan/instructions.js +32 -0
- package/dist/capabilities/profile/instructions.js +70 -0
- package/dist/capabilities/research/instructions.js +5 -0
- package/dist/capabilities/status/instructions.js +11 -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 +565 -0
- package/dist/cli/capabilityContext/bespoke.js +44 -0
- package/dist/cli/capabilityContext/build.js +242 -0
- package/dist/cli/capabilityContext/closeout.js +233 -0
- package/dist/cli/capabilityContext/contract.js +179 -0
- package/dist/cli/capabilityContext/evidence.js +463 -0
- package/dist/cli/capabilityContext/index.js +3 -0
- package/dist/cli/capabilityContext/orchestration.js +131 -0
- package/dist/cli/capabilityContext/planState.js +260 -0
- package/dist/cli/capabilityContext/progress.js +142 -0
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +83 -0
- package/dist/cli/capabilityContext/slim.js +152 -0
- package/dist/cli/capabilityContext/startup.js +150 -0
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +56 -0
- package/dist/cli/capabilityContext.js +1 -2421
- package/dist/cli/commands/appHome.js +22 -0
- package/dist/cli/commands/capability.js +5 -12
- package/dist/cli/commands/compact.js +41 -13
- package/dist/cli/commands/doctor.js +127 -97
- package/dist/cli/commands/durability.js +81 -0
- package/dist/cli/commands/glossaryAdvice.js +138 -0
- package/dist/cli/commands/lint.js +26 -44
- package/dist/cli/commands/personalGlossary.js +176 -0
- package/dist/cli/commands/prime/briefOrientation.js +747 -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 +311 -0
- package/dist/cli/commands/prime/collectOrientationState.js +212 -0
- package/dist/cli/commands/prime/orientationOutput.js +397 -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 +78 -53
- package/dist/cli/commands/report.js +96 -25
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +266 -143
- package/dist/cli/commands/state/decisions.js +387 -0
- package/dist/cli/commands/state/docs.js +70 -0
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +14 -0
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +14 -0
- package/dist/cli/commands/state/index.js +16 -0
- package/dist/cli/commands/state/list.js +194 -0
- package/dist/cli/commands/state/objective.js +25 -0
- package/dist/cli/commands/state/plan.js +14 -0
- 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 +13 -0
- package/dist/cli/commands/state/shared.js +14 -0
- package/dist/cli/commands/state/todo.js +42 -0
- package/dist/cli/commands/state/write.js +434 -0
- package/dist/cli/commands/upgrade.js +146 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +272 -213
- 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 +372 -0
- package/dist/cli/dispatch/commands.js +27 -0
- package/dist/cli/dispatch/index.js +207 -0
- package/dist/cli/dispatch/lifecycle.js +652 -0
- package/dist/cli/dispatch/prime.js +139 -0
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +63 -0
- package/dist/cli/dispatch/state.js +140 -0
- package/dist/cli/dispatch.js +1 -996
- package/dist/cli/errors.js +52 -0
- package/dist/cli/help.js +390 -43
- package/dist/cli/migrationRequired.js +87 -0
- package/dist/cli/orientation/attention.js +59 -0
- package/dist/cli/orientation/corpusCoverage.js +102 -0
- package/dist/cli/orientation.js +444 -173
- 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 +63 -14
- package/dist/cli/structured.js +0 -1
- package/dist/cli/todoMarkdown.js +46 -0
- 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 +11 -81
- package/dist/hooks/compaction/apply.js +446 -0
- package/dist/hooks/compaction/dryRun.js +184 -0
- package/dist/hooks/compaction/index.js +22 -0
- package/dist/hooks/compaction/parse.js +325 -0
- package/dist/hooks/compaction/retention.js +202 -0
- package/dist/hooks/compaction/status.js +360 -0
- package/dist/hooks/compaction/types.js +5 -0
- package/dist/hooks/validateArtifact/agentFacing.js +9 -0
- package/dist/hooks/validateArtifact/index.js +92 -0
- package/dist/hooks/validateArtifact/markdown.js +145 -0
- package/dist/hooks/validateArtifact/schema.js +546 -0
- package/dist/hooks/validateArtifact/traversal.js +107 -0
- package/dist/hooks/validateArtifact/violations.js +107 -0
- package/dist/migrate/v2HandoffManifest.js +452 -0
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +106 -0
- package/dist/registries/artifactProtocolIds.js +78 -0
- package/dist/registries/artifactRegistry.js +224 -63
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +141 -13
- package/dist/registries/evaluatorHandoffContract.js +170 -0
- 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 +229 -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 +385 -0
- 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 -0
- 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 +846 -0
- package/dist/state/entityMigrationTodo.js +133 -0
- package/dist/state/entityPublicationContext.js +806 -0
- package/dist/state/entityRetrievalHelp.js +506 -0
- package/dist/state/entityStorage.js +896 -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 +530 -0
- package/dist/state/planIdentity.js +47 -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/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 +432 -0
- package/dist/state/startupAnalysis/contract.js +160 -0
- package/dist/state/startupAnalysis/helpers.js +286 -0
- package/dist/state/startupAnalysis/index.js +6 -0
- package/dist/state/startupAnalysis/metrics.js +340 -0
- package/dist/state/startupAnalysis/records.js +198 -0
- package/dist/state/startupAnalysis/report.js +111 -0
- package/dist/state/startupAnalysis/threshold.js +512 -0
- package/dist/state/startupAnalysis.js +2 -1953
- package/dist/state/startupProjection.js +499 -0
- package/dist/state/stateMode.js +85 -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/todoDocsEntities.js +1064 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +51 -0
- package/dist/state/todoReconciliationActivation.js +132 -0
- package/dist/state/todoReconciliationInspection.js +173 -0
- package/dist/state/todoReconciliationRepair.js +170 -0
- package/dist/state/todoReconciliationTransaction.js +582 -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 +332 -0
- package/dist/state/write/fields.js +61 -0
- package/dist/state/write/glossaryPublication.js +263 -0
- package/dist/state/write/grammar.js +280 -0
- package/dist/state/write/helpers.js +29 -0
- package/dist/state/write/index.js +12 -0
- package/dist/state/write/input.js +367 -0
- package/dist/state/write/lock.js +837 -0
- package/dist/state/write/mutation.js +234 -0
- package/dist/state/write/operations.js +169 -0
- package/dist/state/write/planEvaluation.js +128 -0
- package/dist/state/write/planPublication.js +179 -0
- package/dist/state/write/runtimeOperations.js +142 -0
- package/dist/state/write/serialize.js +1 -0
- package/dist/state/write/transaction.js +52 -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 +197 -192
- 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 +367 -149
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +155 -0
- package/dist/upgrade/npxPlatformStatus.js +22 -0
- package/dist/upgrade/projectIntegration.js +145 -187
- package/dist/upgrade/projectIntegrationDecision.js +50 -0
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +278 -352
- 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 +14 -0
- package/dist/upgrade/versionResolution.js +12 -5
- package/dist/validate/activationArtifactEvidence.js +844 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +515 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +5 -11
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +144 -15
- package/dist/validate/crossCapability.js +15 -10
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +73 -37
- package/dist/validate/v1LegacyCruft.js +131 -0
- package/dist/validate/vocabularyAuthority.js +303 -0
- package/package.json +53 -27
- 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 -355
- package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
- package/bundle/references/cli/capability-tool-classification.yaml +0 -53
- package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
- package/bundle/references/meta/documentation-inventory.md +0 -43
- package/bundle/references/v1-section-mapping.md +0 -47
- 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/instructions.md +0 -428
- 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/instructions.md +0 -331
- 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/instructions.md +0 -514
- 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/instructions.md +0 -280
- 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/instructions.md +0 -437
- package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
- package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
- 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 -107
- package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
- 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/instructions.md +0 -419
- 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/instructions.md +0 -403
- 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/instructions.md +0 -329
- 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/instructions.md +0 -309
- package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
- package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
- package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
- package/bundle/skills/agentera/references/contract.md +0 -1039
- package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
- package/bundle/skills/hej/SKILL.md +0 -69
- package/bundle/skills/hej/agents/hej.toml +0 -11
- package/bundle/skills/hej/agents/openai.yaml +0 -8
- 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/cli/appContext.js.map +0 -1
- package/dist/cli/argvalidate.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.js +0 -1012
- 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.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/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.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 -212
- package/dist/hooks/sessionStop.js.map +0 -1
- package/dist/hooks/validateArtifact.js +0 -933
- package/dist/hooks/validateArtifact.js.map +0 -1
- package/dist/registries/artifactRegistry.js.map +0 -1
- package/dist/registries/capabilityContract.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/setup/codex.js +0 -1056
- 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.js +0 -1297
- package/dist/setup/doctor.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.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/channels.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 -571
- package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
- package/dist/upgrade/migrateArtifactsV2ToV3.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/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/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,30 @@
|
|
|
1
|
+
import { assertValidatedProjectRoot, validateRealProjectRoot } from "./projectRoot.js";
|
|
2
|
+
import { readProjectFileSnapshot } from "./safeProjectFile.js";
|
|
3
|
+
function projectSource(project, sourcePath) {
|
|
4
|
+
const snapshot = readProjectFileSnapshot(project, sourcePath);
|
|
5
|
+
return snapshot.kind === "file"
|
|
6
|
+
? { kind: "file", bytes: snapshot.bytes.toString("utf8") }
|
|
7
|
+
: snapshot.kind === "missing" ? { kind: "missing" } : { kind: "unsafe", reason: snapshot.reason };
|
|
8
|
+
}
|
|
9
|
+
/** Read one authority-approved provenance source from one pinned project or Git snapshot. */
|
|
10
|
+
export function readBoundMigrationSource(binding, sourcePath) {
|
|
11
|
+
if (binding.kind === "project" || binding.kind === "migration_preview") {
|
|
12
|
+
try {
|
|
13
|
+
const project = typeof binding.projectRoot === "string" ? validateRealProjectRoot(binding.projectRoot) : binding.projectRoot;
|
|
14
|
+
assertValidatedProjectRoot(project);
|
|
15
|
+
return projectSource(project, sourcePath);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return { kind: "unsafe", reason: error.message };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!/^[a-f0-9]{40,64}$/.test(binding.commit))
|
|
22
|
+
return { kind: "unsafe", reason: "Git binding requires an immutable commit ID" };
|
|
23
|
+
try {
|
|
24
|
+
const bytes = binding.readSource(sourcePath);
|
|
25
|
+
return bytes === undefined ? { kind: "missing" } : { kind: "file", bytes };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { kind: "unsafe", reason: `cannot read commit '${binding.commit}': ${error.message}` };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
5
|
+
import { dumpYamlMapping } from "../core/yaml.js";
|
|
6
|
+
import { canonicalRecordJson } from "./archiveDiscovery.js";
|
|
7
|
+
import { StateRetrievalFailure } from "./directRetrieval.js";
|
|
8
|
+
import { allocateEntityId, canonicalEntityRecordViolations, entityExactGetMaxBytes, exactDiscoveredEntityBytes, publishEntityUnderLock, replaceEntityUnderLock, validateEntityDiscovery, validateEntityState, withEntityWriterLock } from "./entityStorage.js";
|
|
9
|
+
import { detectStateModeBinding } from "./stateMode.js";
|
|
10
|
+
import { reject } from "./write/errors.js";
|
|
11
|
+
import { validateArtifactBytes } from "./write/validate.js";
|
|
12
|
+
import { loadStateStorageAuthority } from "./stateStorageAuthority.js";
|
|
13
|
+
import { entityListSelectorFlags, entityListSelectorKey, projectEntityList, resolveEntityListSelector } from "./entityListProjection.js";
|
|
14
|
+
import { shellQuoteArgument } from "../core/shell.js";
|
|
15
|
+
const OBJECTIVE_ARTIFACT = "objective";
|
|
16
|
+
const EXPERIMENT_ARTIFACT = "experiments";
|
|
17
|
+
const OBJECTIVE = "objective";
|
|
18
|
+
const EXPERIMENT = "experiment";
|
|
19
|
+
const ID = /^[a-z]{10}$/;
|
|
20
|
+
const ACTIVE = new Set(["open", "active"]);
|
|
21
|
+
const OBJECTIVE_ORDER = "created_desc_then_id_asc";
|
|
22
|
+
const EXPERIMENT_ORDER = "date_desc_then_id_asc";
|
|
23
|
+
function mapping(value) { return value !== null && typeof value === "object" && !Array.isArray(value); }
|
|
24
|
+
function relative(root, file) { return path.relative(path.resolve(root), file).split(path.sep).join("/"); }
|
|
25
|
+
function contract(boundary, sourceRoot = resolveSourceRoot()) {
|
|
26
|
+
const { authorityPath, document: authority } = loadStateStorageAuthority(sourceRoot);
|
|
27
|
+
const target = mapping(authority.entity_target) ? authority.entity_target : {};
|
|
28
|
+
const storage = mapping(target.storage_boundary) && mapping(target.storage_boundary.shared_primitives) ? target.storage_boundary.shared_primitives : {};
|
|
29
|
+
const definition = (Array.isArray(target.entities) ? target.entities : []).find((value) => mapping(value) && value.boundary === boundary);
|
|
30
|
+
const retrieval = mapping(definition) && mapping(definition.retrieval) ? definition.retrieval : {};
|
|
31
|
+
const positive = (value, name) => { const result = Number(value); if (!Number.isSafeInteger(result) || result < 1)
|
|
32
|
+
throw new Error(`invalid ${boundary} ${name} authority`); return result; };
|
|
33
|
+
if (typeof storage.canonical_root !== "string")
|
|
34
|
+
throw new Error(`invalid entity authority '${authorityPath}'`);
|
|
35
|
+
return { authorityPath, entityRoot: storage.canonical_root, defaultLimit: positive(retrieval.default_limit, "default_limit"), maximumLimit: positive(retrieval.maximum_limit, "maximum_limit"), maxUtf8Bytes: positive(retrieval.max_utf8_bytes, "max_utf8_bytes") };
|
|
36
|
+
}
|
|
37
|
+
function failure(kind, artifact, message, recovery, id, exitCode = 1) {
|
|
38
|
+
return new StateRetrievalFailure({ schemaVersion: "agentera.stateFailure.v1", status: "fail", error: { class: kind, message, syntax: `agentera state ${artifact} get --id ID --format json`, example: `agentera state ${artifact} get --id ${id ?? "qjtrmnpvka"} --format json`, recovery, artifact, ...(id ? { id } : {}) } }, exitCode);
|
|
39
|
+
}
|
|
40
|
+
function relevant(root, sourceRoot, precomputed) {
|
|
41
|
+
const discovery = precomputed
|
|
42
|
+
? validateEntityDiscovery(root, sourceRoot, precomputed)
|
|
43
|
+
: validateEntityState(root, sourceRoot);
|
|
44
|
+
const graphIssue = discovery.issues.find((issue) => issue.artifact === OBJECTIVE_ARTIFACT || issue.artifact === EXPERIMENT_ARTIFACT || issue.boundary === OBJECTIVE || issue.boundary === EXPERIMENT);
|
|
45
|
+
if (graphIssue)
|
|
46
|
+
throw failure(graphIssue.code === "duplicate_id" ? "ambiguous" : "corrupt", graphIssue.artifact ?? OBJECTIVE_ARTIFACT, graphIssue.message, graphIssue.recovery, graphIssue.id);
|
|
47
|
+
const entities = discovery.entities.filter(({ artifact, boundary }) => artifact === OBJECTIVE_ARTIFACT || artifact === EXPERIMENT_ARTIFACT || boundary === OBJECTIVE || boundary === EXPERIMENT);
|
|
48
|
+
const bad = entities.find(({ classification, id, record }) => classification !== "valid" || !id || !record);
|
|
49
|
+
if (bad)
|
|
50
|
+
throw failure(bad.classification === "duplicate" ? "ambiguous" : "corrupt", bad.artifact ?? EXPERIMENT_ARTIFACT, `entity '${bad.relativePath}' is not canonical`, "Run agentera check validate state and resolve the reported identity or ownership conflict.", bad.id ?? undefined);
|
|
51
|
+
return entities;
|
|
52
|
+
}
|
|
53
|
+
function objectiveStatus(entity) { return String(mapping(entity.record?.header) ? entity.record.header["status"] ?? "" : ""); }
|
|
54
|
+
function selectObjective(entities, requested) {
|
|
55
|
+
if (requested !== undefined && !ID.test(requested))
|
|
56
|
+
throw failure("invalid_request", OBJECTIVE_ARTIFACT, `objective ID '${requested}' must be ten lowercase letters`, "Use a bare objective ID returned by objective create or list.", requested, 2);
|
|
57
|
+
const objectives = entities.filter(({ boundary }) => boundary === OBJECTIVE);
|
|
58
|
+
if (requested) {
|
|
59
|
+
const matches = objectives.filter(({ id }) => id === requested);
|
|
60
|
+
if (matches.length !== 1)
|
|
61
|
+
throw failure(matches.length ? "ambiguous" : "not_found", OBJECTIVE_ARTIFACT, matches.length ? `objective ID '${requested}' has conflicting ownership` : `objective ID '${requested}' was not found`, "Run agentera state objective list --format json and select one canonical objective ID.", requested);
|
|
62
|
+
return matches[0];
|
|
63
|
+
}
|
|
64
|
+
const active = objectives.filter((entity) => ACTIVE.has(objectiveStatus(entity)));
|
|
65
|
+
if (active.length === 1)
|
|
66
|
+
return active[0];
|
|
67
|
+
if (!active.length)
|
|
68
|
+
throw failure("not_found", OBJECTIVE_ARTIFACT, "no active objective exists", "Create an objective or select one explicitly with --id.");
|
|
69
|
+
throw failure("ambiguous", OBJECTIVE_ARTIFACT, `multiple active objectives require an explicit ID: ${active.map(({ id }) => id).sort().join(", ")}`, "Run agentera state objective list --format json and retry with --id ID.");
|
|
70
|
+
}
|
|
71
|
+
function experimentById(entities, id, objective) {
|
|
72
|
+
if (!ID.test(id))
|
|
73
|
+
throw failure("invalid_request", EXPERIMENT_ARTIFACT, `experiment ID '${id}' must be ten lowercase letters`, "Use a bare experiment ID returned by publish or list.", id, 2);
|
|
74
|
+
const matches = entities.filter((entity) => entity.boundary === EXPERIMENT && entity.id === id);
|
|
75
|
+
if (matches.length !== 1)
|
|
76
|
+
throw failure(matches.length ? "ambiguous" : "not_found", EXPERIMENT_ARTIFACT, matches.length ? `experiment ID '${id}' has conflicting ownership` : `experiment ID '${id}' was not found`, "Run agentera check validate state, or list experiments and retry with one canonical ID.", id);
|
|
77
|
+
if (objective && matches[0].record?.objective !== objective)
|
|
78
|
+
throw failure("not_found", EXPERIMENT_ARTIFACT, `experiment ID '${id}' does not belong to objective '${objective}'`, "List experiments for the selected objective and retry.", id);
|
|
79
|
+
return matches[0];
|
|
80
|
+
}
|
|
81
|
+
function objectiveViolations(record, sourceRoot) {
|
|
82
|
+
const header = mapping(record.header) ? record.header : {};
|
|
83
|
+
const objective = mapping(record.objective) ? record.objective : {};
|
|
84
|
+
const metric = mapping(record.metric) ? record.metric : {};
|
|
85
|
+
const baseline = mapping(record.baseline) ? record.baseline : {};
|
|
86
|
+
const scope = mapping(record.scope) ? record.scope : {};
|
|
87
|
+
const violations = canonicalEntityRecordViolations(OBJECTIVE, record, sourceRoot);
|
|
88
|
+
if (typeof header.title !== "string" || !header.title.trim())
|
|
89
|
+
violations.push("header.title is required");
|
|
90
|
+
if (!ACTIVE.has(String(header["status"])) && header["status"] !== "closed")
|
|
91
|
+
violations.push("objective lifecycle must be open, active, or closed");
|
|
92
|
+
for (const [name, value] of [["objective.description", objective.description], ["objective.measurement", objective.measurement], ["metric.description", metric.description], ["metric.direction", metric.direction], ["metric.unit", metric.unit], ["baseline.description", baseline.description]])
|
|
93
|
+
if (typeof value !== "string" || !value.trim())
|
|
94
|
+
violations.push(`${name} is required`);
|
|
95
|
+
if (!Array.isArray(scope.included) || !scope.included.length || !Array.isArray(scope.excluded))
|
|
96
|
+
violations.push("scope.included and scope.excluded are required");
|
|
97
|
+
if (mapping(record.header) && record.header.id !== undefined)
|
|
98
|
+
violations.push("header.id is forbidden in a canonical objective record");
|
|
99
|
+
return [...new Set(violations)];
|
|
100
|
+
}
|
|
101
|
+
function experimentViolations(record) {
|
|
102
|
+
const candidate = structuredClone(record);
|
|
103
|
+
delete candidate.objective;
|
|
104
|
+
candidate.number = 0;
|
|
105
|
+
const violations = validateArtifactBytes(EXPERIMENT_ARTIFACT, dumpYamlMapping({ experiments: [candidate] }));
|
|
106
|
+
if (!/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(String(record.date ?? "")))
|
|
107
|
+
violations.push("date must be YYYY-MM-DD HH:MM");
|
|
108
|
+
if (!["baseline", "kept", "discarded"].includes(String(record.status)))
|
|
109
|
+
violations.push("status must be baseline, kept, or discarded");
|
|
110
|
+
for (const field of ["id", "artifact", "number", "experiment_number", "stable_id", "objective_id"])
|
|
111
|
+
if (record[field] !== undefined)
|
|
112
|
+
violations.push(`${field} is forbidden in an experiment entity record`);
|
|
113
|
+
return [...new Set(violations)];
|
|
114
|
+
}
|
|
115
|
+
function assertValidState(root, sourceRoot) { const state = validateEntityState(root, sourceRoot); if (!state.valid)
|
|
116
|
+
reject({ class: "conflict", message: `canonical entity state is invalid: ${state.issues.map(({ message }) => message).join("; ")}`, recovery: "Run agentera check validate state and resolve every identity, relationship, or baseline conflict before retrying; no state was changed." }); }
|
|
117
|
+
function assertBaseline(entities, objective, candidate) {
|
|
118
|
+
const records = entities.filter((entity) => entity.boundary === EXPERIMENT && entity.record?.objective === objective).map((entity) => entity.record);
|
|
119
|
+
if (candidate)
|
|
120
|
+
records.push(candidate);
|
|
121
|
+
const count = records.filter((record) => record.status === "baseline").length;
|
|
122
|
+
if (records.length && count !== 1)
|
|
123
|
+
reject({ class: "conflict", message: `objective '${objective}' requires exactly one experiment with status baseline; found ${count}`, recovery: count ? "Keep one immutable baseline and resolve competing baseline ownership before retrying; no state was changed." : "Publish the baseline experiment first with status baseline; no state was changed." });
|
|
124
|
+
}
|
|
125
|
+
function envelope(command, entity, artifact, record, dryRun) { return { schemaVersion: "agentera.stateWrite.v1", command, status: "pass", path: entity.path, id: entity.id, artifact, record, operation: { verb: command.split(" ").at(-1), dry_run: dryRun, idempotent_replay: entity.replay }, validation: { status: "pass", violations: [] } }; }
|
|
126
|
+
function entityPath(root, sourceRoot, artifact, boundary, id) { return path.join(root, contract(boundary, sourceRoot).entityRoot, artifact, boundary, `${id}.yaml`); }
|
|
127
|
+
export function mutateObjectiveEntity(req, options = {}) {
|
|
128
|
+
const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
|
|
129
|
+
const input = structuredClone(req.input ?? {});
|
|
130
|
+
const violations = objectiveViolations(input, sourceRoot);
|
|
131
|
+
if (violations.length)
|
|
132
|
+
reject({ class: "schema_violation", message: "objective entity input is invalid", violations });
|
|
133
|
+
if (!options.publicationContext) {
|
|
134
|
+
const binding = detectStateModeBinding(req.projectRoot, sourceRoot);
|
|
135
|
+
if (binding.mode !== "entities")
|
|
136
|
+
throw new Error("objective entity mutation requires the durable entity-mode marker");
|
|
137
|
+
try {
|
|
138
|
+
return mutateObjectiveEntity(req, { ...options, publicationContext: binding.publicationContext });
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
binding.publicationContext.close();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const context = options.publicationContext;
|
|
145
|
+
return withEntityWriterLock(context, () => {
|
|
146
|
+
assertValidState(context.pinnedPath(), sourceRoot);
|
|
147
|
+
const entities = relevant(context.pinnedPath(), sourceRoot);
|
|
148
|
+
if (req.spec.verb === "create") {
|
|
149
|
+
const id = allocateEntityId(context.pinnedPath(), options.candidate, sourceRoot);
|
|
150
|
+
if (req.dryRun)
|
|
151
|
+
return envelope("state objective create", { id, path: entityPath(req.projectRoot, sourceRoot, OBJECTIVE_ARTIFACT, OBJECTIVE, id), replay: false }, OBJECTIVE_ARTIFACT, input, true);
|
|
152
|
+
let published;
|
|
153
|
+
try {
|
|
154
|
+
const result = publishEntityUnderLock({ projectRoot: req.projectRoot, sourceRoot, publicationContext: context, artifact: OBJECTIVE_ARTIFACT, boundary: OBJECTIVE, id, record: input });
|
|
155
|
+
published = result;
|
|
156
|
+
assertValidState(context.pinnedPath(), sourceRoot);
|
|
157
|
+
context.assertValid();
|
|
158
|
+
return envelope("state objective create", result, OBJECTIVE_ARTIFACT, input, false);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (published?.publishedIdentity)
|
|
162
|
+
context.removeExact(relative(req.projectRoot, published.path), published.publishedIdentity, false);
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const objective = selectObjective(entities, String(req.values.id ?? ""));
|
|
167
|
+
if (canonicalRecordJson(input) === canonicalRecordJson(objective.record))
|
|
168
|
+
return envelope("state objective update", { id: objective.id, path: objective.path, replay: true }, OBJECTIVE_ARTIFACT, input, req.dryRun);
|
|
169
|
+
if (req.dryRun)
|
|
170
|
+
return envelope("state objective update", { id: objective.id, path: objective.path, replay: false }, OBJECTIVE_ARTIFACT, input, true);
|
|
171
|
+
const request = { projectRoot: req.projectRoot, sourceRoot, publicationContext: context, artifact: OBJECTIVE_ARTIFACT, boundary: OBJECTIVE, id: objective.id, expectedRecord: objective.record, expectedBytes: exactDiscoveredEntityBytes(objective), migrationProvenance: objective.migrationProvenance, record: input };
|
|
172
|
+
let replacement;
|
|
173
|
+
try {
|
|
174
|
+
const result = replaceEntityUnderLock(request);
|
|
175
|
+
replacement = result;
|
|
176
|
+
assertValidState(context.pinnedPath(), sourceRoot);
|
|
177
|
+
context.assertValid();
|
|
178
|
+
return envelope("state objective update", result, OBJECTIVE_ARTIFACT, input, false);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (replacement?.publishedIdentity && replacement.previousBytes !== undefined)
|
|
182
|
+
context.restoreExact(relative(req.projectRoot, replacement.path), replacement.publishedIdentity, replacement.previousBytes, entityExactGetMaxBytes(sourceRoot));
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
export function publishExperimentEntity(req, options = {}) {
|
|
188
|
+
const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
|
|
189
|
+
const raw = structuredClone(req.input ?? {});
|
|
190
|
+
const inputViolations = experimentViolations({ ...raw, objective: "qjtrmnpvka" });
|
|
191
|
+
if (inputViolations.length)
|
|
192
|
+
reject({ class: "schema_violation", message: "experiment entity input is invalid", violations: inputViolations });
|
|
193
|
+
if (!options.publicationContext) {
|
|
194
|
+
const binding = detectStateModeBinding(req.projectRoot, sourceRoot);
|
|
195
|
+
if (binding.mode !== "entities")
|
|
196
|
+
throw new Error("experiment entity publication requires the durable entity-mode marker");
|
|
197
|
+
try {
|
|
198
|
+
return publishExperimentEntity(req, { ...options, publicationContext: binding.publicationContext });
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
binding.publicationContext.close();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const context = options.publicationContext;
|
|
205
|
+
return withEntityWriterLock(context, () => {
|
|
206
|
+
assertValidState(context.pinnedPath(), sourceRoot);
|
|
207
|
+
const entities = relevant(context.pinnedPath(), sourceRoot);
|
|
208
|
+
const objective = selectObjective(entities, String(req.values.objective ?? ""));
|
|
209
|
+
const record = { ...raw, objective: objective.id };
|
|
210
|
+
const requested = req.values.id === undefined ? undefined : String(req.values.id);
|
|
211
|
+
if (requested) {
|
|
212
|
+
const existing = experimentById(entities, requested, objective.id);
|
|
213
|
+
if (canonicalRecordJson(existing.record) !== canonicalRecordJson(record))
|
|
214
|
+
reject({ class: "conflict", message: `divergent content for immutable experiment ID '${requested}'; no state was changed` });
|
|
215
|
+
return envelope("state experiments publish", { id: requested, path: existing.path, replay: true }, EXPERIMENT_ARTIFACT, record, req.dryRun);
|
|
216
|
+
}
|
|
217
|
+
assertBaseline(entities, objective.id, record);
|
|
218
|
+
const id = allocateEntityId(context.pinnedPath(), options.candidate, sourceRoot);
|
|
219
|
+
if (req.dryRun)
|
|
220
|
+
return envelope("state experiments publish", { id, path: entityPath(req.projectRoot, sourceRoot, EXPERIMENT_ARTIFACT, EXPERIMENT, id), replay: false }, EXPERIMENT_ARTIFACT, record, true);
|
|
221
|
+
let published;
|
|
222
|
+
try {
|
|
223
|
+
const result = publishEntityUnderLock({ projectRoot: req.projectRoot, sourceRoot, publicationContext: context, artifact: EXPERIMENT_ARTIFACT, boundary: EXPERIMENT, id, record });
|
|
224
|
+
published = result;
|
|
225
|
+
assertValidState(context.pinnedPath(), sourceRoot);
|
|
226
|
+
assertBaseline(relevant(context.pinnedPath(), sourceRoot), objective.id);
|
|
227
|
+
context.assertValid();
|
|
228
|
+
return envelope("state experiments publish", result, EXPERIMENT_ARTIFACT, record, false);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (published?.publishedIdentity)
|
|
232
|
+
context.removeExact(relative(req.projectRoot, published.path), published.publishedIdentity, false);
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function entry(root, entity) { return { id: entity.id, artifact: entity.artifact, record: entity.record, provenance: { storage: "canonical_entity_file", path: relative(root, entity.path), immutable: entity.boundary === EXPERIMENT } }; }
|
|
238
|
+
function snapshot(root, entities) { return createHash("sha256").update(canonicalRecordJson(entities.map((entity) => ({ id: entity.id, boundary: entity.boundary, path: relative(root, entity.path), record: entity.record })).sort((a, b) => canonicalRecordJson(a).localeCompare(canonicalRecordJson(b))))).digest("hex"); }
|
|
239
|
+
function secret(root, authorityPath) { return createHash("sha256").update(path.resolve(root)).update("\0").update(fs.readFileSync(authorityPath)).digest(); }
|
|
240
|
+
function encode(value, root, authorityPath) { const bytes = Buffer.from(canonicalRecordJson(value)); return `${bytes.toString("base64url")}.${createHmac("sha256", secret(root, authorityPath)).update(bytes).digest("base64url")}`; }
|
|
241
|
+
function decode(token, root, authorityPath, artifact) { try {
|
|
242
|
+
const [body, signature, extra] = token.split(".");
|
|
243
|
+
if (!body || !signature || extra)
|
|
244
|
+
throw new Error();
|
|
245
|
+
const bytes = Buffer.from(body, "base64url");
|
|
246
|
+
const supplied = Buffer.from(signature, "base64url");
|
|
247
|
+
const expected = createHmac("sha256", secret(root, authorityPath)).update(bytes).digest();
|
|
248
|
+
if (supplied.length !== expected.length || !timingSafeEqual(supplied, expected))
|
|
249
|
+
throw new Error();
|
|
250
|
+
const value = JSON.parse(bytes.toString());
|
|
251
|
+
if (!mapping(value))
|
|
252
|
+
throw new Error();
|
|
253
|
+
return value;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
throw failure("cursor_invalid", artifact, `${artifact} cursor is malformed or belongs to another project`, "Copy next_cursor exactly, or omit --cursor to restart.");
|
|
257
|
+
} }
|
|
258
|
+
function boundedList(root, sourceRoot, artifact, boundary, selected, all, limit, cursor, order, filter, format = "json", selectorInput) {
|
|
259
|
+
const declared = contract(boundary, sourceRoot);
|
|
260
|
+
const take = limit ?? declared.defaultLimit;
|
|
261
|
+
if (!Number.isSafeInteger(take) || take < 1 || take > declared.maximumLimit)
|
|
262
|
+
throw failure("invalid_request", artifact, `${artifact} list limit must be 1..${declared.maximumLimit}`, "Use a limit in the declared range.", undefined, 2);
|
|
263
|
+
const projectionOptions = { family: artifact, artifact, boundary, format, maxUtf8Bytes: declared.maxUtf8Bytes, selector: selectorInput };
|
|
264
|
+
const selector = resolveEntityListSelector(selectorInput, selected.map((entity) => entry(root, entity)), projectionOptions);
|
|
265
|
+
const selectorKey = entityListSelectorKey(selector);
|
|
266
|
+
const snap = snapshot(root, all);
|
|
267
|
+
let start = 0;
|
|
268
|
+
if (cursor) {
|
|
269
|
+
const value = decode(cursor, root, declared.authorityPath, artifact);
|
|
270
|
+
if (value.selector !== selectorKey)
|
|
271
|
+
throw failure("cursor_invalid", artifact, `${artifact} cursor selectors do not match this request`, "Repeat the original selector, or omit --cursor to restart from current state.");
|
|
272
|
+
if (value.snapshot_id !== snap || value.order !== order || canonicalRecordJson(value.filter) !== canonicalRecordJson(filter))
|
|
273
|
+
throw failure("cursor_snapshot_unavailable", artifact, `${artifact} state or filters changed after this cursor snapshot`, "Repeat the original filters, or omit --cursor to restart from current state.");
|
|
274
|
+
const found = selected.findIndex(({ id }) => id === value.after);
|
|
275
|
+
if (found < 0)
|
|
276
|
+
throw failure("cursor_snapshot_unavailable", artifact, `${artifact} cursor continuation is unavailable`, "Omit --cursor to restart.");
|
|
277
|
+
start = found + 1;
|
|
278
|
+
}
|
|
279
|
+
const page = selected.slice(start, start + take);
|
|
280
|
+
const remaining = selected.length - start - page.length;
|
|
281
|
+
const next = remaining && page.length ? encode({ snapshot_id: snap, order, filter, selector: selectorKey, after: page.at(-1).id }, root, declared.authorityPath) : undefined;
|
|
282
|
+
const listCommand = `state ${artifact} list`;
|
|
283
|
+
const filterFlags = `${filter.objective ? ` --objective ${shellQuoteArgument(filter.objective)}` : ""}${filter.topic ? ` --topic ${shellQuoteArgument(filter.topic)}` : ""}${filter.status ? ` --status ${shellQuoteArgument(filter.status)}` : ""}`;
|
|
284
|
+
const selectorFlags = entityListSelectorFlags(selector);
|
|
285
|
+
const response = { schemaVersion: "agentera.stateList.v1", command: listCommand, status: remaining ? "degraded" : "ok", entries: page.map((entity) => entry(root, entity)), counts: { total: selected.length, returned: page.length, remaining }, order, filters: filter, snapshot: { id: snap, first_page: !cursor, has_more: Boolean(remaining), candidate_count: selected.length }, source: { artifact, authority: "canonical_entity_files", root: declared.entityRoot }, source_contract: { authority: "references/artifacts/state-storage-authority.yaml", detail: "full", cursor: "opaque_snapshot_cursor" }, retrieval: { ...(next ? { continue: `agentera ${listCommand}${filterFlags}${selectorFlags} --limit ${take} --cursor ${next} --format json` } : {}) }, ...(remaining ? { omitted: true, omitted_count: remaining, omission_reason: "page_limit", next_cursor: next } : {}) };
|
|
286
|
+
return projectEntityList(response, selector, projectionOptions);
|
|
287
|
+
}
|
|
288
|
+
export function getObjectiveEntity(root, id, sourceRoot = resolveSourceRoot()) { const entity = selectObjective(relevant(root, sourceRoot), id); return { schemaVersion: "agentera.stateGet.v1", command: "state objective get", status: "ok", entry: entry(root, entity), source_contract: { authority: "references/artifacts/state-storage-authority.yaml", detail: "full_entity" } }; }
|
|
289
|
+
export function listObjectiveEntities(root, limit, cursor, options = {}) { const sourceRoot = options.sourceRoot ?? resolveSourceRoot(); const entities = relevant(root, sourceRoot, options.discovery); const statuses = options.statuses?.length ? new Set(options.statuses) : undefined; const selected = entities.filter((entity) => entity.boundary === OBJECTIVE && (!statuses || statuses.has(objectiveStatus(entity)))).sort((a, b) => String(mapping(b.record?.header) ? b.record.header.created ?? "" : "").localeCompare(String(mapping(a.record?.header) ? a.record.header.created ?? "" : "")) || a.id.localeCompare(b.id)); return boundedList(root, sourceRoot, OBJECTIVE_ARTIFACT, OBJECTIVE, selected, entities, limit, cursor, OBJECTIVE_ORDER, options.statuses ? { status: options.statuses } : {}, options.format, options.selector); }
|
|
290
|
+
export function currentObjectiveEntity(root, sourceRoot = resolveSourceRoot()) { const entity = selectObjective(relevant(root, sourceRoot)); return { schemaVersion: "agentera.stateList.v1", command: "state objective", status: "ok", entries: [entry(root, entity)], counts: { total: 1, returned: 1, remaining: 0 }, filters: { status: "active" }, source: { artifact: OBJECTIVE_ARTIFACT, authority: "canonical_entity_files" } }; }
|
|
291
|
+
export function getExperimentEntity(root, id, sourceRoot = resolveSourceRoot()) { const entity = experimentById(relevant(root, sourceRoot), id); return { schemaVersion: "agentera.stateGet.v1", command: "state experiments get", status: "ok", entry: entry(root, entity), source_contract: { authority: "references/artifacts/state-storage-authority.yaml", detail: "full_immutable_entity" } }; }
|
|
292
|
+
export function listExperimentEntities(root, objective, limit, cursor, options = {}) { const sourceRoot = options.sourceRoot ?? resolveSourceRoot(); const entities = relevant(root, sourceRoot, options.discovery); const owner = selectObjective(entities, objective); assertBaseline(entities, owner.id); const selected = entities.filter((entity) => entity.boundary === EXPERIMENT && entity.record?.objective === owner.id).sort((a, b) => String(b.record.date).localeCompare(String(a.record.date)) || a.id.localeCompare(b.id)); return boundedList(root, sourceRoot, EXPERIMENT_ARTIFACT, EXPERIMENT, selected, entities, limit, cursor, EXPERIMENT_ORDER, { objective: owner.id }, options.format, options.selector); }
|
|
293
|
+
export function listCurrentExperimentEntities(root, objective, limit, cursor, filters = {}, options = {}) {
|
|
294
|
+
const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
|
|
295
|
+
const entities = relevant(root, sourceRoot);
|
|
296
|
+
let owner;
|
|
297
|
+
try {
|
|
298
|
+
owner = selectObjective(entities, objective);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
if (error instanceof StateRetrievalFailure && !objective) {
|
|
302
|
+
error.body.error.syntax = "agentera state experiments --objective ID [--limit N] [--cursor TOKEN] --format json";
|
|
303
|
+
error.body.error.example = "agentera state experiments --objective qjtrmnpvka --format json";
|
|
304
|
+
error.body.error.recovery = "Pass --objective with one bare objective ID returned by state objective list; no state was changed.";
|
|
305
|
+
}
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
assertBaseline(entities, owner.id);
|
|
309
|
+
let selected = entities.filter((entity) => entity.boundary === EXPERIMENT && entity.record?.objective === owner.id);
|
|
310
|
+
if (filters.status)
|
|
311
|
+
selected = selected.filter((entity) => entity.record?.status === filters.status);
|
|
312
|
+
if (filters.topic) {
|
|
313
|
+
const needle = filters.topic.toLowerCase();
|
|
314
|
+
selected = selected.filter((entity) => canonicalRecordJson(entity.record).toLowerCase().includes(needle));
|
|
315
|
+
}
|
|
316
|
+
selected.sort((a, b) => String(b.record.date).localeCompare(String(a.record.date)) || a.id.localeCompare(b.id));
|
|
317
|
+
const result = boundedList(root, sourceRoot, EXPERIMENT_ARTIFACT, EXPERIMENT, selected, entities, limit, cursor, EXPERIMENT_ORDER, { objective: owner.id, topic: filters.topic ?? null, status: filters.status ?? null }, options.format);
|
|
318
|
+
result.command = "state experiments";
|
|
319
|
+
if (mapping(result.retrieval) && typeof result.retrieval.continue === "string")
|
|
320
|
+
result.retrieval.continue = result.retrieval.continue.replace("state experiments list", "state experiments");
|
|
321
|
+
return result;
|
|
322
|
+
}
|