@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,212 @@
1
+ const PLACEHOLDER_PATTERN = /\[REDACTED:[A-Z_]+\]/g;
2
+ const PLACEHOLDER_VALUE_PATTERN = /^\[REDACTED:[A-Z_]+\]$/;
3
+ const SENSITIVE_KEY_SOURCE = String.raw `(?:[A-Za-z_$][A-Za-z0-9_$-]*)?(?:password|passwd|pwd|client[-_$]?secret|consumer[-_$]?secret|api[-_$]?key|access[-_$]?token|refresh[-_$]?token|auth[-_$]?token|id[-_$]?token|private[-_$]?key|secret[-_$]?access[-_$]?key|secret[-_$]?key|credential|secret|token)`;
4
+ const CREDENTIAL_VALUE_SOURCE = String.raw `(?:\[REDACTED:[A-Z_]+\]|\$\{\{[^\r\n]*?\}\}|\{\{[^\r\n]*?\}\}|\$\{[^}\r\n]+\}|\$[A-Za-z_][A-Za-z0-9_]*|"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'|[^,;#}\]\)\r\n]+)`;
5
+ const SAFE_CREDENTIAL_VALUE_PATTERN = /^(?:\[REDACTED:[A-Z_]+\]|\$\{\{[^\r\n]*\}\}|\{\{[^\r\n]*\}\}|\$\{[A-Z_][A-Z0-9_]*\}|\$[A-Z_][A-Z0-9_]*|(?:process\.)?env\.[A-Z_][A-Z0-9_]*|<[^>]+>|--\S+|x{2,}|\*{2,}|\.{3}|sk[_-]x+|example|sample|change-?me|(?:your|replace)[-_][a-z0-9_-]+|string|str|number|boolean|unknown|any|null|undefined|none)$/i;
6
+ const NON_CONTENT_LABEL_PATTERN = /\b(?:proxy-authorization|authorization|bearer|basic|cookie|set-cookie|password|passwd|pwd|client[_-]?secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|private[_-]?key|credential|secret|token|jwt|email|contact|card|key|export)\b/gi;
7
+ const RULES = [
8
+ {
9
+ pattern: /-----BEGIN ((?:(?:RSA|EC|DSA|OPENSSH|ENCRYPTED) )?PRIVATE KEY|PGP PRIVATE KEY BLOCK)-----[\s\S]*?(?:-----END \1-----|$)/gi,
10
+ kind: "PRIVATE_KEY",
11
+ priority: 100,
12
+ },
13
+ {
14
+ pattern: /(?:^|[\r\n])[ \t]*(?:Proxy-)?Authorization[ \t]*:[ \t]*([^ \t\r\n][^\r\n]*)/gim,
15
+ group: 1,
16
+ kind: "AUTH_TOKEN",
17
+ priority: 95,
18
+ },
19
+ {
20
+ pattern: /(?:^|[^A-Za-z0-9_-])(?:Bearer|Basic)\s+["']?([A-Za-z0-9._~+/=-]{16,})(?![A-Za-z0-9._~+/=-])/gi,
21
+ group: 1,
22
+ kind: "AUTH_TOKEN",
23
+ priority: 94,
24
+ },
25
+ {
26
+ pattern: /\beyJ[A-Za-z0-9_-]{5,}\.eyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{16,}\b/g,
27
+ kind: "AUTH_TOKEN",
28
+ priority: 94,
29
+ },
30
+ {
31
+ pattern: /(?:^|[\r\n])[ \t]*(?:Set-Cookie|Cookie)\s*:\s*([^\r\n]+)/gim,
32
+ group: 1,
33
+ kind: "COOKIE",
34
+ priority: 92,
35
+ },
36
+ {
37
+ pattern: new RegExp(String.raw `(?:^|[\r\n;,{}])[ \t]*(?:-[ \t]+)?(?:(?:export|const|let|var)[ \t]+)*["']?${SENSITIVE_KEY_SOURCE}["']?[ \t]*[:=][ \t]*(${CREDENTIAL_VALUE_SOURCE})`, "gim"),
38
+ group: 1,
39
+ kind: "CREDENTIAL",
40
+ priority: 85,
41
+ accept: (value) => !isSafeCredentialValue(value),
42
+ },
43
+ {
44
+ pattern: new RegExp(String.raw `--${SENSITIVE_KEY_SOURCE}(?![A-Za-z0-9_$-])(?:[ \t]+|=[ \t]*)(${CREDENTIAL_VALUE_SOURCE})`, "gi"),
45
+ group: 1,
46
+ kind: "CREDENTIAL",
47
+ priority: 85,
48
+ accept: (value) => !isSafeCredentialValue(value),
49
+ },
50
+ {
51
+ pattern: new RegExp(String.raw `[?&]${SENSITIVE_KEY_SOURCE}(?![A-Za-z0-9_$-])=([^&#\s"'<>]+)`, "gi"),
52
+ group: 1,
53
+ kind: "CREDENTIAL",
54
+ priority: 85,
55
+ accept: (value) => !isSafeCredentialValue(value),
56
+ },
57
+ {
58
+ pattern: /\b[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s/:@]*:([^\s/@]+)@/g,
59
+ group: 1,
60
+ kind: "CREDENTIAL",
61
+ priority: 85,
62
+ accept: (value) => !isSafeCredentialValue(value),
63
+ },
64
+ { pattern: /\bsk-(?:proj-)?[A-Za-z0-9_-]{16,}[A-Za-z0-9]\b/g, kind: "API_KEY", priority: 80 },
65
+ { pattern: /\bsk_[A-Za-z0-9_-]{8,}\b/g, kind: "API_KEY", priority: 80 },
66
+ { pattern: /\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,})\b/g, kind: "API_KEY", priority: 80 },
67
+ { pattern: /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g, kind: "API_KEY", priority: 80 },
68
+ { pattern: /\bxox[baprs]-[A-Za-z0-9-]{16,}[A-Za-z0-9]\b/g, kind: "API_KEY", priority: 80 },
69
+ { pattern: /\b(?:(?:sk|rk)_live_[A-Za-z0-9]{16,}|whsec_[A-Za-z0-9]{16,})\b/g, kind: "API_KEY", priority: 80 },
70
+ { pattern: /\bglpat-[A-Za-z0-9_-]{16,}[A-Za-z0-9]\b/g, kind: "API_KEY", priority: 80 },
71
+ { pattern: /\bAIza[0-9A-Za-z_-]{35}\b/g, kind: "API_KEY", priority: 80 },
72
+ { pattern: /\bnpm_[A-Za-z0-9]{36}\b/g, kind: "API_KEY", priority: 80 },
73
+ {
74
+ pattern: /(?<![A-Z0-9._%+-])[A-Z0-9._%+-]{1,64}@[A-Z0-9](?:[A-Z0-9.-]{0,251}[A-Z0-9])?\.[A-Z]{2,63}(?![A-Z0-9-]|\.[A-Z0-9])/gi,
75
+ kind: "EMAIL",
76
+ priority: 70,
77
+ },
78
+ {
79
+ pattern: /(?<![A-Za-z0-9])[0-9A-Fa-f]{8}-(?:[0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}(?![A-Za-z0-9])/g,
80
+ kind: "OPAQUE_ID",
81
+ priority: 60,
82
+ },
83
+ {
84
+ pattern: /(?<![A-Za-z0-9])(?:[0-9A-Fa-f]{64}|[0-9A-Fa-f]{40}|[0-9A-Fa-f]{32})(?![A-Za-z0-9])/g,
85
+ kind: "OPAQUE_ID",
86
+ priority: 60,
87
+ accept: (value) => /[A-Fa-f]/.test(value),
88
+ },
89
+ {
90
+ pattern: /(?<![A-Za-z0-9])[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,
91
+ kind: "OPAQUE_ID",
92
+ priority: 60,
93
+ accept: looksLikeHighEntropyOpaqueId,
94
+ },
95
+ {
96
+ pattern: /(?<![A-Za-z0-9.])\+?(?:\d|\(\d)[\d ()-]*\d[Xx]?\)?(?![A-Za-z0-9]|\.\d)/g,
97
+ kind: "LONG_NUMBER",
98
+ priority: 50,
99
+ accept: (value) => {
100
+ if (value.replace(/\D/g, "").length < 9)
101
+ return false;
102
+ const normalized = value.trim().replace(/[()]/g, "");
103
+ return !/^(?:19|20)\d{2}-\d{1,2}-\d{1,2}(?:[ T-]\d{1,2})?$/.test(normalized)
104
+ && !/^(?:19|20)\d{2}\s+\d{1,2}\s+\d{1,2}(?:\s+\d{1,2})?$/.test(normalized);
105
+ },
106
+ },
107
+ ];
108
+ export function redactMemoryPayloadText(text) {
109
+ if (!text)
110
+ return { text, counts: {}, redacted: false };
111
+ const spans = [];
112
+ for (const rule of RULES)
113
+ collectRuleSpans(text, rule, spans);
114
+ const selected = mergeOverlappingSpans(spans);
115
+ if (selected.length === 0)
116
+ return { text, counts: {}, redacted: false };
117
+ const counts = {};
118
+ const output = [];
119
+ let offset = 0;
120
+ for (const span of selected) {
121
+ output.push(text.slice(offset, span.start), `[REDACTED:${span.kind}]`);
122
+ counts[span.kind] = (counts[span.kind] ?? 0) + 1;
123
+ offset = span.end;
124
+ }
125
+ output.push(text.slice(offset));
126
+ return { text: output.join(""), counts, redacted: true };
127
+ }
128
+ export function hasMeaningfulMemoryPayloadText(text) {
129
+ if (!text.trim())
130
+ return false;
131
+ const remainder = text
132
+ .replace(PLACEHOLDER_PATTERN, " ")
133
+ .replace(NON_CONTENT_LABEL_PATTERN, " ")
134
+ .replace(/[\s.,;:!?"'`(){}\[\]<>/\\|=_-]+/g, "");
135
+ return /[\p{L}\p{N}]/u.test(remainder);
136
+ }
137
+ function collectRuleSpans(text, rule, spans) {
138
+ rule.pattern.lastIndex = 0;
139
+ for (const match of text.matchAll(rule.pattern)) {
140
+ const value = match[rule.group ?? 0];
141
+ if (match.index === undefined || !value || PLACEHOLDER_VALUE_PATTERN.test(value.trim()))
142
+ continue;
143
+ if (rule.accept && !rule.accept(value))
144
+ continue;
145
+ const relativeStart = match[0].lastIndexOf(value);
146
+ if (relativeStart < 0)
147
+ continue;
148
+ spans.push({
149
+ start: match.index + relativeStart,
150
+ end: match.index + relativeStart + value.length,
151
+ kind: rule.kind,
152
+ priority: rule.priority,
153
+ });
154
+ }
155
+ }
156
+ function isSafeCredentialValue(rawValue) {
157
+ let value = rawValue.trim();
158
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
159
+ value = value.slice(1, -1).trim();
160
+ }
161
+ return !value || SAFE_CREDENTIAL_VALUE_PATTERN.test(value);
162
+ }
163
+ function looksLikeHighEntropyOpaqueId(value) {
164
+ let lowercase = 0;
165
+ let uppercase = 0;
166
+ let digits = 0;
167
+ let transitions = 0;
168
+ let letterRun = 0;
169
+ let longestLetterRun = 0;
170
+ let previousWasDigit;
171
+ const unique = new Set();
172
+ for (const character of value) {
173
+ const isDigit = character >= "0" && character <= "9";
174
+ if (isDigit) {
175
+ digits += 1;
176
+ letterRun = 0;
177
+ }
178
+ else {
179
+ if (character >= "a" && character <= "z")
180
+ lowercase += 1;
181
+ else
182
+ uppercase += 1;
183
+ letterRun += 1;
184
+ longestLetterRun = Math.max(longestLetterRun, letterRun);
185
+ }
186
+ if (previousWasDigit !== undefined && previousWasDigit !== isDigit)
187
+ transitions += 1;
188
+ previousWasDigit = isDigit;
189
+ unique.add(character);
190
+ }
191
+ return lowercase >= 2
192
+ && uppercase >= 2
193
+ && digits >= 2
194
+ && transitions >= 4
195
+ && longestLetterRun <= 5
196
+ && unique.size >= 12;
197
+ }
198
+ function mergeOverlappingSpans(spans) {
199
+ const sorted = [...spans].sort((left, right) => (left.start - right.start
200
+ || right.end - left.end
201
+ || right.priority - left.priority));
202
+ const merged = [];
203
+ for (const span of sorted) {
204
+ const previous = merged.at(-1);
205
+ if (!previous || span.start >= previous.end) {
206
+ merged.push({ ...span });
207
+ continue;
208
+ }
209
+ previous.end = Math.max(previous.end, span.end);
210
+ }
211
+ return merged;
212
+ }
@@ -1,6 +1,6 @@
1
- import { parseSkillReminderCommand, } from "./memory-hook-command.js";
2
- import { traceContextFromClaudeHookBody, traceContextFromHookBody, } from "./trace-context.js";
3
- import { recordTraceEvent } from "./trace-store.js";
1
+ import { parseSkillReminderCommand, } from "./hook-command.js";
2
+ import { traceContextFromClaudeHookBody, traceContextFromDshSkillReminder, traceContextFromHookBody, traceContextFromOpenCodeHookBody, } from "../trace/context.js";
3
+ import { recordTraceEvent } from "../trace/store.js";
4
4
  export function createMemoryReminderTraceRecorder(options = {}) {
5
5
  return {
6
6
  async recordSkillReminder(body) {
@@ -18,21 +18,21 @@ export function createMemoryReminderTraceRecorder(options = {}) {
18
18
  env: options.env,
19
19
  traceContext,
20
20
  type: "skill_reminder",
21
- source: request.client === "codex" ? "codex-hook" : "claude-hook",
21
+ source: reminderSource(request),
22
22
  operation: "reminder",
23
23
  ok: true,
24
24
  request: {
25
25
  triggers: request.triggers,
26
26
  },
27
27
  response: {
28
- role: "developer",
28
+ role: request.client === "dsh" ? "user" : "developer",
29
29
  content: request.content,
30
30
  },
31
31
  }), options.diagnosticLogger);
32
32
  options.diagnosticLogger?.("memory_hook.skill_reminder", {
33
33
  client: request.client,
34
34
  sessionId: request.sessionId,
35
- turnId: request.client === "codex" ? request.turnId : request.promptId,
35
+ turnId: traceContext?.turnId,
36
36
  triggers: request.triggers,
37
37
  contentChars: request.content.length,
38
38
  });
@@ -43,7 +43,20 @@ export function createMemoryReminderTraceRecorder(options = {}) {
43
43
  function traceContextForReminder(command) {
44
44
  if (command.client === "codex")
45
45
  return traceContextFromHookBody(command);
46
- return traceContextFromClaudeHookBody(command);
46
+ if (command.client === "claude-code")
47
+ return traceContextFromClaudeHookBody(command);
48
+ if (command.client === "dsh")
49
+ return traceContextFromDshSkillReminder(command);
50
+ return traceContextFromOpenCodeHookBody(command);
51
+ }
52
+ function reminderSource(command) {
53
+ if (command.client === "codex")
54
+ return "codex-hook";
55
+ if (command.client === "claude-code")
56
+ return "claude-hook";
57
+ if (command.client === "dsh")
58
+ return "dsh-cordis";
59
+ return "opencode-plugin";
47
60
  }
48
61
  async function recordTraceBestEffort(label, promise, diagnosticLogger) {
49
62
  try {
@@ -1,12 +1,23 @@
1
- import { memoraxConfigFromEnv, } from "./memorax-config.js";
2
- import { repositoryMemoryScopeContainsWorkspace, repositoryMemoryScopeKind, repositoryMemoryScopesMatch, resolveRepositoryMemoryScope, } from "./repository-memory-scope.js";
1
+ import { memoraxConfigFromEnv, } from "../provider/memorax/config.js";
2
+ import { repositoryMemoryScopeCanUpgradeFromDegradedGit, repositoryMemoryScopeContainsWorkspace, repositoryMemoryScopeKind, repositoryMemoryScopesMatch, resolveRepositoryMemoryScope, } from "../repository/scope.js";
3
+ export function resolvedRepoMemoryWorktree(result) {
4
+ if (!result.ok || !result.memory.scope)
5
+ return undefined;
6
+ return repositoryMemoryScopeKind(result.memory.scope) === "git-repository"
7
+ ? result.memory.scope.boundWorkspaceRoot
8
+ : undefined;
9
+ }
3
10
  const sessionScopes = new WeakMap();
4
11
  const scopeResolutionQueues = new WeakMap();
5
- export function createRepositoryMemorySessionRuntime() {
12
+ export function createRepositoryMemorySessionRuntime(options = {}) {
6
13
  const owner = {};
7
14
  return {
8
15
  async resolve(input) {
9
- return await resolveConfiguredRepositoryMemoryForSession({ owner, ...input });
16
+ return await resolveConfiguredRepositoryMemoryForSession({
17
+ owner,
18
+ onScopeUpgrade: options.onScopeUpgrade,
19
+ ...input,
20
+ });
10
21
  },
11
22
  close() {
12
23
  sessionScopes.delete(owner);
@@ -93,6 +104,16 @@ export async function resolveConfiguredRepositoryMemoryForSession(input) {
93
104
  return scopeResult;
94
105
  if (cached?.scope.baseUserId === configResult.config.userId) {
95
106
  if (!repositoryMemoryScopesMatch(cached.scope, scopeResult.scope)) {
107
+ if (repositoryMemoryScopeCanUpgradeFromDegradedGit(cached.scope, scopeResult.scope)) {
108
+ input.onScopeUpgrade?.({
109
+ client: input.client,
110
+ sessionId,
111
+ previousScope: cached.scope,
112
+ currentScope: scopeResult.scope,
113
+ });
114
+ cached.scope = scopeResult.scope;
115
+ return { ok: true, memory: { config: configResult.config, scope: scopeResult.scope } };
116
+ }
96
117
  cached.mismatch = true;
97
118
  return repositoryScopeMismatch();
98
119
  }
@@ -1,13 +1,17 @@
1
- import { createAutomaticMemoryWritebackRuntime } from "./automatic-memory-writeback.js";
2
- import { createCodexMemoryHookRuntime, } from "./codex-memory-hook-runtime.js";
3
- import { createClaudeMemoryHookRuntime, } from "./claude-memory-hook-runtime.js";
4
- import { createMemoryTurnCoordinator } from "./memory-turn-coordinator.js";
5
- import { createRepositoryMemorySessionRuntime, } from "./repository-memory-context.js";
1
+ import { createAutomaticMemoryWritebackRuntime } from "./automatic-writeback.js";
2
+ import { createCodexMemoryHookRuntime, } from "../clients/codex/memory-hook-runtime.js";
3
+ import { createClaudeMemoryHookRuntime, } from "../clients/claude/memory-hook-runtime.js";
4
+ import { createDshMemoryHookRuntime, } from "../clients/dsh/memory-hook-runtime.js";
5
+ import { createOpenCodeMemoryHookRuntime, } from "../clients/opencode/memory-hook-runtime.js";
6
+ import { createMemoryTurnCoordinator } from "./turn-coordinator.js";
7
+ import { createRepositoryMemorySessionRuntime, } from "./repository-session.js";
6
8
  export function createMemoryService(options = {}) {
7
9
  const automaticWriteback = createAutomaticMemoryWritebackRuntime({
8
10
  diagnosticLogger: options.diagnosticLogger,
9
11
  });
10
- const repositoryMemorySession = createRepositoryMemorySessionRuntime();
12
+ const repositoryMemorySession = createRepositoryMemorySessionRuntime({
13
+ onScopeUpgrade: automaticWriteback.discardForScopeUpgrade,
14
+ });
11
15
  const turnCoordinator = createMemoryTurnCoordinator({
12
16
  automaticWriteback: automaticWriteback.enqueue,
13
17
  now: options.now,
@@ -25,6 +29,16 @@ export function createMemoryService(options = {}) {
25
29
  repositoryMemorySession,
26
30
  turnCoordinator,
27
31
  });
32
+ const openCodeHook = createOpenCodeMemoryHookRuntime({
33
+ ...options,
34
+ repositoryMemorySession,
35
+ turnCoordinator,
36
+ });
37
+ const dshHook = createDshMemoryHookRuntime({
38
+ ...options,
39
+ repositoryMemorySession,
40
+ turnCoordinator,
41
+ });
28
42
  let closed = false;
29
43
  return {
30
44
  async recordTurnStart(command) {
@@ -33,6 +47,10 @@ export function createMemoryService(options = {}) {
33
47
  return await codexHook.recordTurnStart(command);
34
48
  case "claude-code":
35
49
  return await claudeHook.recordTurnStart(command);
50
+ case "opencode":
51
+ return await openCodeHook.recordTurnStart(command);
52
+ case "dsh":
53
+ return await dshHook.recordTurnStart(command);
36
54
  }
37
55
  return unsupportedMemoryHookCommand(command);
38
56
  },
@@ -42,6 +60,10 @@ export function createMemoryService(options = {}) {
42
60
  return await codexHook.writeback(command);
43
61
  case "claude-code":
44
62
  return await claudeHook.writeback(command);
63
+ case "opencode":
64
+ return await openCodeHook.writeback(command);
65
+ case "dsh":
66
+ return await dshHook.writeback(command);
45
67
  }
46
68
  return unsupportedMemoryHookCommand(command);
47
69
  },
@@ -54,6 +76,8 @@ export function createMemoryService(options = {}) {
54
76
  closed = true;
55
77
  codexHook.close();
56
78
  claudeHook.close();
79
+ openCodeHook.close();
80
+ dshHook.close();
57
81
  turnCoordinator.close();
58
82
  repositoryMemorySession.close();
59
83
  automaticWriteback.close();
@@ -1,4 +1,4 @@
1
- import { repositoryMemoryScopesMatch, } from "./repository-memory-scope.js";
1
+ import { repositoryMemoryScopeCanUpgradeFromDegradedGit, repositoryMemoryScopesMatch, } from "../repository/scope.js";
2
2
  const DEFAULT_TTL_MS = 5 * 60 * 1000;
3
3
  const DEFAULT_MAX_ENTRIES = 256;
4
4
  const DEFAULT_CLEANUP_INTERVAL_MS = 60 * 1000;
@@ -19,6 +19,7 @@ export function createMemoryTurnCoordinator(options) {
19
19
  cwd: input.cwd,
20
20
  workspaceKind: input.workspaceKind,
21
21
  transcriptPath: input.transcriptPath,
22
+ eventStartSeq: input.eventStartSeq,
22
23
  createdAt: input.createdAt,
23
24
  sessionTurnIndex: input.sessionTurnIndex,
24
25
  traceContext: input.traceContext,
@@ -72,10 +73,13 @@ export function createMemoryTurnCoordinator(options) {
72
73
  if (!currentScope) {
73
74
  return reject(input.metadata ? "workspace_scope_mismatch" : "workspace_scope_unavailable");
74
75
  }
75
- const repositoryScope = input.metadata?.repositoryScope ?? currentScope;
76
+ let repositoryScope = input.metadata?.repositoryScope ?? currentScope;
76
77
  if (input.metadata?.repositoryScope
77
78
  && !repositoryMemoryScopesMatch(input.metadata.repositoryScope, currentScope)) {
78
- return reject("workspace_scope_mismatch");
79
+ if (!repositoryMemoryScopeCanUpgradeFromDegradedGit(input.metadata.repositoryScope, currentScope)) {
80
+ return reject("workspace_scope_mismatch");
81
+ }
82
+ repositoryScope = currentScope;
79
83
  }
80
84
  const acceptance = options.automaticWriteback({
81
85
  ...input.writeback,
@@ -1,5 +1,6 @@
1
- import { writebackMessagesContentChars } from "./memory-writeback-chunk.js";
2
- import { memoryWritebackBufferConfig } from "./memorax-config.js";
1
+ import { writebackMessagesContentChars } from "./writeback-chunk.js";
2
+ import { memoryWritebackBufferConfig } from "../provider/memorax/config.js";
3
+ import { repositoryMemoryScopeCanUpgradeFromDegradedGit, } from "../repository/scope.js";
3
4
  const SYSTEM_CLOCK = {
4
5
  now: () => Date.now(),
5
6
  setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
@@ -11,6 +12,9 @@ export function createMemoryWritebackBufferRuntime() {
11
12
  enqueue(decision, options, deps) {
12
13
  enqueueMemoryWritebackBufferForRuntime(writebackBuffers, decision, options, deps);
13
14
  },
15
+ discardForScopeUpgrade(upgrade) {
16
+ return discardDegradedGitBuffersForUpgrade(writebackBuffers, upgrade);
17
+ },
14
18
  flushAll(flushReason) {
15
19
  let flushed = 0;
16
20
  for (const [bufferKey, buffer] of [...writebackBuffers.entries()]) {
@@ -34,6 +38,11 @@ function enqueueMemoryWritebackBufferForRuntime(writebackBuffers, decision, opti
34
38
  const config = memoryWritebackBufferConfig(env);
35
39
  if (!options.repositoryScope)
36
40
  return;
41
+ discardDegradedGitBuffersForUpgrade(writebackBuffers, {
42
+ client: decision.client,
43
+ sessionKey: decision.sessionKey,
44
+ currentScope: options.repositoryScope,
45
+ });
37
46
  const bufferKey = memoryWritebackBufferKey(decision.client, decision.sessionKey, options.repositoryScope);
38
47
  let buffer = writebackBuffers.get(bufferKey);
39
48
  if (buffer?.turnKeys.has(decision.idempotencyKey)) {
@@ -85,6 +94,26 @@ function enqueueMemoryWritebackBufferForRuntime(writebackBuffers, decision, opti
85
94
  resetMemoryWritebackIdleTimer(writebackBuffers, buffer, config.maxAgeMs, deps);
86
95
  }
87
96
  }
97
+ function discardDegradedGitBuffersForUpgrade(writebackBuffers, upgrade) {
98
+ let discarded = 0;
99
+ for (const [bufferKey, buffer] of writebackBuffers.entries()) {
100
+ if (buffer.client !== upgrade.client
101
+ || buffer.sessionKey !== upgrade.sessionKey
102
+ || !repositoryMemoryScopeCanUpgradeFromDegradedGit(buffer.repositoryScope, upgrade.currentScope))
103
+ continue;
104
+ writebackBuffers.delete(bufferKey);
105
+ if (buffer.timer)
106
+ buffer.clock.clearTimeout(buffer.timer);
107
+ buffer.deps.debug("memory.automatic_writeback", {
108
+ scheduled: false,
109
+ skipReason: "buffer_scope_upgraded",
110
+ sessionKey: upgrade.sessionKey,
111
+ discardedTurnCount: buffer.turns.length,
112
+ });
113
+ discarded += 1;
114
+ }
115
+ return discarded;
116
+ }
88
117
  function createMemoryWritebackBuffer(bufferKey, client, sessionKey, env, options, repositoryScope, clock, deps) {
89
118
  const now = clock.now();
90
119
  const buffer = {
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { memoryWritebackChunkConfig, memoryWritebackChunkEnabled, } from "./memorax-config.js";
2
+ import { memoryWritebackChunkConfig, memoryWritebackChunkEnabled, } from "../provider/memorax/config.js";
3
3
  const CODE_CHUNK_GROUP_ID_PREFIX = "memory-writeback-chunk:v1:";
4
4
  export function memoryWritebackAddParts(decision, env) {
5
5
  if (!memoryWritebackChunkEnabled(env)) {
@@ -1,10 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
- import { backendDebug } from "./debug-log.js";
3
- import { callMemoAddStatus, memoraxConfigFromEnv } from "./memorax-adapter.js";
4
- import { MEMORAX_PROVIDER_ID, memoraxWritebackEnabled } from "./memorax-config.js";
5
- import { completeMemoryWritebackTask, createMemoryWritebackTaskProjection, } from "./memory-writeback-task-projection.js";
6
- import { clientTraceConfigFromEnv } from "./trace-config.js";
7
- import { recordTraceEvent } from "./trace-store.js";
2
+ import { backendDebug } from "../shared/debug-log.js";
3
+ import { callMemoAddStatus, memoraxConfigFromEnv } from "../provider/memorax/adapter.js";
4
+ import { MEMORAX_PROVIDER_ID, memoraxWritebackEnabled } from "../provider/memorax/config.js";
5
+ import { completeMemoryWritebackTask, createMemoryWritebackTaskProjection, } from "./writeback-task-projection.js";
6
+ import { clientTraceConfigFromEnv } from "../trace/config.js";
7
+ import { recordTraceEvent } from "../trace/store.js";
8
8
  const DEFAULT_INTERVAL_MS = 60_000;
9
9
  const DEFAULT_MAX_TASKS_PER_RUN = 20;
10
10
  const DEFAULT_CONCURRENCY = 4;
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { readIncrementalJsonlProjection, } from "./incremental-jsonl-projection.js";
3
- import { memoryProjectFromUnknown, resolveMemoryProject, } from "./memory-project.js";
4
- import { clientTracePaths } from "./trace-config.js";
5
- import { isTraceClient, } from "./trace-context.js";
2
+ import { readIncrementalJsonlProjection, } from "../shared/incremental-jsonl-projection.js";
3
+ import { memoryProjectFromUnknown, resolveMemoryProject, } from "./project.js";
4
+ import { clientTracePaths } from "../trace/config.js";
5
+ import { isTraceClient, } from "../trace/context.js";
6
6
  const LIVE_TASK_CAPACITY = 1_024;
7
7
  const PENDING_WRITEBACK_STATUSES = new Set([
8
8
  "accepted",
@@ -1,14 +1,14 @@
1
- import { MEMORAX_DEFAULT_MEMORY_OUTPUT_LANGUAGE, MEMORAX_PROVIDER_ID, clampInteger, memoraxAddOptionsFromContext, memoraxConfigFromEnv, parseScore, } from "./memorax-config.js";
2
- import { getMemoraxJson, memoraxInvocationFailure, postMemoraxJson, } from "./memorax-http.js";
3
- import { repositoryMemoryScopeKind, } from "./repository-memory-scope.js";
4
- import { isRecord } from "./utils.js";
1
+ import { MEMORAX_DEFAULT_MEMORY_OUTPUT_LANGUAGE, MEMORAX_PROVIDER_ID, clampInteger, memoraxAddOptionsFromContext, memoraxConfigFromEnv, parseScore, } from "./config.js";
2
+ import { getMemoraxJson, memoraxInvocationFailure, postMemoraxJson, } from "./http.js";
3
+ import { repositoryMemoryScopeKind, } from "../../repository/scope.js";
4
+ import { isRecord } from "../../shared/record.js";
5
5
  const SLOT_RESULT_SCHEMA_VERSION = "slot-invocation-result.preview.v1";
6
6
  const FORWARDED_WRITEBACK_METADATA_KEYS = [
7
7
  "memorax_code_memory_reason",
8
8
  "memory_type",
9
9
  "source_detail",
10
10
  ];
11
- export { memoraxConfigFromEnv } from "./memorax-config.js";
11
+ export { memoraxConfigFromEnv } from "./config.js";
12
12
  export async function invokeMemoraxMemoryProvider(run, request, options = {}) {
13
13
  const configResult = options.config ? { ok: true, config: options.config } : memoraxConfigFromEnv(options.env);
14
14
  if (!configResult.ok)
@@ -1,7 +1,7 @@
1
- import { MEMORAX_DEFAULT_BASE_URL, MEMORAX_DEFAULT_MEMORY_OUTPUT_LANGUAGE, normalizeMemoraxBaseUrl, normalizeMemoraxMemoryOutputLanguage, } from "../../memorax-code-adapter-common/src/memorax-defaults.mjs";
2
- import { defaultMemoraxCodeHome, loadMemoraxCodeConfig, } from "./memorax-code-config.js";
3
- export { defaultMemoraxCodeHome, memoraxCodeConfigPath, loadMemoraxCodeConfig } from "./memorax-code-config.js";
4
- export { seedMissingMemoraxCodeConfig } from "./memorax-code-config.js";
1
+ import { MEMORAX_DEFAULT_BASE_URL, MEMORAX_DEFAULT_MEMORY_OUTPUT_LANGUAGE, normalizeMemoraxBaseUrl, normalizeMemoraxMemoryOutputLanguage, } from "../../../../memorax-code-adapter-common/src/memorax-defaults.mjs";
2
+ import { defaultMemoraxCodeHome, loadMemoraxCodeConfig, } from "../../config/memorax-code.js";
3
+ export { defaultMemoraxCodeHome, memoraxCodeConfigPath, loadMemoraxCodeConfig } from "../../config/memorax-code.js";
4
+ export { seedMissingMemoraxCodeConfig } from "../../config/memorax-code.js";
5
5
  export { MEMORAX_DEFAULT_BASE_URL, MEMORAX_DEFAULT_MEMORY_OUTPUT_LANGUAGE };
6
6
  export const MEMORAX_PROVIDER_ID = "memory.memorax";
7
7
  export const MEMORAX_DEFAULT_MEMORY_TYPE_ORDER = ["core", "episodic", "semantic", "procedural", "unclassified"];
@@ -1,4 +1,4 @@
1
- import { isRecord } from "./utils.js";
1
+ import { isRecord } from "../../shared/record.js";
2
2
  export async function postMemoraxJson(config, path, payload, fetchImpl) {
3
3
  const controller = new AbortController();
4
4
  const timeout = setTimeout(() => controller.abort(), config.timeoutMs);
@@ -3,7 +3,7 @@ import { constants } from "node:fs";
3
3
  import { access } from "node:fs/promises";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
5
5
  import { promisify } from "node:util";
6
- import { memoryProjectRoot } from "./memory-project.js";
6
+ import { memoryProjectRoot } from "../memory/project.js";
7
7
  const execFileAsync = promisify(execFile);
8
8
  const STABLE_READINESS_CACHE_TTL_MS = 30_000;
9
9
  const PREPARING_READINESS_CACHE_TTL_MS = 5_000;
@@ -134,7 +134,7 @@ function releaseBundleValidationSlot() {
134
134
  activeBundleValidations -= 1;
135
135
  }
136
136
  async function readActiveRepoMemoryJob(input) {
137
- const moduleUrl = new URL("../../memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs", import.meta.url);
137
+ const moduleUrl = new URL("../../../memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs", import.meta.url);
138
138
  const markerModule = await import(moduleUrl.href);
139
139
  if (typeof markerModule.readActiveRepoMemoryJobMarker !== "function") {
140
140
  throw new Error("repo memory job marker reader is unavailable");
@@ -149,7 +149,7 @@ async function validateRepoMemoryBundle(repoRoot) {
149
149
  catch {
150
150
  return "missing";
151
151
  }
152
- const validatorUrl = new URL("../../memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py", import.meta.url);
152
+ const validatorUrl = new URL("../../../memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py", import.meta.url);
153
153
  try {
154
154
  await access(validatorUrl, constants.R_OK);
155
155
  }