@memorax/memorax-code 0.1.0

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 (282) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/bin/memorax-cli.mjs +28 -0
  4. package/bin/memorax-code-backend.mjs +4 -0
  5. package/bin/memorax-code-claude.mjs +4 -0
  6. package/bin/memorax-code-codex.mjs +4 -0
  7. package/bin/memorax-code-npm-preinstall.mjs +55 -0
  8. package/bin/memorax-code-plugin-postinstall.mjs +1236 -0
  9. package/bin/memorax-code.mjs +204 -0
  10. package/docs/configuration.md +232 -0
  11. package/docs/troubleshooting.md +179 -0
  12. package/lib/client-hook-runtime.mjs +32 -0
  13. package/lib/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
  14. package/lib/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
  15. package/lib/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
  16. package/lib/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
  17. package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
  18. package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
  19. package/lib/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
  20. package/lib/memorax-code-adapter-common/src/config-utils.mjs +391 -0
  21. package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
  22. package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
  23. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
  24. package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
  25. package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
  26. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
  27. package/lib/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
  28. package/lib/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
  29. package/lib/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
  30. package/lib/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
  31. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
  32. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
  33. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
  34. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
  35. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
  36. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
  37. package/lib/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
  38. package/lib/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
  39. package/lib/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
  40. package/lib/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
  41. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
  42. package/lib/memorax-code-backend/dist/active-client-selection.js +35 -0
  43. package/lib/memorax-code-backend/dist/adapter-lifecycle-participant.js +1 -0
  44. package/lib/memorax-code-backend/dist/automatic-memory-retrieval.js +113 -0
  45. package/lib/memorax-code-backend/dist/automatic-memory-writeback.js +297 -0
  46. package/lib/memorax-code-backend/dist/backend-env.js +13 -0
  47. package/lib/memorax-code-backend/dist/backend-lifecycle-lock.js +42 -0
  48. package/lib/memorax-code-backend/dist/backend-process.js +147 -0
  49. package/lib/memorax-code-backend/dist/backend-service-cleanup.js +18 -0
  50. package/lib/memorax-code-backend/dist/backend-service-record.js +206 -0
  51. package/lib/memorax-code-backend/dist/backend-service-result.js +37 -0
  52. package/lib/memorax-code-backend/dist/backend-service-token.js +11 -0
  53. package/lib/memorax-code-backend/dist/backend-shutdown-request.js +133 -0
  54. package/lib/memorax-code-backend/dist/backend-state.js +58 -0
  55. package/lib/memorax-code-backend/dist/backend-status.js +53 -0
  56. package/lib/memorax-code-backend/dist/backend-token-record.js +79 -0
  57. package/lib/memorax-code-backend/dist/claude-adapter-lifecycle.js +134 -0
  58. package/lib/memorax-code-backend/dist/claude-local-transcript.js +648 -0
  59. package/lib/memorax-code-backend/dist/claude-memory-hook-runtime.js +472 -0
  60. package/lib/memorax-code-backend/dist/claude-transcript-turn.js +876 -0
  61. package/lib/memorax-code-backend/dist/client-plugin-removal.js +67 -0
  62. package/lib/memorax-code-backend/dist/client-selection.js +36 -0
  63. package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +131 -0
  64. package/lib/memorax-code-backend/dist/codex-effective-prompt.js +54 -0
  65. package/lib/memorax-code-backend/dist/codex-memory-hook-runtime.js +541 -0
  66. package/lib/memorax-code-backend/dist/codex-plugin-hooks.js +421 -0
  67. package/lib/memorax-code-backend/dist/codex-plugin-install.js +523 -0
  68. package/lib/memorax-code-backend/dist/codex-rollout-turn.js +402 -0
  69. package/lib/memorax-code-backend/dist/codex-session-turn-index.js +88 -0
  70. package/lib/memorax-code-backend/dist/codex-workspace-links.js +55 -0
  71. package/lib/memorax-code-backend/dist/debug-log.js +21 -0
  72. package/lib/memorax-code-backend/dist/entrypoint.js +14 -0
  73. package/lib/memorax-code-backend/dist/incremental-jsonl-projection.js +271 -0
  74. package/lib/memorax-code-backend/dist/install-watchdog.js +71 -0
  75. package/lib/memorax-code-backend/dist/jsonl-append.js +75 -0
  76. package/lib/memorax-code-backend/dist/memorax-adapter.js +451 -0
  77. package/lib/memorax-code-backend/dist/memorax-cli.js +14 -0
  78. package/lib/memorax-code-backend/dist/memorax-code-config.js +279 -0
  79. package/lib/memorax-code-backend/dist/memorax-code-lifecycle.js +523 -0
  80. package/lib/memorax-code-backend/dist/memorax-code.js +3 -0
  81. package/lib/memorax-code-backend/dist/memorax-config.js +283 -0
  82. package/lib/memorax-code-backend/dist/memorax-http.js +142 -0
  83. package/lib/memorax-code-backend/dist/memory-cli.js +345 -0
  84. package/lib/memorax-code-backend/dist/memory-hook-command.js +200 -0
  85. package/lib/memorax-code-backend/dist/memory-observability.js +1 -0
  86. package/lib/memorax-code-backend/dist/memory-project.js +89 -0
  87. package/lib/memorax-code-backend/dist/memory-reminder-trace-recorder.js +58 -0
  88. package/lib/memorax-code-backend/dist/memory-service.js +66 -0
  89. package/lib/memorax-code-backend/dist/memory-turn-coordinator.js +139 -0
  90. package/lib/memorax-code-backend/dist/memory-viewer-activity.js +113 -0
  91. package/lib/memorax-code-backend/dist/memory-viewer-data-projection-cache.js +69 -0
  92. package/lib/memorax-code-backend/dist/memory-viewer-event-identity.js +3 -0
  93. package/lib/memorax-code-backend/dist/memory-viewer-history-projection.js +79 -0
  94. package/lib/memorax-code-backend/dist/memory-viewer-logo.js +1 -0
  95. package/lib/memorax-code-backend/dist/memory-viewer-observability.js +8 -0
  96. package/lib/memorax-code-backend/dist/memory-viewer-redaction.js +52 -0
  97. package/lib/memorax-code-backend/dist/memory-viewer-session-title.js +93 -0
  98. package/lib/memorax-code-backend/dist/memory-viewer-store.js +964 -0
  99. package/lib/memorax-code-backend/dist/memory-viewer-turn-reference.js +12 -0
  100. package/lib/memorax-code-backend/dist/memory-viewer-user-html.js +115 -0
  101. package/lib/memorax-code-backend/dist/memory-viewer-user-projection.js +168 -0
  102. package/lib/memorax-code-backend/dist/memory-viewer-writeback-status.js +97 -0
  103. package/lib/memorax-code-backend/dist/memory-writeback-buffer.js +217 -0
  104. package/lib/memorax-code-backend/dist/memory-writeback-chunk.js +120 -0
  105. package/lib/memorax-code-backend/dist/memory-writeback-reconciler.js +244 -0
  106. package/lib/memorax-code-backend/dist/memory-writeback-task-projection.js +377 -0
  107. package/lib/memorax-code-backend/dist/proxy-env.js +54 -0
  108. package/lib/memorax-code-backend/dist/repo-memory-readiness.js +188 -0
  109. package/lib/memorax-code-backend/dist/repository-memory-context.js +134 -0
  110. package/lib/memorax-code-backend/dist/repository-memory-scope.js +490 -0
  111. package/lib/memorax-code-backend/dist/server-cli.js +787 -0
  112. package/lib/memorax-code-backend/dist/server-health.js +16 -0
  113. package/lib/memorax-code-backend/dist/server-http.js +110 -0
  114. package/lib/memorax-code-backend/dist/server-json.js +4 -0
  115. package/lib/memorax-code-backend/dist/server-memory-hook.js +32 -0
  116. package/lib/memorax-code-backend/dist/server-memory-viewer.js +135 -0
  117. package/lib/memorax-code-backend/dist/server-observability.js +102 -0
  118. package/lib/memorax-code-backend/dist/server.js +220 -0
  119. package/lib/memorax-code-backend/dist/service-entrypoint.js +10 -0
  120. package/lib/memorax-code-backend/dist/service.js +567 -0
  121. package/lib/memorax-code-backend/dist/trace-config.js +112 -0
  122. package/lib/memorax-code-backend/dist/trace-context.js +111 -0
  123. package/lib/memorax-code-backend/dist/trace-store.js +571 -0
  124. package/lib/memorax-code-backend/dist/utils.js +3 -0
  125. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +148 -0
  126. package/lib/memorax-code-backend/package.json +26 -0
  127. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
  128. package/lib/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
  129. package/lib/memorax-code-claude-adapter/hooks/hooks.json +66 -0
  130. package/lib/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
  131. package/lib/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
  132. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
  133. package/lib/memorax-code-claude-adapter/package.json +13 -0
  134. package/lib/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
  135. package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
  136. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
  137. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
  138. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
  139. package/lib/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
  140. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
  141. package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  142. package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  143. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
  144. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  145. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  146. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
  147. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
  148. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
  149. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
  150. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  151. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
  152. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  153. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  154. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  155. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  156. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  157. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  158. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  159. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  160. package/lib/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
  161. package/lib/memorax-code-claude-adapter/src/cli.mjs +363 -0
  162. package/lib/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
  163. package/lib/memorax-code-claude-adapter/src/config.mjs +544 -0
  164. package/lib/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
  165. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
  166. package/lib/memorax-code-claude-marketplace/.claude-plugin/marketplace.json +15 -0
  167. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
  168. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
  169. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hooks.json +66 -0
  170. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
  171. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
  172. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
  173. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
  174. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
  175. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
  176. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
  177. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
  178. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
  179. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
  180. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +391 -0
  181. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
  182. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
  183. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
  184. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
  185. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
  186. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
  187. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
  188. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
  189. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
  190. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
  191. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
  192. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
  193. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
  194. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
  195. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
  196. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
  197. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
  198. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
  199. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
  200. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
  201. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
  202. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +13 -0
  203. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
  204. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
  205. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
  206. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
  207. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
  208. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
  209. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
  210. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  211. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  212. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
  213. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  214. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  215. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
  216. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
  217. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
  218. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
  219. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  220. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
  221. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  222. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  223. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  224. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  225. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  226. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  227. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  228. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  229. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
  230. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/cli.mjs +363 -0
  231. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
  232. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config.mjs +544 -0
  233. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
  234. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
  235. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +33 -0
  236. package/lib/memorax-code-codex-adapter/assets/composer-icon.png +0 -0
  237. package/lib/memorax-code-codex-adapter/assets/logo.png +0 -0
  238. package/lib/memorax-code-codex-adapter/hooks/hook-launcher.mjs +26 -0
  239. package/lib/memorax-code-codex-adapter/hooks/hooks.json +61 -0
  240. package/lib/memorax-code-codex-adapter/hooks/repo-memory-job.mjs +38 -0
  241. package/lib/memorax-code-codex-adapter/hooks/repo-memory-update-policy.mjs +10 -0
  242. package/lib/memorax-code-codex-adapter/hooks/runtime-hook.mjs +4 -0
  243. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +5 -0
  244. package/lib/memorax-code-codex-adapter/package.json +13 -0
  245. package/lib/memorax-code-codex-adapter/runtime-hooks/capture-cwd.mjs +18 -0
  246. package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +82 -0
  247. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +125 -0
  248. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-writeback.mjs +52 -0
  249. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +83 -0
  250. package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  251. package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  252. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +9 -0
  253. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  254. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  255. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +46 -0
  256. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +100 -0
  257. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +270 -0
  258. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +96 -0
  259. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  260. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +116 -0
  261. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  262. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  263. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  264. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  265. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  266. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  267. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  268. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  269. package/lib/memorax-code-codex-adapter/src/adapter-paths.mjs +29 -0
  270. package/lib/memorax-code-codex-adapter/src/cli.mjs +368 -0
  271. package/lib/memorax-code-codex-adapter/src/config-utils.mjs +1 -0
  272. package/lib/memorax-code-codex-adapter/src/config.mjs +226 -0
  273. package/lib/memorax-code-codex-adapter/src/session-registry.mjs +331 -0
  274. package/lib/memorax-code-codex-adapter/src/workspace-kind.mjs +68 -0
  275. package/lib/node-version.mjs +11 -0
  276. package/lib/npm-invocation.mjs +31 -0
  277. package/lib/resolve-claude-command.mjs +47 -0
  278. package/lib/resolve-codex-command.mjs +94 -0
  279. package/lib/run-entrypoint.mjs +83 -0
  280. package/lib/vscode-extension-command.mjs +119 -0
  281. package/lib/windows-cli-invocation.mjs +100 -0
  282. package/package.json +45 -0
@@ -0,0 +1,16 @@
1
+ import { json } from "./server-json.js";
2
+ export function handleHealthRequest(state, res) {
3
+ return json(res, 200, {
4
+ ok: true,
5
+ service: "memorax-code-backend",
6
+ instanceId: process.env.MEMORAX_CODE_BACKEND_INSTANCE_ID,
7
+ authRequired: Boolean(state.authToken),
8
+ security: {
9
+ mode: state.security.mode,
10
+ allowExternalAccess: state.security.allowExternalAccess,
11
+ },
12
+ state: {
13
+ sessionHome: state.sessionHome,
14
+ },
15
+ });
16
+ }
@@ -0,0 +1,110 @@
1
+ import { backendEnv } from "./backend-env.js";
2
+ const DEFAULT_MAX_JSON_BODY_BYTES = 16 * 1024 * 1024;
3
+ const MEMORY_VIEWER_SESSION_COOKIE = "memorax_code_memory_viewer_session";
4
+ export class HttpRequestError extends Error {
5
+ statusCode;
6
+ constructor(statusCode, message) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.name = "HttpRequestError";
10
+ }
11
+ }
12
+ function maxJsonBodyBytes() {
13
+ const configured = Number(backendEnv("MAX_JSON_BODY_BYTES"));
14
+ if (Number.isFinite(configured) && configured > 0)
15
+ return Math.floor(configured);
16
+ return DEFAULT_MAX_JSON_BODY_BYTES;
17
+ }
18
+ export async function readJson(req, maxBytes = maxJsonBodyBytes()) {
19
+ const rawContentEncoding = Array.isArray(req.headers["content-encoding"])
20
+ ? req.headers["content-encoding"].join(",")
21
+ : req.headers["content-encoding"];
22
+ const unsupportedEncoding = (rawContentEncoding ?? "identity")
23
+ .split(",")
24
+ .map((encoding) => encoding.trim().toLowerCase())
25
+ .find((encoding) => encoding && encoding !== "identity");
26
+ if (unsupportedEncoding) {
27
+ throw new HttpRequestError(415, `unsupported content-encoding: ${unsupportedEncoding}`);
28
+ }
29
+ const chunks = [];
30
+ let size = 0;
31
+ for await (const chunk of req) {
32
+ const buffer = Buffer.from(chunk);
33
+ size += buffer.byteLength;
34
+ if (size > maxBytes) {
35
+ throw new HttpRequestError(413, `request body exceeds ${maxBytes} bytes`);
36
+ }
37
+ chunks.push(buffer);
38
+ }
39
+ const text = Buffer.concat(chunks).toString("utf8");
40
+ try {
41
+ return text ? JSON.parse(text) : {};
42
+ }
43
+ catch (error) {
44
+ if (error instanceof SyntaxError) {
45
+ throw new HttpRequestError(400, "request body must be valid JSON");
46
+ }
47
+ throw error;
48
+ }
49
+ }
50
+ export function authorized(state, req, url) {
51
+ if (!state.authToken)
52
+ return true;
53
+ const authorization = req.headers.authorization;
54
+ const bearer = authorization?.startsWith("Bearer ") ? authorization.slice("Bearer ".length) : undefined;
55
+ const headerToken = req.headers["x-memorax-code-backend-token"];
56
+ const token = bearer
57
+ ?? (typeof headerToken === "string" ? headerToken : undefined)
58
+ ?? url.searchParams.get("token")
59
+ ?? undefined;
60
+ if (token === state.authToken)
61
+ return true;
62
+ if (url.pathname === "/memory-viewer"
63
+ || url.pathname.startsWith("/memory-viewer/")) {
64
+ const viewerCookie = cookieValue(req.headers.cookie, MEMORY_VIEWER_SESSION_COOKIE);
65
+ if (viewerCookie === state.authToken)
66
+ return true;
67
+ }
68
+ return false;
69
+ }
70
+ export function memoryViewerSessionCookieHeader(state, req, url) {
71
+ if (!state.authToken
72
+ || req.method !== "GET"
73
+ || url.pathname !== "/memory-viewer")
74
+ return undefined;
75
+ const supplied = url.searchParams.get("token");
76
+ const authorization = req.headers.authorization;
77
+ const bearer = authorization?.startsWith("Bearer ") ? authorization.slice("Bearer ".length) : undefined;
78
+ if (supplied !== state.authToken && bearer !== state.authToken)
79
+ return undefined;
80
+ const secure = Boolean(req.socket?.encrypted);
81
+ return `${MEMORY_VIEWER_SESSION_COOKIE}=${encodeURIComponent(state.authToken)}; HttpOnly; SameSite=Strict; Path=/memory-viewer${secure ? "; Secure" : ""}`;
82
+ }
83
+ function cookieValue(header, name) {
84
+ if (!header)
85
+ return undefined;
86
+ for (const part of header.split(";")) {
87
+ const [rawName, ...rawValue] = part.trim().split("=");
88
+ if (rawName !== name)
89
+ continue;
90
+ try {
91
+ return decodeURIComponent(rawValue.join("="));
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ export function statusCodeFromError(error) {
100
+ if (error instanceof HttpRequestError)
101
+ return error.statusCode;
102
+ return error instanceof Error && "statusCode" in error && typeof error.statusCode === "number"
103
+ ? error.statusCode
104
+ : 500;
105
+ }
106
+ export function publicErrorMessage(error) {
107
+ return error instanceof HttpRequestError
108
+ ? error.message
109
+ : "internal server error";
110
+ }
@@ -0,0 +1,4 @@
1
+ export function json(res, status, body) {
2
+ res.writeHead(status, { "content-type": "application/json" });
3
+ res.end(JSON.stringify(body));
4
+ }
@@ -0,0 +1,32 @@
1
+ import { parseTurnStartCommand, parseWritebackCommand, } from "./memory-hook-command.js";
2
+ import { readJson } from "./server-http.js";
3
+ import { json } from "./server-json.js";
4
+ export async function handleMemoryHookRequest(dependencies, url, req, res) {
5
+ if (req.method !== "POST")
6
+ return false;
7
+ if (url.pathname !== "/memory/turn-start"
8
+ && url.pathname !== "/memory/skill-reminder"
9
+ && url.pathname !== "/memory/writeback")
10
+ return false;
11
+ const body = await readJson(req);
12
+ if (url.pathname === "/memory/skill-reminder") {
13
+ json(res, 200, await dependencies.memoryReminderTraceRecorder.recordSkillReminder(body));
14
+ return true;
15
+ }
16
+ if (url.pathname === "/memory/turn-start") {
17
+ const parsed = parseTurnStartCommand(body);
18
+ if (!parsed.ok) {
19
+ json(res, 400, { ok: false, error: parsed.error });
20
+ return true;
21
+ }
22
+ json(res, 200, await dependencies.memoryService.recordTurnStart(parsed.command));
23
+ return true;
24
+ }
25
+ const parsed = parseWritebackCommand(body);
26
+ if (!parsed.ok) {
27
+ json(res, 400, { ok: false, error: parsed.error });
28
+ return true;
29
+ }
30
+ json(res, 200, await dependencies.memoryService.writebackTurn(parsed.command));
31
+ return true;
32
+ }
@@ -0,0 +1,135 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isMemoryProjectId, UNCLASSIFIED_PROJECT_ID } from "./memory-project.js";
3
+ import { MEMORAX_LOGO_DATA_URL } from "./memory-viewer-logo.js";
4
+ import { memoryViewerUserHtml } from "./memory-viewer-user-html.js";
5
+ import { projectMemoryViewerUserData } from "./memory-viewer-user-projection.js";
6
+ import { listMemoryViewerDataWithHistory, } from "./memory-viewer-store.js";
7
+ import { repoMemoryReadinessForProject, } from "./repo-memory-readiness.js";
8
+ import { json } from "./server-json.js";
9
+ import { memoraxCodeHomeForTrace } from "./trace-config.js";
10
+ const MEMORY_VIEWER_SESSION_ACTIVITY_WINDOW_MS = 72 * 60 * 60 * 1_000;
11
+ const MEMORY_VIEWER_ACTIVITY_CUTOFF_GRANULARITY_MS = 60_000;
12
+ const MEMORY_VIEWER_LOGO = Buffer.from(MEMORAX_LOGO_DATA_URL.slice(MEMORAX_LOGO_DATA_URL.indexOf(",") + 1), "base64");
13
+ export async function handleMemoryViewerRequest(url, req, res, options = {}) {
14
+ if (req.method === "GET" && url.pathname === "/memory-viewer") {
15
+ if (!memoryViewerUserClient(url)) {
16
+ json(res, 400, { ok: false, error: "client must be codex or claude-code" });
17
+ return true;
18
+ }
19
+ res.writeHead(200, {
20
+ "content-type": "text/html; charset=utf-8",
21
+ "cache-control": "no-store",
22
+ "content-security-policy": "default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; base-uri 'none'; frame-ancestors 'none'",
23
+ "referrer-policy": "no-referrer",
24
+ "x-content-type-options": "nosniff",
25
+ ...(options.sessionCookie ? { "set-cookie": options.sessionCookie } : {}),
26
+ });
27
+ res.end(memoryViewerUserHtml());
28
+ return true;
29
+ }
30
+ if (req.method === "GET" && url.pathname === "/memory-viewer/logo") {
31
+ res.writeHead(200, {
32
+ "content-type": "image/png",
33
+ "cache-control": "private, max-age=86400",
34
+ "x-content-type-options": "nosniff",
35
+ });
36
+ res.end(MEMORY_VIEWER_LOGO);
37
+ return true;
38
+ }
39
+ if (req.method !== "GET" || url.pathname !== "/memory-viewer/api/summary") {
40
+ return false;
41
+ }
42
+ const memoraxCodeHome = viewerMemoraxCodeHome(options);
43
+ const selectedClient = memoryViewerUserClient(url);
44
+ if (!selectedClient) {
45
+ json(res, 400, { ok: false, error: "client must be codex or claude-code" });
46
+ return true;
47
+ }
48
+ const requestedProject = projectFilter(url);
49
+ const activeSessionSince = memoryViewerActivityCutoff(options.now?.() ?? Date.now());
50
+ const viewerData = await listMemoryViewerDataWithHistory(memoraxCodeHome, {
51
+ client: selectedClient.traceClient,
52
+ includePendingWritebacks: true,
53
+ activeSessionSince,
54
+ includeUserProjection: true,
55
+ ...(requestedProject.projectId ? { projectId: requestedProject.projectId } : {}),
56
+ ...(requestedProject.reject ? { rejectProjectFilter: true } : {}),
57
+ }, { claudeProjectsRoot: options.claudeProjectsRoot });
58
+ const projection = viewerData.userProjection
59
+ ?? projectMemoryViewerUserData(viewerData.events);
60
+ const readiness = options.repoMemoryReadiness ?? repoMemoryReadinessForProject;
61
+ const projects = await Promise.all(activeMemoryViewerProjects(viewerData.activityProjects, viewerData.activityProjectSessions, activeSessionSince).map(async (project) => ({
62
+ projectId: project.projectId,
63
+ projectLabel: project.projectLabel,
64
+ repoMemory: await readiness(project.projectId, memoraxCodeHome),
65
+ })));
66
+ conditionalViewerJson(req, res, {
67
+ ok: true,
68
+ selectedClient: selectedClient.publicClient,
69
+ availableClients: ["codex", "claude-code"],
70
+ summary: projection.summary,
71
+ activities: projection.activities.slice(0, 100),
72
+ projects,
73
+ ...(viewerData.selectedProjectId ? { selectedProjectId: viewerData.selectedProjectId } : {}),
74
+ ...(viewerData.projectFilterStatus ? { projectFilterStatus: viewerData.projectFilterStatus } : {}),
75
+ });
76
+ return true;
77
+ }
78
+ function viewerMemoraxCodeHome(options) {
79
+ return options.memoraxCodeHome
80
+ ?? (options.env?.MEMORAX_CODE_HOME?.trim() || memoraxCodeHomeForTrace(options.env));
81
+ }
82
+ function memoryViewerUserClient(url) {
83
+ const value = url.searchParams.get("client");
84
+ const traceClient = value === null ? "codex" : traceClientFromPublicValue(value.trim().toLowerCase());
85
+ return traceClient
86
+ ? { traceClient, publicClient: traceClient === "claude" ? "claude-code" : "codex" }
87
+ : undefined;
88
+ }
89
+ function traceClientFromPublicValue(value) {
90
+ if (value === "codex")
91
+ return "codex";
92
+ return value === "claude" || value === "claude-code" || value === "cc"
93
+ ? "claude"
94
+ : undefined;
95
+ }
96
+ function activeMemoryViewerProjects(projects, projectSessions, activeSessionSince) {
97
+ const activeProjectIds = new Set(projectSessions
98
+ .filter((entry) => {
99
+ const lastSeenAt = Date.parse(entry.lastSeenAt);
100
+ return Number.isFinite(lastSeenAt) && lastSeenAt >= activeSessionSince;
101
+ })
102
+ .map((entry) => entry.projectId));
103
+ return projects.filter((entry) => activeProjectIds.has(entry.projectId));
104
+ }
105
+ function memoryViewerActivityCutoff(now) {
106
+ const safeNow = Number.isFinite(now) ? now : Date.now();
107
+ return Math.floor(safeNow / MEMORY_VIEWER_ACTIVITY_CUTOFF_GRANULARITY_MS)
108
+ * MEMORY_VIEWER_ACTIVITY_CUTOFF_GRANULARITY_MS
109
+ - MEMORY_VIEWER_SESSION_ACTIVITY_WINDOW_MS;
110
+ }
111
+ function conditionalViewerJson(req, res, body) {
112
+ const payload = JSON.stringify(body);
113
+ const etag = `"${createHash("sha256").update(payload).digest("base64url")}"`;
114
+ const headers = {
115
+ "cache-control": "private, no-cache",
116
+ etag,
117
+ };
118
+ if (req.headers["if-none-match"] === etag) {
119
+ res.writeHead(304, headers);
120
+ res.end();
121
+ return;
122
+ }
123
+ res.writeHead(200, { ...headers, "content-type": "application/json" });
124
+ res.end(payload);
125
+ }
126
+ function projectFilter(url) {
127
+ const rawProjectId = url.searchParams.get("projectId");
128
+ const projectId = (rawProjectId ?? "").trim();
129
+ if (projectId === UNCLASSIFIED_PROJECT_ID || isMemoryProjectId(projectId)) {
130
+ return { projectId };
131
+ }
132
+ if (rawProjectId !== null && projectId)
133
+ return { reject: true };
134
+ return {};
135
+ }
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { backendDebug } from "./debug-log.js";
3
+ import { TRACE_CLIENTS, clientTraceConfigFromEnv, } from "./trace-config.js";
4
+ import { recordTraceEvent } from "./trace-store.js";
5
+ import { memoryViewerObservabilityHook } from "./memory-viewer-observability.js";
6
+ export function createBackendMemoryObservability(memoraxCodeHome, existingHook, env = process.env, additionalDefaultHooks = []) {
7
+ if (existingHook)
8
+ return existingHook;
9
+ const effectiveEnv = { ...env, MEMORAX_CODE_HOME: memoraxCodeHome };
10
+ return composeMemoryObservabilityHooks([
11
+ ...additionalDefaultHooks,
12
+ memoryViewerObservabilityHook(),
13
+ sessionTraceObservabilityHook(memoraxCodeHome, effectiveEnv),
14
+ ]);
15
+ }
16
+ export function composeMemoryObservabilityHooks(hooks) {
17
+ const active = hooks.filter((hook) => Boolean(hook?.recordEvent));
18
+ if (active.length === 0)
19
+ return undefined;
20
+ return {
21
+ recordEvent(event) {
22
+ const correlatedEvent = event.eventId
23
+ ? event
24
+ : { ...event, eventId: `memory-observability-${randomUUID()}` };
25
+ for (const [sinkIndex, hook] of active.entries()) {
26
+ try {
27
+ hook.recordEvent?.(correlatedEvent);
28
+ }
29
+ catch (error) {
30
+ backendDebug("memory_observability.sink_failed", {
31
+ sinkIndex,
32
+ error: error instanceof Error ? error.message : String(error),
33
+ });
34
+ }
35
+ }
36
+ },
37
+ async drain() {
38
+ await Promise.all(active.map(async (hook, sinkIndex) => {
39
+ try {
40
+ await hook.drain?.();
41
+ }
42
+ catch (error) {
43
+ backendDebug("memory_observability.drain_failed", {
44
+ sinkIndex,
45
+ error: error instanceof Error ? error.message : String(error),
46
+ });
47
+ }
48
+ }));
49
+ },
50
+ };
51
+ }
52
+ function sessionTraceObservabilityHook(memoraxCodeHome, env) {
53
+ const enabledClients = new Set(TRACE_CLIENTS.filter((client) => clientTraceConfigFromEnv(client, env).enabled));
54
+ if (enabledClients.size === 0)
55
+ return undefined;
56
+ const pending = new Set();
57
+ return {
58
+ recordEvent(event) {
59
+ const client = event.traceContext?.client;
60
+ if (!client || !enabledClients.has(client))
61
+ return;
62
+ const config = clientTraceConfigFromEnv(client, env);
63
+ if (!config.enabled)
64
+ return;
65
+ const write = recordTraceEvent({
66
+ memoraxCodeHome,
67
+ env,
68
+ config,
69
+ traceContext: event.traceContext,
70
+ eventId: event.eventId,
71
+ type: sessionTraceEventType(event),
72
+ source: event.source,
73
+ operation: event.operation,
74
+ ok: event.ok,
75
+ relatedTurns: event.relatedTurns,
76
+ request: event.request,
77
+ response: event.response,
78
+ error: event.error,
79
+ }).catch((error) => {
80
+ backendDebug(`${client}_trace.write_failed`, {
81
+ label: "memory_observability",
82
+ error: error instanceof Error ? error.message : String(error),
83
+ });
84
+ }).finally(() => {
85
+ pending.delete(write);
86
+ });
87
+ pending.add(write);
88
+ },
89
+ async drain() {
90
+ await Promise.allSettled([...pending]);
91
+ },
92
+ };
93
+ }
94
+ function sessionTraceEventType(event) {
95
+ if (event.source === "memory_cli" && event.operation === "writeback")
96
+ return "memory_cli_add";
97
+ if (event.source === "memory_cli")
98
+ return "memory_cli_search";
99
+ if (event.operation === "writeback")
100
+ return "memory_writeback";
101
+ return "memory_retrieve";
102
+ }
@@ -0,0 +1,220 @@
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
+ }
213
+ if (isMainEntrypoint(import.meta.url)) {
214
+ import("./server-cli.js")
215
+ .then(({ runBackendCli }) => runBackendCli(process.argv))
216
+ .catch((error) => {
217
+ console.error(error instanceof Error ? error.message : String(error));
218
+ process.exit(1);
219
+ });
220
+ }
@@ -0,0 +1,10 @@
1
+ import { runBackendCli } from "./server-cli.js";
2
+ const markerIndex = process.argv.indexOf("--memorax-code-backend-instance");
3
+ const instanceId = markerIndex >= 0 ? process.argv[markerIndex + 1] : undefined;
4
+ if (!instanceId
5
+ || instanceId !== process.env.MEMORAX_CODE_BACKEND_INSTANCE_ID
6
+ || !/^[A-Za-z0-9_-]+$/.test(instanceId)) {
7
+ console.error("invalid MemoraX Code Backend service instance marker");
8
+ process.exit(1);
9
+ }
10
+ runBackendCli([process.execPath, "memorax-code-backend"]);