@memorax/memorax-code 0.1.2 → 0.1.3

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 (242) hide show
  1. package/README.md +16 -12
  2. package/bin/memorax-code-npm-preinstall.mjs +7 -2
  3. package/bin/memorax-code-opencode.mjs +4 -0
  4. package/bin/memorax-code-plugin-postinstall.mjs +342 -93
  5. package/docs/configuration.md +144 -35
  6. package/docs/troubleshooting.md +73 -13
  7. package/lib/dsh-plugin-install.mjs +22 -0
  8. package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  9. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  10. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  11. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  12. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  13. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  14. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  15. package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
  16. package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
  17. package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
  18. package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
  19. package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
  20. package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
  21. package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
  22. package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
  23. package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
  24. package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
  25. package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
  26. package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
  27. package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
  28. package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
  29. package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
  30. package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
  31. package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
  32. package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
  33. package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
  34. package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
  35. package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
  36. package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
  37. package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
  38. package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
  39. package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
  40. package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
  41. package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
  42. package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
  43. package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
  44. package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
  45. package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
  46. package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
  47. package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
  48. package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
  49. package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
  50. package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
  51. package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
  52. package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
  53. package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
  54. package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
  55. package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
  56. package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
  57. package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
  58. package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
  59. package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
  60. package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
  61. package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
  62. package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
  63. package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
  64. package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
  65. package/lib/memorax-code-backend/dist/server.js +3 -212
  66. package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
  67. package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
  68. package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
  69. package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
  70. package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
  71. package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
  72. package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
  73. package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
  74. package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
  75. package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
  76. package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
  77. package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
  78. package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
  79. package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
  80. package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
  81. package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
  82. package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
  83. package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
  84. package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
  85. package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
  86. package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
  87. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
  88. package/lib/memorax-code-backend/package.json +3 -3
  89. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  90. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  91. package/lib/memorax-code-claude-adapter/package.json +1 -1
  92. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  93. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  94. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  95. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  96. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  97. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  98. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  99. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  100. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  101. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  102. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  103. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  104. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  105. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  106. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  107. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  108. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  109. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  110. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  111. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  112. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  113. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  114. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  115. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  116. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  117. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
  118. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  119. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  120. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  121. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  122. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  123. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  124. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  125. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  126. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  127. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  128. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  129. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  130. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  131. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  132. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  133. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  134. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
  135. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
  136. package/lib/memorax-code-codex-adapter/package.json +1 -1
  137. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
  138. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
  139. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
  140. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  141. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  142. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
  143. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
  144. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
  145. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
  146. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  147. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
  148. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  149. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  150. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  151. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  152. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  153. package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
  154. package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
  155. package/lib/memorax-code-dsh-adapter/package.json +69 -0
  156. package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
  157. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  158. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  159. package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
  160. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  161. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  162. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
  163. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
  164. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
  165. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
  166. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  167. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
  168. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  169. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  170. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  171. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  172. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  173. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  174. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  175. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  176. package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
  177. package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
  178. package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
  179. package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
  180. package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
  181. package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
  182. package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
  183. package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
  184. package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1289 -0
  185. package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
  186. package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
  187. package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
  188. package/lib/memorax-code-opencode-adapter/package.json +10 -0
  189. package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
  190. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  191. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  192. package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
  193. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  194. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  195. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
  196. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
  197. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
  198. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
  199. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  200. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
  201. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  202. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  203. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  204. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  205. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  206. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  207. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  208. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  209. package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
  210. package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
  211. package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
  212. package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
  213. package/lib/memorax-code-opencode-adapter/src/plugin.mjs +536 -0
  214. package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +207 -0
  215. package/lib/run-entrypoint.mjs +6 -0
  216. package/package.json +7 -3
  217. package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
  218. /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
  219. /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
  220. /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
  221. /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
  222. /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
  223. /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
  224. /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
  225. /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
  226. /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
  227. /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
  228. /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
  229. /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
  230. /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
  231. /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
  232. /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
  233. /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
  234. /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
  235. /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
  236. /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
  237. /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
  238. /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
  239. /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
  240. /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
  241. /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
  242. /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
@@ -3,17 +3,22 @@ import { readFile } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { BackendConnectionAuthorityError } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
7
- import { RuntimeRecordError } from "../../memorax-code-adapter-common/src/runtime-record.mjs";
8
- import { runBackendStatus } from "./backend-status.js";
9
- import { readBackendServiceState, preflightBackendServiceStart, startBackendService, stopBackendService, } from "./service.js";
10
- import { backendServiceHome, BackendLifecycleLockError, withBackendLifecycleLock, } from "./backend-lifecycle-lock.js";
11
- import { seedMissingMemoraxCodeConfig } from "./memorax-config.js";
12
- import { runProcessWithWindowsNpm } from "./windows-cli-invocation.js";
6
+ import { BackendConnectionAuthorityError } from "../../../memorax-code-adapter-common/src/backend-connection.mjs";
7
+ import { RuntimeRecordError } from "../../../memorax-code-adapter-common/src/runtime-record.mjs";
8
+ import { runBackendStatus } from "./backend/status.js";
9
+ import { readBackendServiceState, preflightBackendServiceStart, startBackendService, stopBackendService, } from "./backend/service.js";
10
+ import { backendServiceHome, BackendLifecycleLockError, withBackendLifecycleLock, } from "./lock.js";
11
+ import { seedMissingMemoraxCodeConfig } from "../provider/memorax/config.js";
12
+ import { runProcessWithWindowsNpm } from "../shared/windows-cli-invocation.js";
13
13
  import { loadManagedClientsConfig, resolveManagedClients } from "./client-selection.js";
14
- import { clearActiveManagedClients, readActiveManagedClients, writeActiveManagedClients } from "./active-client-selection.js";
15
- import { codexAdapterLifecycle } from "./codex-adapter-lifecycle.js";
16
- import { claudeAdapterLifecycle } from "./claude-adapter-lifecycle.js";
14
+ import { clearActiveManagedClients, readActiveManagedClients, writeActiveManagedClients } from "./active-clients.js";
15
+ import { codexAdapterLifecycle } from "../clients/codex/lifecycle.js";
16
+ import { claudeAdapterLifecycle } from "../clients/claude/lifecycle.js";
17
+ import { collectDshAdapterLifecycleStatus, withDshAdapterLifecycleLock, } from "../clients/dsh/lifecycle.js";
18
+ import { openCodeAdapterLifecycle } from "../clients/opencode/lifecycle.js";
19
+ const PACKAGE_REPLACEMENT_ENV = "MEMORAX_CODE_PACKAGE_REPLACEMENT";
20
+ const DSH_RECOVERY_ENV = "MEMORAX_CODE_DSH_ADAPTER_RECOVERY";
21
+ const DSH_RECOVERY_REVISION_ENV = "MEMORAX_CODE_DSH_ADAPTER_EXPECTED_REVISION";
17
22
  export async function collectMemoraxCodeStatus(backendUrl, backendToken, serviceOptions, argv) {
18
23
  const clients = managedClientsFor(argv, serviceOptions, { preferActive: true });
19
24
  let serviceState;
@@ -45,22 +50,34 @@ export async function collectMemoraxCodeStatus(backendUrl, backendToken, service
45
50
  const claudeAdapter = clients.claude
46
51
  ? await claudeAdapterLifecycle.status({ argv, serviceOptions, backendUrl })
47
52
  : undefined;
53
+ const dshAdapter = clients.dsh
54
+ ? await collectDshAdapterLifecycleStatus({ argv, serviceOptions, backendUrl })
55
+ : undefined;
56
+ const opencodeAdapter = clients.opencode
57
+ ? await openCodeAdapterLifecycle.status({ argv, serviceOptions, backendUrl })
58
+ : undefined;
48
59
  const codexReady = codexAdapter ? isAdapterReady(codexAdapter) : true;
49
60
  const claudeReady = claudeAdapter ? isAdapterReady(claudeAdapter) : true;
61
+ const dshReady = dshAdapter ? isAdapterReady(dshAdapter) : true;
62
+ const opencodeReady = opencodeAdapter ? isAdapterReady(opencodeAdapter) : true;
50
63
  return {
51
64
  ok: backend.ok
52
65
  && codexReady
53
- && (isOptionalUnconfiguredClaudeAdapter(claudeAdapter, codexAdapter) || claudeReady),
66
+ && opencodeReady
67
+ && (isOptionalUnconfiguredClaudeAdapter(claudeAdapter, codexAdapter) || claudeReady)
68
+ && (isOptionalUnavailableDshAdapter(dshAdapter) || dshReady),
54
69
  action: "status",
55
70
  backend,
56
71
  ...(codexAdapter ? { codexAdapter } : {}),
57
72
  ...(claudeAdapter ? { claudeAdapter } : {}),
73
+ ...(dshAdapter ? { dshAdapter } : {}),
74
+ ...(opencodeAdapter ? { opencodeAdapter } : {}),
58
75
  };
59
76
  }
60
77
  export async function startMemoraxCodeService(serviceOptions, argv, commitReadyState) {
61
78
  return withMemoraxCodeLifecycleLock("start", serviceOptions, async () => {
62
79
  const report = await startMemoraxCodeServiceLocked(serviceOptions, argv);
63
- if (report.ok)
80
+ if (report.ok && report.backend?.ok)
64
81
  await commitReadyState?.(report);
65
82
  return report;
66
83
  });
@@ -88,16 +105,70 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
88
105
  return { ok: false, action: "start", backend: serviceStateFailure };
89
106
  }
90
107
  const config = loadManagedClientsConfig(memoraxCodeHome);
91
- const clients = resolveManagedClients(argv, config);
108
+ const requestedClients = resolveManagedClients(argv, config);
109
+ const clients = isDshAdapterRecovery()
110
+ ? { ...requestedClients, dsh: true }
111
+ : requestedClients;
92
112
  const previousClients = readActiveManagedClients(memoraxCodeHome);
113
+ const context = { argv, serviceOptions };
114
+ if (clients.dsh || previousClients?.dsh || isDshAdapterRecovery()) {
115
+ try {
116
+ return await withDshAdapterLifecycleLock(context, (dshLifecycle) => (executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients, dshLifecycle)));
117
+ }
118
+ catch (error) {
119
+ return dshLifecycleFailure("start", error);
120
+ }
121
+ }
122
+ return executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients);
123
+ }
124
+ async function executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients, dshLifecycle) {
125
+ const lifecycleContext = { argv, serviceOptions };
126
+ const lifecycleBackendContext = { ...lifecycleContext, backendUrl };
127
+ if (isDshAdapterRecovery() && dshLifecycle) {
128
+ const status = await dshLifecycle.status(lifecycleBackendContext);
129
+ const expectedRevision = nonEmptyString(process.env[DSH_RECOVERY_REVISION_ENV])
130
+ ? process.env[DSH_RECOVERY_REVISION_ENV]
131
+ : undefined;
132
+ if (!expectedRevision
133
+ || status.ok !== true
134
+ || status.enabled !== true
135
+ || status.revision !== expectedRevision) {
136
+ return {
137
+ ok: true,
138
+ action: "start",
139
+ reason: "dsh_recovery_not_authorized",
140
+ dshAdapter: {
141
+ ...status,
142
+ skipped: true,
143
+ reason: "dsh_recovery_not_authorized",
144
+ },
145
+ };
146
+ }
147
+ }
148
+ const quiescedDsh = dshLifecycle && (clients.dsh || previousClients?.dsh)
149
+ ? await dshLifecycle.quiesce?.(lifecycleContext)
150
+ : undefined;
151
+ if (quiescedDsh?.ok === false) {
152
+ return {
153
+ ok: false,
154
+ action: "start",
155
+ backend: preservedBackendResult(serviceOptions, "dsh_adapter_quiesce_failed", "start"),
156
+ dshAdapter: quiescedDsh,
157
+ };
158
+ }
159
+ const recoverPreparationFailure = (reason) => recoverStartPreparationFailure(serviceOptions, reason, dshLifecycle, lifecycleBackendContext, quiescedDsh);
93
160
  // A failed Backend ownership check must leave the active client generation
94
161
  // and its conservative cleanup marker untouched.
95
162
  const stopped = await stopBackendService(serviceOptions);
96
163
  if (!stopped.ok) {
164
+ const restoredDsh = await reactivatePreviouslyEnabledDsh(dshLifecycle, lifecycleContext, quiescedDsh);
97
165
  return {
98
166
  ok: false,
99
167
  action: "start",
100
168
  backend: { ...stopped, action: "start" },
169
+ ...(restoredDsh || quiescedDsh
170
+ ? { dshAdapter: restoredDsh ?? quiescedDsh }
171
+ : {}),
101
172
  };
102
173
  }
103
174
  const deselectedCodex = previousClients?.codex && !clients.codex
@@ -106,13 +177,27 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
106
177
  const deselectedClaude = previousClients?.claude && !clients.claude
107
178
  ? await claudeAdapterLifecycle.disable({ argv, serviceOptions })
108
179
  : undefined;
109
- if (deselectedCodex?.ok === false || deselectedClaude?.ok === false) {
180
+ const deselectedDsh = previousClients?.dsh && !clients.dsh && dshLifecycle
181
+ ? await dshLifecycle.disable({ argv, serviceOptions })
182
+ : undefined;
183
+ const deselectedOpenCode = previousClients?.opencode && !clients.opencode
184
+ ? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
185
+ : undefined;
186
+ if (deselectedCodex?.ok === false
187
+ || deselectedClaude?.ok === false
188
+ || deselectedDsh?.ok === false
189
+ || deselectedOpenCode?.ok === false) {
190
+ const recovery = await recoverPreparationFailure("adapter_disable_failed");
110
191
  return {
111
192
  ok: false,
112
193
  action: "start",
113
- backend: await recoverBackendAfterStartPreparationFailure(serviceOptions, "adapter_disable_failed"),
194
+ backend: recovery.backend,
114
195
  ...(deselectedCodex ? { codexAdapter: deselectedCodex } : {}),
115
196
  ...(deselectedClaude ? { claudeAdapter: deselectedClaude } : {}),
197
+ ...(recovery.dshAdapter || deselectedDsh
198
+ ? { dshAdapter: recovery.dshAdapter ?? deselectedDsh }
199
+ : {}),
200
+ ...(deselectedOpenCode ? { opencodeAdapter: deselectedOpenCode } : {}),
116
201
  };
117
202
  }
118
203
  // The marker is a conservative cleanup scope, not a readiness signal. Persist
@@ -123,51 +208,95 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
123
208
  await seedMissingMemoraxCodeConfig(memoraxCodeHomeForService(serviceOptions));
124
209
  }
125
210
  catch (error) {
211
+ const recovery = await recoverPreparationFailure("lifecycle_state_prepare_failed");
126
212
  return {
127
213
  ok: false,
128
214
  action: "start",
129
215
  reason: "lifecycle_state_prepare_failed",
130
216
  message: error instanceof Error ? error.message : String(error),
131
- backend: await recoverBackendAfterStartPreparationFailure(serviceOptions, "lifecycle_state_prepare_failed"),
217
+ backend: recovery.backend,
218
+ ...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
132
219
  };
133
220
  }
134
221
  const codexAdapter = clients.codex
135
222
  ? await codexAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
136
223
  : undefined;
137
224
  if (codexAdapter?.ok === false) {
225
+ const recovery = await recoverPreparationFailure("codex_adapter_enable_failed");
138
226
  return {
139
227
  ok: false,
140
228
  action: "start",
141
- backend: await recoverBackendAfterStartPreparationFailure(serviceOptions, "codex_adapter_enable_failed"),
229
+ backend: recovery.backend,
142
230
  codexAdapter,
231
+ ...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
143
232
  };
144
233
  }
145
234
  const claudeAdapter = clients.claude
146
235
  ? await claudeAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
147
236
  : undefined;
237
+ const opencodeAdapter = clients.opencode
238
+ ? await openCodeAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
239
+ : undefined;
240
+ if (opencodeAdapter?.ok === false) {
241
+ const recovery = await recoverPreparationFailure("opencode_adapter_enable_failed");
242
+ return {
243
+ ok: false,
244
+ action: "start",
245
+ backend: recovery.backend,
246
+ ...(codexAdapter ? { codexAdapter } : {}),
247
+ ...(claudeAdapter ? { claudeAdapter } : {}),
248
+ ...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
249
+ opencodeAdapter,
250
+ };
251
+ }
252
+ const preparedDshAdapter = clients.dsh && dshLifecycle
253
+ ? await dshLifecycle.prepareEnable(lifecycleBackendContext)
254
+ : undefined;
255
+ if (preparedDshAdapter?.ok === false) {
256
+ const recovery = await recoverPreparationFailure("dsh_adapter_enable_failed");
257
+ return {
258
+ ok: false,
259
+ action: "start",
260
+ backend: recovery.backend,
261
+ ...(codexAdapter ? { codexAdapter } : {}),
262
+ ...(claudeAdapter ? { claudeAdapter } : {}),
263
+ dshAdapter: recovery.dshAdapter ?? preparedDshAdapter,
264
+ ...(opencodeAdapter ? { opencodeAdapter } : {}),
265
+ };
266
+ }
148
267
  const backendStartOptions = {
149
268
  ...serviceOptions,
150
269
  claudeProjectsRoot: claudeProjectsRootForStart(argv, claudeAdapter),
151
270
  };
152
271
  const backend = await startBackendService(backendStartOptions);
153
272
  if (!backend.ok) {
154
- const disabled = codexAdapter
273
+ const disabledCodex = codexAdapter
155
274
  ? await codexAdapterLifecycle.disable({ argv, serviceOptions })
156
275
  : undefined;
276
+ const disabledOpenCode = opencodeAdapter
277
+ ? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
278
+ : undefined;
157
279
  return {
158
280
  ok: false,
159
281
  action: "start",
160
282
  backend,
161
- ...(disabled ? { codexAdapter: disabled } : {}),
283
+ ...(disabledCodex ? { codexAdapter: disabledCodex } : {}),
162
284
  ...(claudeAdapter ? { claudeAdapter } : {}),
285
+ ...(preparedDshAdapter ? { dshAdapter: preparedDshAdapter } : {}),
286
+ ...(disabledOpenCode ? { opencodeAdapter: disabledOpenCode } : {}),
163
287
  };
164
288
  }
289
+ const dshAdapter = preparedDshAdapter?.installed === true
290
+ ? await dshLifecycle?.activate?.(lifecycleBackendContext)
291
+ : preparedDshAdapter;
165
292
  return {
166
- ok: claudeAdapter?.ok !== false,
293
+ ok: claudeAdapter?.ok !== false && dshAdapter?.ok !== false,
167
294
  action: "start",
168
295
  backend,
169
296
  ...(codexAdapter ? { codexAdapter } : {}),
170
297
  ...(claudeAdapter ? { claudeAdapter } : {}),
298
+ ...(dshAdapter ? { dshAdapter } : {}),
299
+ ...(opencodeAdapter ? { opencodeAdapter } : {}),
171
300
  };
172
301
  }
173
302
  function claudeProjectsRootForStart(argv, claudeAdapter) {
@@ -187,12 +316,20 @@ export async function stopMemoraxCodeService(serviceOptions, argv) {
187
316
  }
188
317
  async function stopMemoraxCodeServiceLocked(serviceOptions, argv) {
189
318
  const context = memoraxCodeStopContext(serviceOptions, argv);
190
- const execution = await executeMemoraxCodeStop(serviceOptions, argv, context);
319
+ let execution;
320
+ try {
321
+ execution = context.clients.dsh
322
+ ? await withDshAdapterLifecycleLock({ argv, serviceOptions }, (dshLifecycle) => (executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle)))
323
+ : await executeMemoraxCodeStop(serviceOptions, argv, context);
324
+ }
325
+ catch (error) {
326
+ return dshLifecycleFailure("stop", error);
327
+ }
191
328
  if (execution.report.ok)
192
329
  commitActiveManagedClients(context.memoraxCodeHome, execution.remainingClients);
193
330
  return execution.report;
194
331
  }
195
- async function executeMemoraxCodeStop(serviceOptions, argv, context) {
332
+ async function executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle) {
196
333
  const { activeClients, clients } = context;
197
334
  const serviceStateFailure = backendServiceStatePreflight(serviceOptions, "stop");
198
335
  if (serviceStateFailure) {
@@ -209,22 +346,47 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
209
346
  ? {
210
347
  codex: activeClients.codex && !clients.codex,
211
348
  claude: activeClients.claude && !clients.claude,
349
+ dsh: activeClients.dsh && !clients.dsh,
350
+ opencode: activeClients.opencode && !clients.opencode,
212
351
  }
213
352
  : undefined;
214
- const hasRemainingClients = remaining?.codex === true || remaining?.claude === true;
215
- const backendOnlyStop = !clients.codex && !clients.claude;
216
- const needsBackendStop = backendOnlyStop || !hasRemainingClients;
217
- // A true partial stop keeps the shared Backend for remaining clients. Every
218
- // other stop establishes Backend shutdown before mutating client state.
353
+ const hasRemainingClients = remaining?.codex === true
354
+ || remaining?.claude === true
355
+ || remaining?.dsh === true
356
+ || remaining?.opencode === true;
357
+ const backendOnlyStop = !clients.codex && !clients.claude && !clients.dsh && !clients.opencode;
358
+ const packageReplacement = isPackageReplacement();
359
+ const needsBackendStop = packageReplacement || backendOnlyStop || !hasRemainingClients;
360
+ const quiescedDsh = clients.dsh && dshLifecycle
361
+ ? await dshLifecycle.quiesce?.({ argv, serviceOptions })
362
+ : undefined;
363
+ if (quiescedDsh?.ok === false) {
364
+ return {
365
+ report: {
366
+ ok: false,
367
+ action: "stop",
368
+ backend: preservedBackendResult(serviceOptions, "dsh_adapter_quiesce_failed"),
369
+ dshAdapter: quiescedDsh,
370
+ },
371
+ remainingClients: activeClients,
372
+ };
373
+ }
374
+ // A true partial stop keeps the shared Backend for remaining clients. DSH
375
+ // publishes its inert sentinel first; every other adapter is disabled only
376
+ // after an accepted Backend shutdown.
219
377
  const stoppedBackend = needsBackendStop
220
378
  ? await stopBackendService(serviceOptions)
221
379
  : undefined;
222
380
  if (stoppedBackend?.ok === false) {
381
+ const restoredDsh = await reactivatePreviouslyEnabledDsh(dshLifecycle, { argv, serviceOptions }, quiescedDsh);
223
382
  return {
224
383
  report: {
225
384
  ok: false,
226
385
  action: "stop",
227
386
  backend: stoppedBackend,
387
+ ...(restoredDsh || quiescedDsh
388
+ ? { dshAdapter: restoredDsh ?? quiescedDsh }
389
+ : {}),
228
390
  },
229
391
  remainingClients: activeClients,
230
392
  };
@@ -235,12 +397,25 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
235
397
  const claudeAdapter = clients.claude
236
398
  ? await claudeAdapterLifecycle.disable({ argv, serviceOptions })
237
399
  : undefined;
238
- const adaptersOk = codexAdapter?.ok !== false && claudeAdapter?.ok !== false;
400
+ const dshAdapter = clients.dsh && dshLifecycle
401
+ ? await dshLifecycle.disable({ argv, serviceOptions })
402
+ : undefined;
403
+ const opencodeAdapter = clients.opencode
404
+ ? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
405
+ : undefined;
406
+ const adaptersOk = codexAdapter?.ok !== false
407
+ && claudeAdapter?.ok !== false
408
+ && dshAdapter?.ok !== false
409
+ && opencodeAdapter?.ok !== false;
239
410
  const backend = stoppedBackend
240
411
  ?? (adaptersOk
241
412
  ? preservedBackendResult(serviceOptions, "active_clients_remaining")
242
413
  : preservedBackendResult(serviceOptions, "adapter_disable_failed"));
243
- const ok = backend.ok && codexAdapter?.ok !== false && claudeAdapter?.ok !== false;
414
+ const ok = backend.ok
415
+ && codexAdapter?.ok !== false
416
+ && claudeAdapter?.ok !== false
417
+ && dshAdapter?.ok !== false
418
+ && opencodeAdapter?.ok !== false;
244
419
  return {
245
420
  report: {
246
421
  ok,
@@ -248,6 +423,8 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
248
423
  backend,
249
424
  ...(codexAdapter ? { codexAdapter } : {}),
250
425
  ...(claudeAdapter ? { claudeAdapter } : {}),
426
+ ...(dshAdapter ? { dshAdapter } : {}),
427
+ ...(opencodeAdapter ? { opencodeAdapter } : {}),
251
428
  },
252
429
  remainingClients: remaining && hasRemainingClients ? remaining : undefined,
253
430
  };
@@ -255,7 +432,7 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
255
432
  export async function restartMemoraxCodeService(serviceOptions, argv, commitReadyState) {
256
433
  return withMemoraxCodeLifecycleLock("restart", serviceOptions, async () => {
257
434
  const report = await restartMemoraxCodeServiceLocked(serviceOptions, argv);
258
- if (report.ok)
435
+ if (report.ok && report.backend?.ok)
259
436
  await commitReadyState?.(report);
260
437
  return report;
261
438
  });
@@ -284,11 +461,22 @@ export async function uninstallMemoraxCodeService(serviceOptions, argv) {
284
461
  }
285
462
  async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
286
463
  const context = memoraxCodeStopContext(serviceOptions, argv);
464
+ if (context.clients.dsh) {
465
+ try {
466
+ return await withDshAdapterLifecycleLock({ argv, serviceOptions }, (dshLifecycle) => (executeMemoraxCodeUninstall(serviceOptions, argv, context, dshLifecycle)));
467
+ }
468
+ catch (error) {
469
+ return dshLifecycleFailure("uninstall", error);
470
+ }
471
+ }
472
+ return executeMemoraxCodeUninstall(serviceOptions, argv, context);
473
+ }
474
+ async function executeMemoraxCodeUninstall(serviceOptions, argv, context, dshLifecycle) {
287
475
  const { activeClients, clients, memoraxCodeHome } = context;
288
- const configuredClients = managedClientsFor([], serviceOptions);
476
+ const configuredClients = configuredClientsForPackageRemoval(serviceOptions);
289
477
  const canRemoveSharedPackage = includesManagedClients(clients, configuredClients)
290
478
  && (!activeClients || includesManagedClients(clients, activeClients));
291
- const stopExecution = await executeMemoraxCodeStop(serviceOptions, argv, context);
479
+ const stopExecution = await executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle);
292
480
  const stopped = stopExecution.report;
293
481
  if (!stopped.ok) {
294
482
  return {
@@ -305,8 +493,16 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
305
493
  const claudePlugin = clients.claude
306
494
  ? await claudeAdapterLifecycle.remove({ argv, serviceOptions })
307
495
  : undefined;
496
+ const dshPlugin = clients.dsh && dshLifecycle
497
+ ? await dshLifecycle.remove({ argv, serviceOptions })
498
+ : undefined;
499
+ const opencodePlugin = clients.opencode
500
+ ? await openCodeAdapterLifecycle.remove({ argv, serviceOptions })
501
+ : undefined;
308
502
  const pluginCleanupOk = codexPlugin?.ok !== false
309
- && claudePlugin?.ok !== false;
503
+ && claudePlugin?.ok !== false
504
+ && dshPlugin?.ok !== false
505
+ && opencodePlugin?.ok !== false;
310
506
  const npmPackageRemoval = !pluginCleanupOk
311
507
  ? skippedNpmPackageRemoval("plugin_cleanup_failed")
312
508
  : canRemoveSharedPackage
@@ -315,6 +511,10 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
315
511
  const claudeAdapter = stopped.claudeAdapter && claudePlugin
316
512
  ? { ...stopped.claudeAdapter, pluginRemove: claudePlugin }
317
513
  : stopped.claudeAdapter;
514
+ const dshAdapter = dshPlugin ?? stopped.dshAdapter;
515
+ const opencodeAdapter = stopped.opencodeAdapter && opencodePlugin
516
+ ? { ...stopped.opencodeAdapter, pluginRemove: opencodePlugin }
517
+ : stopped.opencodeAdapter;
318
518
  const ok = pluginCleanupOk && npmPackageRemoval.ok !== false;
319
519
  if (ok)
320
520
  commitActiveManagedClients(memoraxCodeHome, stopExecution.remainingClients);
@@ -324,8 +524,13 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
324
524
  action: "uninstall",
325
525
  ...(codexPlugin ? { codexPlugin } : {}),
326
526
  ...(claudeAdapter ? { claudeAdapter } : {}),
527
+ ...(dshAdapter ? { dshAdapter } : {}),
528
+ ...(opencodeAdapter ? { opencodeAdapter } : {}),
327
529
  npmPackageRemoval,
328
- removesPlugin: codexPlugin?.ok === true || claudePlugin?.ok === true,
530
+ removesPlugin: codexPlugin?.ok === true
531
+ || claudePlugin?.ok === true
532
+ || (dshPlugin?.ok === true && dshPlugin.skipped !== true)
533
+ || opencodePlugin?.ok === true,
329
534
  removesUserState: false,
330
535
  };
331
536
  }
@@ -403,12 +608,25 @@ function managedClientsFor(argv, serviceOptions, options = {}) {
403
608
  }
404
609
  return resolveManagedClients(argv, loadManagedClientsConfig(memoraxCodeHome));
405
610
  }
611
+ function configuredClientsForPackageRemoval(serviceOptions) {
612
+ const memoraxCodeHome = memoraxCodeHomeForService(serviceOptions);
613
+ const config = loadManagedClientsConfig(memoraxCodeHome);
614
+ const configured = resolveManagedClients([], config);
615
+ const legacyDshSelection = config.clients !== undefined
616
+ && config.clients.dsh === undefined;
617
+ const ownsDshIntegration = existsSync(join(memoraxCodeHome, "adapters", "dsh", "state.json"));
618
+ return legacyDshSelection && !ownsDshIntegration
619
+ ? { ...configured, dsh: false }
620
+ : configured;
621
+ }
406
622
  function memoraxCodeStopContext(serviceOptions, argv) {
407
623
  const memoraxCodeHome = memoraxCodeHomeForService(serviceOptions);
408
624
  return {
409
625
  memoraxCodeHome,
410
626
  activeClients: readActiveManagedClients(memoraxCodeHome),
411
- clients: managedClientsFor(argv, serviceOptions, { preferActive: true }),
627
+ clients: isPackageReplacement()
628
+ ? { codex: false, claude: false, dsh: true, opencode: false }
629
+ : managedClientsFor(argv, serviceOptions, { preferActive: true }),
412
630
  };
413
631
  }
414
632
  function commitActiveManagedClients(memoraxCodeHome, clients) {
@@ -425,7 +643,19 @@ function argValue(argv, name) {
425
643
  return index >= 0 ? argv[index + 1] : undefined;
426
644
  }
427
645
  function includesManagedClients(selection, required) {
428
- return (!required.codex || selection.codex) && (!required.claude || selection.claude);
646
+ return (!required.codex || selection.codex)
647
+ && (!required.claude || selection.claude)
648
+ && (!required.dsh || selection.dsh)
649
+ && (!required.opencode || selection.opencode);
650
+ }
651
+ function isPackageReplacement() {
652
+ return truthyEnv(process.env[PACKAGE_REPLACEMENT_ENV]);
653
+ }
654
+ function isDshAdapterRecovery() {
655
+ return truthyEnv(process.env[DSH_RECOVERY_ENV]);
656
+ }
657
+ function truthyEnv(value) {
658
+ return ["1", "true", "yes", "on"].includes(String(value ?? "").trim().toLowerCase());
429
659
  }
430
660
  function preservedBackendResult(serviceOptions, reason, action = "stop") {
431
661
  const state = readBackendServiceState(serviceOptions);
@@ -457,6 +687,41 @@ async function recoverBackendAfterStartPreparationFailure(serviceOptions, reason
457
687
  };
458
688
  }
459
689
  }
690
+ async function recoverStartPreparationFailure(serviceOptions, reason, dshLifecycle, context, quiescedDsh) {
691
+ const backend = await recoverBackendAfterStartPreparationFailure(serviceOptions, reason);
692
+ const dshAdapter = backend.ok
693
+ ? await restorePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh)
694
+ : undefined;
695
+ return { backend, ...(dshAdapter ? { dshAdapter } : {}) };
696
+ }
697
+ async function restorePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh) {
698
+ const activated = await reactivatePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh);
699
+ if (activated?.ok !== false
700
+ && activated?.enabled === true
701
+ && sameDshProfileSet(activated.profiles, quiescedDsh?.profiles))
702
+ return activated;
703
+ if (!dshLifecycle || quiescedDsh?.previouslyEnabled !== true)
704
+ return undefined;
705
+ const prepared = await dshLifecycle.prepareEnable(context);
706
+ if (prepared.ok === false || prepared.installed !== true)
707
+ return prepared;
708
+ return await dshLifecycle.activate?.(context) ?? prepared;
709
+ }
710
+ function sameDshProfileSet(actual, expected) {
711
+ if (!actual?.every(nonEmptyString) || !expected?.every(nonEmptyString))
712
+ return false;
713
+ const actualNames = new Set(actual);
714
+ const expectedNames = new Set(expected);
715
+ return actualNames.size === actual.length
716
+ && expectedNames.size === expected.length
717
+ && actualNames.size === expectedNames.size
718
+ && [...actualNames].every((name) => expectedNames.has(name));
719
+ }
720
+ async function reactivatePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh) {
721
+ if (!dshLifecycle || quiescedDsh?.previouslyEnabled !== true)
722
+ return undefined;
723
+ return await dshLifecycle.activate?.(context);
724
+ }
460
725
  function backendServiceStatePreflight(serviceOptions, action) {
461
726
  try {
462
727
  readBackendServiceState(serviceOptions);
@@ -501,14 +766,22 @@ async function withMemoraxCodeLifecycleLock(action, serviceOptions, operation) {
501
766
  }
502
767
  }
503
768
  export function isAdapterReady(report) {
504
- const hookIntegration = report.integration === "hooks" || report.state?.integration === "hooks";
505
- return hookIntegration
769
+ const integration = report.integration ?? report.state?.integration;
770
+ return (integration === "hooks" || integration === "plugin")
506
771
  && report.ok !== false
507
772
  && report.installed === true
508
773
  && report.enabled === true
509
774
  && report.backendUrlMatches !== false
510
775
  && report.codexSkills?.ok !== false
511
- && report.claudeSkills?.ok !== false;
776
+ && report.claudeSkills?.ok !== false
777
+ && report.opencodeSkills?.ok !== false;
778
+ }
779
+ export function isOptionalUnavailableDshAdapter(report) {
780
+ return Boolean(report
781
+ && report.ok !== false
782
+ && report.skipped === true
783
+ && report.managed !== true
784
+ && report.reason === "no_existing_profiles");
512
785
  }
513
786
  export function isOptionalUnconfiguredClaudeAdapter(report, codexAdapter) {
514
787
  return Boolean(report
@@ -521,3 +794,16 @@ export function isOptionalUnconfiguredClaudeAdapter(report, codexAdapter) {
521
794
  function nonEmptyString(value) {
522
795
  return typeof value === "string" && value.trim().length > 0;
523
796
  }
797
+ function dshLifecycleFailure(action, error) {
798
+ return {
799
+ ok: false,
800
+ action,
801
+ dshAdapter: {
802
+ ok: false,
803
+ action,
804
+ integration: "plugin",
805
+ runtime: "dsh",
806
+ error: error instanceof Error ? error.message : String(error),
807
+ },
808
+ };
809
+ }
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { runMemoryCli } from "./memory-cli.js";
2
+ import { runMemoryCli } from "./memory/cli.js";
3
3
  runMemoryCli(process.argv.slice(2)).then((result) => {
4
4
  if (!process.argv.includes("--json") && result.ok && result.action === "memory.search") {
5
5
  if (result.userNotice)
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import { runBackendCli } from "./server-cli.js";
2
+ import { runBackendCli } from "./entrypoints/backend-cli.js";
3
3
  runBackendCli(process.argv);
@@ -1,6 +1,6 @@
1
- import { invokeMemoraxMemoryProvider } from "./memorax-adapter.js";
2
- import { memoryRetrievalEnabled, startupRetrieveTimeoutMs, } from "./memorax-config.js";
3
- import { isRecord } from "./utils.js";
1
+ import { invokeMemoraxMemoryProvider } from "../provider/memorax/adapter.js";
2
+ import { memoryRetrievalEnabled, startupRetrieveTimeoutMs, } from "../provider/memorax/config.js";
3
+ import { isRecord } from "../shared/record.js";
4
4
  const AUTOMATIC_MEMORY_CONTEXT_MAX_CHARS = 9_000;
5
5
  export async function retrieveAutomaticMemoryContext(options) {
6
6
  const startedAt = Date.now();