@memorax/memorax-code 0.1.1 → 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 (246) 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 +424 -108
  5. package/docs/configuration.md +153 -29
  6. package/docs/troubleshooting.md +93 -7
  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 +38 -0
  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} +16 -9
  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} +18 -11
  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} +157 -34
  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 +3 -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} +82 -21
  49. package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +45 -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} +25 -4
  55. package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +30 -6
  56. package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +7 -3
  57. package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +31 -2
  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/{repository-memory-scope.js → repository/scope.js} +81 -33
  66. package/lib/memorax-code-backend/dist/server.js +3 -212
  67. package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
  68. package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
  69. package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
  70. package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
  71. package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
  72. package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
  73. package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
  74. package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
  75. package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
  76. package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
  77. package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
  78. package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
  79. package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +25 -14
  80. package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
  81. package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
  82. package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
  83. package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
  84. package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
  85. package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
  86. package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
  87. package/lib/memorax-code-backend/dist/viewer/ui/icon.js +1 -0
  88. package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +14 -12
  89. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
  90. package/lib/memorax-code-backend/package.json +3 -3
  91. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  92. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  93. package/lib/memorax-code-claude-adapter/package.json +1 -1
  94. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +5 -0
  95. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
  96. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  97. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +5 -1
  98. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
  99. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  100. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  101. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  102. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  103. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  104. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  105. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  106. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  107. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  108. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  109. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  110. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +2 -0
  111. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  112. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  113. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  114. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  115. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  116. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  117. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +38 -0
  118. 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
  119. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  120. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
  121. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +5 -0
  122. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
  123. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  124. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +5 -1
  125. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
  126. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  127. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  128. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  129. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  130. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  131. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  132. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  133. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  134. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  135. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  136. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  137. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +2 -0
  138. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
  139. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
  140. package/lib/memorax-code-codex-adapter/package.json +1 -1
  141. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +16 -2
  142. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +23 -15
  143. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
  144. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +5 -1
  145. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +40 -10
  146. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
  147. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
  148. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
  149. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
  150. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  151. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
  152. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  153. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  154. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  155. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  156. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  157. package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
  158. package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
  159. package/lib/memorax-code-dsh-adapter/package.json +69 -0
  160. package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
  161. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  162. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  163. package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
  164. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  165. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  166. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
  167. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
  168. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
  169. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
  170. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  171. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
  172. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  173. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  174. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  175. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  176. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  177. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  178. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  179. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  180. package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
  181. package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
  182. package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
  183. package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
  184. package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
  185. package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
  186. package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
  187. package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
  188. package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1289 -0
  189. package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
  190. package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
  191. package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
  192. package/lib/memorax-code-opencode-adapter/package.json +10 -0
  193. package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
  194. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  195. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  196. package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
  197. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  198. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  199. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
  200. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
  201. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
  202. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
  203. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  204. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
  205. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  206. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  207. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  208. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  209. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  210. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  211. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  212. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  213. package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
  214. package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
  215. package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
  216. package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
  217. package/lib/memorax-code-opencode-adapter/src/plugin.mjs +536 -0
  218. package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +207 -0
  219. package/lib/resolve-claude-command.mjs +154 -1
  220. package/lib/resolve-codex-command.mjs +56 -1
  221. package/lib/run-entrypoint.mjs +6 -0
  222. package/package.json +7 -3
  223. package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
  224. /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
  225. /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
  226. /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
  227. /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
  228. /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
  229. /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
  230. /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
  231. /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
  232. /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
  233. /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
  234. /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
  235. /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
  236. /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
  237. /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
  238. /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
  239. /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
  240. /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
  241. /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
  242. /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
  243. /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
  244. /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
  245. /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
  246. /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env node
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ export const OPENCODE_REPO_MEMORY_AGENT = "memorax-code-repo-memory";
6
+
7
+ export async function runOpenCodeRepoMemory(input, options = {}) {
8
+ const env = options.env ?? process.env;
9
+ const managedServerUrl = stringValue(env.MEMORAX_CODE_OPENCODE_SERVER_URL);
10
+ const serverUrl = stringValue(input?.serverUrl) ?? managedServerUrl;
11
+ if (!serverUrl) {
12
+ throw new Error(
13
+ "OpenCode repo memory runner requires --server-url or MEMORAX_CODE_OPENCODE_SERVER_URL",
14
+ );
15
+ }
16
+ const repo = stringValue(input?.repo);
17
+ if (!repo) throw new Error("OpenCode repo memory runner requires --repo");
18
+ const prompt = stringValue(input?.prompt);
19
+ if (!prompt) throw new Error("OpenCode repo memory runner requires --prompt");
20
+
21
+ const baseUrl = normalizedServerUrl(serverUrl);
22
+ const authorization = serverAuthorization(env, baseUrl, managedServerUrl);
23
+ const directory = resolve(repo);
24
+ const parentID = stringValue(input?.parentID)
25
+ ?? stringValue(env.MEMORAX_CODE_MEMORY_CLI_SESSION_ID);
26
+ const fetchImpl = options.fetchImpl ?? fetch;
27
+ let sessionID;
28
+ try {
29
+ const session = await requestJson(fetchImpl, endpoint(baseUrl, "/session", directory), {
30
+ method: "POST",
31
+ headers: {
32
+ "content-type": "application/json",
33
+ ...(authorization ? { authorization } : {}),
34
+ },
35
+ body: JSON.stringify({
36
+ ...(parentID ? { parentID } : {}),
37
+ title: "MemoraX Code Repo Memory",
38
+ permission: [
39
+ { permission: "edit", pattern: "*", action: "allow" },
40
+ { permission: "bash", pattern: "*", action: "allow" },
41
+ { permission: "webfetch", pattern: "*", action: "allow" },
42
+ { permission: "doom_loop", pattern: "*", action: "allow" },
43
+ { permission: "external_directory", pattern: "*", action: "allow" },
44
+ ],
45
+ }),
46
+ }, "session creation");
47
+ sessionID = stringValue(session?.id);
48
+ if (!sessionID) throw new Error("OpenCode session creation returned no session id");
49
+
50
+ const message = await requestJson(
51
+ fetchImpl,
52
+ endpoint(baseUrl, `/session/${encodeURIComponent(sessionID)}/message`, directory),
53
+ {
54
+ method: "POST",
55
+ headers: {
56
+ "content-type": "application/json",
57
+ ...(authorization ? { authorization } : {}),
58
+ },
59
+ body: JSON.stringify({
60
+ agent: OPENCODE_REPO_MEMORY_AGENT,
61
+ parts: [{ type: "text", text: prompt }],
62
+ }),
63
+ },
64
+ "blocking prompt",
65
+ );
66
+ const finalText = messageText(message);
67
+ if (!finalText) throw new Error("OpenCode repo memory runner received no final text");
68
+ return finalText;
69
+ } finally {
70
+ if (sessionID) {
71
+ await bestEffortDelete(
72
+ fetchImpl,
73
+ endpoint(baseUrl, `/session/${encodeURIComponent(sessionID)}`, directory),
74
+ authorization,
75
+ );
76
+ }
77
+ }
78
+ }
79
+
80
+ function parseArgs(values) {
81
+ const result = {};
82
+ for (let index = 0; index < values.length; index += 1) {
83
+ const value = values[index];
84
+ if (value === "--server-url") result.serverUrl = requiredValue(values, ++index, value);
85
+ else if (value === "--repo") result.repo = requiredValue(values, ++index, value);
86
+ else if (value === "--prompt") result.prompt = requiredValue(values, ++index, value);
87
+ else if (value === "--parent-id") result.parentID = requiredValue(values, ++index, value);
88
+ else throw new Error(`unknown argument: ${value}`);
89
+ }
90
+ return result;
91
+ }
92
+
93
+ function requiredValue(values, index, option) {
94
+ const value = values[index];
95
+ if (!value || value.startsWith("--")) throw new Error(`${option} requires a value`);
96
+ return value;
97
+ }
98
+
99
+ function normalizedServerUrl(value) {
100
+ try {
101
+ const url = new URL(value);
102
+ if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error();
103
+ return url;
104
+ } catch {
105
+ throw new Error("OpenCode repo memory runner requires a valid HTTP server URL");
106
+ }
107
+ }
108
+
109
+ function endpoint(baseUrl, pathname, directory) {
110
+ const url = new URL(pathname, baseUrl);
111
+ url.searchParams.set("directory", directory);
112
+ return url;
113
+ }
114
+
115
+ function serverAuthorization(env, targetUrl, managedServerUrl) {
116
+ const password = rawString(env.OPENCODE_SERVER_PASSWORD);
117
+ if (!password || !managedServerUrl) return undefined;
118
+ let managedUrl;
119
+ try {
120
+ managedUrl = normalizedServerUrl(managedServerUrl);
121
+ } catch {
122
+ return undefined;
123
+ }
124
+ if (targetUrl.origin !== managedUrl.origin) return undefined;
125
+ const username = rawString(env.OPENCODE_SERVER_USERNAME) ?? "opencode";
126
+ return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
127
+ }
128
+
129
+ async function requestJson(fetchImpl, url, init, operation) {
130
+ let response;
131
+ try {
132
+ response = await fetchImpl(url, init);
133
+ } catch (error) {
134
+ throw new Error(`OpenCode ${operation} request failed: ${errorMessage(error)}`);
135
+ }
136
+ const body = await response.text();
137
+ if (!response.ok) {
138
+ const detail = responseDetail(body);
139
+ throw new Error(
140
+ `OpenCode ${operation} failed with HTTP ${response.status}${detail ? `: ${detail}` : ""}`,
141
+ );
142
+ }
143
+ if (!body.trim()) throw new Error(`OpenCode ${operation} returned an empty response`);
144
+ try {
145
+ return JSON.parse(body);
146
+ } catch {
147
+ throw new Error(`OpenCode ${operation} returned invalid JSON`);
148
+ }
149
+ }
150
+
151
+ async function bestEffortDelete(fetchImpl, url, authorization) {
152
+ try {
153
+ await fetchImpl(url, {
154
+ method: "DELETE",
155
+ headers: authorization ? { authorization } : {},
156
+ });
157
+ } catch {
158
+ // Session cleanup must not replace the prompt result or its error.
159
+ }
160
+ }
161
+
162
+ function messageText(message) {
163
+ const payload = message?.data ?? message;
164
+ if (!Array.isArray(payload?.parts)) return undefined;
165
+ return payload.parts
166
+ .flatMap((part) => part?.type === "text" && stringValue(part.text) ? [part.text.trim()] : [])
167
+ .join("\n\n")
168
+ .trim() || undefined;
169
+ }
170
+
171
+ function responseDetail(body) {
172
+ if (!body.trim()) return undefined;
173
+ try {
174
+ const parsed = JSON.parse(body);
175
+ return stringValue(parsed?.data?.message)
176
+ ?? stringValue(parsed?.message)
177
+ ?? stringValue(parsed?.error);
178
+ } catch {
179
+ return body.trim().slice(0, 300);
180
+ }
181
+ }
182
+
183
+ function stringValue(value) {
184
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
185
+ }
186
+
187
+ function rawString(value) {
188
+ return typeof value === "string" && value.length > 0 ? value : undefined;
189
+ }
190
+
191
+ function errorMessage(error) {
192
+ return error instanceof Error ? error.message : String(error);
193
+ }
194
+
195
+ function isDirectExecution() {
196
+ return process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
197
+ }
198
+
199
+ if (isDirectExecution()) {
200
+ try {
201
+ const finalText = await runOpenCodeRepoMemory(parseArgs(process.argv.slice(2)));
202
+ process.stdout.write(`${finalText}\n`);
203
+ } catch (error) {
204
+ process.stderr.write(`${errorMessage(error)}\n`);
205
+ process.exitCode = 1;
206
+ }
207
+ }
@@ -1,17 +1,30 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { readdirSync } from "node:fs";
1
3
  import { homedir } from "node:os";
2
- import { join } from "node:path";
4
+ import { join, win32 } from "node:path";
3
5
  import {
4
6
  commandOnPath,
5
7
  defaultVsCodeExtensionRoots,
6
8
  findVsCodeExtensionCommand,
9
+ isExecutableCommand,
7
10
  } from "./vscode-extension-command.mjs";
8
11
 
12
+ const CLAUDE_DESKTOP_MACOS_RUNTIME_SEGMENTS = ["claude.app", "Contents", "MacOS", "claude"];
13
+ const CLAUDE_DESKTOP_CODE_PROBE_TIMEOUT_MS = 10_000;
14
+ const CLAUDE_DESKTOP_WINDOWS_PACKAGE_NAME = "Claude";
15
+ const CLAUDE_DESKTOP_WINDOWS_QUERY_TIMEOUT_MS = 10_000;
16
+ const CLAUDE_DESKTOP_WINDOWS_RUNTIME_SEGMENTS = ["claude.exe"];
17
+
9
18
  export function resolveClaudeCommand({
10
19
  env = process.env,
11
20
  homeDir = homedir(),
12
21
  platform = process.platform,
13
22
  arch = process.arch,
23
+ desktopCodeRoots = defaultClaudeDesktopCodeRoots(env, homeDir, platform),
24
+ desktopCodeProbe = spawnSync,
14
25
  vscodeExtensionRoots = defaultVsCodeExtensionRoots(homeDir),
26
+ windowsAppPackageFamilies,
27
+ windowsAppQuery = spawnSync,
15
28
  } = {}) {
16
29
  const configured = nonEmpty(env.MEMORAX_CODE_CLAUDE_COMMAND);
17
30
  if (configured) return { command: configured, source: "configured" };
@@ -20,6 +33,24 @@ export function resolveClaudeCommand({
20
33
  return { command: "claude", source: "path" };
21
34
  }
22
35
 
36
+ const desktopCommand = findClaudeDesktopCodeCommand(
37
+ desktopCodeRoots,
38
+ platform,
39
+ env,
40
+ desktopCodeProbe,
41
+ );
42
+ if (desktopCommand) return { command: desktopCommand, source: "app-bundled" };
43
+
44
+ const windowsDesktopCommand = resolveWindowsClaudeDesktopCodeCommand({
45
+ env,
46
+ homeDir,
47
+ packageFamilies: windowsAppPackageFamilies,
48
+ platform,
49
+ desktopCodeProbe,
50
+ spawnSyncImpl: windowsAppQuery,
51
+ });
52
+ if (windowsDesktopCommand) return { command: windowsDesktopCommand, source: "app-bundled" };
53
+
23
54
  const vscodeCommand = findVsCodeExtensionCommand({
24
55
  extensionId: "anthropic.claude-code",
25
56
  extensionRoots: vscodeExtensionRoots,
@@ -41,6 +72,128 @@ export function ensureClaudeCommandEnv(options = {}) {
41
72
  return resolved;
42
73
  }
43
74
 
75
+ export function resolveWindowsClaudeDesktopCodeCommand({
76
+ env = process.env,
77
+ homeDir = homedir(),
78
+ packageFamilies,
79
+ platform = process.platform,
80
+ desktopCodeProbe = spawnSync,
81
+ spawnSyncImpl = spawnSync,
82
+ } = {}) {
83
+ if (platform !== "win32") return undefined;
84
+ const localAppData = nonEmpty(env.LOCALAPPDATA) ?? join(homeDir, "AppData", "Local");
85
+ const families = packageFamilies ?? queryWindowsClaudeAppPackageFamilies(env, spawnSyncImpl);
86
+ const roots = families.map((family) => join(
87
+ localAppData,
88
+ "Packages",
89
+ family,
90
+ "LocalCache",
91
+ "Roaming",
92
+ "Claude",
93
+ "claude-code",
94
+ ));
95
+ return findClaudeDesktopCodeCommand(roots, platform, env, desktopCodeProbe);
96
+ }
97
+
98
+ function findClaudeDesktopCodeCommand(roots, platform, env, spawnSyncImpl) {
99
+ const runtimeSegments = claudeDesktopRuntimeSegments(platform);
100
+ if (!runtimeSegments) return undefined;
101
+ for (const root of new Set(roots)) {
102
+ let versions;
103
+ try {
104
+ versions = readdirSync(root, { withFileTypes: true })
105
+ .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())
106
+ .map((entry) => entry.name)
107
+ .sort((left, right) => right.localeCompare(left, "en", { numeric: true, sensitivity: "base" }));
108
+ } catch {
109
+ continue;
110
+ }
111
+ for (const version of versions) {
112
+ const command = join(root, version, ...runtimeSegments);
113
+ if (
114
+ isExecutableCommand(command, platform)
115
+ && claudeDesktopCodeCommandIsRunnable(command, env, spawnSyncImpl)
116
+ ) {
117
+ return command;
118
+ }
119
+ }
120
+ }
121
+ return undefined;
122
+ }
123
+
124
+ function claudeDesktopCodeCommandIsRunnable(command, env, spawnSyncImpl) {
125
+ let result;
126
+ try {
127
+ result = spawnSyncImpl(
128
+ command,
129
+ ["--version"],
130
+ {
131
+ encoding: "utf8",
132
+ env,
133
+ stdio: ["ignore", "pipe", "pipe"],
134
+ timeout: CLAUDE_DESKTOP_CODE_PROBE_TIMEOUT_MS,
135
+ windowsHide: true,
136
+ },
137
+ );
138
+ } catch {
139
+ return false;
140
+ }
141
+ return result.status === 0 && !result.error && !result.signal;
142
+ }
143
+
144
+ function defaultClaudeDesktopCodeRoots(env, homeDir, platform) {
145
+ if (platform === "darwin") {
146
+ return [join(homeDir, "Library", "Application Support", "Claude", "claude-code")];
147
+ }
148
+ if (platform === "win32") {
149
+ const appData = nonEmpty(env.APPDATA) ?? join(homeDir, "AppData", "Roaming");
150
+ return [join(appData, "Claude", "claude-code")];
151
+ }
152
+ return [];
153
+ }
154
+
155
+ function claudeDesktopRuntimeSegments(platform) {
156
+ if (platform === "darwin") return CLAUDE_DESKTOP_MACOS_RUNTIME_SEGMENTS;
157
+ if (platform === "win32") return CLAUDE_DESKTOP_WINDOWS_RUNTIME_SEGMENTS;
158
+ return undefined;
159
+ }
160
+
161
+ function queryWindowsClaudeAppPackageFamilies(env, spawnSyncImpl) {
162
+ const powershell = windowsPowerShellCommand(env);
163
+ const script = [
164
+ "[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)",
165
+ `Get-AppxPackage -Name '${CLAUDE_DESKTOP_WINDOWS_PACKAGE_NAME}' -ErrorAction SilentlyContinue | ForEach-Object { $_.PackageFamilyName }`,
166
+ ].join("; ");
167
+ let result;
168
+ try {
169
+ result = spawnSyncImpl(
170
+ powershell,
171
+ ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", script],
172
+ {
173
+ encoding: "utf8",
174
+ env,
175
+ stdio: ["ignore", "pipe", "pipe"],
176
+ timeout: CLAUDE_DESKTOP_WINDOWS_QUERY_TIMEOUT_MS,
177
+ windowsHide: true,
178
+ },
179
+ );
180
+ } catch {
181
+ return [];
182
+ }
183
+ if (result.status !== 0 || result.error || result.signal) return [];
184
+ return [...new Set(String(result.stdout ?? "")
185
+ .split(/\r?\n/)
186
+ .map((value) => value.replace(/^\uFEFF/, "").trim())
187
+ .filter((value) => /^[A-Za-z0-9][A-Za-z0-9.-]*_[A-Za-z0-9]+$/.test(value)))];
188
+ }
189
+
190
+ function windowsPowerShellCommand(env) {
191
+ const systemRoot = nonEmpty(env.SystemRoot) ?? nonEmpty(env.SYSTEMROOT);
192
+ return systemRoot
193
+ ? win32.join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
194
+ : "powershell.exe";
195
+ }
196
+
44
197
  function nonEmpty(value) {
45
198
  const normalized = String(value ?? "").trim();
46
199
  return normalized || undefined;
@@ -1,6 +1,7 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import { readdirSync } from "node:fs";
2
3
  import { homedir } from "node:os";
3
- import { join } from "node:path";
4
+ import { join, win32 } from "node:path";
4
5
  import {
5
6
  commandOnPath,
6
7
  defaultVsCodeExtensionRoots,
@@ -9,6 +10,8 @@ import {
9
10
  } from "./vscode-extension-command.mjs";
10
11
 
11
12
  const APP_BUNDLE_NAMES = ["ChatGPT.app", "Codex.app"];
13
+ const WINDOWS_CODEX_APP_PROBE_TIMEOUT_MS = 10_000;
14
+ const WINDOWS_CODEX_APP_RUNTIME_SEGMENTS = ["plugins", ".plugin-appserver", "codex.exe"];
12
15
 
13
16
  export function resolveCodexCommand({
14
17
  env = process.env,
@@ -17,6 +20,9 @@ export function resolveCodexCommand({
17
20
  arch = process.arch,
18
21
  applicationRoots = [join(homeDir, "Applications"), "/Applications"],
19
22
  vscodeExtensionRoots = defaultVsCodeExtensionRoots(homeDir),
23
+ windowsAppProbe = spawnSync,
24
+ windowsAppRuntimePaths,
25
+ windowsPathExists = isExecutableCommand,
20
26
  } = {}) {
21
27
  const npmOverride = nonEmpty(env.MEMORAX_CODE_CODEX_COMMAND);
22
28
  if (npmOverride) return { command: npmOverride, source: "npm-override" };
@@ -37,6 +43,16 @@ export function resolveCodexCommand({
37
43
  }
38
44
  }
39
45
 
46
+ const windowsAppCommand = resolveWindowsCodexAppCommand({
47
+ env,
48
+ homeDir,
49
+ pathExists: windowsPathExists,
50
+ platform,
51
+ runtimePaths: windowsAppRuntimePaths,
52
+ spawnSyncImpl: windowsAppProbe,
53
+ });
54
+ if (windowsAppCommand) return { command: windowsAppCommand, source: "app-bundled" };
55
+
40
56
  const vscodeCommand = findVsCodeExtensionCommand({
41
57
  extensionId: "openai.chatgpt",
42
58
  extensionRoots: vscodeExtensionRoots,
@@ -49,6 +65,25 @@ export function resolveCodexCommand({
49
65
  return { command: "codex", source: "unavailable" };
50
66
  }
51
67
 
68
+ export function resolveWindowsCodexAppCommand({
69
+ env = process.env,
70
+ homeDir = homedir(),
71
+ pathExists = isExecutableCommand,
72
+ platform = process.platform,
73
+ runtimePaths,
74
+ spawnSyncImpl = spawnSync,
75
+ } = {}) {
76
+ if (platform !== "win32") return undefined;
77
+ const codexHome = nonEmpty(env.CODEX_HOME) ?? win32.join(homeDir, ".codex");
78
+ const candidates = runtimePaths ?? [win32.join(codexHome, ...WINDOWS_CODEX_APP_RUNTIME_SEGMENTS)];
79
+ for (const command of candidates) {
80
+ if (pathExists(command, platform) && windowsCodexCommandIsRunnable(command, env, spawnSyncImpl)) {
81
+ return command;
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+
52
87
  export function ensureCodexCommandEnv(options = {}) {
53
88
  const env = options.env ?? process.env;
54
89
  const resolved = resolveCodexCommand({ ...options, env });
@@ -88,6 +123,26 @@ function codexPlatformDirectories(platform, arch) {
88
123
  return [];
89
124
  }
90
125
 
126
+ function windowsCodexCommandIsRunnable(command, env, spawnSyncImpl) {
127
+ let result;
128
+ try {
129
+ result = spawnSyncImpl(
130
+ command,
131
+ ["--version"],
132
+ {
133
+ encoding: "utf8",
134
+ env,
135
+ stdio: ["ignore", "pipe", "pipe"],
136
+ timeout: WINDOWS_CODEX_APP_PROBE_TIMEOUT_MS,
137
+ windowsHide: true,
138
+ },
139
+ );
140
+ } catch {
141
+ return false;
142
+ }
143
+ return result.status === 0 && !result.error && !result.signal;
144
+ }
145
+
91
146
  function nonEmpty(value) {
92
147
  const normalized = String(value ?? "").trim();
93
148
  return normalized || undefined;
@@ -74,6 +74,12 @@ export async function runClaudeAdapterCli() {
74
74
  await import(pathToFileURL(entrypoint).href);
75
75
  }
76
76
 
77
+ export async function runOpenCodeAdapterCli() {
78
+ if (!ensureSupportedNodeRuntime()) return;
79
+ const entrypoint = join(packageRoot, "lib", "memorax-code-opencode-adapter", "src", "cli.mjs");
80
+ await import(pathToFileURL(entrypoint).href);
81
+ }
82
+
77
83
  function ensureSupportedNodeRuntime() {
78
84
  const message = unsupportedNodeVersionMessage();
79
85
  if (!message) return true;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memorax/memorax-code",
3
- "version": "0.1.1",
4
- "description": "MemoraX Code CLI, local memory backend, Codex and Claude Code adapters, skills, and Memory Viewer.",
3
+ "version": "0.1.3",
4
+ "description": "Persistent coding memory for Codex, Claude Code, DeepSeek Harness, and OpenCode.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "homepage": "https://github.com/memorax-ai/memorax-code#readme",
@@ -15,6 +15,9 @@
15
15
  "keywords": [
16
16
  "agent",
17
17
  "codex",
18
+ "deepseek-harness",
19
+ "dsh",
20
+ "opencode",
18
21
  "memory",
19
22
  "memorax"
20
23
  ],
@@ -23,7 +26,8 @@
23
26
  "memorax-cli": "bin/memorax-cli.mjs",
24
27
  "memorax-code-backend": "bin/memorax-code-backend.mjs",
25
28
  "memorax-code-claude": "bin/memorax-code-claude.mjs",
26
- "memorax-code-codex": "bin/memorax-code-codex.mjs"
29
+ "memorax-code-codex": "bin/memorax-code-codex.mjs",
30
+ "memorax-code-opencode": "bin/memorax-code-opencode.mjs"
27
31
  },
28
32
  "files": [
29
33
  "bin",
@@ -1,67 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { readFile } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { join, resolve } from "node:path";
5
- import { cleanupCodexAfterBackendRemoval, } from "./codex-plugin-install.js";
6
- export async function prepareClientPluginRemovalCleanup(options = {}) {
7
- const claudePluginInstaller = await loadClaudePluginInstaller();
8
- const home = resolveHome(options.homeDir);
9
- const memoraxCodeHome = resolve(options.memoraxCodeHome ?? process.env.MEMORAX_CODE_HOME ?? join(home, ".memorax-code"));
10
- const claudeState = await readJsonRecord(join(memoraxCodeHome, "adapters", "claude-code", "state.json"));
11
- const claudeHome = options.claudeHome ?? stringField(claudeState, "claudeHome");
12
- return async () => {
13
- const [codexPlugin, claudePlugin] = await Promise.all([
14
- cleanupCodexAfterBackendRemoval({
15
- memoraxCodeHome,
16
- homeDir: home,
17
- codexHome: options.codexHome,
18
- codexCommand: options.codexCommand,
19
- }).catch((error) => removalFailure("backend-removal-cleanup", error)),
20
- Promise.resolve()
21
- .then(() => claudePluginInstaller.removeClaudePluginInstallation({
22
- memoraxCodeHome,
23
- ...(claudeHome ? { claudeHome } : {}),
24
- ...(options.claudeCommand ? { claudeCommand: options.claudeCommand } : {}),
25
- }))
26
- .catch((error) => removalFailure("claude-plugin-remove", error)),
27
- ]);
28
- return {
29
- ok: codexPlugin.ok && claudePlugin.ok,
30
- action: "client-plugin-removal-cleanup",
31
- codexPlugin,
32
- claudePlugin,
33
- };
34
- };
35
- }
36
- async function loadClaudePluginInstaller() {
37
- return await import(new URL("../../memorax-code-claude-adapter/src/plugin-install.mjs", import.meta.url).href);
38
- }
39
- async function readJsonRecord(path) {
40
- if (!existsSync(path))
41
- return undefined;
42
- try {
43
- const parsed = JSON.parse(await readFile(path, "utf8"));
44
- return isRecord(parsed) ? parsed : undefined;
45
- }
46
- catch {
47
- return undefined;
48
- }
49
- }
50
- function stringField(record, key) {
51
- const value = record?.[key];
52
- return typeof value === "string" && value.trim() ? value : undefined;
53
- }
54
- function resolveHome(value) {
55
- return resolve(value ?? process.env.HOME ?? homedir());
56
- }
57
- function removalFailure(action, error) {
58
- return {
59
- ok: false,
60
- action,
61
- reason: "plugin_remove_failed",
62
- message: error instanceof Error ? error.message : String(error),
63
- };
64
- }
65
- function isRecord(value) {
66
- return typeof value === "object" && value !== null && !Array.isArray(value);
67
- }