mirror-mind 0.0.1 → 0.32.1
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/.claude/hooks/log-session-end.sh +85 -0
- package/.claude/hooks/log-user-prompt.sh +85 -0
- package/.claude/hooks/mirror-inject.sh +85 -0
- package/.claude/hooks/session-start.sh +85 -0
- package/.gemini/hooks/log-assistant.sh +85 -0
- package/.gemini/hooks/log-user.sh +85 -0
- package/.gemini/hooks/session-end.sh +85 -0
- package/.gemini/hooks/session-start.sh +85 -0
- package/.pi/extensions/mirror-logger.ts +561 -0
- package/.pi/skills/mm-backup/SKILL.md +21 -0
- package/.pi/skills/mm-build/SKILL.md +1206 -0
- package/.pi/skills/mm-consolidate/SKILL.md +112 -0
- package/.pi/skills/mm-consult/SKILL.md +70 -0
- package/.pi/skills/mm-conversations/SKILL.md +16 -0
- package/.pi/skills/mm-discard/SKILL.md +39 -0
- package/.pi/skills/mm-explore/SKILL.md +255 -0
- package/.pi/skills/mm-help/SKILL.md +74 -0
- package/.pi/skills/mm-identity/SKILL.md +96 -0
- package/.pi/skills/mm-journal/SKILL.md +16 -0
- package/.pi/skills/mm-journey/SKILL.md +23 -0
- package/.pi/skills/mm-journeys/SKILL.md +15 -0
- package/.pi/skills/mm-memories/SKILL.md +17 -0
- package/.pi/skills/mm-mirror/SKILL.md +98 -0
- package/.pi/skills/mm-mute/SKILL.md +18 -0
- package/.pi/skills/mm-new/SKILL.md +18 -0
- package/.pi/skills/mm-recall/SKILL.md +17 -0
- package/.pi/skills/mm-release-notes/SKILL.md +52 -0
- package/.pi/skills/mm-seed/SKILL.md +19 -0
- package/.pi/skills/mm-shadow/SKILL.md +117 -0
- package/.pi/skills/mm-soul/SKILL.md +502 -0
- package/.pi/skills/mm-tasks/SKILL.md +24 -0
- package/.pi/skills/mm-update/SKILL.md +32 -0
- package/.pi/skills/mm-week/SKILL.md +28 -0
- package/.pi/skills/mm-welcome/SKILL.md +24 -0
- package/AGENTS.md +188 -0
- package/README.md +126 -9
- package/bin/loader.js +67 -0
- package/bin/mirror-hook.js +7 -0
- package/bin/mirror.js +7 -0
- package/docs/releases/index.md +99 -0
- package/docs/releases/pending-cutoffs.md +510 -0
- package/docs/releases/v0.10.0.md +123 -0
- package/docs/releases/v0.10.1.md +66 -0
- package/docs/releases/v0.10.10.md +51 -0
- package/docs/releases/v0.10.11.md +39 -0
- package/docs/releases/v0.10.12.md +57 -0
- package/docs/releases/v0.10.13.md +35 -0
- package/docs/releases/v0.10.14.md +42 -0
- package/docs/releases/v0.10.15.md +53 -0
- package/docs/releases/v0.10.16.md +35 -0
- package/docs/releases/v0.10.17.md +43 -0
- package/docs/releases/v0.10.2.md +64 -0
- package/docs/releases/v0.10.3.md +78 -0
- package/docs/releases/v0.10.4.md +42 -0
- package/docs/releases/v0.10.5.md +57 -0
- package/docs/releases/v0.10.6.md +47 -0
- package/docs/releases/v0.10.7.md +53 -0
- package/docs/releases/v0.10.8.md +49 -0
- package/docs/releases/v0.10.9.md +37 -0
- package/docs/releases/v0.11.0.md +86 -0
- package/docs/releases/v0.12.0.md +67 -0
- package/docs/releases/v0.13.0.md +64 -0
- package/docs/releases/v0.14.0.md +68 -0
- package/docs/releases/v0.15.0.md +48 -0
- package/docs/releases/v0.16.0.md +50 -0
- package/docs/releases/v0.16.1.md +55 -0
- package/docs/releases/v0.16.2.md +36 -0
- package/docs/releases/v0.17.0.md +50 -0
- package/docs/releases/v0.17.1.md +58 -0
- package/docs/releases/v0.17.2.md +42 -0
- package/docs/releases/v0.17.3.md +58 -0
- package/docs/releases/v0.18.0.md +84 -0
- package/docs/releases/v0.18.1.md +51 -0
- package/docs/releases/v0.18.2.md +69 -0
- package/docs/releases/v0.19.0.md +85 -0
- package/docs/releases/v0.19.1.md +46 -0
- package/docs/releases/v0.20.0.md +85 -0
- package/docs/releases/v0.21.0.md +61 -0
- package/docs/releases/v0.21.1.md +47 -0
- package/docs/releases/v0.22.0.md +77 -0
- package/docs/releases/v0.22.1.md +42 -0
- package/docs/releases/v0.23.0.md +105 -0
- package/docs/releases/v0.24.0.md +125 -0
- package/docs/releases/v0.25.0.md +107 -0
- package/docs/releases/v0.26.0.md +139 -0
- package/docs/releases/v0.26.1.md +65 -0
- package/docs/releases/v0.26.2.md +43 -0
- package/docs/releases/v0.27.0.md +63 -0
- package/docs/releases/v0.28.0.md +59 -0
- package/docs/releases/v0.29.0.md +61 -0
- package/docs/releases/v0.29.1.md +59 -0
- package/docs/releases/v0.29.2.md +59 -0
- package/docs/releases/v0.29.3.md +93 -0
- package/docs/releases/v0.30.0.md +75 -0
- package/docs/releases/v0.30.1.md +93 -0
- package/docs/releases/v0.30.2.md +66 -0
- package/docs/releases/v0.31.0.md +122 -0
- package/docs/releases/v0.31.1.md +142 -0
- package/docs/releases/v0.31.10.md +118 -0
- package/docs/releases/v0.31.11.md +88 -0
- package/docs/releases/v0.31.12.md +105 -0
- package/docs/releases/v0.31.13.md +99 -0
- package/docs/releases/v0.31.14.md +97 -0
- package/docs/releases/v0.31.2.md +115 -0
- package/docs/releases/v0.31.3.md +142 -0
- package/docs/releases/v0.31.4.md +117 -0
- package/docs/releases/v0.31.5.md +155 -0
- package/docs/releases/v0.31.6.md +132 -0
- package/docs/releases/v0.31.7.md +132 -0
- package/docs/releases/v0.31.8.md +120 -0
- package/docs/releases/v0.31.9.md +120 -0
- package/docs/releases/v0.32.0.md +261 -0
- package/docs/releases/v0.32.1.md +59 -0
- package/docs/releases/v0.8.0.md +118 -0
- package/docs/releases/v0.9.0.md +98 -0
- package/docs/releases/v0.9.1.md +83 -0
- package/package.json +102 -6
- package/plugins/mirror-mind/.claude-plugin/plugin.json +13 -0
- package/plugins/mirror-mind/hooks/hooks.json +50 -0
- package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
- package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
- package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
- package/plugins/mirror-mind/hooks/session-start.sh +98 -0
- package/plugins/mirror-mind/mcp/launch.sh +52 -0
- package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
- package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
- package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
- package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
- package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
- package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
- package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
- package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
- package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
- package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
- package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
- package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +65 -0
- package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
- package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
- package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
- package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
- package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
- package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
- package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
- package/scripts/codex-hooks/session-end.sh +85 -0
- package/scripts/codex-hooks/session-start.sh +85 -0
- package/scripts/codex-mirror.sh +48 -0
- package/templates/identity/README.md +119 -0
- package/templates/identity/ego/behavior.yaml +52 -0
- package/templates/identity/ego/constraints.yaml +15 -0
- package/templates/identity/ego/identity.yaml +43 -0
- package/templates/identity/journeys/personal-growth.yaml +39 -0
- package/templates/identity/organization/identity.yaml +24 -0
- package/templates/identity/organization/principles.yaml +17 -0
- package/templates/identity/personas/coach.yaml +94 -0
- package/templates/identity/personas/designer.yaml +93 -0
- package/templates/identity/personas/doctor.yaml +96 -0
- package/templates/identity/personas/engineer.yaml +77 -0
- package/templates/identity/personas/financial.yaml +97 -0
- package/templates/identity/personas/prompt-engineer.yaml +122 -0
- package/templates/identity/personas/researcher.yaml +88 -0
- package/templates/identity/personas/strategist.yaml +91 -0
- package/templates/identity/personas/teacher.yaml +95 -0
- package/templates/identity/personas/therapist.yaml +91 -0
- package/templates/identity/personas/thinker.yaml +74 -0
- package/templates/identity/personas/writer.yaml +76 -0
- package/templates/identity/self/config.yaml +16 -0
- package/templates/identity/self/soul.yaml +105 -0
- package/templates/identity/user/identity.yaml +30 -0
- package/ts/src/backup/staging.ts +62 -0
- package/ts/src/backup/zipBackup.ts +267 -0
- package/ts/src/backup/zipReader.ts +109 -0
- package/ts/src/backup/zipWriter.ts +148 -0
- package/ts/src/builder/activeCheckpoint.ts +134 -0
- package/ts/src/builder/aggregateStatus.ts +34 -0
- package/ts/src/builder/approve.ts +149 -0
- package/ts/src/builder/argv.ts +292 -0
- package/ts/src/builder/ariadMethod.ts +536 -0
- package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
- package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
- package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
- package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
- package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
- package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
- package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
- package/ts/src/builder/artifacts/storyFiles.ts +61 -0
- package/ts/src/builder/artifacts/storyIndex.ts +166 -0
- package/ts/src/builder/cadence.ts +59 -0
- package/ts/src/builder/card.ts +192 -0
- package/ts/src/builder/checkpointRefused.ts +66 -0
- package/ts/src/builder/closure.ts +964 -0
- package/ts/src/builder/commands.ts +2053 -0
- package/ts/src/builder/cursorPosition.ts +176 -0
- package/ts/src/builder/cursorTransitions.ts +77 -0
- package/ts/src/builder/deliveryCursor.ts +577 -0
- package/ts/src/builder/deliveryStoryClosure.ts +521 -0
- package/ts/src/builder/deliveryStoryPlan.ts +536 -0
- package/ts/src/builder/deliveryStoryReady.ts +160 -0
- package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
- package/ts/src/builder/expand.ts +336 -0
- package/ts/src/builder/flowUnit.ts +339 -0
- package/ts/src/builder/homeSurface.ts +122 -0
- package/ts/src/builder/implementationGuard.ts +125 -0
- package/ts/src/builder/index.ts +11 -0
- package/ts/src/builder/lifecycleRefusal.ts +92 -0
- package/ts/src/builder/lifecycleRibbon.ts +159 -0
- package/ts/src/builder/load.ts +313 -0
- package/ts/src/builder/methodAdoption.ts +113 -0
- package/ts/src/builder/methodDefinition.ts +429 -0
- package/ts/src/builder/methodInspection.ts +371 -0
- package/ts/src/builder/plan.ts +408 -0
- package/ts/src/builder/planPreauthorization.ts +265 -0
- package/ts/src/builder/prepare.ts +225 -0
- package/ts/src/builder/projectPaths.ts +64 -0
- package/ts/src/builder/pull.ts +356 -0
- package/ts/src/builder/pullCandidates.ts +463 -0
- package/ts/src/builder/pullCandidatesRender.ts +238 -0
- package/ts/src/builder/refinementField.ts +93 -0
- package/ts/src/builder/releaseIntent.ts +173 -0
- package/ts/src/builder/resumeState.ts +84 -0
- package/ts/src/builder/resumeSurface.ts +149 -0
- package/ts/src/builder/roadmapGrammar.ts +300 -0
- package/ts/src/builder/roadmapScan.ts +97 -0
- package/ts/src/builder/roadmapScope.ts +210 -0
- package/ts/src/builder/scopePhrases.ts +146 -0
- package/ts/src/builder/storyPaths.ts +196 -0
- package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
- package/ts/src/builder/surfaceProtocol.ts +42 -0
- package/ts/src/builder/templateGeneration.ts +148 -0
- package/ts/src/builder/transition.ts +178 -0
- package/ts/src/consult/args.ts +99 -0
- package/ts/src/consult/core.ts +122 -0
- package/ts/src/consult/modelCatalog.ts +55 -0
- package/ts/src/consult/render.ts +47 -0
- package/ts/src/conversation/append.ts +414 -0
- package/ts/src/conversation/backfill.ts +387 -0
- package/ts/src/conversation/closeTail.ts +467 -0
- package/ts/src/conversation/extraction.ts +333 -0
- package/ts/src/conversation/extractionDriver.ts +130 -0
- package/ts/src/conversation/extractionRun.ts +70 -0
- package/ts/src/conversation/journeyInference.ts +165 -0
- package/ts/src/conversation/journeyRepair.ts +114 -0
- package/ts/src/conversation/lifecycleFaces.ts +197 -0
- package/ts/src/conversation/lifecycleWrites.ts +313 -0
- package/ts/src/conversation/listing.ts +77 -0
- package/ts/src/conversation/logger.ts +576 -0
- package/ts/src/conversation/loggerCli.ts +282 -0
- package/ts/src/conversation/loggerRuntime.ts +259 -0
- package/ts/src/conversation/metadataLifecycle.ts +443 -0
- package/ts/src/conversation/recall.ts +66 -0
- package/ts/src/conversation/sessionComposites.ts +258 -0
- package/ts/src/conversation/sessionImport.ts +90 -0
- package/ts/src/conversation/transcriptBackfill.ts +141 -0
- package/ts/src/cultivation/applyActions.ts +241 -0
- package/ts/src/cultivation/cluster.ts +86 -0
- package/ts/src/cultivation/consolidationStore.ts +281 -0
- package/ts/src/cultivation/promptContext.ts +62 -0
- package/ts/src/cultivation/propose.ts +305 -0
- package/ts/src/cultivation/scan.ts +155 -0
- package/ts/src/db/backupGate.ts +47 -0
- package/ts/src/db/bootstrap.ts +108 -0
- package/ts/src/db/bootstrapLock.ts +223 -0
- package/ts/src/db/copyGuard.ts +60 -0
- package/ts/src/db/database.ts +397 -0
- package/ts/src/db/decode.ts +66 -0
- package/ts/src/db/ftsIntegrity.ts +41 -0
- package/ts/src/db/migrateOnOpen.ts +214 -0
- package/ts/src/db/migrations.ts +576 -0
- package/ts/src/db/readyOnOpen.ts +35 -0
- package/ts/src/db/rowDecode.ts +42 -0
- package/ts/src/db/schema.ts +432 -0
- package/ts/src/db/schemaInventory.ts +225 -0
- package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
- package/ts/src/db/schemaState.ts +91 -0
- package/ts/src/db/schemaTsDivergence.ts +114 -0
- package/ts/src/descriptor/descriptorRead.ts +49 -0
- package/ts/src/docs/docsLint.ts +265 -0
- package/ts/src/explorer/handoff.ts +522 -0
- package/ts/src/explorer/render.ts +335 -0
- package/ts/src/explorer/story.ts +769 -0
- package/ts/src/explorer/transition.ts +72 -0
- package/ts/src/extensions/bindings.ts +170 -0
- package/ts/src/extensions/catalog.ts +249 -0
- package/ts/src/extensions/catalogCommands.ts +513 -0
- package/ts/src/extensions/catalogWrites.ts +652 -0
- package/ts/src/extensions/contextRuntime.ts +325 -0
- package/ts/src/extensions/dispatch.ts +374 -0
- package/ts/src/extensions/errors.ts +24 -0
- package/ts/src/extensions/manifest.ts +356 -0
- package/ts/src/extensions/migrations.ts +350 -0
- package/ts/src/extraction/conversation.ts +304 -0
- package/ts/src/extraction/conversationMetadata.ts +206 -0
- package/ts/src/extraction/fencing.ts +106 -0
- package/ts/src/extraction/json.ts +17 -0
- package/ts/src/extraction/prompts.ts +470 -0
- package/ts/src/frontDoor/args.ts +30 -0
- package/ts/src/frontDoor/argvShape.ts +106 -0
- package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
- package/ts/src/frontDoor/buildRoute.ts +398 -0
- package/ts/src/frontDoor/cli.ts +1865 -0
- package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
- package/ts/src/frontDoor/consultRoute.ts +50 -0
- package/ts/src/frontDoor/contentTailRoute.ts +239 -0
- package/ts/src/frontDoor/conversationLoggerRoute.ts +73 -0
- package/ts/src/frontDoor/cultivationRoute.ts +210 -0
- package/ts/src/frontDoor/dbPath.ts +131 -0
- package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
- package/ts/src/frontDoor/exploreRoute.ts +572 -0
- package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
- package/ts/src/frontDoor/frontDoorLog.ts +57 -0
- package/ts/src/frontDoor/identityWrite.ts +36 -0
- package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
- package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
- package/ts/src/frontDoor/liveBackup.ts +100 -0
- package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
- package/ts/src/frontDoor/namedRefusal.ts +35 -0
- package/ts/src/frontDoor/nodeSupport.ts +24 -0
- package/ts/src/frontDoor/render/consolidate.ts +199 -0
- package/ts/src/frontDoor/render/conversations.ts +33 -0
- package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
- package/ts/src/frontDoor/render/descriptor.ts +20 -0
- package/ts/src/frontDoor/render/detectPersona.ts +50 -0
- package/ts/src/frontDoor/render/icons.ts +13 -0
- package/ts/src/frontDoor/render/identity.ts +59 -0
- package/ts/src/frontDoor/render/identityRows.ts +17 -0
- package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
- package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
- package/ts/src/frontDoor/render/journeys.ts +79 -0
- package/ts/src/frontDoor/render/list.ts +41 -0
- package/ts/src/frontDoor/render/memories.ts +67 -0
- package/ts/src/frontDoor/render/recall.ts +49 -0
- package/ts/src/frontDoor/render/shadow.ts +155 -0
- package/ts/src/frontDoor/render/tasks.ts +99 -0
- package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
- package/ts/src/frontDoor/render/week.ts +113 -0
- package/ts/src/frontDoor/routing.ts +999 -0
- package/ts/src/frontDoor/runtimeRoute.ts +623 -0
- package/ts/src/frontDoor/searchRoute.ts +166 -0
- package/ts/src/frontDoor/seedPaths.ts +98 -0
- package/ts/src/frontDoor/soulRoute.ts +433 -0
- package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
- package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
- package/ts/src/frontDoor/usage.ts +176 -0
- package/ts/src/guards/claudePlugin.ts +252 -0
- package/ts/src/guards/packContents.ts +306 -0
- package/ts/src/guards/piSourcedSkills.ts +70 -0
- package/ts/src/guards/retiredRouteShadows.ts +57 -0
- package/ts/src/guards/retiredSurfaces.ts +564 -0
- package/ts/src/hooks/claude.ts +176 -0
- package/ts/src/hooks/codex.ts +45 -0
- package/ts/src/hooks/gemini.ts +126 -0
- package/ts/src/hooks/main.ts +109 -0
- package/ts/src/hooks/mirrorState.ts +71 -0
- package/ts/src/hooks/payload.ts +68 -0
- package/ts/src/hooks/runtime.ts +159 -0
- package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
- package/ts/src/identity/descriptorGenerate.ts +162 -0
- package/ts/src/identity/identityEdit.ts +143 -0
- package/ts/src/identity/identityKey.ts +77 -0
- package/ts/src/identity/identityRead.ts +69 -0
- package/ts/src/identity/identityStore.ts +80 -0
- package/ts/src/identity/journeyListing.ts +53 -0
- package/ts/src/identity/personaInspect.ts +44 -0
- package/ts/src/identity/personaListing.ts +37 -0
- package/ts/src/identity/setIdentity.ts +64 -0
- package/ts/src/index.ts +231 -0
- package/ts/src/init/init.ts +111 -0
- package/ts/src/journey/journeyOptions.ts +131 -0
- package/ts/src/journey/journeyRemoval.ts +158 -0
- package/ts/src/journey/journeyStatus.ts +149 -0
- package/ts/src/journey/journeySyncFile.ts +87 -0
- package/ts/src/journey/journeyWrite.ts +203 -0
- package/ts/src/journey/parentJourney.ts +41 -0
- package/ts/src/journey/validateParentJourney.ts +55 -0
- package/ts/src/mcp/boundary.ts +151 -0
- package/ts/src/mcp/guards.ts +244 -0
- package/ts/src/mcp/main.ts +121 -0
- package/ts/src/mcp/payload.ts +141 -0
- package/ts/src/mcp/protocol.ts +141 -0
- package/ts/src/mcp/readModels.ts +241 -0
- package/ts/src/mcp/registry.ts +201 -0
- package/ts/src/mcp/serve.ts +120 -0
- package/ts/src/mcp/tools/deterministic.ts +137 -0
- package/ts/src/mcp/tools/providerCrossing.ts +187 -0
- package/ts/src/mcp/wire.ts +8 -0
- package/ts/src/memory/journal.ts +180 -0
- package/ts/src/memory/listing.ts +107 -0
- package/ts/src/memory/memoryWrite.ts +88 -0
- package/ts/src/memory/reinforcement.ts +35 -0
- package/ts/src/mirror/context.ts +161 -0
- package/ts/src/mirror/defaultResolution.ts +199 -0
- package/ts/src/mirror/orchestration.ts +364 -0
- package/ts/src/mirror/reception.ts +194 -0
- package/ts/src/mirror/render.ts +75 -0
- package/ts/src/mirror/runtimeSession.ts +205 -0
- package/ts/src/mode/operatingMode.ts +148 -0
- package/ts/src/observability/callOutcome.ts +115 -0
- package/ts/src/observability/inspectLedger.ts +329 -0
- package/ts/src/observability/ledgerHooks.ts +126 -0
- package/ts/src/observability/llmCalls.ts +154 -0
- package/ts/src/persona/detectPersona.ts +81 -0
- package/ts/src/planning/promptAssembly.ts +111 -0
- package/ts/src/planning/weekPending.ts +81 -0
- package/ts/src/planning/weekPlan.ts +183 -0
- package/ts/src/planning/weekSave.ts +117 -0
- package/ts/src/providers/config.ts +189 -0
- package/ts/src/providers/cost.ts +64 -0
- package/ts/src/providers/credits.ts +204 -0
- package/ts/src/providers/embedding.ts +321 -0
- package/ts/src/providers/familyProviders.ts +147 -0
- package/ts/src/providers/llm.ts +334 -0
- package/ts/src/providers/openrouter.ts +244 -0
- package/ts/src/providers/redaction.ts +110 -0
- package/ts/src/providers/replay.ts +15 -0
- package/ts/src/providers/transport.ts +410 -0
- package/ts/src/repair/encodingRepair.ts +253 -0
- package/ts/src/runtime/backup.ts +151 -0
- package/ts/src/runtime/channel.ts +146 -0
- package/ts/src/runtime/config.ts +168 -0
- package/ts/src/runtime/diagnose.ts +686 -0
- package/ts/src/runtime/git.ts +510 -0
- package/ts/src/runtime/installKind.ts +220 -0
- package/ts/src/runtime/migrate.ts +154 -0
- package/ts/src/runtime/packageIdentity.ts +102 -0
- package/ts/src/runtime/releaseNotes.ts +244 -0
- package/ts/src/runtime/status.ts +557 -0
- package/ts/src/runtime/strategies/clone.ts +200 -0
- package/ts/src/runtime/strategies/package.ts +328 -0
- package/ts/src/runtime/treeRoot.ts +30 -0
- package/ts/src/runtime/update.ts +445 -0
- package/ts/src/runtime/updateGate.ts +40 -0
- package/ts/src/runtime/updatePipeline.ts +159 -0
- package/ts/src/runtime/version.ts +36 -0
- package/ts/src/runtime/wiring.ts +130 -0
- package/ts/src/search/memorySearch.ts +338 -0
- package/ts/src/search/ranker.ts +154 -0
- package/ts/src/seed/seed.ts +256 -0
- package/ts/src/seed/seedYaml.ts +133 -0
- package/ts/src/soul/apply.ts +218 -0
- package/ts/src/soul/harvest.ts +267 -0
- package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
- package/ts/src/soul/prompts/soul_self_voice.md +219 -0
- package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
- package/ts/src/soul/prompts.ts +85 -0
- package/ts/src/soul/render.ts +358 -0
- package/ts/src/soul/state.ts +212 -0
- package/ts/src/soul/transition.ts +37 -0
- package/ts/src/tasks/journeyPathParse.ts +113 -0
- package/ts/src/tasks/taskImportSync.ts +142 -0
- package/ts/src/tasks/taskStore.ts +312 -0
- package/ts/src/tasks/weekView.ts +120 -0
- package/ts/src/util/clipCodePoints.ts +26 -0
- package/ts/src/util/paths.ts +63 -0
- package/ts/src/util/program.ts +9 -0
- package/ts/src/util/pyGenerators.ts +144 -0
- package/ts/src/util/pythonText.ts +317 -0
- package/ts/src/util/semver.ts +45 -0
- package/ts/src/util/shellWord.ts +25 -0
- package/ts/src/util/slug.ts +64 -0
- package/ts/src/welcome/card.ts +339 -0
- package/ts/src/welcome/statusLine.ts +101 -0
- package/ts/src/welcome/updateCache.ts +129 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Core decoders for on-disk value shapes (originally CV22.DS2.TS2).
|
|
2
|
+
//
|
|
3
|
+
// These two functions turn the exact on-disk shapes the Python core writes
|
|
4
|
+
// (little-endian float32 embedding BLOBs, ISO timestamps) into the values the
|
|
5
|
+
// ranker consumes. They live in the db layer because both the production core
|
|
6
|
+
// (search/ranker.ts) and the parity harness depend on them — the dependency
|
|
7
|
+
// flows downward into the core, never from core into parity (CR006).
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Decode a little-endian IEEE-754 float32 BLOB into a `Float32Array`.
|
|
11
|
+
*
|
|
12
|
+
* The Python core stores embeddings as `np.float32(...).tobytes()`
|
|
13
|
+
* (see `memory.intelligence.embeddings.embedding_to_bytes`), i.e. packed
|
|
14
|
+
* little-endian 4-byte floats. We decode via `DataView` with an explicit
|
|
15
|
+
* little-endian flag so the result is independent of both the platform byte
|
|
16
|
+
* order and the byte alignment of the incoming view (a base64/Buffer decode can
|
|
17
|
+
* hand us a non-4-aligned `byteOffset`, which the `new Float32Array(buffer, …)`
|
|
18
|
+
* view constructor rejects).
|
|
19
|
+
*
|
|
20
|
+
* Trailing bytes that do not complete a 4-byte float are ignored, matching
|
|
21
|
+
* `np.frombuffer(data, dtype=np.float32)`.
|
|
22
|
+
*/
|
|
23
|
+
export function blobToFloat32(bytes: Uint8Array): Float32Array {
|
|
24
|
+
const count = Math.floor(bytes.byteLength / 4);
|
|
25
|
+
const out = new Float32Array(count);
|
|
26
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
27
|
+
for (let i = 0; i < count; i++) {
|
|
28
|
+
out[i] = view.getFloat32(i * 4, /* littleEndian */ true);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Encode a vector as a little-endian IEEE-754 float32 BLOB -- the counterpart
|
|
35
|
+
* to `blobToFloat32` and a byte-for-byte match of Python's
|
|
36
|
+
* `embedding_to_bytes` (`np.float32(...).tobytes()`). Shared by every writer
|
|
37
|
+
* that stores a freshly generated embedding (conversation extraction,
|
|
38
|
+
* cultivation's `merge` action), so the encode step has exactly one
|
|
39
|
+
* implementation, matching `blobToFloat32`'s single decode implementation.
|
|
40
|
+
*/
|
|
41
|
+
export function embeddingToBytes(values: readonly number[]): Uint8Array {
|
|
42
|
+
const buffer = Buffer.alloc(values.length * 4);
|
|
43
|
+
values.forEach((value, index) => {
|
|
44
|
+
buffer.writeFloatLE(value, index * 4);
|
|
45
|
+
});
|
|
46
|
+
return buffer;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parse a stored ISO timestamp into epoch milliseconds (UTC), or `null`.
|
|
51
|
+
*
|
|
52
|
+
* Mirrors `memory.intelligence.search._parse_datetime_utc`: naive strings are
|
|
53
|
+
* treated as UTC, while Z-suffixed and offset-aware strings are honored as
|
|
54
|
+
* written. Returns `null` for empty/unparseable input (the Python helper returns
|
|
55
|
+
* `None`, which the ranker treats as a neutral default).
|
|
56
|
+
*
|
|
57
|
+
* Millisecond precision is intentional: JS `Date` is millisecond-resolution, so
|
|
58
|
+
* the golden generator records epoch-ms references truncated to the same
|
|
59
|
+
* granularity.
|
|
60
|
+
*/
|
|
61
|
+
export function parseUtcMs(value: string | null | undefined): number | null {
|
|
62
|
+
if (!value) return null;
|
|
63
|
+
const hasTz = /[zZ]$|[+-]\d\d:\d\d$/.test(value);
|
|
64
|
+
const ms = Date.parse(hasTz ? value : `${value}Z`);
|
|
65
|
+
return Number.isNaN(ms) ? null : ms;
|
|
66
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// FTS5 integrity assertion for the database seam (CR021).
|
|
2
|
+
//
|
|
3
|
+
// `memories_fts` is an external-content FTS5 table kept in sync by triggers on
|
|
4
|
+
// `memories`. A write that fires those triggers can, in principle, leave the
|
|
5
|
+
// index inconsistent (the external-content "ghost row" failure mode). Nothing
|
|
6
|
+
// in the system ran FTS5's own integrity check; this exposes it so the
|
|
7
|
+
// write-parity harness can grade the FTS side-effect and a health surface can
|
|
8
|
+
// verify it.
|
|
9
|
+
|
|
10
|
+
import type { WritableDatabase } from "./database.ts";
|
|
11
|
+
|
|
12
|
+
/** Raised when the FTS5 integrity check reports a corrupt/inconsistent index. */
|
|
13
|
+
export class FtsIntegrityError extends Error {}
|
|
14
|
+
|
|
15
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
16
|
+
|
|
17
|
+
function tableExists(db: WritableDatabase, name: string): boolean {
|
|
18
|
+
return (
|
|
19
|
+
db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(name) !==
|
|
20
|
+
undefined
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Run FTS5's `integrity-check` for `ftsTable`, throwing `FtsIntegrityError` if
|
|
26
|
+
* the index is inconsistent with its content table. A no-op when the table is
|
|
27
|
+
* absent, so callers can invoke it unconditionally on any copy. Requires a
|
|
28
|
+
* writable handle (the check is issued as an FTS5 command INSERT).
|
|
29
|
+
*/
|
|
30
|
+
export function assertFtsIntegrity(db: WritableDatabase, ftsTable = "memories_fts"): void {
|
|
31
|
+
if (!IDENTIFIER.test(ftsTable)) {
|
|
32
|
+
throw new FtsIntegrityError(`unsafe FTS table identifier: ${ftsTable}`);
|
|
33
|
+
}
|
|
34
|
+
if (!tableExists(db, ftsTable)) return;
|
|
35
|
+
try {
|
|
36
|
+
db.prepare(`INSERT INTO ${ftsTable}(${ftsTable}) VALUES('integrity-check')`).run();
|
|
37
|
+
} catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
throw new FtsIntegrityError(`FTS integrity check failed for ${ftsTable}: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// Migrate-on-open — CV22.DS6.US3 (D2/D3).
|
|
2
|
+
//
|
|
3
|
+
// The front door's activation seam for forward migrations on an *existing*
|
|
4
|
+
// database. `bootstrapDatabaseIfMissing` only runs on a *missing* file, so
|
|
5
|
+
// without this seam an existing database never receives a new migration -- the
|
|
6
|
+
// column stays dormant, merely tolerated by `assertSchemaState`.
|
|
7
|
+
//
|
|
8
|
+
// CV22.DS10.TS5 made TypeScript the SOLE custodian (D-025). The seam was built
|
|
9
|
+
// for two engines: Python's MIGRATIONS list stopped at 016, so this applied
|
|
10
|
+
// only the TS-authored tail and DEFERRED whenever a Python-authored migration
|
|
11
|
+
// was pending, rather than let TypeScript silently apply work Python still
|
|
12
|
+
// owned. That deferral was honest while Python existed. Its verdict was not --
|
|
13
|
+
// `runtime migrate` printed `nothing pending`, exit 0, and the updater's
|
|
14
|
+
// migrate stage passed on a database with pending work nothing had applied.
|
|
15
|
+
//
|
|
16
|
+
// There is no second engine to defer to now, so the split is gone and every
|
|
17
|
+
// pending known migration is applied here. What remains as `declined` is
|
|
18
|
+
// structural and cannot be resolved by another engine: a file with no
|
|
19
|
+
// `_migrations` table, or a database carrying migrations this core does not
|
|
20
|
+
// know. Those fail loudly.
|
|
21
|
+
//
|
|
22
|
+
// Migrations, THEN the bootstrap schema (TS5 handoff review, finding B1).
|
|
23
|
+
// Python's `get_connection` ran both on every open, and the second half is the
|
|
24
|
+
// only thing that ever created the objects the schema has and no migration
|
|
25
|
+
// does: `_ext_migrations`, `_ext_bindings` and its index (v0.8.0), and
|
|
26
|
+
// `journey_mutation_receipts` (v0.31.12). Taking over the migrations without
|
|
27
|
+
// the schema step left a v0.7.0 home at "current (17/17)" and failing in
|
|
28
|
+
// Mirror Mode on `no such table: _ext_bindings`. So a slow-path open composes
|
|
29
|
+
// the two exactly as `bootstrapDatabase` does for a new file. Every Python-era
|
|
30
|
+
// database arrives with `017` pending and takes this path once. A database
|
|
31
|
+
// already at every migration but missing those objects gets no repair here;
|
|
32
|
+
// only TS5-era development copies can be in that state.
|
|
33
|
+
//
|
|
34
|
+
// Discipline (see this story's plan):
|
|
35
|
+
// - D2: called before serving on BOTH read and write opens, but the steady
|
|
36
|
+
// state is a single `_migrations` read -- no lock, no backup -- so the hot
|
|
37
|
+
// path of an already-current database pays almost nothing.
|
|
38
|
+
// - D3: the backup is conditional and owned here (not the per-write
|
|
39
|
+
// `openLiveWriteDatabase` snapshot), taken only once we have committed to applying a migration.
|
|
40
|
+
// - Backup-first, then lock, then idempotent `runMigrations`; the pending set
|
|
41
|
+
// is re-checked under the lock so concurrent openers cannot double-apply or
|
|
42
|
+
// double-backup (the loser sees nothing pending and no-ops).
|
|
43
|
+
|
|
44
|
+
import { chmodSync, existsSync, mkdirSync, rmSync } from "node:fs";
|
|
45
|
+
import { dirname, join } from "node:path";
|
|
46
|
+
import { PROGRAM } from "#util/program.ts";
|
|
47
|
+
|
|
48
|
+
import { acquireBootstrapLock, type BootstrapLockOptions } from "./bootstrapLock.ts";
|
|
49
|
+
import {
|
|
50
|
+
type OpenOptions,
|
|
51
|
+
openDatabaseForBootstrap,
|
|
52
|
+
openDatabaseReadOnly,
|
|
53
|
+
snapshotDatabaseTo,
|
|
54
|
+
} from "./database.ts";
|
|
55
|
+
import { runMigrations } from "./migrations.ts";
|
|
56
|
+
import { createSchema } from "./schema.ts";
|
|
57
|
+
import { KNOWN_MIGRATION_IDS } from "./schemaState.ts";
|
|
58
|
+
|
|
59
|
+
const BACKUP_DIR_NAME = "backups";
|
|
60
|
+
const MIGRATION_BACKUP_FILE_NAME = "frontdoor-pre-migration-backup.db";
|
|
61
|
+
|
|
62
|
+
/** Where migrate-on-open snapshots the database before applying a migration.
|
|
63
|
+
* A distinct name from the per-write backup so a migration snapshot never
|
|
64
|
+
* clobbers (or is clobbered by) a routine pre-write snapshot. */
|
|
65
|
+
export function migrationBackupPathFor(dbPath: string): string {
|
|
66
|
+
return join(dirname(dbPath), BACKUP_DIR_NAME, MIGRATION_BACKUP_FILE_NAME);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* What migrate-on-open did. THREE verdicts, not two (CV22.DS10.TS5, D-025).
|
|
71
|
+
*
|
|
72
|
+
* `declined` used to be `deferredToPython`, and it was honest while Python
|
|
73
|
+
* existed: the work was real, and another engine could do it. What was not
|
|
74
|
+
* honest was the VERDICT -- `runMigrate` reported `nothing pending` with exit
|
|
75
|
+
* 0, and the updater read that as a passing stage on a database with pending
|
|
76
|
+
* work nothing had applied.
|
|
77
|
+
*
|
|
78
|
+
* After this story there is nothing to defer to, so a decline is structural:
|
|
79
|
+
* the file is not a Mirror database, or it carries migrations this core does
|
|
80
|
+
* not know. Both are real refusals that must fail loudly rather than pass
|
|
81
|
+
* quietly, on the one command whose job is to leave the database correct after
|
|
82
|
+
* an update.
|
|
83
|
+
*/
|
|
84
|
+
export type MigrateVerdict = "applied" | "nothing_pending" | "declined";
|
|
85
|
+
|
|
86
|
+
export interface MigrateOnOpenResult {
|
|
87
|
+
/** Which of the three things happened. */
|
|
88
|
+
verdict: MigrateVerdict;
|
|
89
|
+
/** True only when this call actually applied one or more migrations. */
|
|
90
|
+
migrated: boolean;
|
|
91
|
+
/** The migration ids applied (empty unless `migrated`). */
|
|
92
|
+
appliedIds: readonly string[];
|
|
93
|
+
/** The pre-migration snapshot path, when a migration was applied. */
|
|
94
|
+
backupPath?: string;
|
|
95
|
+
/** Why the work was declined, when it was. Never empty for `declined`. */
|
|
96
|
+
declinedReason?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MigrateOnOpenOptions extends OpenOptions, BootstrapLockOptions {}
|
|
100
|
+
|
|
101
|
+
const NOTHING_PENDING: MigrateOnOpenResult = {
|
|
102
|
+
verdict: "nothing_pending",
|
|
103
|
+
migrated: false,
|
|
104
|
+
appliedIds: [],
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
function declined(reason: string): MigrateOnOpenResult {
|
|
108
|
+
return { verdict: "declined", migrated: false, appliedIds: [], declinedReason: reason };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Read the applied migration ids. Returns `null` when the database has no
|
|
113
|
+
* `_migrations` table — i.e. it is not a bootstrapped Mirror database. That is
|
|
114
|
+
* `assertSchemaState`'s error to raise, not ours: migrate-on-open simply
|
|
115
|
+
* declines rather than trying to bootstrap an unknown file.
|
|
116
|
+
*/
|
|
117
|
+
function appliedMigrationIds(dbPath: string, options: OpenOptions): Set<string> | null {
|
|
118
|
+
const db = openDatabaseReadOnly(dbPath, options);
|
|
119
|
+
try {
|
|
120
|
+
const rows = db.prepare("SELECT id FROM _migrations").all() as { id: string }[];
|
|
121
|
+
return new Set(rows.map((row) => row.id));
|
|
122
|
+
} catch {
|
|
123
|
+
return null;
|
|
124
|
+
} finally {
|
|
125
|
+
db.close();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The known migrations this database has not applied, in order.
|
|
131
|
+
*
|
|
132
|
+
* No split any more. Until CV22.DS10.TS5 this separated the TS-authored tail
|
|
133
|
+
* from Python-authored ids and declined the whole thing whenever a Python one
|
|
134
|
+
* was pending -- correct while Python could still apply them. TypeScript
|
|
135
|
+
* carries all seventeen and is the only engine left, so every pending known
|
|
136
|
+
* migration is simply pending.
|
|
137
|
+
*/
|
|
138
|
+
function pendingMigrations(applied: Set<string>): string[] {
|
|
139
|
+
return KNOWN_MIGRATION_IDS.filter((id) => !applied.has(id));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Migrations the database carries that this core does not know about. */
|
|
143
|
+
function unknownMigrations(applied: Set<string>): string[] {
|
|
144
|
+
const known = new Set(KNOWN_MIGRATION_IDS);
|
|
145
|
+
return [...applied].filter((id) => !known.has(id)).sort();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function takeBackup(dbPath: string): string {
|
|
149
|
+
const backupPath = migrationBackupPathFor(dbPath);
|
|
150
|
+
mkdirSync(dirname(backupPath), { recursive: true, mode: 0o700 });
|
|
151
|
+
rmSync(backupPath, { force: true });
|
|
152
|
+
snapshotDatabaseTo(dbPath, backupPath);
|
|
153
|
+
chmodSync(backupPath, 0o600);
|
|
154
|
+
return backupPath;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Bring an existing `dbPath` to this core's schema: apply every pending known
|
|
159
|
+
* migration, then the bootstrap schema, backup first and under the
|
|
160
|
+
* cross-process bootstrap lock. Cheap and side-effect-free when nothing is
|
|
161
|
+
* pending, which is every open after the first. Safe to call on every open.
|
|
162
|
+
* See the module header for the full contract.
|
|
163
|
+
*/
|
|
164
|
+
export function ensureMigratedOnOpen(
|
|
165
|
+
dbPath: string,
|
|
166
|
+
options: MigrateOnOpenOptions = {},
|
|
167
|
+
): MigrateOnOpenResult {
|
|
168
|
+
// A missing file is not this seam's business: `bootstrapDatabaseIfMissing`
|
|
169
|
+
// owns creation, and `runMigrate` reports the absence with its own message.
|
|
170
|
+
if (!existsSync(dbPath)) return NOTHING_PENDING;
|
|
171
|
+
|
|
172
|
+
// Cheap steady-state pre-check — no lock, no backup.
|
|
173
|
+
const applied = appliedMigrationIds(dbPath, options);
|
|
174
|
+
if (applied === null) {
|
|
175
|
+
return declined("database has no _migrations table — not a bootstrapped Mirror database");
|
|
176
|
+
}
|
|
177
|
+
const unknown = unknownMigrations(applied);
|
|
178
|
+
if (unknown.length > 0) {
|
|
179
|
+
// The database is AHEAD of this core. Applying anything now would write
|
|
180
|
+
// with older code against a newer schema; declining is the safe answer,
|
|
181
|
+
// and saying so is the honest one.
|
|
182
|
+
return declined(
|
|
183
|
+
`database carries migrations this core does not know (${unknown.join(", ")}) — ` +
|
|
184
|
+
`update this Mirror installation: ${PROGRAM} runtime update`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
if (pendingMigrations(applied).length === 0) return NOTHING_PENDING;
|
|
188
|
+
|
|
189
|
+
// Slow path: serialize with concurrent openers and re-decide under the lock so
|
|
190
|
+
// a race cannot double-apply or double-backup.
|
|
191
|
+
const lock = acquireBootstrapLock(dbPath, options);
|
|
192
|
+
try {
|
|
193
|
+
const appliedNow = appliedMigrationIds(dbPath, options);
|
|
194
|
+
if (appliedNow === null) {
|
|
195
|
+
return declined("database has no _migrations table — not a bootstrapped Mirror database");
|
|
196
|
+
}
|
|
197
|
+
const pending = pendingMigrations(appliedNow);
|
|
198
|
+
// Another opener migrated between the pre-check and the lock.
|
|
199
|
+
if (pending.length === 0) return NOTHING_PENDING;
|
|
200
|
+
|
|
201
|
+
const backupPath = takeBackup(dbPath);
|
|
202
|
+
const db = openDatabaseForBootstrap(dbPath, options);
|
|
203
|
+
try {
|
|
204
|
+
runMigrations(db);
|
|
205
|
+
// The half of Python's open that only the schema performed (B1).
|
|
206
|
+
createSchema(db);
|
|
207
|
+
} finally {
|
|
208
|
+
db.close();
|
|
209
|
+
}
|
|
210
|
+
return { verdict: "applied", migrated: true, appliedIds: pending, backupPath };
|
|
211
|
+
} finally {
|
|
212
|
+
lock.release();
|
|
213
|
+
}
|
|
214
|
+
}
|