agentera 3.0.0-dev.8 → 3.0.0-dev.81
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 +252 -22
- package/bundle/.agentera-build-source.json +8 -0
- package/bundle/CHANGELOG.md +1389 -0
- package/bundle/DESIGN.md +229 -0
- package/bundle/LICENSE +201 -0
- package/bundle/README.md +142 -0
- package/bundle/UPGRADE.md +275 -0
- package/bundle/extract-corpus-parity.json +2 -4
- package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
- package/bundle/references/adapters/package-publication.json +484 -0
- package/bundle/references/adapters/package-registry.yaml +443 -188
- package/bundle/references/adapters/package-surface-characterization.md +68 -34
- package/bundle/references/adapters/product-v1-reset.yaml +101 -0
- 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 +357 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +559 -0
- package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
- package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
- package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
- package/bundle/references/analysis/verification-policy.yaml +262 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
- package/bundle/references/artifacts/glossary-entry-contract.yaml +2906 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +3075 -0
- package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
- package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
- 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 +152 -93
- package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
- package/bundle/references/cli/update-channels.yaml +7 -5
- package/bundle/references/cli/vocabulary-index.yaml +7 -9
- package/bundle/references/cli/vocabulary.md +54 -97
- package/bundle/references/meta/retained-reference-authority.yaml +171 -0
- package/bundle/skills/agentera/SKILL.md +183 -63
- package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
- package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
- package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
- package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
- package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
- package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
- package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
- package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
- package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
- package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
- package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
- package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
- package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
- package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
- package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
- package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
- package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
- package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
- package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +13 -4
- package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
- package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -3
- package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
- package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
- package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
- package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
- package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
- package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
- package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
- package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
- package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
- package/bundle/skills/agentera/protocol.yaml +4 -4
- package/bundle/skills/agentera/route-phrases.yaml +81 -0
- package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
- package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +29 -30
- package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
- package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -43
- package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -34
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
- package/bundle/skills/agentera/schemas/artifacts/health.yaml +53 -51
- package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -35
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +453 -55
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -39
- package/bundle/skills/agentera/schemas/artifacts/todo.yaml +305 -7
- package/bundle/skills/agentera/schemas/artifacts/vision.yaml +0 -19
- package/dist/.agentera-build-source.json +8 -0
- package/dist/analytics/extractCorpus/cli.js +52 -11
- package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
- package/dist/analytics/extractCorpus/core.js +262 -14
- package/dist/analytics/extractCorpus/corpus.js +57 -18
- package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
- package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
- package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
- package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
- package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
- package/dist/analytics/extractCorpus/index.js +4 -2
- package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
- package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
- package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
- 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 +113 -0
- package/dist/analytics/personalGlossaryCandidateProjection.js +788 -0
- package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
- package/dist/analytics/personalGlossaryCandidateProjectionModel.js +1 -0
- package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
- package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
- package/dist/analytics/personalGlossaryDecision.js +203 -0
- package/dist/analytics/personalGlossaryExplicit.js +788 -0
- package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
- package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
- package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
- package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
- package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
- package/dist/analytics/personalGlossaryProfile.js +229 -0
- package/dist/analytics/personalGlossaryRecurrence.js +618 -0
- package/dist/analytics/personalGlossaryRefreshProjection.js +351 -0
- package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
- package/dist/analytics/personalGlossaryReviewRecords.js +332 -0
- package/dist/analytics/profileSignals.js +211 -0
- package/dist/analytics/usageStats.js +150 -23
- package/dist/audit/terminologyDrift.js +281 -0
- package/dist/bin/agentera.js +3 -2
- package/dist/capabilities/audit/instructions.js +16 -6
- package/dist/capabilities/build/instructions.js +59 -6
- package/dist/capabilities/design/instructions.js +3 -4
- package/dist/capabilities/discuss/instructions.js +29 -6
- package/dist/capabilities/document/instructions.js +11 -6
- package/dist/capabilities/index.js +20 -14
- package/dist/capabilities/optimize/instructions.js +14 -6
- package/dist/capabilities/orchestrate/instructions.js +42 -6
- package/dist/capabilities/plan/instructions.js +30 -3
- package/dist/capabilities/profile/instructions.js +104 -5
- package/dist/capabilities/research/instructions.js +4 -5
- package/dist/capabilities/status/instructions.js +15 -6
- package/dist/capabilities/status/startupInstructions.js +34 -0
- package/dist/capabilities/vision/instructions.js +3 -5
- package/dist/cli/appContext.js +14 -7
- package/dist/cli/argvalidate.js +0 -1
- package/dist/cli/capabilityContext/benchmark.js +5 -4
- package/dist/cli/capabilityContext/bespoke.js +14 -6
- package/dist/cli/capabilityContext/build.js +116 -42
- package/dist/cli/capabilityContext/closeout.js +30 -27
- package/dist/cli/capabilityContext/contract.js +18 -27
- package/dist/cli/capabilityContext/evidence.js +84 -77
- package/dist/cli/capabilityContext/index.js +0 -1
- package/dist/cli/capabilityContext/orchestration.js +42 -18
- package/dist/cli/capabilityContext/planState.js +89 -96
- package/dist/cli/capabilityContext/progress.js +52 -12
- package/dist/cli/capabilityContext/projectVerification.js +409 -0
- package/dist/cli/capabilityContext/shared.js +9 -20
- package/dist/cli/capabilityContext/slim.js +52 -8
- package/dist/cli/capabilityContext/startup.js +51 -114
- package/dist/cli/capabilityContext/startupAggregation.js +68 -0
- package/dist/cli/capabilityContext/types.js +26 -10
- package/dist/cli/capabilityContext.js +0 -1
- package/dist/cli/commands/appHome.js +0 -1
- package/dist/cli/commands/capability.js +2 -2
- package/dist/cli/commands/compact.js +163 -13
- package/dist/cli/commands/doctor.js +162 -11
- 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/personalGlossaryCandidateReads.js +755 -0
- package/dist/cli/commands/personalGlossaryDecision.js +349 -0
- package/dist/cli/commands/personalGlossaryPublish.js +484 -0
- package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
- package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
- package/dist/cli/commands/prime/briefOrientation.js +845 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/bundleStatus.js +54 -4
- package/dist/cli/commands/prime/collectEntityOrientation.js +338 -0
- package/dist/cli/commands/prime/collectOrientationState.js +124 -68
- package/dist/cli/commands/prime/orientationOutput.js +271 -59
- package/dist/cli/commands/prime/types.js +0 -1
- package/dist/cli/commands/prime.js +89 -11
- package/dist/cli/commands/profileGrounding.js +55 -0
- package/dist/cli/commands/query.js +74 -52
- package/dist/cli/commands/report.js +187 -27
- package/dist/cli/commands/route.js +142 -0
- package/dist/cli/commands/schema.js +436 -138
- package/dist/cli/commands/state/decisions.js +40 -56
- package/dist/cli/commands/state/docs.js +58 -85
- package/dist/cli/commands/state/experimentRecords.js +151 -0
- package/dist/cli/commands/state/experiments.js +11 -65
- package/dist/cli/commands/state/get.js +129 -0
- package/dist/cli/commands/state/health.js +11 -113
- 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 -65
- package/dist/cli/commands/state/plan.js +11 -170
- 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 +28 -107
- package/dist/cli/commands/state/write.js +459 -0
- package/dist/cli/commands/upgrade.js +176 -5
- package/dist/cli/commands/upgradeVerify.js +118 -0
- package/dist/cli/commands/validate.js +235 -136
- package/dist/cli/commands/verify.js +73 -16
- package/dist/cli/contracts/bundleStatus.js +0 -1
- package/dist/cli/contracts/orientationState.js +0 -1
- package/dist/cli/dispatch/argvParser.js +0 -1
- package/dist/cli/dispatch/check.js +84 -40
- package/dist/cli/dispatch/commands.js +3 -3
- package/dist/cli/dispatch/index.js +84 -52
- package/dist/cli/dispatch/lifecycle.js +182 -62
- package/dist/cli/dispatch/prime.js +37 -2
- package/dist/cli/dispatch/projections.js +17 -0
- package/dist/cli/dispatch/shared.js +1 -2
- package/dist/cli/dispatch/state.js +62 -66
- package/dist/cli/dispatch.js +0 -1
- package/dist/cli/errors.js +16 -17
- package/dist/cli/help.js +419 -41
- package/dist/cli/migrationRequired.js +125 -0
- package/dist/cli/orientation/attention.js +19 -22
- package/dist/cli/orientation/corpusCoverage.js +32 -1
- package/dist/cli/orientation.js +346 -129
- 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/productV1Eol.js +55 -0
- package/dist/cli/profileAcquisition.js +167 -0
- package/dist/cli/startupCompletenessContract.js +11 -9
- package/dist/cli/stateQuery.js +47 -12
- 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 +0 -1
- package/dist/core/atomicWriter.js +23 -0
- package/dist/core/developmentChannel.js +1 -0
- package/dist/core/developmentInvocation.js +377 -0
- package/dist/core/difflib.js +0 -1
- package/dist/core/envPaths.js +0 -1
- package/dist/core/jsonValue.js +0 -1
- package/dist/core/paths.js +0 -1
- package/dist/core/pyjson.js +0 -1
- 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 +61 -2
- package/dist/eval/evalSkills.js +13 -14
- package/dist/eval/glossaryEvaluation.js +751 -0
- package/dist/eval/glossaryEvaluationProcess.js +29 -0
- package/dist/eval/glossaryEvaluationRunner.js +571 -0
- package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
- package/dist/eval/hybridRouteEvaluation.js +155 -0
- package/dist/eval/semanticEval.js +0 -1
- package/dist/eval/semanticFixtures.js +0 -1
- package/dist/hooks/common.js +3 -56
- package/dist/hooks/compaction/apply.js +224 -47
- package/dist/hooks/compaction/dryRun.js +2 -1
- package/dist/hooks/compaction/index.js +5 -6
- package/dist/hooks/compaction/parse.js +73 -6
- package/dist/hooks/compaction/retention.js +28 -25
- package/dist/hooks/compaction/status.js +145 -26
- package/dist/hooks/compaction/types.js +0 -1
- package/dist/hooks/validateArtifact/agentFacing.js +0 -1
- package/dist/hooks/validateArtifact/index.js +6 -65
- package/dist/hooks/validateArtifact/markdown.js +9 -10
- package/dist/hooks/validateArtifact/schema.js +96 -9
- package/dist/hooks/validateArtifact/traversal.js +12 -11
- package/dist/hooks/validateArtifact/violations.js +5 -3
- package/dist/migrate/v2HandoffManifest.js +8 -3
- package/dist/registries/activationContract.js +2 -0
- package/dist/registries/activationTuples.js +145 -0
- package/dist/registries/artifactProtocolIds.js +2 -1
- package/dist/registries/artifactRegistry.js +207 -60
- package/dist/registries/artifactSchemaProjection.js +45 -0
- package/dist/registries/capabilityContract.js +5 -21
- package/dist/registries/evaluatorHandoffContract.js +0 -1
- package/dist/registries/evidenceTierContract.js +375 -0
- package/dist/registries/explicitSegmentGrammarContract.js +619 -0
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryCandidateContractPaths.js +6 -0
- package/dist/registries/glossaryCandidateContracts.js +820 -0
- package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
- package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
- package/dist/registries/glossaryCandidateProjectionAuthority.js +345 -0
- package/dist/registries/glossaryCandidateProjectionContract.js +108 -0
- package/dist/registries/glossaryCaveatContract.js +67 -0
- package/dist/registries/glossaryConsumerContractValidation.js +787 -0
- package/dist/registries/glossaryEntryContract.js +759 -0
- package/dist/registries/glossaryEntryTemporal.js +12 -0
- package/dist/registries/glossaryMiningAuthority.js +764 -0
- package/dist/registries/glossaryProfileFullContract.js +24 -0
- package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
- package/dist/registries/glossaryReviewRecordsContract.js +129 -0
- package/dist/registries/glossaryTermIdentity.js +139 -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 +184 -209
- package/dist/registries/personalGlossaryContracts.js +1 -0
- package/dist/registries/todoReadinessContract.js +448 -0
- package/dist/registries/triggerLoader.js +7 -44
- package/dist/registries/verbosityBudgetContract.js +205 -0
- package/dist/release/releaseMetadata.js +168 -11
- 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 +618 -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 +14 -75
- 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 +894 -0
- package/dist/state/entityWriterLock.js +18 -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 +15 -7
- 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 +70 -9
- package/dist/state/startupAnalysis/contract.js +44 -10
- package/dist/state/startupAnalysis/helpers.js +1 -2
- package/dist/state/startupAnalysis/index.js +0 -1
- package/dist/state/startupAnalysis/metrics.js +0 -1
- package/dist/state/startupAnalysis/records.js +0 -1
- package/dist/state/startupAnalysis/report.js +0 -1
- package/dist/state/startupAnalysis/threshold.js +13 -1
- 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/todoCreateBatch.js +69 -0
- package/dist/state/todoDocsEntities.js +1339 -0
- package/dist/state/todoDocsEntityValidation.js +158 -0
- package/dist/state/todoMarkdownProjection.js +63 -0
- package/dist/state/todoReconciliationActivation.js +182 -0
- package/dist/state/todoReconciliationInspection.js +184 -0
- package/dist/state/todoReconciliationRepair.js +320 -0
- package/dist/state/todoReconciliationTransaction.js +628 -0
- package/dist/state/todoSeverityHeadings.js +71 -0
- package/dist/state/todoTransitionBatch.js +65 -0
- package/dist/state/todoUpdateBatch.js +50 -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 +380 -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 +77 -36
- package/dist/upgrade/appModel.js +0 -1
- package/dist/upgrade/atomicWriter.js +1 -0
- package/dist/upgrade/bundleEvidence.js +0 -1
- package/dist/upgrade/channels.js +6 -9
- package/dist/upgrade/compatibility.js +43 -17
- package/dist/upgrade/doctor.js +55 -32
- package/dist/upgrade/doctorClassifier.js +11 -1
- package/dist/upgrade/installedHooksRetirement.js +46 -40
- package/dist/upgrade/legacyAgentCleanup.js +133 -34
- package/dist/upgrade/lifecycleUpgrade.js +126 -0
- package/dist/upgrade/migrateArtifactsV2ToV3.js +325 -82
- package/dist/upgrade/migrationPublication.js +122 -0
- package/dist/upgrade/nextMajorDoctor.js +0 -22
- package/dist/upgrade/npxPlatformStatus.js +2 -2
- package/dist/upgrade/productV1Reset.js +515 -0
- package/dist/upgrade/productV1ResetAuthority.js +139 -0
- package/dist/upgrade/projectIntegration.js +126 -134
- package/dist/upgrade/projectIntegrationDecision.js +21 -13
- package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
- package/dist/upgrade/runtimeMigration.js +210 -430
- package/dist/upgrade/upgradeCommands.js +14 -1
- package/dist/upgrade/upgradeLock.js +85 -0
- package/dist/upgrade/upgradeOrchestrator.js +257 -48
- package/dist/upgrade/v3CapabilitySurface.js +2 -3
- package/dist/upgrade/versionResolution.js +0 -1
- package/dist/validate/activationArtifactEvidence.js +866 -0
- package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
- package/dist/validate/activationConjunction.js +816 -0
- package/dist/validate/activationEvidenceManifest.js +610 -0
- package/dist/validate/activationPackageSemantics.js +29 -0
- package/dist/validate/appHomeContract.js +1 -7
- package/dist/validate/bootstrapAuthority.js +44 -0
- package/dist/validate/capability.js +11 -3
- package/dist/validate/crossCapability.js +14 -9
- package/dist/validate/glossaryVariantGuard.js +96 -0
- package/dist/validate/retainedReferenceAuthority.js +879 -0
- package/dist/validate/selfAudit.js +39 -45
- package/dist/validate/vocabularyAuthority.js +8 -8
- package/package.json +39 -13
- package/bundle/references/adapters/cursor.md +0 -214
- 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 -554
- 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 -13
- package/bundle/references/cli/parity-expected-actual-template.md +0 -30
- 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 -45
- 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/audit.toml +0 -6
- package/bundle/skills/agentera/agents/build.toml +0 -6
- package/bundle/skills/agentera/agents/design.toml +0 -6
- package/bundle/skills/agentera/agents/discuss.toml +0 -6
- package/bundle/skills/agentera/agents/document.toml +0 -6
- package/bundle/skills/agentera/agents/optimize.toml +0 -6
- package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
- package/bundle/skills/agentera/agents/plan.toml +0 -6
- package/bundle/skills/agentera/agents/profile.toml +0 -6
- package/bundle/skills/agentera/agents/research.toml +0 -6
- package/bundle/skills/agentera/agents/status.toml +0 -6
- package/bundle/skills/agentera/agents/vision.toml +0 -6
- package/bundle/skills/agentera/references/contract.md +0 -1048
- 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/coverageAudit.js.map +0 -1
- package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
- package/dist/analytics/extractCorpus/extractCorpusParity.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/sqliteCaps.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/audit/instructions.js.map +0 -1
- package/dist/capabilities/build/instructions.js.map +0 -1
- package/dist/capabilities/design/instructions.js.map +0 -1
- package/dist/capabilities/discuss/instructions.js.map +0 -1
- package/dist/capabilities/document/instructions.js.map +0 -1
- package/dist/capabilities/index.js.map +0 -1
- package/dist/capabilities/optimize/instructions.js.map +0 -1
- package/dist/capabilities/orchestrate/instructions.js.map +0 -1
- package/dist/capabilities/plan/instructions.js.map +0 -1
- package/dist/capabilities/profile/instructions.js.map +0 -1
- package/dist/capabilities/research/instructions.js.map +0 -1
- package/dist/capabilities/status/instructions.js.map +0 -1
- package/dist/capabilities/vision/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/build.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/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/appHome.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/bundleStatus.js.map +0 -1
- package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
- package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
- package/dist/cli/commands/prime/types.js.map +0 -1
- package/dist/cli/commands/prime/v1Migration.js +0 -39
- package/dist/cli/commands/prime/v1Migration.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/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/contracts/bundleStatus.js.map +0 -1
- package/dist/cli/contracts/orientationState.js.map +0 -1
- package/dist/cli/dispatch/argvParser.js.map +0 -1
- package/dist/cli/dispatch/check.js.map +0 -1
- package/dist/cli/dispatch/commands.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/attention.js.map +0 -1
- package/dist/cli/orientation/corpusCoverage.js.map +0 -1
- package/dist/cli/orientation.js.map +0 -1
- package/dist/cli/prime-blob.js.map +0 -1
- package/dist/cli/startupCompletenessContract.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/cli/todoSeverity.js.map +0 -1
- package/dist/core/difflib.js.map +0 -1
- package/dist/core/envPaths.js.map +0 -1
- package/dist/core/jsonValue.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/cursorPreToolUse.js +0 -19
- package/dist/hooks/cursorPreToolUse.js.map +0 -1
- package/dist/hooks/cursorSessionStart.js +0 -79
- package/dist/hooks/cursorSessionStart.js.map +0 -1
- package/dist/hooks/sessionStart.js +0 -216
- package/dist/hooks/sessionStart.js.map +0 -1
- package/dist/hooks/sessionStop.js +0 -206
- 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 -86
- 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/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 -316
- package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
- package/dist/registries/triggerLoader.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 -639
- 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 -129
- package/dist/setup/cursor.js.map +0 -1
- package/dist/setup/cursorSurfaces.js +0 -67
- package/dist/setup/cursorSurfaces.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 -240
- package/dist/setup/doctor/diagnostics.js.map +0 -1
- package/dist/setup/doctor/opencode.js +0 -313
- package/dist/setup/doctor/opencode.js.map +0 -1
- package/dist/setup/doctor/report.js +0 -425
- 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/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/appContentRefresh.js.map +0 -1
- package/dist/upgrade/appModel.js.map +0 -1
- package/dist/upgrade/bundleEvidence.js.map +0 -1
- package/dist/upgrade/channels.js.map +0 -1
- package/dist/upgrade/coexistenceProbe.js +0 -107
- 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/doctorClassifier.js.map +0 -1
- package/dist/upgrade/installedHooksRetirement.js.map +0 -1
- package/dist/upgrade/legacyAgentCleanup.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/npxPlatformStatus.js.map +0 -1
- package/dist/upgrade/projectIntegration.js.map +0 -1
- package/dist/upgrade/projectIntegrationDecision.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/legacyPythonParity.js +0 -93
- package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
- package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
- package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
- package/dist/validate/lifecycleAdapters/shared.js +0 -198
- package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
- package/dist/validate/lifecycleAdapters.js +0 -62
- package/dist/validate/lifecycleAdapters.js.map +0 -1
- package/dist/validate/selfAudit.js.map +0 -1
- package/dist/validate/vocabularyAuthority.js.map +0 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { resolveSourceRoot } from "../core/sourceRoot.js";
|
|
5
|
+
import { dumpYamlMapping, loadYamlMapping } from "../core/yaml.js";
|
|
6
|
+
import { EntityPublicationContext } from "./entityPublicationContext.js";
|
|
7
|
+
import { validateRealProjectRoot } from "./projectRoot.js";
|
|
8
|
+
import { readProjectFileSnapshot } from "./safeProjectFile.js";
|
|
9
|
+
function mapping(value) {
|
|
10
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function contract(sourceRoot = resolveSourceRoot()) {
|
|
13
|
+
const authorityPath = path.join(sourceRoot, "references", "artifacts", "state-storage-authority.yaml");
|
|
14
|
+
const authority = loadYamlMapping(fs.readFileSync(authorityPath, "utf8"));
|
|
15
|
+
const migration = authority.entity_migration;
|
|
16
|
+
const marker = mapping(migration) ? migration.cutover_marker : null;
|
|
17
|
+
const entityMode = mapping(marker) ? marker.entity_mode : null;
|
|
18
|
+
if (!mapping(marker) ||
|
|
19
|
+
typeof marker.path !== "string" ||
|
|
20
|
+
typeof marker.schema_version !== "string" ||
|
|
21
|
+
!mapping(entityMode) ||
|
|
22
|
+
typeof entityMode.mode !== "string") {
|
|
23
|
+
throw new Error(`state storage authority '${authorityPath}' has no executable cutover marker contract`);
|
|
24
|
+
}
|
|
25
|
+
if (path.isAbsolute(marker.path) || marker.path.split(/[\\/]/).includes("..")) {
|
|
26
|
+
throw new Error(`state storage authority declares unsafe cutover marker path '${marker.path}'`);
|
|
27
|
+
}
|
|
28
|
+
return { markerPath: marker.path, schemaVersion: marker.schema_version, mode: entityMode.mode };
|
|
29
|
+
}
|
|
30
|
+
function readStableMarker(root, markerPath) {
|
|
31
|
+
const snapshot = readProjectFileSnapshot(root, markerPath);
|
|
32
|
+
if (snapshot.kind === "missing") {
|
|
33
|
+
if (path.resolve(snapshot.absolute) === root.path) {
|
|
34
|
+
throw new Error(`project root '${root.path}' changed while the state mode marker was inspected; restore the real directory and retry`);
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (snapshot.kind === "unsafe") {
|
|
39
|
+
const detail = snapshot.reason === "type"
|
|
40
|
+
? "is not a regular file"
|
|
41
|
+
: snapshot.reason === "symlink"
|
|
42
|
+
? "has an unsafe path"
|
|
43
|
+
: "changed or became unsafe while being read";
|
|
44
|
+
throw new Error(`state mode marker '${markerPath}' ${detail}; restore a stable project-local marker and retry`);
|
|
45
|
+
}
|
|
46
|
+
return snapshot.bytes;
|
|
47
|
+
}
|
|
48
|
+
function pathKind(root, relativePath) {
|
|
49
|
+
const absolute = path.join(root.path, ...relativePath.split("/"));
|
|
50
|
+
try {
|
|
51
|
+
const stat = fs.lstatSync(absolute);
|
|
52
|
+
if (stat.isSymbolicLink())
|
|
53
|
+
return "unsafe";
|
|
54
|
+
if (stat.isFile())
|
|
55
|
+
return "file";
|
|
56
|
+
if (stat.isDirectory())
|
|
57
|
+
return "directory";
|
|
58
|
+
return "unsafe";
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code === "ENOENT")
|
|
62
|
+
return "missing";
|
|
63
|
+
return "unsafe";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function isGitWorktreeRoot(root) {
|
|
67
|
+
const env = { ...process.env };
|
|
68
|
+
for (const name of ["GIT_INDEX_FILE", "GIT_DIR", "GIT_WORK_TREE", "GIT_COMMON_DIR"])
|
|
69
|
+
delete env[name];
|
|
70
|
+
const result = spawnSync("git", ["rev-parse", "--show-toplevel"], {
|
|
71
|
+
cwd: root.path,
|
|
72
|
+
env,
|
|
73
|
+
encoding: "utf8",
|
|
74
|
+
});
|
|
75
|
+
if (result.error || result.status !== 0)
|
|
76
|
+
return false;
|
|
77
|
+
try {
|
|
78
|
+
return fs.realpathSync(String(result.stdout).trim()) === root.path;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function classifyMarkerAbsentProject(root, markerPath) {
|
|
85
|
+
const stateRoot = pathKind(root, ".agentera");
|
|
86
|
+
if (stateRoot === "missing") {
|
|
87
|
+
return {
|
|
88
|
+
state: isGitWorktreeRoot(root) ? "fresh_uninitialized" : "unknown",
|
|
89
|
+
root,
|
|
90
|
+
markerPath,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (stateRoot !== "directory") {
|
|
94
|
+
return {
|
|
95
|
+
state: "corrupt",
|
|
96
|
+
root,
|
|
97
|
+
markerPath,
|
|
98
|
+
reason: "Agentera state root '.agentera' is not a safe directory",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const entities = pathKind(root, ".agentera/entities");
|
|
102
|
+
if (entities !== "missing" && entities !== "directory") {
|
|
103
|
+
return {
|
|
104
|
+
state: "corrupt",
|
|
105
|
+
root,
|
|
106
|
+
markerPath,
|
|
107
|
+
reason: "Agentera entity root '.agentera/entities' is not a safe directory",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (entities === "directory")
|
|
111
|
+
return { state: "partial", root, markerPath };
|
|
112
|
+
const aggregates = ["plan.yaml", "progress.yaml", "decisions.yaml", "health.yaml"]
|
|
113
|
+
.map((name) => pathKind(root, `.agentera/${name}`));
|
|
114
|
+
if (aggregates.includes("unsafe")) {
|
|
115
|
+
return {
|
|
116
|
+
state: "corrupt",
|
|
117
|
+
root,
|
|
118
|
+
markerPath,
|
|
119
|
+
reason: "a recognized Agentera aggregate is not a safe regular file",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const aggregateCount = aggregates.filter((kind) => kind === "file").length;
|
|
123
|
+
if (aggregateCount >= 2)
|
|
124
|
+
return { state: "legacy", root, markerPath };
|
|
125
|
+
if (aggregateCount === 1)
|
|
126
|
+
return { state: "partial", root, markerPath };
|
|
127
|
+
return { state: "unknown", root, markerPath };
|
|
128
|
+
}
|
|
129
|
+
/** Classify local state without creating, repairing, or adopting project files. */
|
|
130
|
+
export function classifyProjectState(projectRoot, sourceRoot = resolveSourceRoot()) {
|
|
131
|
+
const root = validateRealProjectRoot(projectRoot);
|
|
132
|
+
const declared = contract(sourceRoot);
|
|
133
|
+
let bytes;
|
|
134
|
+
try {
|
|
135
|
+
bytes = readStableMarker(root, declared.markerPath);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return {
|
|
139
|
+
state: "corrupt",
|
|
140
|
+
root,
|
|
141
|
+
markerPath: declared.markerPath,
|
|
142
|
+
reason: error.message,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (bytes === null)
|
|
146
|
+
return classifyMarkerAbsentProject(root, declared.markerPath);
|
|
147
|
+
try {
|
|
148
|
+
const document = loadYamlMapping(bytes.toString("utf8"));
|
|
149
|
+
if (document.schemaVersion !== declared.schemaVersion || document.mode !== declared.mode) {
|
|
150
|
+
return {
|
|
151
|
+
state: "corrupt",
|
|
152
|
+
root,
|
|
153
|
+
markerPath: declared.markerPath,
|
|
154
|
+
reason: `state mode marker '${declared.markerPath}' must declare schemaVersion '${declared.schemaVersion}' and mode '${declared.mode}'; restore the durable migration marker before retrying`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
state: "corrupt",
|
|
161
|
+
root,
|
|
162
|
+
markerPath: declared.markerPath,
|
|
163
|
+
reason: `state mode marker '${declared.markerPath}' is corrupt: ${error.message}; restore the durable migration marker before retrying`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { state: "entities", root, markerPath: declared.markerPath, markerBytes: bytes };
|
|
167
|
+
}
|
|
168
|
+
export function freshEntityStateMarker(sourceRoot = resolveSourceRoot()) {
|
|
169
|
+
const declared = contract(sourceRoot);
|
|
170
|
+
return { schemaVersion: declared.schemaVersion, mode: declared.mode };
|
|
171
|
+
}
|
|
172
|
+
export function freshPlanInitialization(projectRoot, sourceRoot = resolveSourceRoot()) {
|
|
173
|
+
const classified = classifyProjectState(projectRoot, sourceRoot);
|
|
174
|
+
if (classified.state !== "fresh_uninitialized")
|
|
175
|
+
return null;
|
|
176
|
+
const marker = freshEntityStateMarker(sourceRoot);
|
|
177
|
+
return {
|
|
178
|
+
root: classified.root,
|
|
179
|
+
markerPath: classified.markerPath,
|
|
180
|
+
marker,
|
|
181
|
+
markerBytes: dumpYamlMapping(marker),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function detectValidatedStateMode(projectRoot, sourceRoot) {
|
|
185
|
+
const root = validateRealProjectRoot(projectRoot);
|
|
186
|
+
const declared = contract(sourceRoot);
|
|
187
|
+
const bytes = readStableMarker(root, declared.markerPath);
|
|
188
|
+
if (bytes === null)
|
|
189
|
+
return { mode: "legacy", root };
|
|
190
|
+
let document;
|
|
191
|
+
try {
|
|
192
|
+
document = loadYamlMapping(bytes.toString("utf8"));
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
throw new Error(`state mode marker '${declared.markerPath}' is corrupt: ${error.message}; restore the durable migration marker before retrying`);
|
|
196
|
+
}
|
|
197
|
+
if (document.schemaVersion !== declared.schemaVersion || document.mode !== declared.mode) {
|
|
198
|
+
throw new Error(`state mode marker '${declared.markerPath}' must declare schemaVersion '${declared.schemaVersion}' and mode '${declared.mode}'; restore the durable migration marker before retrying`);
|
|
199
|
+
}
|
|
200
|
+
return { mode: "entities", root, markerPath: declared.markerPath, markerBytes: bytes };
|
|
201
|
+
}
|
|
202
|
+
/** Read the authority-owned cutover marker without creating or repairing state. */
|
|
203
|
+
export function detectStateModeBinding(projectRoot, sourceRoot = resolveSourceRoot()) {
|
|
204
|
+
const detected = detectValidatedStateMode(projectRoot, sourceRoot);
|
|
205
|
+
if (detected.mode === "legacy")
|
|
206
|
+
return detected;
|
|
207
|
+
return {
|
|
208
|
+
mode: "entities",
|
|
209
|
+
root: detected.root,
|
|
210
|
+
publicationContext: EntityPublicationContext.open(detected.root, detected.markerPath, detected.markerBytes),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export function detectStateMode(projectRoot, sourceRoot = resolveSourceRoot()) {
|
|
214
|
+
return detectValidatedStateMode(projectRoot, sourceRoot).mode;
|
|
215
|
+
}
|
|
216
|
+
export function requireEntityStateBinding(projectRoot, sourceRoot = resolveSourceRoot()) {
|
|
217
|
+
const binding = detectStateModeBinding(projectRoot, sourceRoot);
|
|
218
|
+
if (binding.mode === "legacy") {
|
|
219
|
+
throw new Error("state writes require the durable entity-state marker; legacy aggregates are read-only migration input");
|
|
220
|
+
}
|
|
221
|
+
return binding;
|
|
222
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadYamlMapping } from "../core/yaml.js";
|
|
4
|
+
const AUTHORITY_RELATIVE_PATH = path.join("references", "artifacts", "state-storage-authority.yaml");
|
|
5
|
+
let cache;
|
|
6
|
+
function immutableGraph(root) {
|
|
7
|
+
const proxies = new WeakMap();
|
|
8
|
+
const immutable = (value) => {
|
|
9
|
+
if (value === null || typeof value !== "object")
|
|
10
|
+
return value;
|
|
11
|
+
const existing = proxies.get(value);
|
|
12
|
+
if (existing)
|
|
13
|
+
return existing;
|
|
14
|
+
const proxy = new Proxy(value, {
|
|
15
|
+
get: (target, property, receiver) => immutable(Reflect.get(target, property, receiver)),
|
|
16
|
+
getOwnPropertyDescriptor: (target, property) => {
|
|
17
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
|
|
18
|
+
return descriptor && "value" in descriptor
|
|
19
|
+
? { ...descriptor, value: immutable(descriptor.value) }
|
|
20
|
+
: descriptor;
|
|
21
|
+
},
|
|
22
|
+
set: () => { throw new TypeError("state storage authority is immutable"); },
|
|
23
|
+
defineProperty: () => { throw new TypeError("state storage authority is immutable"); },
|
|
24
|
+
deleteProperty: () => { throw new TypeError("state storage authority is immutable"); },
|
|
25
|
+
preventExtensions: () => { throw new TypeError("state storage authority is immutable"); },
|
|
26
|
+
setPrototypeOf: () => { throw new TypeError("state storage authority is immutable"); },
|
|
27
|
+
});
|
|
28
|
+
proxies.set(value, proxy);
|
|
29
|
+
return proxy;
|
|
30
|
+
};
|
|
31
|
+
return immutable(root);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read the state-storage authority on every call and reuse its immutable parsed
|
|
35
|
+
* graph only while the canonical path and exact file bytes remain unchanged.
|
|
36
|
+
*/
|
|
37
|
+
export function loadStateStorageAuthority(sourceRoot) {
|
|
38
|
+
const authorityPath = path.resolve(sourceRoot, AUTHORITY_RELATIVE_PATH);
|
|
39
|
+
const bytes = fs.readFileSync(authorityPath);
|
|
40
|
+
if (cache?.authorityPath === authorityPath && cache.bytes.equals(bytes)) {
|
|
41
|
+
return { authorityPath, document: cache.document, revision: cache.revision };
|
|
42
|
+
}
|
|
43
|
+
const document = immutableGraph(loadYamlMapping(bytes.toString("utf8")));
|
|
44
|
+
const revision = Symbol(authorityPath);
|
|
45
|
+
cache = { authorityPath, bytes, document, revision };
|
|
46
|
+
return { authorityPath, document, revision };
|
|
47
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function isSummaryEntity(entity) {
|
|
2
|
+
return entity.boundary === "progress_summary" || entity.boundary === "decision_summary" || entity.boundary === "health_summary";
|
|
3
|
+
}
|
|
4
|
+
export function summaryCaveat(artifact) {
|
|
5
|
+
return `${artifact} summary is immutable migrated history: incomplete historical evidence is read-only and full record detail is unavailable.`;
|
|
6
|
+
}
|
|
7
|
+
export function detailMetadata(entity) {
|
|
8
|
+
const summary = isSummaryEntity(entity);
|
|
9
|
+
return {
|
|
10
|
+
boundary: entity.boundary,
|
|
11
|
+
detail_availability: summary ? "summary" : "full",
|
|
12
|
+
compatibility: summary ? "degraded" : "current",
|
|
13
|
+
...(summary ? { caveats: [summaryCaveat(entity.artifact)] } : {}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function detailProvenance(projectRelativePath, entity) {
|
|
17
|
+
const summary = isSummaryEntity(entity);
|
|
18
|
+
return {
|
|
19
|
+
storage: "canonical_entity_file",
|
|
20
|
+
path: projectRelativePath,
|
|
21
|
+
boundary: entity.boundary,
|
|
22
|
+
detail: summary ? "summary" : "full",
|
|
23
|
+
...(summary ? { migration_provenance: entity.record.migration_provenance } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { loadYamlMapping } from "../core/yaml.js";
|
|
3
|
+
import { canonicalRecordJson } from "./archiveDiscovery.js";
|
|
4
|
+
import { canonicalMigrationRecord } from "./canonicalMigrationRecord.js";
|
|
5
|
+
import { legacySummaryRecord } from "./legacySummaryRecord.js";
|
|
6
|
+
import { readBoundMigrationSource } from "./migrationSourceBinding.js";
|
|
7
|
+
function mapping(value) {
|
|
8
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
export function summaryMigrationProvenanceDeclaration(value, authorityPath) {
|
|
11
|
+
if (!Array.isArray(value.sources))
|
|
12
|
+
throw new Error(`invalid summary migration provenance sources declaration in '${authorityPath}'`);
|
|
13
|
+
return { sources: value.sources.map((source) => {
|
|
14
|
+
if (!mapping(source) || typeof source.path !== "string" || !Array.isArray(source.collections) || !source.collections.every((collection) => typeof collection === "string")) {
|
|
15
|
+
throw new Error(`invalid summary migration provenance source declaration in '${authorityPath}'`);
|
|
16
|
+
}
|
|
17
|
+
return { path: source.path, collections: source.collections };
|
|
18
|
+
}) };
|
|
19
|
+
}
|
|
20
|
+
/** Bind a degraded summary to one declared legacy source record, without reopening arbitrary project paths. */
|
|
21
|
+
export function summaryMigrationProvenanceViolations(boundary, record, declaration, forbiddenAliases, binding) {
|
|
22
|
+
const provenance = record.migration_provenance;
|
|
23
|
+
if (!mapping(provenance))
|
|
24
|
+
return ["migration_provenance must be a mapping"];
|
|
25
|
+
if (canonicalRecordJson(Object.keys(provenance).sort()) !== canonicalRecordJson(["source_path", "source_record_sha256"])) {
|
|
26
|
+
return ["migration_provenance must contain exactly source_path and source_record_sha256"];
|
|
27
|
+
}
|
|
28
|
+
if (typeof record.summary !== "string")
|
|
29
|
+
return ["summary must be a string"];
|
|
30
|
+
const sourcePath = provenance.source_path;
|
|
31
|
+
const sourceDigest = provenance.source_record_sha256;
|
|
32
|
+
const declaredSource = typeof sourcePath === "string" ? declaration.sources.find((source) => source.path === sourcePath) : undefined;
|
|
33
|
+
if (!declaredSource)
|
|
34
|
+
return ["migration_provenance.source_path must be an authority-declared preserved aggregate path"];
|
|
35
|
+
if (typeof sourceDigest !== "string" || !/^[a-f0-9]{64}$/.test(sourceDigest))
|
|
36
|
+
return ["migration_provenance.source_record_sha256 must be a lowercase SHA-256 digest"];
|
|
37
|
+
if (binding === undefined)
|
|
38
|
+
return ["migration_provenance requires a source binding context for a compacted summary"];
|
|
39
|
+
const source = readBoundMigrationSource(binding, declaredSource.path);
|
|
40
|
+
if (source.kind !== "file")
|
|
41
|
+
return [`migration_provenance source '${declaredSource.path}' is ${source.kind === "missing" ? "missing" : `unsafe (${source.reason})`}`];
|
|
42
|
+
let document;
|
|
43
|
+
try {
|
|
44
|
+
document = loadYamlMapping(source.bytes);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return [`migration_provenance source '${declaredSource.path}' is invalid YAML: ${error.message}`];
|
|
48
|
+
}
|
|
49
|
+
const retained = structuredClone(record);
|
|
50
|
+
delete retained.migration_provenance;
|
|
51
|
+
const candidates = declaredSource.collections.flatMap((collection) => {
|
|
52
|
+
const rows = document[collection];
|
|
53
|
+
return Array.isArray(rows) ? rows.flatMap((physical) => {
|
|
54
|
+
const candidate = legacySummaryRecord(physical);
|
|
55
|
+
return candidate ? [{ physical, candidate }] : [];
|
|
56
|
+
}) : [];
|
|
57
|
+
}).filter(({ physical, candidate }) => (typeof candidate.summary === "string" || candidate.detail_availability === "summary_only")
|
|
58
|
+
&& createHash("sha256").update(canonicalRecordJson(physical)).digest("hex") === sourceDigest
|
|
59
|
+
&& canonicalRecordJson(canonicalMigrationRecord(boundary, candidate, forbiddenAliases)) === canonicalRecordJson(retained));
|
|
60
|
+
const canonicalCandidates = new Set(candidates.map(({ candidate }) => canonicalRecordJson(canonicalMigrationRecord(boundary, candidate, forbiddenAliases))));
|
|
61
|
+
if (canonicalCandidates.size !== 1)
|
|
62
|
+
return [canonicalCandidates.size === 0
|
|
63
|
+
? "migration_provenance does not bind a retained canonical summary to a declared source record"
|
|
64
|
+
: "migration_provenance ambiguously binds divergent declared source summary records"];
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const REFERENCE = "entity_target.declared_compacted_summary_contract.source_row_provenance";
|
|
2
|
+
const BOUNDARIES = new Set(["progress_summary", "decision_summary", "health_summary"]);
|
|
3
|
+
function mapping(value) {
|
|
4
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function strings(value) {
|
|
7
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string") ? [...value] : [];
|
|
8
|
+
}
|
|
9
|
+
/** Validate the one source-row digest semantic contract used by every summary boundary. */
|
|
10
|
+
export function validateCompactedSummarySourceRowAuthority(target, authorityPath) {
|
|
11
|
+
const compacted = mapping(target.declared_compacted_summary_contract) ? target.declared_compacted_summary_contract : null;
|
|
12
|
+
const semantic = mapping(compacted?.source_row_provenance) ? compacted.source_row_provenance : null;
|
|
13
|
+
const digest = mapping(semantic?.source_record_sha256) ? semantic.source_record_sha256 : null;
|
|
14
|
+
const accepted = strings(semantic?.accepted_parsed_row_values).sort();
|
|
15
|
+
if (semantic?.status !== "implemented"
|
|
16
|
+
|| semantic.semantic_id !== "v2_compacted_summary_physical_row.v1"
|
|
17
|
+
|| accepted.length !== 2 || accepted[0] !== "mapping" || accepted[1] !== "scalar_string"
|
|
18
|
+
|| typeof semantic.normalization !== "string"
|
|
19
|
+
|| digest?.format !== "lowercase_sha256_hex"
|
|
20
|
+
|| typeof digest.input !== "string"
|
|
21
|
+
|| typeof digest.canonicalization !== "string")
|
|
22
|
+
throw new Error(`invalid compacted-summary source-row provenance declaration in '${authorityPath}'`);
|
|
23
|
+
const declared = Array.isArray(compacted?.boundaries) ? compacted.boundaries : [];
|
|
24
|
+
const primary = Array.isArray(target.entities) ? target.entities : [];
|
|
25
|
+
for (const [scope, entries, provenance] of [
|
|
26
|
+
["primary", primary, (entry) => mapping(entry.canonical_metadata) && mapping(entry.canonical_metadata.summary_migration_provenance) ? entry.canonical_metadata.summary_migration_provenance : null],
|
|
27
|
+
["declared", declared, (entry) => mapping(entry.record) && mapping(entry.record.migration_provenance) ? entry.record.migration_provenance : null],
|
|
28
|
+
]) {
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
if (!mapping(entry) || !BOUNDARIES.has(String(entry.boundary)))
|
|
31
|
+
continue;
|
|
32
|
+
if (provenance(entry)?.source_row_provenance !== REFERENCE)
|
|
33
|
+
throw new Error(`${scope} summary boundary '${entry.boundary}' must reference the compacted-summary source-row provenance declaration in '${authorityPath}'`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { renderTodoPublicRecord } from "../cli/todoMarkdown.js";
|
|
2
|
+
import { todoActivationRisks, TODO_UNSAFE_INACTIVE_RECOVERY } from "./todoReconciliationActivation.js";
|
|
3
|
+
import { reject } from "./write/errors.js";
|
|
4
|
+
function publicSnapshot(record) {
|
|
5
|
+
return { present: true, description: renderTodoPublicRecord(record), severity: String(record.severity), status: String(record.status) };
|
|
6
|
+
}
|
|
7
|
+
function rowSnapshot(row, record) {
|
|
8
|
+
return { ...row.snapshot, severity: row.section === "resolved" ? String(record.severity) : row.snapshot.severity };
|
|
9
|
+
}
|
|
10
|
+
function samePublic(left, right) {
|
|
11
|
+
return ["present", "description", "severity", "status"].every((field) => left[field] === right[field]);
|
|
12
|
+
}
|
|
13
|
+
export function unsafeInactiveDuplicateDiagnosis(conflicting = 0) {
|
|
14
|
+
return {
|
|
15
|
+
counts: { matched: 0, converted: 0, retained: 0, duplicate: 1, stale: 0, conflicting },
|
|
16
|
+
risks: todoActivationRisks([]),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** The one read-only decision that gates both activation preview and apply. */
|
|
20
|
+
export function inactiveTodoActivationSafety(scan, entities) {
|
|
21
|
+
const todoEntities = entities.filter(({ boundary, id, record }) => boundary === "todo_item" && id && record);
|
|
22
|
+
const entityIds = new Set(todoEntities.map(({ id }) => id));
|
|
23
|
+
const unmatched = todoEntities.filter(({ id }) => !scan.rows.has(id));
|
|
24
|
+
const stale = todoEntities.filter(({ id, record }) => {
|
|
25
|
+
const row = scan.rows.get(id);
|
|
26
|
+
return row !== undefined && !samePublic(publicSnapshot(record), rowSnapshot(row, record));
|
|
27
|
+
});
|
|
28
|
+
const orphaned = [...scan.rows.keys()].filter((id) => !entityIds.has(id));
|
|
29
|
+
const resurrectedIds = todoEntities
|
|
30
|
+
.filter(({ id, record }) => {
|
|
31
|
+
const row = scan.rows.get(id);
|
|
32
|
+
return row === undefined ? record.status === "open" : record.status === "resolved" && !row.item.id;
|
|
33
|
+
})
|
|
34
|
+
.map(({ id }) => id)
|
|
35
|
+
.sort();
|
|
36
|
+
const counts = {
|
|
37
|
+
matched: scan.matchedRows,
|
|
38
|
+
converted: scan.convertedRows,
|
|
39
|
+
retained: scan.retainedLegacyRows.length,
|
|
40
|
+
duplicate: 0,
|
|
41
|
+
stale: stale.length,
|
|
42
|
+
conflicting: unmatched.length + orphaned.length,
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
safe: unmatched.length === 0 && stale.length === 0 && orphaned.length === 0 && resurrectedIds.length === 0,
|
|
46
|
+
counts,
|
|
47
|
+
risks: todoActivationRisks(resurrectedIds),
|
|
48
|
+
resurrectedIds,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function rejectUnsafeInactiveTodoActivation(safety) {
|
|
52
|
+
reject({
|
|
53
|
+
class: "conflict",
|
|
54
|
+
message: "TODO activation requires complete one-to-one inactive public projections",
|
|
55
|
+
diagnosis: { counts: safety.counts, risks: safety.risks },
|
|
56
|
+
recovery: TODO_UNSAFE_INACTIVE_RECOVERY,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { canonicalRecordJson } from "./archiveDiscovery.js";
|
|
3
|
+
import { todoInputViolations } from "./todoDocsEntityValidation.js";
|
|
4
|
+
import { reject } from "./write/errors.js";
|
|
5
|
+
export const TODO_CREATE_BATCH_VERSION = "agentera.todoCreateBatch.v1";
|
|
6
|
+
function mapping(value) { return value !== null && typeof value === "object" && !Array.isArray(value); }
|
|
7
|
+
export function inspectTodoCreateBatch(input) {
|
|
8
|
+
if (!input || input.schema_version !== TODO_CREATE_BATCH_VERSION)
|
|
9
|
+
return null;
|
|
10
|
+
const strictEnvelope = Object.keys(input).sort().join(",") === "creates,schema_version" && Array.isArray(input.creates);
|
|
11
|
+
const violations = [];
|
|
12
|
+
if (!strictEnvelope)
|
|
13
|
+
violations.push("batch envelope must contain exactly schema_version and creates");
|
|
14
|
+
if (!Array.isArray(input.creates) || input.creates.length < 1 || input.creates.length > 256)
|
|
15
|
+
violations.push("creates must contain 1 to 256 entries");
|
|
16
|
+
const creates = (Array.isArray(input.creates) ? input.creates : []).map((value, index) => {
|
|
17
|
+
if (!mapping(value) || Object.keys(value).sort().join(",") !== "local_ref,record" || typeof value.local_ref !== "string" || !/^[a-z][a-z0-9_-]{0,63}$/.test(value.local_ref) || !mapping(value.record)) {
|
|
18
|
+
violations.push(`creates[${index}] must contain exactly one valid local_ref and one record mapping`);
|
|
19
|
+
return { local_ref: "", record: {} };
|
|
20
|
+
}
|
|
21
|
+
const validationRecord = structuredClone(value.record);
|
|
22
|
+
if (mapping(validationRecord.readiness) && Array.isArray(validationRecord.readiness.dependencies))
|
|
23
|
+
validationRecord.readiness.dependencies = validationRecord.readiness.dependencies.map((dependency) => mapping(dependency) && typeof dependency.local_ref === "string" ? { artifact: "todo", id: "aaaaaaaaaa" } : dependency);
|
|
24
|
+
violations.push(...todoInputViolations(validationRecord, "create").map((item) => `creates[${index}].record: ${item}`));
|
|
25
|
+
return { local_ref: value.local_ref, record: value.record };
|
|
26
|
+
});
|
|
27
|
+
const refs = new Set();
|
|
28
|
+
for (const { local_ref } of creates) {
|
|
29
|
+
if (local_ref && refs.has(local_ref))
|
|
30
|
+
violations.push(`duplicate local reference '${local_ref}'`);
|
|
31
|
+
refs.add(local_ref);
|
|
32
|
+
}
|
|
33
|
+
for (const [index, { record }] of creates.entries()) {
|
|
34
|
+
const dependencies = mapping(record.readiness) ? record.readiness.dependencies : undefined;
|
|
35
|
+
if (!Array.isArray(dependencies))
|
|
36
|
+
continue;
|
|
37
|
+
for (const dependency of dependencies) {
|
|
38
|
+
if (mapping(dependency) && Object.keys(dependency).sort().join(",") === "artifact,id" && dependency.artifact === "todo" && typeof dependency.id === "string" && /^[a-z]{10}$/.test(dependency.id))
|
|
39
|
+
continue;
|
|
40
|
+
if (mapping(dependency) && Object.keys(dependency).join(",") === "local_ref" && typeof dependency.local_ref === "string" && refs.has(dependency.local_ref))
|
|
41
|
+
continue;
|
|
42
|
+
violations.push(`creates[${index}].record.readiness.dependencies contains a missing or invalid local reference`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const edges = new Map(creates.map(({ local_ref, record }) => [local_ref, (mapping(record.readiness) && Array.isArray(record.readiness.dependencies) ? record.readiness.dependencies : []).flatMap((value) => mapping(value) && typeof value.local_ref === "string" ? [value.local_ref] : [])]));
|
|
46
|
+
const visiting = new Set();
|
|
47
|
+
const visited = new Set();
|
|
48
|
+
const cyclic = (ref) => { if (visiting.has(ref))
|
|
49
|
+
return true; if (visited.has(ref))
|
|
50
|
+
return false; visiting.add(ref); const found = (edges.get(ref) ?? []).some(cyclic); visiting.delete(ref); visited.add(ref); return found; };
|
|
51
|
+
if ([...edges.keys()].some(cyclic))
|
|
52
|
+
violations.push("request-local dependency graph contains a cycle");
|
|
53
|
+
return { strictEnvelope, creates, violations: [...new Set(violations)] };
|
|
54
|
+
}
|
|
55
|
+
export function parseTodoCreateBatch(input) {
|
|
56
|
+
const inspected = inspectTodoCreateBatch(input);
|
|
57
|
+
if (!inspected)
|
|
58
|
+
return null;
|
|
59
|
+
if (inspected.violations.length)
|
|
60
|
+
reject({ class: "schema_violation", message: "todo create batch input is invalid", violations: inspected.violations, recovery: "Correct the strict agentera.todoCreateBatch.v1 envelope, then preview it again; no state was changed." });
|
|
61
|
+
return inspected.creates;
|
|
62
|
+
}
|
|
63
|
+
export function resolveTodoCreateBatchRecords(entries, ids) {
|
|
64
|
+
return entries.map(({ local_ref, record }) => { const copy = structuredClone(record); if (mapping(copy.readiness) && Array.isArray(copy.readiness.dependencies))
|
|
65
|
+
copy.readiness.dependencies = copy.readiness.dependencies.map((value) => mapping(value) && "local_ref" in value ? { artifact: "todo", id: ids.get(String(value.local_ref)) } : value); return { local_ref, record: copy }; });
|
|
66
|
+
}
|
|
67
|
+
export function todoCreateBatchEffectSha256(input, mappingSha256, localRefs, targets) {
|
|
68
|
+
return createHash("sha256").update(canonicalRecordJson({ schema_version: TODO_CREATE_BATCH_VERSION, input, mapping_sha256: mappingSha256, local_refs: localRefs, targets })).digest("hex");
|
|
69
|
+
}
|