mirror-mind 0.0.0-stage → 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.
Files changed (468) hide show
  1. package/.claude/hooks/log-session-end.sh +85 -0
  2. package/.claude/hooks/log-user-prompt.sh +85 -0
  3. package/.claude/hooks/mirror-inject.sh +85 -0
  4. package/.claude/hooks/session-start.sh +85 -0
  5. package/.gemini/hooks/log-assistant.sh +85 -0
  6. package/.gemini/hooks/log-user.sh +85 -0
  7. package/.gemini/hooks/session-end.sh +85 -0
  8. package/.gemini/hooks/session-start.sh +85 -0
  9. package/.pi/extensions/mirror-logger.ts +561 -0
  10. package/.pi/skills/mm-backup/SKILL.md +21 -0
  11. package/.pi/skills/mm-build/SKILL.md +1206 -0
  12. package/.pi/skills/mm-consolidate/SKILL.md +112 -0
  13. package/.pi/skills/mm-consult/SKILL.md +70 -0
  14. package/.pi/skills/mm-conversations/SKILL.md +16 -0
  15. package/.pi/skills/mm-discard/SKILL.md +39 -0
  16. package/.pi/skills/mm-explore/SKILL.md +255 -0
  17. package/.pi/skills/mm-help/SKILL.md +74 -0
  18. package/.pi/skills/mm-identity/SKILL.md +96 -0
  19. package/.pi/skills/mm-journal/SKILL.md +16 -0
  20. package/.pi/skills/mm-journey/SKILL.md +23 -0
  21. package/.pi/skills/mm-journeys/SKILL.md +15 -0
  22. package/.pi/skills/mm-memories/SKILL.md +17 -0
  23. package/.pi/skills/mm-mirror/SKILL.md +98 -0
  24. package/.pi/skills/mm-mute/SKILL.md +18 -0
  25. package/.pi/skills/mm-new/SKILL.md +18 -0
  26. package/.pi/skills/mm-recall/SKILL.md +17 -0
  27. package/.pi/skills/mm-release-notes/SKILL.md +52 -0
  28. package/.pi/skills/mm-seed/SKILL.md +19 -0
  29. package/.pi/skills/mm-shadow/SKILL.md +117 -0
  30. package/.pi/skills/mm-soul/SKILL.md +502 -0
  31. package/.pi/skills/mm-tasks/SKILL.md +24 -0
  32. package/.pi/skills/mm-update/SKILL.md +32 -0
  33. package/.pi/skills/mm-week/SKILL.md +28 -0
  34. package/.pi/skills/mm-welcome/SKILL.md +24 -0
  35. package/AGENTS.md +188 -0
  36. package/LICENSE +21 -0
  37. package/README.md +128 -2
  38. package/bin/loader.js +67 -0
  39. package/bin/mirror-hook.js +7 -0
  40. package/bin/mirror.js +7 -0
  41. package/docs/releases/index.md +99 -0
  42. package/docs/releases/pending-cutoffs.md +510 -0
  43. package/docs/releases/v0.10.0.md +123 -0
  44. package/docs/releases/v0.10.1.md +66 -0
  45. package/docs/releases/v0.10.10.md +51 -0
  46. package/docs/releases/v0.10.11.md +39 -0
  47. package/docs/releases/v0.10.12.md +57 -0
  48. package/docs/releases/v0.10.13.md +35 -0
  49. package/docs/releases/v0.10.14.md +42 -0
  50. package/docs/releases/v0.10.15.md +53 -0
  51. package/docs/releases/v0.10.16.md +35 -0
  52. package/docs/releases/v0.10.17.md +43 -0
  53. package/docs/releases/v0.10.2.md +64 -0
  54. package/docs/releases/v0.10.3.md +78 -0
  55. package/docs/releases/v0.10.4.md +42 -0
  56. package/docs/releases/v0.10.5.md +57 -0
  57. package/docs/releases/v0.10.6.md +47 -0
  58. package/docs/releases/v0.10.7.md +53 -0
  59. package/docs/releases/v0.10.8.md +49 -0
  60. package/docs/releases/v0.10.9.md +37 -0
  61. package/docs/releases/v0.11.0.md +86 -0
  62. package/docs/releases/v0.12.0.md +67 -0
  63. package/docs/releases/v0.13.0.md +64 -0
  64. package/docs/releases/v0.14.0.md +68 -0
  65. package/docs/releases/v0.15.0.md +48 -0
  66. package/docs/releases/v0.16.0.md +50 -0
  67. package/docs/releases/v0.16.1.md +55 -0
  68. package/docs/releases/v0.16.2.md +36 -0
  69. package/docs/releases/v0.17.0.md +50 -0
  70. package/docs/releases/v0.17.1.md +58 -0
  71. package/docs/releases/v0.17.2.md +42 -0
  72. package/docs/releases/v0.17.3.md +58 -0
  73. package/docs/releases/v0.18.0.md +84 -0
  74. package/docs/releases/v0.18.1.md +51 -0
  75. package/docs/releases/v0.18.2.md +69 -0
  76. package/docs/releases/v0.19.0.md +85 -0
  77. package/docs/releases/v0.19.1.md +46 -0
  78. package/docs/releases/v0.20.0.md +85 -0
  79. package/docs/releases/v0.21.0.md +61 -0
  80. package/docs/releases/v0.21.1.md +47 -0
  81. package/docs/releases/v0.22.0.md +77 -0
  82. package/docs/releases/v0.22.1.md +42 -0
  83. package/docs/releases/v0.23.0.md +105 -0
  84. package/docs/releases/v0.24.0.md +125 -0
  85. package/docs/releases/v0.25.0.md +107 -0
  86. package/docs/releases/v0.26.0.md +139 -0
  87. package/docs/releases/v0.26.1.md +65 -0
  88. package/docs/releases/v0.26.2.md +43 -0
  89. package/docs/releases/v0.27.0.md +63 -0
  90. package/docs/releases/v0.28.0.md +59 -0
  91. package/docs/releases/v0.29.0.md +61 -0
  92. package/docs/releases/v0.29.1.md +59 -0
  93. package/docs/releases/v0.29.2.md +59 -0
  94. package/docs/releases/v0.29.3.md +93 -0
  95. package/docs/releases/v0.30.0.md +75 -0
  96. package/docs/releases/v0.30.1.md +93 -0
  97. package/docs/releases/v0.30.2.md +66 -0
  98. package/docs/releases/v0.31.0.md +122 -0
  99. package/docs/releases/v0.31.1.md +142 -0
  100. package/docs/releases/v0.31.10.md +118 -0
  101. package/docs/releases/v0.31.11.md +88 -0
  102. package/docs/releases/v0.31.12.md +105 -0
  103. package/docs/releases/v0.31.13.md +99 -0
  104. package/docs/releases/v0.31.14.md +97 -0
  105. package/docs/releases/v0.31.2.md +115 -0
  106. package/docs/releases/v0.31.3.md +142 -0
  107. package/docs/releases/v0.31.4.md +117 -0
  108. package/docs/releases/v0.31.5.md +155 -0
  109. package/docs/releases/v0.31.6.md +132 -0
  110. package/docs/releases/v0.31.7.md +132 -0
  111. package/docs/releases/v0.31.8.md +120 -0
  112. package/docs/releases/v0.31.9.md +120 -0
  113. package/docs/releases/v0.32.0.md +261 -0
  114. package/docs/releases/v0.32.1.md +59 -0
  115. package/docs/releases/v0.8.0.md +118 -0
  116. package/docs/releases/v0.9.0.md +98 -0
  117. package/docs/releases/v0.9.1.md +83 -0
  118. package/package.json +110 -4
  119. package/plugins/mirror-mind/.claude-plugin/plugin.json +13 -0
  120. package/plugins/mirror-mind/hooks/hooks.json +50 -0
  121. package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
  122. package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
  123. package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
  124. package/plugins/mirror-mind/hooks/session-start.sh +98 -0
  125. package/plugins/mirror-mind/mcp/launch.sh +52 -0
  126. package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
  127. package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
  128. package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
  129. package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
  130. package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
  131. package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
  132. package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
  133. package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
  134. package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
  135. package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
  136. package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
  137. package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
  138. package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
  139. package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +65 -0
  140. package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
  141. package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
  142. package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
  143. package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
  144. package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
  145. package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
  146. package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
  147. package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
  148. package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
  149. package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
  150. package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
  151. package/scripts/codex-hooks/session-end.sh +85 -0
  152. package/scripts/codex-hooks/session-start.sh +85 -0
  153. package/scripts/codex-mirror.sh +48 -0
  154. package/templates/identity/README.md +119 -0
  155. package/templates/identity/ego/behavior.yaml +52 -0
  156. package/templates/identity/ego/constraints.yaml +15 -0
  157. package/templates/identity/ego/identity.yaml +43 -0
  158. package/templates/identity/journeys/personal-growth.yaml +39 -0
  159. package/templates/identity/organization/identity.yaml +24 -0
  160. package/templates/identity/organization/principles.yaml +17 -0
  161. package/templates/identity/personas/coach.yaml +94 -0
  162. package/templates/identity/personas/designer.yaml +93 -0
  163. package/templates/identity/personas/doctor.yaml +96 -0
  164. package/templates/identity/personas/engineer.yaml +77 -0
  165. package/templates/identity/personas/financial.yaml +97 -0
  166. package/templates/identity/personas/prompt-engineer.yaml +122 -0
  167. package/templates/identity/personas/researcher.yaml +88 -0
  168. package/templates/identity/personas/strategist.yaml +91 -0
  169. package/templates/identity/personas/teacher.yaml +95 -0
  170. package/templates/identity/personas/therapist.yaml +91 -0
  171. package/templates/identity/personas/thinker.yaml +74 -0
  172. package/templates/identity/personas/writer.yaml +76 -0
  173. package/templates/identity/self/config.yaml +16 -0
  174. package/templates/identity/self/soul.yaml +105 -0
  175. package/templates/identity/user/identity.yaml +30 -0
  176. package/ts/src/backup/staging.ts +62 -0
  177. package/ts/src/backup/zipBackup.ts +267 -0
  178. package/ts/src/backup/zipReader.ts +109 -0
  179. package/ts/src/backup/zipWriter.ts +148 -0
  180. package/ts/src/builder/activeCheckpoint.ts +134 -0
  181. package/ts/src/builder/aggregateStatus.ts +34 -0
  182. package/ts/src/builder/approve.ts +149 -0
  183. package/ts/src/builder/argv.ts +292 -0
  184. package/ts/src/builder/ariadMethod.ts +536 -0
  185. package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
  186. package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
  187. package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
  188. package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
  189. package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
  190. package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
  191. package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
  192. package/ts/src/builder/artifacts/storyFiles.ts +61 -0
  193. package/ts/src/builder/artifacts/storyIndex.ts +166 -0
  194. package/ts/src/builder/cadence.ts +59 -0
  195. package/ts/src/builder/card.ts +192 -0
  196. package/ts/src/builder/checkpointRefused.ts +66 -0
  197. package/ts/src/builder/closure.ts +964 -0
  198. package/ts/src/builder/commands.ts +2053 -0
  199. package/ts/src/builder/cursorPosition.ts +176 -0
  200. package/ts/src/builder/cursorTransitions.ts +77 -0
  201. package/ts/src/builder/deliveryCursor.ts +577 -0
  202. package/ts/src/builder/deliveryStoryClosure.ts +521 -0
  203. package/ts/src/builder/deliveryStoryPlan.ts +536 -0
  204. package/ts/src/builder/deliveryStoryReady.ts +160 -0
  205. package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
  206. package/ts/src/builder/expand.ts +336 -0
  207. package/ts/src/builder/flowUnit.ts +339 -0
  208. package/ts/src/builder/homeSurface.ts +122 -0
  209. package/ts/src/builder/implementationGuard.ts +125 -0
  210. package/ts/src/builder/index.ts +11 -0
  211. package/ts/src/builder/lifecycleRefusal.ts +92 -0
  212. package/ts/src/builder/lifecycleRibbon.ts +159 -0
  213. package/ts/src/builder/load.ts +313 -0
  214. package/ts/src/builder/methodAdoption.ts +113 -0
  215. package/ts/src/builder/methodDefinition.ts +429 -0
  216. package/ts/src/builder/methodInspection.ts +371 -0
  217. package/ts/src/builder/plan.ts +408 -0
  218. package/ts/src/builder/planPreauthorization.ts +265 -0
  219. package/ts/src/builder/prepare.ts +225 -0
  220. package/ts/src/builder/projectPaths.ts +64 -0
  221. package/ts/src/builder/pull.ts +356 -0
  222. package/ts/src/builder/pullCandidates.ts +463 -0
  223. package/ts/src/builder/pullCandidatesRender.ts +238 -0
  224. package/ts/src/builder/refinementField.ts +93 -0
  225. package/ts/src/builder/releaseIntent.ts +173 -0
  226. package/ts/src/builder/resumeState.ts +84 -0
  227. package/ts/src/builder/resumeSurface.ts +149 -0
  228. package/ts/src/builder/roadmapGrammar.ts +300 -0
  229. package/ts/src/builder/roadmapScan.ts +97 -0
  230. package/ts/src/builder/roadmapScope.ts +210 -0
  231. package/ts/src/builder/scopePhrases.ts +146 -0
  232. package/ts/src/builder/storyPaths.ts +196 -0
  233. package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
  234. package/ts/src/builder/surfaceProtocol.ts +42 -0
  235. package/ts/src/builder/templateGeneration.ts +148 -0
  236. package/ts/src/builder/transition.ts +178 -0
  237. package/ts/src/consult/args.ts +99 -0
  238. package/ts/src/consult/core.ts +122 -0
  239. package/ts/src/consult/modelCatalog.ts +55 -0
  240. package/ts/src/consult/render.ts +47 -0
  241. package/ts/src/conversation/append.ts +414 -0
  242. package/ts/src/conversation/backfill.ts +387 -0
  243. package/ts/src/conversation/closeTail.ts +467 -0
  244. package/ts/src/conversation/extraction.ts +333 -0
  245. package/ts/src/conversation/extractionDriver.ts +130 -0
  246. package/ts/src/conversation/extractionRun.ts +70 -0
  247. package/ts/src/conversation/journeyInference.ts +165 -0
  248. package/ts/src/conversation/journeyRepair.ts +114 -0
  249. package/ts/src/conversation/lifecycleFaces.ts +197 -0
  250. package/ts/src/conversation/lifecycleWrites.ts +313 -0
  251. package/ts/src/conversation/listing.ts +77 -0
  252. package/ts/src/conversation/logger.ts +576 -0
  253. package/ts/src/conversation/loggerCli.ts +282 -0
  254. package/ts/src/conversation/loggerRuntime.ts +259 -0
  255. package/ts/src/conversation/metadataLifecycle.ts +443 -0
  256. package/ts/src/conversation/recall.ts +66 -0
  257. package/ts/src/conversation/sessionComposites.ts +258 -0
  258. package/ts/src/conversation/sessionImport.ts +90 -0
  259. package/ts/src/conversation/transcriptBackfill.ts +141 -0
  260. package/ts/src/cultivation/applyActions.ts +241 -0
  261. package/ts/src/cultivation/cluster.ts +86 -0
  262. package/ts/src/cultivation/consolidationStore.ts +281 -0
  263. package/ts/src/cultivation/promptContext.ts +62 -0
  264. package/ts/src/cultivation/propose.ts +305 -0
  265. package/ts/src/cultivation/scan.ts +155 -0
  266. package/ts/src/db/backupGate.ts +47 -0
  267. package/ts/src/db/bootstrap.ts +108 -0
  268. package/ts/src/db/bootstrapLock.ts +223 -0
  269. package/ts/src/db/copyGuard.ts +60 -0
  270. package/ts/src/db/database.ts +397 -0
  271. package/ts/src/db/decode.ts +66 -0
  272. package/ts/src/db/ftsIntegrity.ts +41 -0
  273. package/ts/src/db/migrateOnOpen.ts +214 -0
  274. package/ts/src/db/migrations.ts +576 -0
  275. package/ts/src/db/readyOnOpen.ts +35 -0
  276. package/ts/src/db/rowDecode.ts +42 -0
  277. package/ts/src/db/schema.ts +432 -0
  278. package/ts/src/db/schemaInventory.ts +225 -0
  279. package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
  280. package/ts/src/db/schemaState.ts +91 -0
  281. package/ts/src/db/schemaTsDivergence.ts +114 -0
  282. package/ts/src/descriptor/descriptorRead.ts +49 -0
  283. package/ts/src/docs/docsLint.ts +265 -0
  284. package/ts/src/explorer/handoff.ts +522 -0
  285. package/ts/src/explorer/render.ts +335 -0
  286. package/ts/src/explorer/story.ts +769 -0
  287. package/ts/src/explorer/transition.ts +72 -0
  288. package/ts/src/extensions/bindings.ts +170 -0
  289. package/ts/src/extensions/catalog.ts +249 -0
  290. package/ts/src/extensions/catalogCommands.ts +513 -0
  291. package/ts/src/extensions/catalogWrites.ts +652 -0
  292. package/ts/src/extensions/contextRuntime.ts +325 -0
  293. package/ts/src/extensions/dispatch.ts +374 -0
  294. package/ts/src/extensions/errors.ts +24 -0
  295. package/ts/src/extensions/manifest.ts +356 -0
  296. package/ts/src/extensions/migrations.ts +350 -0
  297. package/ts/src/extraction/conversation.ts +304 -0
  298. package/ts/src/extraction/conversationMetadata.ts +206 -0
  299. package/ts/src/extraction/fencing.ts +106 -0
  300. package/ts/src/extraction/json.ts +17 -0
  301. package/ts/src/extraction/prompts.ts +470 -0
  302. package/ts/src/frontDoor/args.ts +30 -0
  303. package/ts/src/frontDoor/argvShape.ts +106 -0
  304. package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
  305. package/ts/src/frontDoor/buildRoute.ts +398 -0
  306. package/ts/src/frontDoor/cli.ts +1865 -0
  307. package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
  308. package/ts/src/frontDoor/consultRoute.ts +50 -0
  309. package/ts/src/frontDoor/contentTailRoute.ts +239 -0
  310. package/ts/src/frontDoor/conversationLoggerRoute.ts +73 -0
  311. package/ts/src/frontDoor/cultivationRoute.ts +210 -0
  312. package/ts/src/frontDoor/dbPath.ts +131 -0
  313. package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
  314. package/ts/src/frontDoor/exploreRoute.ts +572 -0
  315. package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
  316. package/ts/src/frontDoor/frontDoorLog.ts +57 -0
  317. package/ts/src/frontDoor/identityWrite.ts +36 -0
  318. package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
  319. package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
  320. package/ts/src/frontDoor/liveBackup.ts +100 -0
  321. package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
  322. package/ts/src/frontDoor/namedRefusal.ts +35 -0
  323. package/ts/src/frontDoor/nodeSupport.ts +24 -0
  324. package/ts/src/frontDoor/render/consolidate.ts +199 -0
  325. package/ts/src/frontDoor/render/conversations.ts +33 -0
  326. package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
  327. package/ts/src/frontDoor/render/descriptor.ts +20 -0
  328. package/ts/src/frontDoor/render/detectPersona.ts +50 -0
  329. package/ts/src/frontDoor/render/icons.ts +13 -0
  330. package/ts/src/frontDoor/render/identity.ts +59 -0
  331. package/ts/src/frontDoor/render/identityRows.ts +17 -0
  332. package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
  333. package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
  334. package/ts/src/frontDoor/render/journeys.ts +79 -0
  335. package/ts/src/frontDoor/render/list.ts +41 -0
  336. package/ts/src/frontDoor/render/memories.ts +67 -0
  337. package/ts/src/frontDoor/render/recall.ts +49 -0
  338. package/ts/src/frontDoor/render/shadow.ts +155 -0
  339. package/ts/src/frontDoor/render/tasks.ts +99 -0
  340. package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
  341. package/ts/src/frontDoor/render/week.ts +113 -0
  342. package/ts/src/frontDoor/routing.ts +999 -0
  343. package/ts/src/frontDoor/runtimeRoute.ts +623 -0
  344. package/ts/src/frontDoor/searchRoute.ts +166 -0
  345. package/ts/src/frontDoor/seedPaths.ts +98 -0
  346. package/ts/src/frontDoor/soulRoute.ts +433 -0
  347. package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
  348. package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
  349. package/ts/src/frontDoor/usage.ts +176 -0
  350. package/ts/src/guards/claudePlugin.ts +252 -0
  351. package/ts/src/guards/packContents.ts +306 -0
  352. package/ts/src/guards/piSourcedSkills.ts +70 -0
  353. package/ts/src/guards/retiredRouteShadows.ts +57 -0
  354. package/ts/src/guards/retiredSurfaces.ts +564 -0
  355. package/ts/src/hooks/claude.ts +176 -0
  356. package/ts/src/hooks/codex.ts +45 -0
  357. package/ts/src/hooks/gemini.ts +126 -0
  358. package/ts/src/hooks/main.ts +109 -0
  359. package/ts/src/hooks/mirrorState.ts +71 -0
  360. package/ts/src/hooks/payload.ts +68 -0
  361. package/ts/src/hooks/runtime.ts +159 -0
  362. package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
  363. package/ts/src/identity/descriptorGenerate.ts +162 -0
  364. package/ts/src/identity/identityEdit.ts +143 -0
  365. package/ts/src/identity/identityKey.ts +77 -0
  366. package/ts/src/identity/identityRead.ts +69 -0
  367. package/ts/src/identity/identityStore.ts +80 -0
  368. package/ts/src/identity/journeyListing.ts +53 -0
  369. package/ts/src/identity/personaInspect.ts +44 -0
  370. package/ts/src/identity/personaListing.ts +37 -0
  371. package/ts/src/identity/setIdentity.ts +64 -0
  372. package/ts/src/index.ts +231 -0
  373. package/ts/src/init/init.ts +111 -0
  374. package/ts/src/journey/journeyOptions.ts +131 -0
  375. package/ts/src/journey/journeyRemoval.ts +158 -0
  376. package/ts/src/journey/journeyStatus.ts +149 -0
  377. package/ts/src/journey/journeySyncFile.ts +87 -0
  378. package/ts/src/journey/journeyWrite.ts +203 -0
  379. package/ts/src/journey/parentJourney.ts +41 -0
  380. package/ts/src/journey/validateParentJourney.ts +55 -0
  381. package/ts/src/mcp/boundary.ts +151 -0
  382. package/ts/src/mcp/guards.ts +244 -0
  383. package/ts/src/mcp/main.ts +121 -0
  384. package/ts/src/mcp/payload.ts +141 -0
  385. package/ts/src/mcp/protocol.ts +141 -0
  386. package/ts/src/mcp/readModels.ts +241 -0
  387. package/ts/src/mcp/registry.ts +201 -0
  388. package/ts/src/mcp/serve.ts +120 -0
  389. package/ts/src/mcp/tools/deterministic.ts +137 -0
  390. package/ts/src/mcp/tools/providerCrossing.ts +187 -0
  391. package/ts/src/mcp/wire.ts +8 -0
  392. package/ts/src/memory/journal.ts +180 -0
  393. package/ts/src/memory/listing.ts +107 -0
  394. package/ts/src/memory/memoryWrite.ts +88 -0
  395. package/ts/src/memory/reinforcement.ts +35 -0
  396. package/ts/src/mirror/context.ts +161 -0
  397. package/ts/src/mirror/defaultResolution.ts +199 -0
  398. package/ts/src/mirror/orchestration.ts +364 -0
  399. package/ts/src/mirror/reception.ts +194 -0
  400. package/ts/src/mirror/render.ts +75 -0
  401. package/ts/src/mirror/runtimeSession.ts +205 -0
  402. package/ts/src/mode/operatingMode.ts +148 -0
  403. package/ts/src/observability/callOutcome.ts +115 -0
  404. package/ts/src/observability/inspectLedger.ts +329 -0
  405. package/ts/src/observability/ledgerHooks.ts +126 -0
  406. package/ts/src/observability/llmCalls.ts +154 -0
  407. package/ts/src/persona/detectPersona.ts +81 -0
  408. package/ts/src/planning/promptAssembly.ts +111 -0
  409. package/ts/src/planning/weekPending.ts +81 -0
  410. package/ts/src/planning/weekPlan.ts +183 -0
  411. package/ts/src/planning/weekSave.ts +117 -0
  412. package/ts/src/providers/config.ts +189 -0
  413. package/ts/src/providers/cost.ts +64 -0
  414. package/ts/src/providers/credits.ts +204 -0
  415. package/ts/src/providers/embedding.ts +321 -0
  416. package/ts/src/providers/familyProviders.ts +147 -0
  417. package/ts/src/providers/llm.ts +334 -0
  418. package/ts/src/providers/openrouter.ts +244 -0
  419. package/ts/src/providers/redaction.ts +110 -0
  420. package/ts/src/providers/replay.ts +15 -0
  421. package/ts/src/providers/transport.ts +410 -0
  422. package/ts/src/repair/encodingRepair.ts +253 -0
  423. package/ts/src/runtime/backup.ts +151 -0
  424. package/ts/src/runtime/channel.ts +146 -0
  425. package/ts/src/runtime/config.ts +168 -0
  426. package/ts/src/runtime/diagnose.ts +686 -0
  427. package/ts/src/runtime/git.ts +510 -0
  428. package/ts/src/runtime/installKind.ts +220 -0
  429. package/ts/src/runtime/migrate.ts +154 -0
  430. package/ts/src/runtime/packageIdentity.ts +102 -0
  431. package/ts/src/runtime/releaseNotes.ts +244 -0
  432. package/ts/src/runtime/status.ts +557 -0
  433. package/ts/src/runtime/strategies/clone.ts +200 -0
  434. package/ts/src/runtime/strategies/package.ts +328 -0
  435. package/ts/src/runtime/treeRoot.ts +30 -0
  436. package/ts/src/runtime/update.ts +445 -0
  437. package/ts/src/runtime/updateGate.ts +40 -0
  438. package/ts/src/runtime/updatePipeline.ts +159 -0
  439. package/ts/src/runtime/version.ts +36 -0
  440. package/ts/src/runtime/wiring.ts +130 -0
  441. package/ts/src/search/memorySearch.ts +338 -0
  442. package/ts/src/search/ranker.ts +154 -0
  443. package/ts/src/seed/seed.ts +256 -0
  444. package/ts/src/seed/seedYaml.ts +133 -0
  445. package/ts/src/soul/apply.ts +218 -0
  446. package/ts/src/soul/harvest.ts +267 -0
  447. package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
  448. package/ts/src/soul/prompts/soul_self_voice.md +219 -0
  449. package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
  450. package/ts/src/soul/prompts.ts +85 -0
  451. package/ts/src/soul/render.ts +358 -0
  452. package/ts/src/soul/state.ts +212 -0
  453. package/ts/src/soul/transition.ts +37 -0
  454. package/ts/src/tasks/journeyPathParse.ts +113 -0
  455. package/ts/src/tasks/taskImportSync.ts +142 -0
  456. package/ts/src/tasks/taskStore.ts +312 -0
  457. package/ts/src/tasks/weekView.ts +120 -0
  458. package/ts/src/util/clipCodePoints.ts +26 -0
  459. package/ts/src/util/paths.ts +63 -0
  460. package/ts/src/util/program.ts +9 -0
  461. package/ts/src/util/pyGenerators.ts +144 -0
  462. package/ts/src/util/pythonText.ts +317 -0
  463. package/ts/src/util/semver.ts +45 -0
  464. package/ts/src/util/shellWord.ts +25 -0
  465. package/ts/src/util/slug.ts +64 -0
  466. package/ts/src/welcome/card.ts +339 -0
  467. package/ts/src/welcome/statusLine.ts +101 -0
  468. package/ts/src/welcome/updateCache.ts +129 -0
@@ -0,0 +1,80 @@
1
+ // TS identity-table writes — the port of storage/identity.py upsert_identity and
2
+ // update_identity_metadata. These are the deterministic write primitives behind
3
+ // journey and identity management. `id` and `now` are injected so parity runs
4
+ // match the Python oracle (Python generates a random UUID id and a microsecond
5
+ // now).
6
+
7
+ import type { WritableDatabase } from "#db/database.ts";
8
+ import { assertNewIdentityKey } from "./identityKey.ts";
9
+
10
+ /** The writable columns of an identity row (version is TEXT, e.g. "1.0.0"). */
11
+ export interface IdentityRow {
12
+ id: string;
13
+ layer: string;
14
+ key: string;
15
+ content: string;
16
+ version: string;
17
+ metadata: string | null;
18
+ }
19
+
20
+ /**
21
+ * INSERT the identity when (layer, key) is absent, else UPDATE it — mirroring
22
+ * upsert_identity. On INSERT, created_at and updated_at are both the injected
23
+ * now; on UPDATE only updated_at changes and the existing id and created_at are
24
+ * preserved (the WHERE is on the unique (layer, key), so the injected id is
25
+ * ignored for an update, exactly as Python reuses existing.id).
26
+ *
27
+ * This is the only INSERT into `identity`, so it is where a new journey slug or
28
+ * persona id is held to its grammar (CR104): an INSERT whose key breaks it throws
29
+ * `InvalidIdentityKeyError` and writes nothing. An UPDATE never checks, because a
30
+ * key that already exists predates the grammar and must stay writable.
31
+ */
32
+ export function upsertIdentity(db: WritableDatabase, identity: IdentityRow, nowIso: string): void {
33
+ const existing = db
34
+ .prepare("SELECT id FROM identity WHERE layer = ? AND key = ?")
35
+ .get(identity.layer, identity.key);
36
+ if (existing !== undefined) {
37
+ db.prepare(
38
+ "UPDATE identity SET content = ?, version = ?, updated_at = ?, metadata = ? " +
39
+ "WHERE layer = ? AND key = ?",
40
+ ).run(
41
+ identity.content,
42
+ identity.version,
43
+ nowIso,
44
+ identity.metadata,
45
+ identity.layer,
46
+ identity.key,
47
+ );
48
+ } else {
49
+ assertNewIdentityKey(identity.layer, identity.key);
50
+ db.prepare(
51
+ "INSERT INTO identity (id, layer, key, content, version, created_at, updated_at, metadata) " +
52
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
53
+ ).run(
54
+ identity.id,
55
+ identity.layer,
56
+ identity.key,
57
+ identity.content,
58
+ identity.version,
59
+ nowIso,
60
+ nowIso,
61
+ identity.metadata,
62
+ );
63
+ }
64
+ }
65
+
66
+ /** UPDATE only metadata and updated_at — mirrors update_identity_metadata. */
67
+ export function updateIdentityMetadata(
68
+ db: WritableDatabase,
69
+ layer: string,
70
+ key: string,
71
+ metadata: string,
72
+ nowIso: string,
73
+ ): void {
74
+ db.prepare("UPDATE identity SET metadata = ?, updated_at = ? WHERE layer = ? AND key = ?").run(
75
+ metadata,
76
+ nowIso,
77
+ layer,
78
+ key,
79
+ );
80
+ }
@@ -0,0 +1,53 @@
1
+ // `list journeys` read primitives — the port of the journey branch of
2
+ // memory.cli.inspect.cmd_list (`_extract_status` / `_extract_description`).
3
+ //
4
+ // Deliberately NOT reused from journey/journeyOptions.ts: that module ports a
5
+ // different Python method (`list_journey_options`, behind the `journeys`
6
+ // top-level command) with a full-line status regex and no description
7
+ // truncation. This command's Python source (memory.cli.inspect) extracts a
8
+ // single \w+ status word, tries a Portuguese "## Descrição" heading before an
9
+ // English "## Description" fallback (two separate searches, not one
10
+ // alternation — order matters when content could contain both), and caps the
11
+ // description at 120 chars, not 150. Porting it as its own function keeps the
12
+ // two Python call sites' independent behavior independently reproduced.
13
+
14
+ import type { Database } from "#db/database.ts";
15
+ import { optionalString, requireString } from "#db/rowDecode.ts";
16
+
17
+ export interface JourneyListRow {
18
+ key: string;
19
+ status: string;
20
+ description: string;
21
+ }
22
+
23
+ /** Port of `_extract_status`: the first `**Status:** <word>`, or "unknown". */
24
+ export function extractStatus(content: string): string {
25
+ const match = content.match(/\*\*Status:\*\*\s*(\w+)/);
26
+ return match ? match[1] : "unknown";
27
+ }
28
+
29
+ /**
30
+ * Port of `_extract_description`: try a Portuguese "## Descrição" section
31
+ * first, then an English "## Description" section, ending at a blank line or
32
+ * the next heading; trimmed and capped at 120 chars.
33
+ */
34
+ function extractDescription(content: string): string {
35
+ const pt = content.match(/## Descrição\s*\n+(.+?)(?:\n\n|\n##)/s);
36
+ const match = pt ?? content.match(/## Description\s*\n+(.+?)(?:\n\n|\n##)/s);
37
+ return match ? match[1].trim().slice(0, 120) : "";
38
+ }
39
+
40
+ /** Port of `mem.get_identity(layer="journey")`, pre-sorted by key (Python re-sorts a no-op). */
41
+ export function listJourneysForListCommand(db: Database): JourneyListRow[] {
42
+ return db
43
+ .prepare("SELECT key, content FROM identity WHERE layer = 'journey' ORDER BY key")
44
+ .all()
45
+ .map((row) => {
46
+ const content = optionalString(row, "content") ?? "";
47
+ return {
48
+ key: requireString(row, "key"),
49
+ status: extractStatus(content),
50
+ description: extractDescription(content),
51
+ };
52
+ });
53
+ }
@@ -0,0 +1,44 @@
1
+ // `inspect persona` read primitives — the port of memory.cli.inspect._inspect_persona
2
+ // and its shared _persona_metadata helper. `inspect extension`/`runtime-catalog`/
3
+ // `llm-calls`/`embedding-provenance` share the extension catalog / ops-tail
4
+ // machinery and stay on Python, bound to CV22.DS7.TS1.
5
+
6
+ import type { Database } from "#db/database.ts";
7
+ import { optionalString, requireString } from "#db/rowDecode.ts";
8
+
9
+ export interface PersonaInspectRow {
10
+ version: string;
11
+ updatedAt: string;
12
+ content: string;
13
+ /** Parsed JSON object metadata, or {} for null/malformed/non-object metadata. */
14
+ metadata: Record<string, unknown>;
15
+ }
16
+
17
+ /** Port of `_persona_metadata`: {} for null, malformed JSON, or a non-object payload. */
18
+ function parseMetadataObject(raw: string | null): Record<string, unknown> {
19
+ if (!raw) return {};
20
+ try {
21
+ const parsed = JSON.parse(raw) as unknown;
22
+ return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
23
+ ? (parsed as Record<string, unknown>)
24
+ : {};
25
+ } catch {
26
+ return {};
27
+ }
28
+ }
29
+
30
+ /** Port of `mem.store.get_identity("persona", persona_id)`, projected for inspect. */
31
+ export function getPersonaInspect(db: Database, personaId: string): PersonaInspectRow | null {
32
+ const row = db
33
+ .prepare(
34
+ "SELECT version, updated_at, content, metadata FROM identity WHERE layer = 'persona' AND key = ?",
35
+ )
36
+ .get(personaId);
37
+ if (row === undefined) return null;
38
+ return {
39
+ version: requireString(row, "version"),
40
+ updatedAt: requireString(row, "updated_at"),
41
+ content: requireString(row, "content"),
42
+ metadata: parseMetadataObject(optionalString(row, "metadata")),
43
+ };
44
+ }
@@ -0,0 +1,37 @@
1
+ // `list personas` read primitives — the port of the persona branch of
2
+ // memory.cli.inspect.cmd_list. Distinct from persona/detectPersona.ts's
3
+ // `routingRows`: same JSON shape, different call site/output (this one also
4
+ // needs `version`).
5
+
6
+ import type { Database } from "#db/database.ts";
7
+ import { optionalString, requireString } from "#db/rowDecode.ts";
8
+
9
+ export interface PersonaListRow {
10
+ key: string;
11
+ version: string;
12
+ routingKeywords: string[];
13
+ }
14
+
15
+ /** Port of `_persona_metadata(identity).get("routing_keywords") or []`. */
16
+ function parseRoutingKeywords(metadata: string | null): string[] {
17
+ if (!metadata) return [];
18
+ try {
19
+ const parsed = JSON.parse(metadata) as Record<string, unknown>;
20
+ if (!Array.isArray(parsed.routing_keywords)) return [];
21
+ return parsed.routing_keywords.filter((item): item is string => typeof item === "string");
22
+ } catch {
23
+ return [];
24
+ }
25
+ }
26
+
27
+ /** Port of `mem.get_identity(layer="persona")`, pre-sorted by key (Python re-sorts a no-op). */
28
+ export function listPersonas(db: Database): PersonaListRow[] {
29
+ return db
30
+ .prepare("SELECT key, version, metadata FROM identity WHERE layer = 'persona' ORDER BY key")
31
+ .all()
32
+ .map((row) => ({
33
+ key: requireString(row, "key"),
34
+ version: requireString(row, "version"),
35
+ routingKeywords: parseRoutingKeywords(optionalString(row, "metadata")),
36
+ }));
37
+ }
@@ -0,0 +1,64 @@
1
+ // TS identity write surface — the port of IdentityService.set_identity.
2
+ //
3
+ // set_identity is the deterministic write behind `mm-identity` and `mm-seed`:
4
+ // create or update an identity prompt for a (layer, key). It is a thin
5
+ // orchestration over the upsertIdentity primitive with one load-bearing rule —
6
+ // when metadata is None the existing row's metadata is inherited (read before
7
+ // write) rather than overwritten with null. `id` and `now` are injected so parity
8
+ // runs match the Python oracle (Python builds an Identity() with a random UUID id
9
+ // and stamps a microsecond now inside upsert_identity).
10
+
11
+ import type { WritableDatabase } from "#db/database.ts";
12
+ import { optionalString } from "#db/rowDecode.ts";
13
+ import { type IdentityRow, upsertIdentity } from "./identityStore.ts";
14
+
15
+ /** Inputs to set_identity. `version` defaults to "1.0.0"; a null/absent metadata inherits. */
16
+ export interface SetIdentityInput {
17
+ id: string;
18
+ layer: string;
19
+ key: string;
20
+ content: string;
21
+ /** Defaults to "1.0.0", matching the Python Identity model default. */
22
+ version?: string;
23
+ /**
24
+ * A pre-serialized JSON string, or null/undefined to inherit the existing row's
25
+ * metadata (Python treats `metadata is None` as "keep what is there"). Unlike
26
+ * journeys, set_identity never serializes JSON itself — the string passes through.
27
+ */
28
+ metadata?: string | null;
29
+ }
30
+
31
+ /**
32
+ * Port of IdentityService.set_identity: resolve the effective metadata (inherit on
33
+ * None), default the version, and upsert. Delegates INSERT/UPDATE semantics —
34
+ * including id/created_at preservation on update — to upsertIdentity.
35
+ */
36
+ export function setIdentity(db: WritableDatabase, input: SetIdentityInput, nowIso: string): void {
37
+ const row: IdentityRow = {
38
+ id: input.id,
39
+ layer: input.layer,
40
+ key: input.key,
41
+ content: input.content,
42
+ version: input.version ?? "1.0.0",
43
+ metadata: resolveMetadata(db, input),
44
+ };
45
+ upsertIdentity(db, row, nowIso);
46
+ }
47
+
48
+ /**
49
+ * When metadata is provided, use it verbatim. When it is null or absent, inherit
50
+ * the existing row's metadata (or null when there is no existing row) — mirroring
51
+ * `metadata = existing.metadata if existing else None`.
52
+ */
53
+ function resolveMetadata(db: WritableDatabase, input: SetIdentityInput): string | null {
54
+ if (input.metadata !== undefined && input.metadata !== null) {
55
+ return input.metadata;
56
+ }
57
+ const existing = db
58
+ .prepare("SELECT metadata FROM identity WHERE layer = ? AND key = ?")
59
+ .get(input.layer, input.key);
60
+ if (existing === undefined) {
61
+ return null;
62
+ }
63
+ return optionalString(existing, "metadata");
64
+ }
@@ -0,0 +1,231 @@
1
+ // Mirror Mind TypeScript core — package entry point and public API surface.
2
+ //
3
+ // The core was grown as a database-seam strangler of the Python core that
4
+ // lived in `src/memory/` until CV22.DS10.TS5 deleted it (see
5
+ // docs/project/roadmap/cv22-typescript-core-port/). This file
6
+ // is the deliberate public surface: everything a consumer of the package should
7
+ // use is re-exported here, read and write. Internal modules still import each
8
+ // other by deep path; only the public API lives here, and it is kept in sync as
9
+ // the strangler grows (CR011).
10
+
11
+ // --- Consult command core ---
12
+ export type {
13
+ ConsultAskCommand,
14
+ ConsultCreditsCommand,
15
+ ConsultParseResult,
16
+ } from "./consult/args.ts";
17
+ export { CONSULT_USAGE, ConsultArgError, parseConsultArgs } from "./consult/args.ts";
18
+ export type {
19
+ ConsultContextLoader,
20
+ ConsultContextRequest,
21
+ RunConsultOptions,
22
+ } from "./consult/core.ts";
23
+ export {
24
+ buildConsultLlmRequest,
25
+ runConsult,
26
+ runConsultAsk,
27
+ runConsultCredits,
28
+ SYSTEM_PREAMBLE,
29
+ } from "./consult/core.ts";
30
+ export type { ConsultTier } from "./consult/modelCatalog.ts";
31
+ export { CONSULT_TIERS, LLM_FAMILIES, resolveConsultModel } from "./consult/modelCatalog.ts";
32
+ export type { CreditInfo as ConsultCreditInfo } from "./consult/render.ts";
33
+ export {
34
+ BALANCE_BAR_WIDTH,
35
+ renderConsultAsk,
36
+ renderCost,
37
+ renderCredits,
38
+ USD_TO_BRL,
39
+ } from "./consult/render.ts";
40
+
41
+ // --- Conversation extraction ---
42
+ export type {
43
+ ConversationExtractionOptions,
44
+ ConversationExtractionResult,
45
+ } from "./conversation/extraction.ts";
46
+ export { runConversationExtraction } from "./conversation/extraction.ts";
47
+ export type { BackupRecord } from "./db/backupGate.ts";
48
+ export { BackupGateError, requireBackup, sha256File } from "./db/backupGate.ts";
49
+ export { assertCopyTarget, CopyOnlyGuardError } from "./db/copyGuard.ts";
50
+ // --- Database seam ---
51
+ export type {
52
+ Database,
53
+ OpenOptions,
54
+ PreparedQuery,
55
+ Row,
56
+ SqlValue,
57
+ WritableDatabase,
58
+ WritablePreparedQuery,
59
+ } from "./db/database.ts";
60
+ export {
61
+ openDatabaseCopyForWrite,
62
+ openDatabaseForWrite,
63
+ openDatabaseReadOnly,
64
+ snapshotDatabaseTo,
65
+ withTransaction,
66
+ } from "./db/database.ts";
67
+ export { blobToFloat32, parseUtcMs } from "./db/decode.ts";
68
+ export { assertFtsIntegrity, FtsIntegrityError } from "./db/ftsIntegrity.ts";
69
+ export { optionalNumber, optionalString, requireString } from "./db/rowDecode.ts";
70
+ export { assertSchemaState, KNOWN_MIGRATION_IDS, SchemaStateError } from "./db/schemaState.ts";
71
+ // --- Extension context provider runtime (DS7.TS2) ---
72
+ export type {
73
+ CollectExtensionContextOptions,
74
+ CollectedExtensionContext,
75
+ ExtensionContextDiagnostic,
76
+ ExtensionContextRequest,
77
+ ExtensionContextSection,
78
+ } from "./extensions/contextRuntime.ts";
79
+ export {
80
+ collectExtensionContext,
81
+ MIRROR_CONTEXT_PROTOCOL,
82
+ renderExtensionSections,
83
+ selectExtensionBindings,
84
+ } from "./extensions/contextRuntime.ts";
85
+ export type {
86
+ ExistingMemoryForCuration,
87
+ ExtractedMemory,
88
+ ExtractedTask,
89
+ ExtractionMessage,
90
+ } from "./extraction/conversation.ts";
91
+ export {
92
+ curateAgainstExisting,
93
+ extractMemories,
94
+ extractTasks,
95
+ formatTranscript,
96
+ naiveSummary,
97
+ } from "./extraction/conversation.ts";
98
+ export { parseJsonResponse } from "./extraction/json.ts";
99
+ // --- Front-door routing ---
100
+ export type { FrontDoorEngine, RouteDecision } from "./frontDoor/routing.ts";
101
+ export { routeMemoryCommand } from "./frontDoor/routing.ts";
102
+ // --- Identity (read model + writes) ---
103
+ export type { IdentityRow } from "./identity/identityStore.ts";
104
+ export { updateIdentityMetadata, upsertIdentity } from "./identity/identityStore.ts";
105
+ export type { SetIdentityInput } from "./identity/setIdentity.ts";
106
+ export { setIdentity } from "./identity/setIdentity.ts";
107
+ // --- Journeys (options + writes) ---
108
+ export type {
109
+ JourneyHierarchy,
110
+ JourneyIdentityRow,
111
+ JourneyOption,
112
+ } from "./journey/journeyOptions.ts";
113
+ export { groupJourneysByParent, listJourneyOptions } from "./journey/journeyOptions.ts";
114
+ export type { JourneyAssociationCounts } from "./journey/journeyRemoval.ts";
115
+ export {
116
+ countJourneyAssociations,
117
+ JourneyRemovalError,
118
+ removeJourney,
119
+ } from "./journey/journeyRemoval.ts";
120
+ export type { CreateJourneyInput, JourneyFields } from "./journey/journeyWrite.ts";
121
+ export {
122
+ createJourney,
123
+ JOURNEY_LAYER,
124
+ JourneyNotFoundError,
125
+ journeyMetadata,
126
+ setParentJourney,
127
+ setProjectPath,
128
+ } from "./journey/journeyWrite.ts";
129
+ // --- Memory (listing + reinforcement writes) ---
130
+ export type { ListRecentFilters, MemorySummary } from "./memory/listing.ts";
131
+ export {
132
+ buildListRecentQuery,
133
+ countMemoriesByType,
134
+ listRecentMemorySummaries,
135
+ } from "./memory/listing.ts";
136
+ export { logAccess, logUse } from "./memory/reinforcement.ts";
137
+ export type { MirrorContextOptions } from "./mirror/context.ts";
138
+ export { loadMirrorContext, relevantAttachments } from "./mirror/context.ts";
139
+ export type {
140
+ ResolvedMirrorDefaults,
141
+ ResolveMirrorDefaultsInput,
142
+ } from "./mirror/defaultResolution.ts";
143
+ export { detectJourney, resolveMirrorDefaults } from "./mirror/defaultResolution.ts";
144
+ export type { MirrorLoadInput, RenderedMirrorLoad } from "./mirror/orchestration.ts";
145
+ export {
146
+ deactivateMirrorState,
147
+ listActiveMirrorJourneys,
148
+ logMirrorResponse,
149
+ runMirrorLoad,
150
+ titleFromSummary,
151
+ } from "./mirror/orchestration.ts";
152
+ export type {
153
+ ReceptionJourney,
154
+ ReceptionPersona,
155
+ ReceptionResult,
156
+ } from "./mirror/reception.ts";
157
+ export { EMPTY_RECEPTION_RESULT, RECEPTION_PROMPT, runReception } from "./mirror/reception.ts";
158
+ // --- Mirror Mode and operating-mode orchestration (DS7.US4) ---
159
+ export type { OperatingModeState } from "./mode/operatingMode.ts";
160
+ export {
161
+ activateOperatingMode,
162
+ deactivateOperatingMode,
163
+ getActiveOperatingMode,
164
+ renderModeActivation,
165
+ renderModeStatus,
166
+ } from "./mode/operatingMode.ts";
167
+ // --- Persona routing ---
168
+ export type { PersonaMatch, PersonaRoutingRow } from "./persona/detectPersona.ts";
169
+ export { detectPersona, normalizeRoutingText } from "./persona/detectPersona.ts";
170
+
171
+ // --- External providers (DS5 substrate) ---
172
+ export type { ProviderConfig, ProviderConfigOptions, ProviderName } from "./providers/config.ts";
173
+ export { ProviderConfigError, resolveProviderConfig } from "./providers/config.ts";
174
+ export type { CreditInfo, CreditProvider, ReplayCreditFixture } from "./providers/credits.ts";
175
+ export {
176
+ assertReplayCreditFixture,
177
+ loadReplayCreditProvider,
178
+ ReplayCreditProvider,
179
+ } from "./providers/credits.ts";
180
+ export type { EmbeddingProvider, ReplayEmbeddingFixture } from "./providers/embedding.ts";
181
+ export {
182
+ assertReplayEmbeddingFixture,
183
+ loadReplayEmbeddingProvider,
184
+ ReplayEmbeddingProvider,
185
+ } from "./providers/embedding.ts";
186
+ export type {
187
+ LlmProvider,
188
+ LlmRequest,
189
+ LlmResponse,
190
+ LlmRole,
191
+ ReplayLlmFixture,
192
+ } from "./providers/llm.ts";
193
+ export {
194
+ assertReplayLlmFixture,
195
+ loadReplayLlmProvider,
196
+ ReplayLlmProvider,
197
+ } from "./providers/llm.ts";
198
+ export type { RedactionOptions } from "./providers/redaction.ts";
199
+ export {
200
+ assertFixtureSafe,
201
+ redactJson,
202
+ redactString,
203
+ UnsafeFixtureError,
204
+ } from "./providers/redaction.ts";
205
+ export type { ReplayFixture } from "./providers/replay.ts";
206
+ export { loadReplayFixture } from "./providers/replay.ts";
207
+ // --- Hybrid search ranker ---
208
+ export type {
209
+ FreshSearchFilters,
210
+ FreshSearchOptions,
211
+ FreshSearchResult,
212
+ } from "./search/memorySearch.ts";
213
+ export {
214
+ accessCountsByMemoryId,
215
+ DEFAULT_SEARCH_RANKER_CONFIG,
216
+ ftsLexicalScores,
217
+ ftsQuery,
218
+ listSearchMemoryRows,
219
+ searchMemories,
220
+ } from "./search/memorySearch.ts";
221
+ export type { RankableMemory, RankedMemory, RankerConfig, SearchWeights } from "./search/ranker.ts";
222
+ export {
223
+ cosineSimilarity,
224
+ hybridScore,
225
+ rankMemories,
226
+ recencyScore,
227
+ reinforcementScore,
228
+ } from "./search/ranker.ts";
229
+ export { expandHome, normalizeProjectPath } from "./util/paths.ts";
230
+ export { newId, nowIso, toMicrosecondIso } from "./util/pyGenerators.ts";
231
+ // --- Python-compatibility utilities ---
@@ -0,0 +1,111 @@
1
+ // `init` — bootstrap a user home from repository identity templates. The port
2
+ // of memory.cli.init. Filesystem-only: no database is opened or touched.
3
+ //
4
+ // Deliberate, verified divergence: Python's `main()` never catches
5
+ // FileExistsError/FileNotFoundError from init_user_home, so those paths exit
6
+ // via an uncaught exception — a raw Python traceback with this machine's
7
+ // absolute file paths on stderr, exit 1. That traceback is an implementation
8
+ // leak, not a designed CLI contract (unlike, say, `identity get`'s deliberate
9
+ // one-line not-found message) — it is not meaningful or possible to replicate
10
+ // byte-for-byte (it depends on Python's own call stack and module paths, which
11
+ // drift on every refactor and reveal nothing product-relevant). This port
12
+ // preserves the observable CONTRACT instead: exit 1, and a stderr message that
13
+ // names the failure. See the CLI wiring in ../frontDoor/cli.ts.
14
+
15
+ import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { join } from "node:path";
18
+ import { runningTreeRoot } from "#runtime/treeRoot.ts";
19
+
20
+ /** Port of Python's uncaught `FileNotFoundError` for a missing templates root. */
21
+ export class TemplatesNotFoundError extends Error {}
22
+
23
+ /** Port of Python's uncaught `FileExistsError` for a non-empty identity root. */
24
+ export class IdentityRootExistsError extends Error {
25
+ readonly path: string;
26
+ constructor(path: string) {
27
+ super(`Identity root already exists and is not empty: ${path}`);
28
+ this.path = path;
29
+ }
30
+ }
31
+
32
+ /**
33
+ * `<tree root>/templates/identity`. Python's `find_templates_identity_root`
34
+ * walked up from its own file for the directory; since CV22.DS10.US3 the tree
35
+ * root is one resolver shared with release notes and the welcome card, and
36
+ * the templates ship in the package at the same path as in the checkout.
37
+ */
38
+ export function templatesIdentityRoot(treeRoot: string = runningTreeRoot()): string {
39
+ const candidate = join(treeRoot, "templates", "identity");
40
+ if (existsSync(candidate)) return candidate;
41
+ throw new TemplatesNotFoundError(`Could not find templates/identity under ${treeRoot}.`);
42
+ }
43
+
44
+ /**
45
+ * Where `init` creates a user's home: `<home>/.mirror-minds/<user>`, the path
46
+ * `MIRROR_USER=<user>` resolves to.
47
+ *
48
+ * Python's `default_user_home` hardcoded the legacy `~/.mirror/<user>` and told
49
+ * the person to set MIRROR_HOME by hand. CV22.DS10.US3 (D3) has `init` write
50
+ * `MIRROR_USER` into the config file instead, and a legacy home would then
51
+ * make every later command print the legacy-path warning (D14).
52
+ */
53
+ export function defaultUserHome(user: string, home: string = homedir()): string {
54
+ return join(home, ".mirror-minds", user);
55
+ }
56
+
57
+ /** Every `.yaml` file under `root`, recursively (mirrors `Path.rglob("*.yaml")`). */
58
+ function yamlFilesRecursive(root: string): string[] {
59
+ const out: string[] = [];
60
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
61
+ const full = join(root, entry.name);
62
+ if (entry.isDirectory()) out.push(...yamlFilesRecursive(full));
63
+ else if (entry.isFile() && full.endsWith(".yaml")) out.push(full);
64
+ }
65
+ return out;
66
+ }
67
+
68
+ /**
69
+ * Port of `_substitute_user_name`: replace every `{{user_name}}` token in every
70
+ * `.yaml` file under `identityRoot` with `user`, writing back only files that
71
+ * actually contained the token. Non-`.yaml` files (e.g. `README.md`) are
72
+ * intentionally left untouched, matching the Python glob scope exactly.
73
+ */
74
+ function substituteUserName(identityRoot: string, user: string): void {
75
+ for (const file of yamlFilesRecursive(identityRoot)) {
76
+ const content = readFileSync(file, "utf8");
77
+ if (content.includes("{{user_name}}")) {
78
+ writeFileSync(file, content.replaceAll("{{user_name}}", user), "utf8");
79
+ }
80
+ }
81
+ }
82
+
83
+ export interface InitUserHomeOptions {
84
+ /** Overrides the located templates root (tests only; production auto-locates it). */
85
+ templatesIdentityRoot?: string;
86
+ /** Overrides the destination home (tests only; production uses defaultUserHome). */
87
+ userHome?: string;
88
+ }
89
+
90
+ /**
91
+ * Port of `init_user_home`: locate the identity templates, refuse a non-empty
92
+ * existing destination, copy the template tree, substitute `{{user_name}}` in
93
+ * every `.yaml` file, and return the destination identity root.
94
+ */
95
+ export function initUserHome(user: string, options: InitUserHomeOptions = {}): string {
96
+ const templatesRoot = options.templatesIdentityRoot ?? templatesIdentityRoot();
97
+ if (!existsSync(templatesRoot)) {
98
+ throw new TemplatesNotFoundError(`Identity templates not found: ${templatesRoot}`);
99
+ }
100
+
101
+ const destinationHome = options.userHome ?? defaultUserHome(user);
102
+ const identityRoot = join(destinationHome, "identity");
103
+ if (existsSync(identityRoot) && readdirSync(identityRoot).length > 0) {
104
+ throw new IdentityRootExistsError(identityRoot);
105
+ }
106
+
107
+ mkdirSync(destinationHome, { recursive: true });
108
+ cpSync(templatesRoot, identityRoot, { recursive: true });
109
+ substituteUserName(identityRoot, user);
110
+ return identityRoot;
111
+ }