@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,148 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ export function resolveWindowsCliInvocation(command, args, options = {}) {
5
+ const platform = options.platform ?? process.platform;
6
+ if (platform !== "win32")
7
+ return { command, args };
8
+ const pathApi = path.win32;
9
+ const fileExists = options.existsSync ?? existsSync;
10
+ const env = options.env ?? process.env;
11
+ let resolvedCommand = options.resolvedCommand;
12
+ if (!resolvedCommand && !/[\\/]/.test(command)) {
13
+ const located = options.whereOutput === undefined
14
+ ? (options.spawnSync ?? spawnSync)("where.exe", [command], {
15
+ env,
16
+ encoding: "utf8",
17
+ stdio: ["ignore", "pipe", "pipe"],
18
+ windowsHide: true,
19
+ })
20
+ : { status: 0, stdout: options.whereOutput };
21
+ if (located.status === 0) {
22
+ resolvedCommand = selectWindowsCommandCandidate(command, located.stdout);
23
+ }
24
+ }
25
+ resolvedCommand ??= command;
26
+ if (/\.(?:exe|com)$/i.test(resolvedCommand))
27
+ return { command: resolvedCommand, args };
28
+ if (!/\.(?:cmd|bat)$/i.test(resolvedCommand)) {
29
+ throw new Error(`refusing to execute unsupported Windows command shim: ${resolvedCommand}`);
30
+ }
31
+ const name = pathApi.basename(resolvedCommand).replace(/\.(?:cmd|bat)$/i, "").toLowerCase();
32
+ const nativeCli = nativeCliEntrypointCandidates(name, resolvedCommand, env, pathApi)
33
+ .filter(isNativeEntrypoint)
34
+ .find((candidate) => fileExists(candidate));
35
+ if (nativeCli)
36
+ return { command: nativeCli, args };
37
+ const cli = cliEntrypointCandidates(name, resolvedCommand, env, pathApi)
38
+ .filter(isNodeEntrypoint)
39
+ .find((candidate) => fileExists(candidate));
40
+ if (!cli) {
41
+ const override = name === "claude" ? "MEMORAX_CODE_CLAUDE_CLI_JS" : "MEMORAX_CODE_CODEX_CLI_JS";
42
+ throw new Error(`refusing to execute ${pathApi.basename(resolvedCommand)} through a command shell; `
43
+ + `set ${override} to its Node entrypoint`);
44
+ }
45
+ return { command: options.nodePath ?? process.execPath, args: [cli, ...args] };
46
+ }
47
+ function nativeCliEntrypointCandidates(name, command, env, pathApi) {
48
+ if (name !== "claude")
49
+ return [];
50
+ const root = pathApi.dirname(command);
51
+ return [
52
+ env.MEMORAX_CODE_CLAUDE_CLI_EXE,
53
+ env.CLAUDE_CLI_EXE,
54
+ pathApi.join(root, "node_modules", "@anthropic-ai", "claude-code", "bin", "claude.exe"),
55
+ pathApi.join(root, "..", "@anthropic-ai", "claude-code", "bin", "claude.exe"),
56
+ ].filter((candidate) => typeof candidate === "string");
57
+ }
58
+ function cliEntrypointCandidates(name, command, env, pathApi) {
59
+ const root = pathApi.dirname(command);
60
+ if (name === "codex") {
61
+ return [
62
+ env.MEMORAX_CODE_CODEX_CLI_JS,
63
+ env.CODEX_CLI_JS,
64
+ pathApi.join(root, "node_modules", "@openai", "codex", "bin", "codex.js"),
65
+ pathApi.join(root, "..", "@openai", "codex", "bin", "codex.js"),
66
+ ].filter((candidate) => typeof candidate === "string");
67
+ }
68
+ if (name === "claude") {
69
+ return [
70
+ env.MEMORAX_CODE_CLAUDE_CLI_JS,
71
+ env.CLAUDE_CLI_JS,
72
+ pathApi.join(root, "node_modules", "@anthropic-ai", "claude-code", "cli.js"),
73
+ pathApi.join(root, "..", "@anthropic-ai", "claude-code", "cli.js"),
74
+ ].filter((candidate) => typeof candidate === "string");
75
+ }
76
+ return [];
77
+ }
78
+ function isNativeEntrypoint(value) {
79
+ return /\.(?:exe|com)$/i.test(value);
80
+ }
81
+ function isNodeEntrypoint(value) {
82
+ return /\.(?:cjs|js|mjs)$/i.test(value);
83
+ }
84
+ export function selectWindowsCommandCandidate(command, output) {
85
+ const candidates = String(output ?? "")
86
+ .split(/\r?\n/)
87
+ .map((value) => value.trim())
88
+ .filter(Boolean);
89
+ const selected = candidates.find((value) => /\.(?:cmd|bat)$/i.test(value))
90
+ ?? candidates.find((value) => /\.(?:exe|com)$/i.test(value));
91
+ if (!selected) {
92
+ throw new Error(`where.exe did not return a safe executable or command shim for ${command}`);
93
+ }
94
+ return selected;
95
+ }
96
+ export function resolveWindowsNpmInvocation(args, env, options = {}) {
97
+ const platform = options.platform ?? process.platform;
98
+ if (platform !== "win32")
99
+ return { command: "npm", args };
100
+ const nodePath = options.nodePath ?? process.execPath;
101
+ const fileExists = options.existsSync ?? existsSync;
102
+ const candidates = [
103
+ env.MEMORAX_CODE_NPM_EXEC_PATH,
104
+ env.npm_execpath,
105
+ env.NPM_CLI_JS,
106
+ path.win32.join(path.win32.dirname(nodePath), "node_modules", "npm", "bin", "npm-cli.js"),
107
+ path.win32.join(path.win32.dirname(path.win32.dirname(nodePath)), "lib", "node_modules", "npm", "bin", "npm-cli.js"),
108
+ ].filter((candidate) => (typeof candidate === "string" && /\.(?:cjs|js|mjs)$/i.test(candidate)));
109
+ const npmCli = candidates.find((candidate) => fileExists(candidate));
110
+ if (!npmCli) {
111
+ throw new Error("npm CLI JavaScript entrypoint was not found; set MEMORAX_CODE_NPM_EXEC_PATH, "
112
+ + "npm_execpath, or NPM_CLI_JS");
113
+ }
114
+ return { command: nodePath, args: [npmCli, ...args] };
115
+ }
116
+ export function runProcessWithWindowsNpm(command, args, options) {
117
+ return new Promise((resolveResult) => {
118
+ let invocation = { command, args };
119
+ try {
120
+ if (command === "npm") {
121
+ invocation = resolveWindowsNpmInvocation(args, options.env);
122
+ }
123
+ }
124
+ catch (error) {
125
+ resolveResult({
126
+ ok: false,
127
+ stdout: "",
128
+ stderr: error instanceof Error ? error.message : String(error),
129
+ });
130
+ return;
131
+ }
132
+ const child = spawn(invocation.command, invocation.args, {
133
+ cwd: options.cwd,
134
+ env: options.env,
135
+ stdio: ["ignore", "pipe", "pipe"],
136
+ });
137
+ let stdout = "";
138
+ let stderr = "";
139
+ child.stdout.on("data", (chunk) => { stdout += String(chunk); });
140
+ child.stderr.on("data", (chunk) => { stderr += String(chunk); });
141
+ child.on("error", (error) => {
142
+ resolveResult({ ok: false, stdout, stderr: stderr || error.message });
143
+ });
144
+ child.on("close", (code) => {
145
+ resolveResult({ ok: code === 0, stdout, stderr });
146
+ });
147
+ });
148
+ }
@@ -1,9 +1,9 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
- import { loadMemoraxCodeConfig } from "./memorax-code-config.js";
5
- import { isTraceClient } from "./trace-context.js";
6
- export const TRACE_CLIENTS = ["codex", "claude"];
4
+ import { loadMemoraxCodeConfig } from "../config/memorax-code.js";
5
+ import { isTraceClient } from "./context.js";
6
+ export const TRACE_CLIENTS = ["codex", "claude", "dsh", "opencode"];
7
7
  export const CODEX_TRACE_DEFAULT_CONFIG = {
8
8
  enabled: true,
9
9
  captureContent: true,
@@ -18,6 +18,32 @@ export const CLAUDE_TRACE_DEFAULT_CONFIG = {
18
18
  maxEventChars: 20_000,
19
19
  maxFileBytes: 52_428_800,
20
20
  };
21
+ export const DSH_TRACE_DEFAULT_CONFIG = {
22
+ enabled: true,
23
+ captureContent: true,
24
+ retentionDays: 7,
25
+ maxEventChars: 20_000,
26
+ maxFileBytes: 52_428_800,
27
+ };
28
+ export const OPENCODE_TRACE_DEFAULT_CONFIG = {
29
+ enabled: true,
30
+ captureContent: true,
31
+ retentionDays: 7,
32
+ maxEventChars: 20_000,
33
+ maxFileBytes: 52_428_800,
34
+ };
35
+ const TRACE_DEFAULT_CONFIGS = {
36
+ codex: CODEX_TRACE_DEFAULT_CONFIG,
37
+ claude: CLAUDE_TRACE_DEFAULT_CONFIG,
38
+ dsh: DSH_TRACE_DEFAULT_CONFIG,
39
+ opencode: OPENCODE_TRACE_DEFAULT_CONFIG,
40
+ };
41
+ const TRACE_ENV_PREFIXES = {
42
+ codex: "MEMORAX_CODE_CODEX_TRACE",
43
+ claude: "MEMORAX_CODE_CLAUDE_TRACE",
44
+ dsh: "MEMORAX_CODE_DSH_TRACE",
45
+ opencode: "MEMORAX_CODE_OPENCODE_TRACE",
46
+ };
21
47
  export const TRACE_CLEANUP_DEBOUNCE_MS = 60 * 60 * 1000;
22
48
  export const TRACE_CURRENT_TURN_TTL_MS = 30 * 60 * 1000;
23
49
  export const CODEX_TRACE_CLEANUP_DEBOUNCE_MS = TRACE_CLEANUP_DEBOUNCE_MS;
@@ -30,12 +56,18 @@ export function codexTraceConfigFromEnv(env = process.env, fileConfig) {
30
56
  export function claudeTraceConfigFromEnv(env = process.env, fileConfig) {
31
57
  return clientTraceConfigFromEnv("claude", env, fileConfig);
32
58
  }
59
+ export function dshTraceConfigFromEnv(env = process.env, fileConfig) {
60
+ return clientTraceConfigFromEnv("dsh", env, fileConfig);
61
+ }
62
+ export function openCodeTraceConfigFromEnv(env = process.env, fileConfig) {
63
+ return clientTraceConfigFromEnv("opencode", env, fileConfig);
64
+ }
33
65
  export function clientTraceConfigFromEnv(client, env = process.env, fileConfig) {
34
66
  assertTraceClient(client);
35
67
  const config = fileConfig ?? loadMemoraxCodeConfig(memoraxCodeHomeForTrace(env), { warn: () => undefined });
36
68
  const section = config.trace?.[client];
37
- const defaults = client === "claude" ? CLAUDE_TRACE_DEFAULT_CONFIG : CODEX_TRACE_DEFAULT_CONFIG;
38
- const prefix = client === "claude" ? "MEMORAX_CODE_CLAUDE_TRACE" : "MEMORAX_CODE_CODEX_TRACE";
69
+ const defaults = TRACE_DEFAULT_CONFIGS[client];
70
+ const prefix = TRACE_ENV_PREFIXES[client];
39
71
  return {
40
72
  enabled: booleanValue(env[`${prefix}_ENABLED`], section?.enabled ?? defaults.enabled),
41
73
  captureContent: booleanValue(env[`${prefix}_CAPTURE_CONTENT`], section?.capture_content ?? defaults.captureContent),
@@ -53,6 +85,12 @@ export function tracePaths(memoraxCodeHome = memoraxCodeHomeForTrace(process.env
53
85
  export function claudeTracePaths(memoraxCodeHome = memoraxCodeHomeForTrace(process.env)) {
54
86
  return clientTracePaths("claude", memoraxCodeHome);
55
87
  }
88
+ export function dshTracePaths(memoraxCodeHome = memoraxCodeHomeForTrace(process.env)) {
89
+ return clientTracePaths("dsh", memoraxCodeHome);
90
+ }
91
+ export function openCodeTracePaths(memoraxCodeHome = memoraxCodeHomeForTrace(process.env)) {
92
+ return clientTracePaths("opencode", memoraxCodeHome);
93
+ }
56
94
  export function clientTracePaths(client, memoraxCodeHome = memoraxCodeHomeForTrace(process.env)) {
57
95
  assertTraceClient(client);
58
96
  const root = join(memoraxCodeHome, "debug", "traces", client);
@@ -1,4 +1,4 @@
1
- import { memoryProjectFromUnknown, resolveMemoryProject, } from "./memory-project.js";
1
+ import { memoryProjectFromUnknown, resolveMemoryProject, } from "../memory/project.js";
2
2
  export function traceContextFromHookBody(body, capturedAt = new Date().toISOString()) {
3
3
  if (!isRecord(body))
4
4
  return undefined;
@@ -42,6 +42,35 @@ export function traceContextFromClaudeHookBody(body, capturedAt = new Date().toI
42
42
  capturedAt,
43
43
  });
44
44
  }
45
+ export function traceContextFromOpenCodeHookBody(body, capturedAt = new Date().toISOString()) {
46
+ if (!isRecord(body))
47
+ return undefined;
48
+ const sessionId = stringField(body, "sessionId");
49
+ const turnId = stringField(body, "userMessageId");
50
+ if (!sessionId || !turnId)
51
+ return undefined;
52
+ const cwd = stringField(body, "cwd");
53
+ return pruneTraceContext({
54
+ schemaVersion: "1",
55
+ client: "opencode",
56
+ sessionId,
57
+ turnId,
58
+ cwd,
59
+ memoryProject: resolveMemoryProject(cwd),
60
+ workspaceKind: stringField(body, "workspaceKind"),
61
+ contextOrigin: "opencode-hook-body",
62
+ capturedAt,
63
+ });
64
+ }
65
+ export function traceContextFromDshTurnStart(body, capturedAt = new Date().toISOString()) {
66
+ return traceContextFromDshBody(body, "dsh-cordis-turn-start", capturedAt);
67
+ }
68
+ export function traceContextFromDshSkillReminder(body, capturedAt = new Date().toISOString()) {
69
+ return traceContextFromDshBody(body, "dsh-cordis-reminder", capturedAt);
70
+ }
71
+ export function traceContextFromDshSessionEventLog(body, capturedAt = new Date().toISOString()) {
72
+ return traceContextFromDshBody(body, "dsh-session-event-log", capturedAt);
73
+ }
45
74
  export function traceContextFromCurrentTurnRecord(value) {
46
75
  if (!isRecord(value))
47
76
  return undefined;
@@ -100,7 +129,29 @@ function pruneRecord(value) {
100
129
  return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
101
130
  }
102
131
  export function isTraceClient(value) {
103
- return value === "codex" || value === "claude";
132
+ return value === "codex" || value === "claude" || value === "dsh" || value === "opencode";
133
+ }
134
+ function traceContextFromDshBody(body, contextOrigin, capturedAt) {
135
+ if (!isRecord(body))
136
+ return undefined;
137
+ const sessionId = stringField(body, "session_id") ?? stringField(body, "sessionId");
138
+ const turn = body.turn;
139
+ if (!sessionId || typeof turn !== "number" || !Number.isSafeInteger(turn) || turn <= 0) {
140
+ return undefined;
141
+ }
142
+ const cwd = stringField(body, "cwd");
143
+ if (!cwd)
144
+ return undefined;
145
+ return pruneTraceContext({
146
+ schemaVersion: "1",
147
+ client: "dsh",
148
+ sessionId,
149
+ turnId: String(turn),
150
+ cwd,
151
+ memoryProject: resolveMemoryProject(cwd),
152
+ contextOrigin,
153
+ capturedAt,
154
+ });
104
155
  }
105
156
  function stringField(record, key) {
106
157
  const value = record[key];
@@ -1,9 +1,9 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
- import { TRACE_CLEANUP_DEBOUNCE_MS, TRACE_CURRENT_TURN_TTL_MS, clientTraceConfigFromEnv, clientTracePaths, memoraxCodeHomeForTrace, } from "./trace-config.js";
5
- import { isTraceClient, traceContextFromCurrentTurnRecord, traceContextJson, } from "./trace-context.js";
6
- import { appendRepairingJsonl } from "./jsonl-append.js";
4
+ import { TRACE_CLEANUP_DEBOUNCE_MS, TRACE_CURRENT_TURN_TTL_MS, clientTraceConfigFromEnv, clientTracePaths, memoraxCodeHomeForTrace, } from "./config.js";
5
+ import { isTraceClient, traceContextFromCurrentTurnRecord, traceContextJson, } from "./context.js";
6
+ import { appendRepairingJsonl } from "../shared/jsonl-append.js";
7
7
  const eventCounters = new Map();
8
8
  const lastCleanupByRoot = new Map();
9
9
  const currentTurnPathOperations = new Map();
@@ -1,4 +1,4 @@
1
- import { json } from "./server-json.js";
1
+ import { json } from "./json.js";
2
2
  export function handleHealthRequest(state, res) {
3
3
  return json(res, 200, {
4
4
  ok: true,
@@ -1,6 +1,6 @@
1
- import { parseTurnStartCommand, parseWritebackCommand, } from "./memory-hook-command.js";
2
- import { readJson } from "./server-http.js";
3
- import { json } from "./server-json.js";
1
+ import { parseTurnStartCommand, parseWritebackCommand, } from "../../memory/hook-command.js";
2
+ import { readJson } from "./request.js";
3
+ import { json } from "./json.js";
4
4
  export async function handleMemoryHookRequest(dependencies, url, req, res) {
5
5
  if (req.method !== "POST")
6
6
  return false;
@@ -1,4 +1,4 @@
1
- import { backendEnv } from "./backend-env.js";
1
+ import { backendEnv } from "../../config/backend-env.js";
2
2
  const DEFAULT_MAX_JSON_BODY_BYTES = 16 * 1024 * 1024;
3
3
  const MEMORY_VIEWER_SESSION_COOKIE = "memorax_code_memory_viewer_session";
4
4
  export class HttpRequestError extends Error {
@@ -2,9 +2,9 @@ import { createHash } from "node:crypto";
2
2
  import { open, readdir, stat } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import { basename, join, resolve as resolvePath } from "node:path";
5
- import { memoryViewerEventKey } from "./memory-viewer-event-identity.js";
6
- import { claudeTranscriptMemoryActivitiesFromJsonLines } from "./claude-transcript-turn.js";
7
- import { resolveMemoryProject, } from "./memory-project.js";
5
+ import { memoryViewerEventKey } from "../projection/event-identity.js";
6
+ import { claudeTranscriptMemoryActivitiesFromJsonLines } from "../../clients/claude/transcript-turn.js";
7
+ import { resolveMemoryProject, } from "../../memory/project.js";
8
8
  const projections = new Map();
9
9
  const EMPTY_TRANSCRIPT_HISTORY = Object.freeze([]);
10
10
  const MAX_TRANSCRIPT_FILES = 250;
@@ -1,4 +1,4 @@
1
- import { redactViewerPaths } from "./memory-viewer-redaction.js";
1
+ import { redactViewerPaths } from "../projection/redaction.js";
2
2
  const MAX_SESSION_TITLE_LENGTH = 120;
3
3
  const COMMON_RELATIVE_PATH_ROOTS = new Set([
4
4
  "app",
@@ -1,19 +1,21 @@
1
1
  import { createHash } from "node:crypto";
2
- import { isMemoryProjectId, UNCLASSIFIED_PROJECT_ID } from "./memory-project.js";
3
- import { MEMORAX_LOGO_DATA_URL } from "./memory-viewer-logo.js";
4
- import { memoryViewerUserHtml } from "./memory-viewer-user-html.js";
5
- import { projectMemoryViewerUserData } from "./memory-viewer-user-projection.js";
6
- import { listMemoryViewerDataWithHistory, } from "./memory-viewer-store.js";
7
- import { repoMemoryReadinessForProject, } from "./repo-memory-readiness.js";
8
- import { json } from "./server-json.js";
9
- import { memoraxCodeHomeForTrace } from "./trace-config.js";
2
+ import { MEMORAX_ICON_DATA_URL } from "../ui/icon.js";
3
+ import { isMemoryProjectId, UNCLASSIFIED_PROJECT_ID } from "../../memory/project.js";
4
+ import { MEMORAX_LOGO_DATA_URL } from "../ui/logo.js";
5
+ import { memoryViewerUserHtml } from "../ui/user-html.js";
6
+ import { projectMemoryViewerUserData } from "../projection/user.js";
7
+ import { listMemoryViewerDataWithHistory } from "../store.js";
8
+ import { repoMemoryReadinessForProject, } from "../../repository/readiness.js";
9
+ import { json } from "../../transport/http/json.js";
10
+ import { memoraxCodeHomeForTrace } from "../../trace/config.js";
10
11
  const MEMORY_VIEWER_SESSION_ACTIVITY_WINDOW_MS = 72 * 60 * 60 * 1_000;
11
12
  const MEMORY_VIEWER_ACTIVITY_CUTOFF_GRANULARITY_MS = 60_000;
12
13
  const MEMORY_VIEWER_LOGO = Buffer.from(MEMORAX_LOGO_DATA_URL.slice(MEMORAX_LOGO_DATA_URL.indexOf(",") + 1), "base64");
14
+ const MEMORY_VIEWER_ICON = Buffer.from(MEMORAX_ICON_DATA_URL.slice(MEMORAX_ICON_DATA_URL.indexOf(",") + 1), "base64");
13
15
  export async function handleMemoryViewerRequest(url, req, res, options = {}) {
14
16
  if (req.method === "GET" && url.pathname === "/memory-viewer") {
15
17
  if (!memoryViewerUserClient(url)) {
16
- json(res, 400, { ok: false, error: "client must be codex or claude-code" });
18
+ json(res, 400, { ok: false, error: "client must be codex, claude-code, dsh, or opencode" });
17
19
  return true;
18
20
  }
19
21
  res.writeHead(200, {
@@ -36,13 +38,22 @@ export async function handleMemoryViewerRequest(url, req, res, options = {}) {
36
38
  res.end(MEMORY_VIEWER_LOGO);
37
39
  return true;
38
40
  }
41
+ if (req.method === "GET" && url.pathname === "/memory-viewer/favicon.png") {
42
+ res.writeHead(200, {
43
+ "content-type": "image/png",
44
+ "cache-control": "private, max-age=86400",
45
+ "x-content-type-options": "nosniff",
46
+ });
47
+ res.end(MEMORY_VIEWER_ICON);
48
+ return true;
49
+ }
39
50
  if (req.method !== "GET" || url.pathname !== "/memory-viewer/api/summary") {
40
51
  return false;
41
52
  }
42
53
  const memoraxCodeHome = viewerMemoraxCodeHome(options);
43
54
  const selectedClient = memoryViewerUserClient(url);
44
55
  if (!selectedClient) {
45
- json(res, 400, { ok: false, error: "client must be codex or claude-code" });
56
+ json(res, 400, { ok: false, error: "client must be codex, claude-code, dsh, or opencode" });
46
57
  return true;
47
58
  }
48
59
  const requestedProject = projectFilter(url);
@@ -66,7 +77,7 @@ export async function handleMemoryViewerRequest(url, req, res, options = {}) {
66
77
  conditionalViewerJson(req, res, {
67
78
  ok: true,
68
79
  selectedClient: selectedClient.publicClient,
69
- availableClients: ["codex", "claude-code"],
80
+ availableClients: ["codex", "claude-code", "dsh", "opencode"],
70
81
  summary: projection.summary,
71
82
  activities: projection.activities.slice(0, 100),
72
83
  projects,
@@ -83,12 +94,12 @@ function memoryViewerUserClient(url) {
83
94
  const value = url.searchParams.get("client");
84
95
  const traceClient = value === null ? "codex" : traceClientFromPublicValue(value.trim().toLowerCase());
85
96
  return traceClient
86
- ? { traceClient, publicClient: traceClient === "claude" ? "claude-code" : "codex" }
97
+ ? { traceClient, publicClient: traceClient === "claude" ? "claude-code" : traceClient }
87
98
  : undefined;
88
99
  }
89
100
  function traceClientFromPublicValue(value) {
90
- if (value === "codex")
91
- return "codex";
101
+ if (value === "codex" || value === "dsh" || value === "opencode")
102
+ return value;
92
103
  return value === "claude" || value === "claude-code" || value === "cc"
93
104
  ? "claude"
94
105
  : undefined;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
- import { UNCLASSIFIED_PROJECT_ID } from "./memory-project.js";
2
- import { memoryViewerEventTurnIds } from "./memory-viewer-turn-reference.js";
1
+ import { UNCLASSIFIED_PROJECT_ID } from "../../memory/project.js";
2
+ import { memoryViewerEventTurnIds } from "./turn-reference.js";
3
3
  export function memoryViewerActivitySummary(allEvents) {
4
4
  let recalledCount = 0;
5
5
  let addCount = 0;
@@ -1,4 +1,4 @@
1
- import { memoryViewerEventKey } from "./memory-viewer-event-identity.js";
1
+ import { memoryViewerEventKey } from "./event-identity.js";
2
2
  /**
3
3
  * Marks a retained start without an end as interrupted only when a different
4
4
  * Turn demonstrably started later in the same client session.
@@ -1,4 +1,4 @@
1
- import { recordMemoryViewerEvent } from "./memory-viewer-store.js";
1
+ import { recordMemoryViewerEvent } from "../store.js";
2
2
  export function memoryViewerObservabilityHook() {
3
3
  return {
4
4
  recordEvent(event) {
@@ -1,4 +1,4 @@
1
- import { isTraceClient } from "./trace-context.js";
1
+ import { isTraceClient } from "../../trace/context.js";
2
2
  /**
3
3
  * Projects raw Viewer events into the deliberately small user-facing summary contract.
4
4
  * Conversation, memory, session, turn, and diagnostic fields never cross this boundary.
@@ -1,4 +1,4 @@
1
- import { completeMemoryWritebackTask, memoryText, memoryWritebackTaskEventKey, memoryWritebackTaskOutcome, memoryWritebackTaskOutcomeForStatus, nonNegativeInteger, projectMemoryWritebackTasks, stringArray, } from "./memory-writeback-task-projection.js";
1
+ import { completeMemoryWritebackTask, memoryText, memoryWritebackTaskEventKey, memoryWritebackTaskOutcome, memoryWritebackTaskOutcomeForStatus, nonNegativeInteger, projectMemoryWritebackTasks, stringArray, } from "../../memory/writeback-task-projection.js";
2
2
  export { memoryText, nonNegativeInteger, stringArray, };
3
3
  export function pendingMemoryViewerWritebacks(eventsToCheck) {
4
4
  const tasks = new Map(projectMemoryWritebackTasks(eventsToCheck.flatMap(memoryViewerWritebackProjectionRecord)).map((task) => [memoryWritebackTaskEventKey(task), task]));