@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,345 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { backendDebug } from "./debug-log.js";
4
+ import { invokeMemoraxMemoryProvider } from "./memorax-adapter.js";
5
+ import { defaultMemoraxCodeHome, memoryCliAddEnabled, memoryCliMaxMemoryChars, memoryCliSessionId, memoryConfigStatus, } from "./memorax-config.js";
6
+ import { resolveConfiguredRepositoryMemory, } from "./repository-memory-context.js";
7
+ import { repositoryMemoryScopeContainsWorkspace, repositoryMemoryScopeKind, repositoryMemoryScopesMatch, } from "./repository-memory-scope.js";
8
+ import { isTraceClient } from "./trace-context.js";
9
+ import { readCurrentTraceTurn, recordTraceEvent } from "./trace-store.js";
10
+ export async function runMemoryCli(args, options = {}) {
11
+ const command = args[0] || "status";
12
+ const env = options.env ?? process.env;
13
+ const nextOptions = { ...options, env };
14
+ if (command === "status")
15
+ return await memoryStatus(nextOptions, args.includes("--config-only"));
16
+ if (command === "search")
17
+ return memorySearch(args.slice(1), nextOptions);
18
+ if (command === "add")
19
+ return memoryAdd(args.slice(1), nextOptions);
20
+ return { ok: false, action: "memory.status", error: `unknown memory command: ${command}` };
21
+ }
22
+ async function memoryStatus(options, configOnly = false) {
23
+ const env = options.env ?? process.env;
24
+ const status = memoryConfigStatus(env);
25
+ if (configOnly) {
26
+ return {
27
+ ok: status.configured,
28
+ action: "memory.status",
29
+ provider: "memory.memorax",
30
+ searchEnabled: status.search.enabled,
31
+ addEnabled: status.cli.addEnabled,
32
+ config: status,
33
+ ...(status.configured ? {} : { error: status.error }),
34
+ };
35
+ }
36
+ if (!status.configured) {
37
+ return {
38
+ ok: false,
39
+ action: "memory.status",
40
+ provider: "memory.memorax",
41
+ searchEnabled: false,
42
+ addEnabled: status.cli.addEnabled,
43
+ config: status,
44
+ workspaceScope: "unavailable",
45
+ workspaceScopeReason: "config_missing",
46
+ error: status.error,
47
+ };
48
+ }
49
+ const repositoryMemory = await resolveMemoryCliRepositoryMemory(options);
50
+ return {
51
+ ok: true,
52
+ action: "memory.status",
53
+ provider: "memory.memorax",
54
+ baseUrl: status.baseUrl,
55
+ userId: status.userId,
56
+ baseUserId: status.userId,
57
+ ...(repositoryMemory.ok
58
+ ? memoryCliIdentityFields(repositoryMemory.memory)
59
+ : {
60
+ workspaceScope: "unavailable",
61
+ workspaceScopeReason: repositoryMemory.reason,
62
+ }),
63
+ searchEnabled: status.search.enabled,
64
+ addEnabled: status.cli.addEnabled,
65
+ config: status,
66
+ };
67
+ }
68
+ async function memorySearch(args, options) {
69
+ const queryResult = await readTextArg(args, "--query", "--query-file", "query");
70
+ if (!queryResult.ok)
71
+ return { ok: false, action: "memory.search", error: queryResult.error };
72
+ const query = queryResult.text;
73
+ const repositoryMemory = await resolveMemoryCliRepositoryMemory(options);
74
+ if (!repositoryMemory.ok) {
75
+ return { ok: false, action: "memory.search", query, error: repositoryMemory.error };
76
+ }
77
+ const observability = await memoryCliObservability(options.env);
78
+ const response = await invokeMemoraxMemoryProvider({ sessionId: memoryCliSessionId(args, options.env), prompt: query }, {
79
+ provider_family: "memory",
80
+ provider_id: "memory.memorax",
81
+ transport: "external_http",
82
+ slot: "state_context",
83
+ operation: "query",
84
+ query,
85
+ context: {
86
+ ...(limitFromArgs(args) === undefined ? {} : { limit: limitFromArgs(args) }),
87
+ },
88
+ }, {
89
+ config: repositoryMemory.memory.config,
90
+ diagnosticLogger: backendDebug,
91
+ fetchImpl: options.fetchImpl,
92
+ observability: observability.hook,
93
+ observabilitySource: "memory_cli",
94
+ repositoryScope: repositoryMemory.memory.scope,
95
+ });
96
+ await observability.flush();
97
+ if (!response.ok)
98
+ return { ok: false, action: "memory.search", query, error: response.error };
99
+ const payload = isRecord(response.result.tool_result_payload) ? response.result.tool_result_payload : {};
100
+ return {
101
+ ok: true,
102
+ action: "memory.search",
103
+ provider: "memory.memorax",
104
+ query,
105
+ ...memoryCliIdentityFields(repositoryMemory.memory),
106
+ answer: typeof payload.answer === "string" ? payload.answer : "",
107
+ items: Array.isArray(payload.items) ? payload.items : [],
108
+ receipt: response.result.dispatch_receipt ?? null,
109
+ };
110
+ }
111
+ async function memoryAdd(args, options) {
112
+ const env = options.env ?? process.env;
113
+ if (env.MEMORAX_CODE_MEMORAX_WRITEBACK_ENABLED === "false") {
114
+ return { ok: false, action: "memory.add", error: "MEMORAX_CODE_MEMORAX_WRITEBACK_ENABLED=false disables MemoraX add" };
115
+ }
116
+ if (!memoryCliAddEnabled(env)) {
117
+ return { ok: false, action: "memory.add", error: "memory add is disabled by MEMORAX_CODE_MEMORY_CLI_ADD_ENABLED=false or [memory.cli].add_enabled=false" };
118
+ }
119
+ const memoryResult = await readTextArg(args, "--memory", "--memory-file", "memory");
120
+ if (!memoryResult.ok)
121
+ return { ok: false, action: "memory.add", error: memoryResult.error };
122
+ const memory = memoryResult.text;
123
+ const maxChars = memoryCliMaxMemoryChars(env);
124
+ if (memory.length > maxChars) {
125
+ return { ok: false, action: "memory.add", error: `memory is too long: ${memory.length} chars > ${maxChars}` };
126
+ }
127
+ const memoryType = requiredArg(args, "--type");
128
+ if (!memoryType.ok)
129
+ return { ok: false, action: "memory.add", error: memoryType.error };
130
+ const reason = requiredArg(args, "--reason");
131
+ if (!reason.ok)
132
+ return { ok: false, action: "memory.add", error: reason.error };
133
+ const contentOptions = memoryAddContentOptions(args);
134
+ if (!contentOptions.ok)
135
+ return { ok: false, action: "memory.add", error: contentOptions.error };
136
+ const repositoryMemory = await resolveMemoryCliRepositoryMemory(options);
137
+ if (!repositoryMemory.ok)
138
+ return { ok: false, action: "memory.add", error: repositoryMemory.error };
139
+ const sessionId = memoryCliSessionId(args, env);
140
+ const observability = await memoryCliObservability(env);
141
+ const response = await invokeMemoraxMemoryProvider({ sessionId, prompt: memory }, {
142
+ provider_family: "memory",
143
+ provider_id: "memory.memorax",
144
+ transport: "external_http",
145
+ slot: "state_context",
146
+ operation: "writeback",
147
+ dispatch: "async_best_effort",
148
+ context: {
149
+ idempotencyKey: `memory-cli:${sessionId}:${hashText(`${memoryType.value}\n${reason.value}\n${memory}`)}`,
150
+ messages: [{ role: "user", content: memory }],
151
+ ...contentOptions.context,
152
+ metadata: {
153
+ source_detail: "memorax_code_memory_cli",
154
+ memory_type: memoryType.value,
155
+ memorax_code_memory_reason: reason.value,
156
+ },
157
+ },
158
+ }, {
159
+ config: repositoryMemory.memory.config,
160
+ diagnosticLogger: backendDebug,
161
+ env,
162
+ fetchImpl: options.fetchImpl,
163
+ observability: observability.hook,
164
+ observabilitySource: "memory_cli",
165
+ repositoryScope: repositoryMemory.memory.scope,
166
+ });
167
+ await observability.flush();
168
+ if (!response.ok)
169
+ return { ok: false, action: "memory.add", error: response.error };
170
+ return {
171
+ ok: true,
172
+ action: "memory.add",
173
+ provider: "memory.memorax",
174
+ ...memoryCliIdentityFields(repositoryMemory.memory),
175
+ receipt: response.result.dispatch_receipt ?? null,
176
+ };
177
+ }
178
+ async function resolveMemoryCliRepositoryMemory(options) {
179
+ const env = options.env ?? process.env;
180
+ const memoraxCodeHome = defaultMemoraxCodeHome(env);
181
+ let turnMemory;
182
+ const traceBinding = memoryCliTraceBinding(env);
183
+ if (traceBinding?.expectedSessionId) {
184
+ const current = await readCurrentTraceTurn({
185
+ client: traceBinding.client,
186
+ memoraxCodeHome,
187
+ env,
188
+ expectedSessionId: traceBinding.expectedSessionId,
189
+ });
190
+ if (current.ok
191
+ && (current.traceContext.cwd?.trim() || current.traceContext.workspaceKind?.trim().toLowerCase() === "projectless")) {
192
+ turnMemory = await resolveConfiguredRepositoryMemory({
193
+ workspaceRoot: current.traceContext.cwd,
194
+ workspaceKind: current.traceContext.workspaceKind,
195
+ memoraxCodeHome,
196
+ env,
197
+ });
198
+ if (!turnMemory.ok)
199
+ return turnMemory;
200
+ }
201
+ }
202
+ const commandWorkspace = options.cwd ?? process.cwd();
203
+ if (turnMemory?.ok && turnMemory.memory.scope) {
204
+ const turnScope = turnMemory.memory.scope;
205
+ const turnScopeKind = repositoryMemoryScopeKind(turnScope);
206
+ if ((turnScopeKind === "codex-projectless" && !turnScope.boundWorkspaceRoot)
207
+ || ((turnScopeKind === "codex-projectless" || turnScopeKind === "local-directory")
208
+ && await repositoryMemoryScopeContainsWorkspace(turnScope, commandWorkspace))) {
209
+ return turnMemory;
210
+ }
211
+ }
212
+ const commandMemory = await resolveConfiguredRepositoryMemory({
213
+ workspaceRoot: commandWorkspace,
214
+ memoraxCodeHome,
215
+ env,
216
+ });
217
+ if (!commandMemory.ok || !commandMemory.memory.scope)
218
+ return commandMemory;
219
+ if (turnMemory?.ok && (!turnMemory.memory.scope || !repositoryMemoryScopesMatch(commandMemory.memory.scope, turnMemory.memory.scope))) {
220
+ const clientLabel = traceBinding?.client === "claude" ? "Claude" : "Codex";
221
+ return {
222
+ ok: false,
223
+ reason: "workspace_scope_mismatch",
224
+ error: `memory CLI cwd does not match the current ${clientLabel} turn repository/workspace scope; start a new session in the target scope`,
225
+ };
226
+ }
227
+ return commandMemory;
228
+ }
229
+ function memoryCliIdentityFields(memory) {
230
+ return {
231
+ baseUserId: memory.config.userId,
232
+ ...(memory.scope ? {
233
+ workspace: memory.scope.repositorySlug,
234
+ scopeKind: repositoryMemoryScopeKind(memory.scope),
235
+ effectiveUserId: memory.scope.effectiveUserId,
236
+ workspaceScope: "bound",
237
+ } : {
238
+ workspaceScope: "unavailable",
239
+ }),
240
+ };
241
+ }
242
+ async function memoryCliObservability(env = process.env) {
243
+ const memoraxCodeHome = defaultMemoraxCodeHome(env);
244
+ const traceBinding = memoryCliTraceBinding(env);
245
+ const current = traceBinding
246
+ ? await readCurrentTraceTurn({
247
+ client: traceBinding.client,
248
+ memoraxCodeHome,
249
+ env,
250
+ expectedSessionId: traceBinding.expectedSessionId,
251
+ })
252
+ : undefined;
253
+ const pending = [];
254
+ if (!current?.ok)
255
+ return { flush: async () => undefined };
256
+ return {
257
+ hook: {
258
+ recordEvent(event) {
259
+ pending.push(recordTraceEvent({
260
+ memoraxCodeHome,
261
+ env,
262
+ traceContext: current.traceContext,
263
+ type: memoryCliTraceEventType(event),
264
+ source: event.source,
265
+ operation: event.operation,
266
+ ok: event.ok,
267
+ request: event.request,
268
+ response: event.response,
269
+ error: event.error,
270
+ }));
271
+ },
272
+ },
273
+ flush: async () => {
274
+ await Promise.allSettled(pending);
275
+ },
276
+ };
277
+ }
278
+ function memoryCliTraceBinding(env) {
279
+ const explicitClientRaw = env.MEMORAX_CODE_MEMORY_CLI_TRACE_CLIENT;
280
+ const explicitSessionIdRaw = env.MEMORAX_CODE_MEMORY_CLI_TRACE_SESSION_ID;
281
+ if (explicitClientRaw !== undefined || explicitSessionIdRaw !== undefined) {
282
+ const client = explicitClientRaw?.trim();
283
+ const expectedSessionId = explicitSessionIdRaw?.trim();
284
+ if (!isTraceClient(client) || !expectedSessionId)
285
+ return undefined;
286
+ return { client, expectedSessionId };
287
+ }
288
+ const expectedSessionId = env.CODEX_THREAD_ID?.trim();
289
+ return expectedSessionId
290
+ ? { client: "codex", expectedSessionId }
291
+ : undefined;
292
+ }
293
+ function memoryCliTraceEventType(event) {
294
+ return event.operation === "writeback" ? "memory_cli_add" : "memory_cli_search";
295
+ }
296
+ function memoryAddContentOptions(args) {
297
+ const contentType = argValue(args, "--content-type")?.trim();
298
+ const mode = argValue(args, "--mode")?.trim();
299
+ const context = {};
300
+ const effectiveContentType = contentType || "code";
301
+ const effectiveMode = mode || (effectiveContentType === "code" ? "pre_summarized" : "default");
302
+ context.contentType = effectiveContentType;
303
+ context.mode = effectiveMode;
304
+ return { ok: true, context };
305
+ }
306
+ async function readTextArg(args, inlineFlag, fileFlag, label) {
307
+ const inline = argValue(args, inlineFlag);
308
+ const file = argValue(args, fileFlag);
309
+ if (inline && file)
310
+ return { ok: false, error: `use either ${inlineFlag} or ${fileFlag}, not both` };
311
+ let text = inline ?? "";
312
+ if (file) {
313
+ try {
314
+ text = await readFile(file, "utf8");
315
+ }
316
+ catch (error) {
317
+ return { ok: false, error: `failed to read ${fileFlag}: ${error instanceof Error ? error.message : String(error)}` };
318
+ }
319
+ }
320
+ text = text.trim();
321
+ if (!text)
322
+ return { ok: false, error: `${label} is required` };
323
+ return { ok: true, text };
324
+ }
325
+ function requiredArg(args, flag) {
326
+ const value = argValue(args, flag)?.trim();
327
+ return value ? { ok: true, value } : { ok: false, error: `${flag} is required` };
328
+ }
329
+ function argValue(args, name) {
330
+ const index = args.indexOf(name);
331
+ return index >= 0 ? args[index + 1] : undefined;
332
+ }
333
+ function limitFromArgs(args) {
334
+ const value = argValue(args, "--limit");
335
+ if (!value)
336
+ return undefined;
337
+ const parsed = Number(value);
338
+ return Number.isFinite(parsed) ? Math.max(1, Math.min(100, Math.trunc(parsed))) : undefined;
339
+ }
340
+ function hashText(text) {
341
+ return createHash("sha256").update(text).digest("hex").slice(0, 16);
342
+ }
343
+ function isRecord(value) {
344
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
345
+ }
@@ -0,0 +1,200 @@
1
+ import { isRecord } from "./utils.js";
2
+ export const MEMORY_HOOK_COMMAND_VERSION = 1;
3
+ export const INVALID_MEMORY_HOOK_COMMAND = "invalid memory Hook command";
4
+ const BASE_COMMAND_KEYS = [
5
+ "version",
6
+ "client",
7
+ "sessionId",
8
+ "cwd",
9
+ "workspaceKind",
10
+ ];
11
+ const TURN_START_KEYS = {
12
+ codex: new Set([...BASE_COMMAND_KEYS, "turnId", "prompt", "transcriptPath"]),
13
+ "claude-code": new Set([...BASE_COMMAND_KEYS, "promptId", "prompt", "transcriptPath"]),
14
+ };
15
+ const WRITEBACK_KEYS = {
16
+ codex: new Set([...BASE_COMMAND_KEYS, "turnId", "lastAssistantMessage", "transcriptPath"]),
17
+ "claude-code": new Set([
18
+ ...BASE_COMMAND_KEYS,
19
+ "promptId",
20
+ "lastAssistantMessage",
21
+ "transcriptPath",
22
+ ]),
23
+ };
24
+ const SKILL_REMINDER_KEYS = {
25
+ codex: new Set([...BASE_COMMAND_KEYS, "turnId", "transcriptPath", "content", "triggers"]),
26
+ "claude-code": new Set([...BASE_COMMAND_KEYS, "promptId", "transcriptPath", "content", "triggers"]),
27
+ };
28
+ export function parseTurnStartCommand(value) {
29
+ if (!isRecord(value))
30
+ return invalidCommand();
31
+ const base = parseCommandBase(value, TURN_START_KEYS);
32
+ if (!base)
33
+ return invalidCommand();
34
+ const prompt = requiredStringField(value, "prompt");
35
+ const transcriptPath = requiredStringField(value, "transcriptPath");
36
+ if (!prompt || !transcriptPath)
37
+ return invalidCommand();
38
+ if (base.client === "codex") {
39
+ const turnId = optionalStringField(value, "turnId");
40
+ if (!turnId.ok)
41
+ return invalidCommand();
42
+ return {
43
+ ok: true,
44
+ command: {
45
+ ...base,
46
+ client: "codex",
47
+ prompt,
48
+ transcriptPath,
49
+ ...(turnId.value ? { turnId: turnId.value } : {}),
50
+ },
51
+ };
52
+ }
53
+ const promptId = requiredStringField(value, "promptId");
54
+ if (!promptId)
55
+ return invalidCommand();
56
+ return {
57
+ ok: true,
58
+ command: {
59
+ ...base,
60
+ client: "claude-code",
61
+ promptId,
62
+ prompt,
63
+ transcriptPath,
64
+ },
65
+ };
66
+ }
67
+ export function parseWritebackCommand(value) {
68
+ if (!isRecord(value))
69
+ return invalidCommand();
70
+ const base = parseCommandBase(value, WRITEBACK_KEYS);
71
+ if (!base)
72
+ return invalidCommand();
73
+ const lastAssistantMessage = requiredStringField(value, "lastAssistantMessage");
74
+ if (!lastAssistantMessage)
75
+ return invalidCommand();
76
+ if (base.client === "codex") {
77
+ const turnId = optionalStringField(value, "turnId");
78
+ const transcriptPath = optionalStringField(value, "transcriptPath");
79
+ if (!turnId.ok || !transcriptPath.ok)
80
+ return invalidCommand();
81
+ return {
82
+ ok: true,
83
+ command: {
84
+ ...base,
85
+ client: "codex",
86
+ lastAssistantMessage,
87
+ ...(turnId.value ? { turnId: turnId.value } : {}),
88
+ ...(transcriptPath.value ? { transcriptPath: transcriptPath.value } : {}),
89
+ },
90
+ };
91
+ }
92
+ const promptId = requiredStringField(value, "promptId");
93
+ const transcriptPath = requiredStringField(value, "transcriptPath");
94
+ if (!promptId || !transcriptPath)
95
+ return invalidCommand();
96
+ return {
97
+ ok: true,
98
+ command: {
99
+ ...base,
100
+ client: "claude-code",
101
+ promptId,
102
+ lastAssistantMessage,
103
+ transcriptPath,
104
+ },
105
+ };
106
+ }
107
+ export function parseSkillReminderCommand(value) {
108
+ if (!isRecord(value))
109
+ return invalidCommand();
110
+ const base = parseCommandBase(value, SKILL_REMINDER_KEYS);
111
+ if (!base)
112
+ return invalidCommand();
113
+ const transcriptPath = requiredStringField(value, "transcriptPath");
114
+ const content = requiredContentField(value, "content");
115
+ const triggers = skillReminderTriggers(value.triggers);
116
+ if (!transcriptPath || !content || !triggers)
117
+ return invalidCommand();
118
+ if (base.client === "codex") {
119
+ const turnId = requiredStringField(value, "turnId");
120
+ if (!turnId)
121
+ return invalidCommand();
122
+ return {
123
+ ok: true,
124
+ command: {
125
+ ...base,
126
+ client: "codex",
127
+ turnId,
128
+ transcriptPath,
129
+ content,
130
+ triggers,
131
+ },
132
+ };
133
+ }
134
+ const promptId = requiredStringField(value, "promptId");
135
+ if (!promptId)
136
+ return invalidCommand();
137
+ return {
138
+ ok: true,
139
+ command: {
140
+ ...base,
141
+ client: "claude-code",
142
+ promptId,
143
+ transcriptPath,
144
+ content,
145
+ triggers,
146
+ },
147
+ };
148
+ }
149
+ function parseCommandBase(value, allowedKeys) {
150
+ if (value.version !== MEMORY_HOOK_COMMAND_VERSION)
151
+ return undefined;
152
+ const client = value.client;
153
+ if (client !== "codex" && client !== "claude-code")
154
+ return undefined;
155
+ if (Object.keys(value).some((key) => !allowedKeys[client].has(key)))
156
+ return undefined;
157
+ const sessionId = requiredStringField(value, "sessionId");
158
+ if (!sessionId)
159
+ return undefined;
160
+ const cwd = optionalStringField(value, "cwd");
161
+ const workspaceKind = optionalStringField(value, "workspaceKind");
162
+ if (!cwd.ok || !workspaceKind.ok)
163
+ return undefined;
164
+ return {
165
+ version: MEMORY_HOOK_COMMAND_VERSION,
166
+ client,
167
+ sessionId,
168
+ ...(cwd.value ? { cwd: cwd.value } : {}),
169
+ ...(workspaceKind.value ? { workspaceKind: workspaceKind.value } : {}),
170
+ };
171
+ }
172
+ function requiredStringField(value, key) {
173
+ const field = value[key];
174
+ return typeof field === "string" && field.trim() ? field.trim() : undefined;
175
+ }
176
+ function requiredContentField(value, key) {
177
+ const field = value[key];
178
+ return typeof field === "string" && field.trim() ? field : undefined;
179
+ }
180
+ function skillReminderTriggers(value) {
181
+ if (!Array.isArray(value) || value.length === 0)
182
+ return undefined;
183
+ const triggers = [];
184
+ for (const trigger of value) {
185
+ if (trigger !== "cadence" && trigger !== "post_compaction")
186
+ return undefined;
187
+ if (!triggers.includes(trigger))
188
+ triggers.push(trigger);
189
+ }
190
+ return triggers;
191
+ }
192
+ function optionalStringField(value, key) {
193
+ if (!Object.prototype.hasOwnProperty.call(value, key))
194
+ return { ok: true };
195
+ const field = requiredStringField(value, key);
196
+ return field ? { ok: true, value: field } : { ok: false };
197
+ }
198
+ function invalidCommand() {
199
+ return { ok: false, error: INVALID_MEMORY_HOOK_COMMAND };
200
+ }
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, realpathSync } from "node:fs";
3
+ import { basename, dirname, isAbsolute, join, resolve } from "node:path";
4
+ export const UNCLASSIFIED_PROJECT_ID = "__unclassified__";
5
+ const PROJECT_ROOT_CACHE_CAPACITY = 512;
6
+ const projectsByCwd = new Map();
7
+ const projectRootsById = new Map();
8
+ export function resolveMemoryProject(cwd) {
9
+ if (!cwd || !isAbsolute(cwd))
10
+ return undefined;
11
+ const normalizedCwd = normalizePath(cwd);
12
+ const cached = projectsByCwd.get(normalizedCwd);
13
+ if (cached) {
14
+ rememberProjectRoot(cached.identity.projectId, cached.root);
15
+ return cached.identity;
16
+ }
17
+ let current = normalizedCwd;
18
+ while (true) {
19
+ if (existsSync(join(current, ".git"))) {
20
+ const root = normalizePath(current);
21
+ const label = basename(root).trim();
22
+ const identity = {
23
+ projectId: `repo:${createHash("sha256").update(root).digest("hex").slice(0, 32)}`,
24
+ projectLabel: isSafeProjectLabel(label) ? label : "Repository",
25
+ };
26
+ projectsByCwd.set(normalizedCwd, { identity, root });
27
+ rememberProjectRoot(identity.projectId, root);
28
+ return identity;
29
+ }
30
+ const parent = dirname(current);
31
+ if (parent === current)
32
+ break;
33
+ current = parent;
34
+ }
35
+ return undefined;
36
+ }
37
+ export function memoryProjectRoot(projectId) {
38
+ const root = projectRootsById.get(projectId);
39
+ if (root)
40
+ rememberProjectRoot(projectId, root);
41
+ return root;
42
+ }
43
+ export function memoryProjectFromUnknown(value) {
44
+ if (!value || typeof value !== "object" || Array.isArray(value))
45
+ return undefined;
46
+ const record = value;
47
+ const rawProjectId = rawString(record.projectId) || rawString(record.project_id) || rawString(record.id);
48
+ const rawProjectLabel = rawString(record.projectLabel) || rawString(record.project_label) || rawString(record.label);
49
+ const projectId = rawProjectId.trim();
50
+ const projectLabel = rawProjectLabel.trim();
51
+ if (rawProjectId !== projectId
52
+ || !isMemoryProjectId(projectId)
53
+ || !projectLabel
54
+ || !isSafeProjectLabel(rawProjectLabel)
55
+ || !isSafeProjectLabel(projectLabel))
56
+ return undefined;
57
+ return { projectId, projectLabel };
58
+ }
59
+ export function isMemoryProjectId(value) {
60
+ return /^repo:[a-f0-9]{32}$/.test(value);
61
+ }
62
+ function isSafeProjectLabel(value) {
63
+ return value.length <= 256
64
+ && value !== "."
65
+ && value !== ".."
66
+ && !/[\\/\u0000-\u001f\u007f]/.test(value);
67
+ }
68
+ function normalizePath(value) {
69
+ const absolute = resolve(value);
70
+ try {
71
+ return realpathSync.native(absolute);
72
+ }
73
+ catch {
74
+ return absolute;
75
+ }
76
+ }
77
+ function rememberProjectRoot(projectId, root) {
78
+ projectRootsById.delete(projectId);
79
+ projectRootsById.set(projectId, root);
80
+ while (projectRootsById.size > PROJECT_ROOT_CACHE_CAPACITY) {
81
+ const oldest = projectRootsById.keys().next().value;
82
+ if (typeof oldest !== "string")
83
+ break;
84
+ projectRootsById.delete(oldest);
85
+ }
86
+ }
87
+ function rawString(value) {
88
+ return typeof value === "string" ? value : "";
89
+ }
@@ -0,0 +1,58 @@
1
+ import { parseSkillReminderCommand, } from "./memory-hook-command.js";
2
+ import { traceContextFromClaudeHookBody, traceContextFromHookBody, } from "./trace-context.js";
3
+ import { recordTraceEvent } from "./trace-store.js";
4
+ export function createMemoryReminderTraceRecorder(options = {}) {
5
+ return {
6
+ async recordSkillReminder(body) {
7
+ const parsed = parseSkillReminderCommand(body);
8
+ if (!parsed.ok) {
9
+ options.diagnosticLogger?.("memory_hook.skill_reminder_invalid", {
10
+ error: parsed.error,
11
+ });
12
+ return { ok: true };
13
+ }
14
+ const request = parsed.command;
15
+ const traceContext = traceContextForReminder(request);
16
+ await recordTraceBestEffort("memory_hook.skill_reminder_event", recordTraceEvent({
17
+ memoraxCodeHome: options.memoraxCodeHome,
18
+ env: options.env,
19
+ traceContext,
20
+ type: "skill_reminder",
21
+ source: request.client === "codex" ? "codex-hook" : "claude-hook",
22
+ operation: "reminder",
23
+ ok: true,
24
+ request: {
25
+ triggers: request.triggers,
26
+ },
27
+ response: {
28
+ role: "developer",
29
+ content: request.content,
30
+ },
31
+ }), options.diagnosticLogger);
32
+ options.diagnosticLogger?.("memory_hook.skill_reminder", {
33
+ client: request.client,
34
+ sessionId: request.sessionId,
35
+ turnId: request.client === "codex" ? request.turnId : request.promptId,
36
+ triggers: request.triggers,
37
+ contentChars: request.content.length,
38
+ });
39
+ return { ok: true };
40
+ },
41
+ };
42
+ }
43
+ function traceContextForReminder(command) {
44
+ if (command.client === "codex")
45
+ return traceContextFromHookBody(command);
46
+ return traceContextFromClaudeHookBody(command);
47
+ }
48
+ async function recordTraceBestEffort(label, promise, diagnosticLogger) {
49
+ try {
50
+ await promise;
51
+ }
52
+ catch (error) {
53
+ diagnosticLogger?.("memory_trace.write_failed", {
54
+ label,
55
+ error: error instanceof Error ? error.message : String(error),
56
+ });
57
+ }
58
+ }