@memorax/memorax-code 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +16 -12
  2. package/bin/memorax-code-npm-preinstall.mjs +7 -2
  3. package/bin/memorax-code-opencode.mjs +4 -0
  4. package/bin/memorax-code-plugin-postinstall.mjs +342 -93
  5. package/docs/configuration.md +148 -35
  6. package/docs/troubleshooting.md +73 -13
  7. package/lib/dsh-plugin-install.mjs +22 -0
  8. package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  9. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  10. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  11. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  12. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  13. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  14. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  15. package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
  16. package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
  17. package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
  18. package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
  19. package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
  20. package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
  21. package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
  22. package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
  23. package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
  24. package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
  25. package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
  26. package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
  27. package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
  28. package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
  29. package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
  30. package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
  31. package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
  32. package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
  33. package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
  34. package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
  35. package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
  36. package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
  37. package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
  38. package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
  39. package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
  40. package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
  41. package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
  42. package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
  43. package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
  44. package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
  45. package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
  46. package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
  47. package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
  48. package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
  49. package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
  50. package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
  51. package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
  52. package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
  53. package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
  54. package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
  55. package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
  56. package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
  57. package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
  58. package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
  59. package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
  60. package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
  61. package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
  62. package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
  63. package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
  64. package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
  65. package/lib/memorax-code-backend/dist/server.js +3 -212
  66. package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
  67. package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
  68. package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
  69. package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
  70. package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
  71. package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
  72. package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
  73. package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
  74. package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
  75. package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
  76. package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
  77. package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
  78. package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
  79. package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
  80. package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
  81. package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
  82. package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
  83. package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
  84. package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
  85. package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
  86. package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
  87. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
  88. package/lib/memorax-code-backend/package.json +3 -3
  89. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  90. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  91. package/lib/memorax-code-claude-adapter/package.json +1 -1
  92. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  93. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  94. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  95. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  96. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  97. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  98. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  99. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  100. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  101. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  102. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  103. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  104. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  105. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  106. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  107. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  108. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  109. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  110. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  111. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  112. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  113. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  114. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  115. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  116. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  117. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
  118. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  119. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  120. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  121. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  122. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  123. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  124. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  125. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  126. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  127. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  128. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  129. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  130. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  131. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  132. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  133. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  134. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
  135. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
  136. package/lib/memorax-code-codex-adapter/package.json +1 -1
  137. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
  138. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
  139. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
  140. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  141. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  142. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
  143. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
  144. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
  145. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
  146. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  147. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
  148. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  149. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  150. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  151. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  152. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  153. package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
  154. package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
  155. package/lib/memorax-code-dsh-adapter/package.json +69 -0
  156. package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
  157. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  158. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  159. package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
  160. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  161. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  162. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
  163. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
  164. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
  165. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
  166. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  167. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
  168. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  169. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  170. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  171. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  172. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  173. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  174. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  175. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  176. package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
  177. package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
  178. package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
  179. package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
  180. package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
  181. package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
  182. package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
  183. package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
  184. package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1358 -0
  185. package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
  186. package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
  187. package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
  188. package/lib/memorax-code-opencode-adapter/package.json +10 -0
  189. package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
  190. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  191. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  192. package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
  193. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  194. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  195. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
  196. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
  197. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
  198. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
  199. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  200. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
  201. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  202. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  203. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  204. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  205. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  206. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  207. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  208. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  209. package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
  210. package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
  211. package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
  212. package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
  213. package/lib/memorax-code-opencode-adapter/src/plugin.mjs +539 -0
  214. package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +442 -0
  215. package/lib/run-entrypoint.mjs +6 -0
  216. package/package.json +7 -3
  217. package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
  218. /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
  219. /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
  220. /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
  221. /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
  222. /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
  223. /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
  224. /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
  225. /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
  226. /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
  227. /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
  228. /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
  229. /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
  230. /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
  231. /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
  232. /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
  233. /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
  234. /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
  235. /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
  236. /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
  237. /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
  238. /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
  239. /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
  240. /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
  241. /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
  242. /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
@@ -1,217 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { createServer, } from "node:http";
3
- import { isMainEntrypoint } from "./entrypoint.js";
4
- import { backendDebug } from "./debug-log.js";
5
- import { createMemoryReminderTraceRecorder } from "./memory-reminder-trace-recorder.js";
6
- import { handleMemoryViewerRequest } from "./server-memory-viewer.js";
7
- import { handleMemoryHookRequest } from "./server-memory-hook.js";
8
- import { createBackendMemoryObservability } from "./server-observability.js";
9
- import { createMemoryService } from "./memory-service.js";
10
- import { handleHealthRequest } from "./server-health.js";
11
- import { authorized, memoryViewerSessionCookieHeader, publicErrorMessage, statusCodeFromError } from "./server-http.js";
12
- import { json } from "./server-json.js";
13
- import { createBackendState } from "./backend-state.js";
14
- import { TRACE_CLIENTS } from "./trace-config.js";
15
- import { pruneExpiredTraceSessionsForClient } from "./trace-store.js";
16
- import { startMemoryWritebackReconciler } from "./memory-writeback-reconciler.js";
17
- import { createMemoryWritebackTaskProjection } from "./memory-writeback-task-projection.js";
18
- import { readActiveManagedClients } from "./active-client-selection.js";
19
- const DEFAULT_BACKEND_SHUTDOWN_TIMEOUT_MS = 4_000;
20
- export function createBackendServer(state = createBackendState(), options = {}) {
21
- const memoryEnv = { ...process.env, MEMORAX_CODE_HOME: state.sessionHome };
22
- const memoryWritebackTaskProjections = TRACE_CLIENTS.map((client) => createMemoryWritebackTaskProjection({
23
- memoraxCodeHome: state.sessionHome,
24
- client,
25
- }));
26
- const memoryObservability = createBackendMemoryObservability(state.sessionHome, options.memoryObservability, memoryEnv, memoryWritebackTaskProjections.map((projection) => projection.observabilityHook));
27
- const memoryService = createMemoryService({
28
- diagnosticLogger: backendDebug,
29
- env: memoryEnv,
30
- memoraxCodeHome: state.sessionHome,
31
- memoryObservability,
32
- });
33
- const memoryHookDependencies = {
34
- memoryService,
35
- memoryReminderTraceRecorder: createMemoryReminderTraceRecorder({
36
- diagnosticLogger: backendDebug,
37
- env: memoryEnv,
38
- memoraxCodeHome: state.sessionHome,
39
- }),
40
- };
41
- for (const client of TRACE_CLIENTS) {
42
- void pruneExpiredTraceSessionsForClient({
43
- client,
44
- memoraxCodeHome: state.sessionHome,
45
- }).catch((error) => {
46
- backendDebug(`${client}_trace.retention_cleanup_failed`, {
47
- error: error instanceof Error ? error.message : String(error),
48
- });
49
- });
50
- }
51
- const memoryWritebackReconcilers = memoryWritebackTaskProjections.map((taskProjection) => (startMemoryWritebackReconciler({
52
- memoraxCodeHome: state.sessionHome,
53
- env: memoryEnv,
54
- taskProjection,
55
- })));
56
- const handleRequest = async (req, res) => {
57
- const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "127.0.0.1"}`);
58
- backendDebug("http.request", {
59
- method: req.method,
60
- path: url.pathname,
61
- });
62
- try {
63
- if (req.method === "GET" && url.pathname === "/health")
64
- return handleHealthRequest(state, res);
65
- if (!authorized(state, req, url))
66
- return json(res, 401, { ok: false, error: "unauthorized" });
67
- if (url.pathname === "/memory-viewer"
68
- || url.pathname.startsWith("/memory-viewer/")) {
69
- if (await handleMemoryViewerRequest(url, req, res, {
70
- memoraxCodeHome: state.sessionHome,
71
- claudeProjectsRoot: readActiveManagedClients(state.sessionHome)?.claude === true
72
- ? state.claudeProjectsRoot
73
- : false,
74
- sessionCookie: memoryViewerSessionCookieHeader(state, req, url),
75
- }))
76
- return;
77
- }
78
- if (await handleMemoryHookRequest(memoryHookDependencies, url, req, res))
79
- return;
80
- return json(res, 404, { ok: false, error: "not found" });
81
- }
82
- catch (error) {
83
- const status = statusCodeFromError(error);
84
- const publicMessage = publicErrorMessage(error);
85
- if (status >= 500)
86
- console.error("request failed", error);
87
- if (res.headersSent) {
88
- return res.end();
89
- }
90
- return json(res, status, { ok: false, error: publicMessage });
91
- }
92
- };
93
- const activeRequests = new Set();
94
- const server = createServer((req, res) => {
95
- const request = handleRequest(req, res);
96
- activeRequests.add(request);
97
- void request.then(() => activeRequests.delete(request), () => activeRequests.delete(request));
98
- });
99
- return attachBackendShutdown(server, {
100
- activeRequests,
101
- memoryObservability,
102
- memoryService,
103
- memoryWritebackReconcilers,
104
- timeoutMs: positiveShutdownTimeout(options.shutdownTimeoutMs),
105
- });
106
- }
107
- function attachBackendShutdown(server, resources) {
108
- const closeHttpServer = server.close.bind(server);
109
- const backendServer = server;
110
- let shutdownPromise;
111
- backendServer.shutdown = () => {
112
- shutdownPromise ??= shutdownBackend(backendServer, closeHttpServer, resources);
113
- return shutdownPromise;
114
- };
115
- backendServer.close = ((callback) => {
116
- void backendServer.shutdown().then(() => callback?.(), (error) => callback?.(error instanceof Error ? error : new Error(String(error))));
117
- return backendServer;
118
- });
119
- return backendServer;
120
- }
121
- async function shutdownBackend(server, closeHttpServer, resources) {
122
- const deadline = Date.now() + resources.timeoutMs;
123
- const reconcilerDrain = settleShutdownWork("memory_writeback_reconcilers", Promise.all(resources.memoryWritebackReconcilers.map((reconciler) => reconciler.close())));
124
- try {
125
- await waitForShutdownPhase("http_server", closeBackendHttpServer(server, closeHttpServer, resources.timeoutMs), deadline);
126
- await waitForShutdownPhase("http_requests", waitForActiveRequests(resources.activeRequests), deadline);
127
- if (Date.now() < deadline) {
128
- await waitForShutdownPhase("memory_service", settleShutdownWork("memory_service", resources.memoryService.drain()), deadline);
129
- }
130
- if (Date.now() < deadline && resources.memoryObservability?.drain) {
131
- await waitForShutdownPhase("memory_observability", settleShutdownWork("memory_observability", resources.memoryObservability.drain()), deadline);
132
- }
133
- await waitForShutdownPhase("background_work", reconcilerDrain, deadline);
134
- }
135
- finally {
136
- resources.memoryService.close();
137
- }
138
- }
139
- function closeBackendHttpServer(server, closeHttpServer, timeoutMs) {
140
- return new Promise((resolve, reject) => {
141
- const forceTimer = setTimeout(() => {
142
- backendDebug("shutdown.http_connections_forced", { timeoutMs });
143
- try {
144
- server.closeAllConnections();
145
- }
146
- catch (error) {
147
- backendDebug("shutdown.http_connections_force_failed", {
148
- error: error instanceof Error ? error.message : String(error),
149
- });
150
- }
151
- }, timeoutMs);
152
- const done = (error) => {
153
- clearTimeout(forceTimer);
154
- if (error && error.code !== "ERR_SERVER_NOT_RUNNING") {
155
- reject(error);
156
- return;
157
- }
158
- resolve();
159
- };
160
- try {
161
- closeHttpServer(done);
162
- server.closeIdleConnections();
163
- }
164
- catch (error) {
165
- done(error instanceof Error ? error : new Error(String(error)));
166
- }
167
- });
168
- }
169
- async function waitForActiveRequests(activeRequests) {
170
- while (activeRequests.size > 0) {
171
- await Promise.allSettled([...activeRequests]);
172
- }
173
- }
174
- async function waitForShutdownPhase(phase, work, deadline) {
175
- const remainingMs = deadline - Date.now();
176
- if (remainingMs <= 0) {
177
- backendDebug("shutdown.phase_timed_out", { phase, remainingMs: 0 });
178
- return false;
179
- }
180
- let timer;
181
- const result = await Promise.race([
182
- work.then(() => ({ completed: true }), (error) => ({ completed: true, error })),
183
- new Promise((resolve) => {
184
- timer = setTimeout(() => resolve({ completed: false }), remainingMs);
185
- }),
186
- ]);
187
- if (timer)
188
- clearTimeout(timer);
189
- if (!result.completed) {
190
- backendDebug("shutdown.phase_timed_out", { phase, remainingMs });
191
- return false;
192
- }
193
- if ("error" in result)
194
- throw result.error;
195
- return true;
196
- }
197
- async function settleShutdownWork(label, work) {
198
- try {
199
- await work;
200
- }
201
- catch (error) {
202
- backendDebug("shutdown.work_failed", {
203
- label,
204
- error: error instanceof Error ? error.message : String(error),
205
- });
206
- }
207
- }
208
- function positiveShutdownTimeout(value) {
209
- if (typeof value === "number" && Number.isSafeInteger(value) && value > 0)
210
- return value;
211
- return DEFAULT_BACKEND_SHUTDOWN_TIMEOUT_MS;
212
- }
2
+ import { isMainEntrypoint } from "./entrypoints/main.js";
3
+ export { createBackendServer } from "./app/backend-server.js";
213
4
  if (isMainEntrypoint(import.meta.url)) {
214
- import("./server-cli.js")
5
+ import("./entrypoints/backend-cli.js")
215
6
  .then(({ runBackendCli }) => runBackendCli(process.argv))
216
7
  .catch((error) => {
217
8
  console.error(error instanceof Error ? error.message : String(error));
@@ -1,4 +1,4 @@
1
- import { runBackendCli } from "./server-cli.js";
1
+ import { runBackendCli } from "./entrypoints/backend-cli.js";
2
2
  const markerIndex = process.argv.indexOf("--memorax-code-backend-instance");
3
3
  const instanceId = markerIndex >= 0 ? process.argv[markerIndex + 1] : undefined;
4
4
  if (!instanceId
@@ -1,4 +1,4 @@
1
- import { backendEnv } from "./backend-env.js";
1
+ import { backendEnv } from "../config/backend-env.js";
2
2
  export function backendDebugEnabled() {
3
3
  const value = backendEnv("DEBUG_REQUESTS");
4
4
  return value === "1" || value === "true" || value === "yes";
@@ -0,0 +1,75 @@
1
+ import { open } from "node:fs/promises";
2
+ const JSONL_TAIL_SCAN_CHUNK_BYTES = 8 * 1024;
3
+ const pathOperations = new Map();
4
+ export async function appendRepairingJsonl(path, text) {
5
+ await serializePath(path, async () => {
6
+ const handle = await open(path, "a+", 0o600);
7
+ try {
8
+ const { rollbackSize, separator } = await prepareTailForAppend(handle);
9
+ try {
10
+ await handle.writeFile(`${separator}${text}`, "utf8");
11
+ }
12
+ catch (error) {
13
+ await handle.truncate(rollbackSize).catch(() => undefined);
14
+ throw error;
15
+ }
16
+ }
17
+ finally {
18
+ await handle.close();
19
+ }
20
+ });
21
+ }
22
+ async function serializePath(path, operation) {
23
+ const previous = pathOperations.get(path) ?? Promise.resolve();
24
+ const current = previous.catch(() => undefined).then(operation);
25
+ pathOperations.set(path, current);
26
+ try {
27
+ return await current;
28
+ }
29
+ finally {
30
+ if (pathOperations.get(path) === current)
31
+ pathOperations.delete(path);
32
+ }
33
+ }
34
+ async function prepareTailForAppend(handle) {
35
+ const size = (await handle.stat()).size;
36
+ if (size === 0)
37
+ return { rollbackSize: 0, separator: "" };
38
+ const lastByte = Buffer.allocUnsafe(1);
39
+ await readExactAt(handle, lastByte, size - 1);
40
+ if (lastByte[0] === 0x0a)
41
+ return { rollbackSize: size, separator: "" };
42
+ const tailStart = await jsonlTailStart(handle, size);
43
+ const tail = Buffer.allocUnsafe(size - tailStart);
44
+ await readExactAt(handle, tail, tailStart);
45
+ try {
46
+ JSON.parse(tail.toString("utf8"));
47
+ return { rollbackSize: size, separator: "\n" };
48
+ }
49
+ catch {
50
+ await handle.truncate(tailStart);
51
+ return { rollbackSize: tailStart, separator: "" };
52
+ }
53
+ }
54
+ async function jsonlTailStart(handle, size) {
55
+ let end = size;
56
+ while (end > 0) {
57
+ const start = Math.max(0, end - JSONL_TAIL_SCAN_CHUNK_BYTES);
58
+ const buffer = Buffer.allocUnsafe(end - start);
59
+ await readExactAt(handle, buffer, start);
60
+ const newline = buffer.lastIndexOf(0x0a);
61
+ if (newline >= 0)
62
+ return start + newline + 1;
63
+ end = start;
64
+ }
65
+ return 0;
66
+ }
67
+ async function readExactAt(handle, buffer, position) {
68
+ let offset = 0;
69
+ while (offset < buffer.length) {
70
+ const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, position + offset);
71
+ if (bytesRead === 0)
72
+ throw new Error("failed to read JSONL tail");
73
+ offset += bytesRead;
74
+ }
75
+ }
@@ -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",