@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,217 @@
1
+ import { writebackMessagesContentChars } from "./memory-writeback-chunk.js";
2
+ import { memoryWritebackBufferConfig } from "./memorax-config.js";
3
+ const SYSTEM_CLOCK = {
4
+ now: () => Date.now(),
5
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
6
+ clearTimeout: (timer) => clearTimeout(timer),
7
+ };
8
+ export function createMemoryWritebackBufferRuntime() {
9
+ const writebackBuffers = new Map();
10
+ return {
11
+ enqueue(decision, options, deps) {
12
+ enqueueMemoryWritebackBufferForRuntime(writebackBuffers, decision, options, deps);
13
+ },
14
+ flushAll(flushReason) {
15
+ let flushed = 0;
16
+ for (const [bufferKey, buffer] of [...writebackBuffers.entries()]) {
17
+ if (flushMemoryWritebackBuffer(writebackBuffers, bufferKey, flushReason, buffer.deps)) {
18
+ flushed += 1;
19
+ }
20
+ }
21
+ return flushed;
22
+ },
23
+ close() {
24
+ for (const buffer of writebackBuffers.values()) {
25
+ if (buffer.timer)
26
+ buffer.clock.clearTimeout(buffer.timer);
27
+ }
28
+ writebackBuffers.clear();
29
+ },
30
+ };
31
+ }
32
+ function enqueueMemoryWritebackBufferForRuntime(writebackBuffers, decision, options, deps) {
33
+ const env = options.env ?? process.env;
34
+ const config = memoryWritebackBufferConfig(env);
35
+ if (!options.repositoryScope)
36
+ return;
37
+ const bufferKey = memoryWritebackBufferKey(decision.client, decision.sessionKey, options.repositoryScope);
38
+ let buffer = writebackBuffers.get(bufferKey);
39
+ if (buffer?.turnKeys.has(decision.idempotencyKey)) {
40
+ deps.debug("memory.automatic_writeback", {
41
+ scheduled: false,
42
+ skipReason: "buffer_duplicate_turn",
43
+ sessionKey: decision.sessionKey,
44
+ });
45
+ return;
46
+ }
47
+ const turnContentChars = writebackMessagesContentChars(decision.messages);
48
+ if (buffer && buffer.contentChars + turnContentChars > config.maxChars) {
49
+ flushMemoryWritebackBuffer(writebackBuffers, bufferKey, "char_limit", deps);
50
+ buffer = undefined;
51
+ }
52
+ if (!buffer) {
53
+ buffer = createMemoryWritebackBuffer(bufferKey, decision.client, decision.sessionKey, env, options, options.repositoryScope, deps.clock ?? SYSTEM_CLOCK, deps);
54
+ writebackBuffers.set(bufferKey, buffer);
55
+ }
56
+ buffer.turns.push({
57
+ idempotencyKey: decision.idempotencyKey,
58
+ messages: decision.messages,
59
+ ...(options.traceContext ? { traceContext: options.traceContext } : {}),
60
+ });
61
+ buffer.turnKeys.add(decision.idempotencyKey);
62
+ buffer.contentChars += turnContentChars;
63
+ const clock = deps.clock ?? SYSTEM_CLOCK;
64
+ buffer.updatedAt = clock.now();
65
+ buffer.env = env;
66
+ buffer.fetchImpl = options.fetchImpl;
67
+ buffer.memoryObservability = options.memoryObservability;
68
+ buffer.memoryObservabilitySource = options.memoryObservabilitySource;
69
+ buffer.deps = deps;
70
+ deps.debug("memory.automatic_writeback", {
71
+ scheduled: false,
72
+ buffered: true,
73
+ sessionKey: decision.sessionKey,
74
+ turnCount: buffer.turns.length,
75
+ messageCount: bufferedMessages(buffer).length,
76
+ contentChars: buffer.contentChars,
77
+ });
78
+ if (buffer.turns.length >= config.maxTurns) {
79
+ flushMemoryWritebackBuffer(writebackBuffers, bufferKey, "turn_limit", deps);
80
+ }
81
+ else if (buffer.contentChars > config.maxChars) {
82
+ flushMemoryWritebackBuffer(writebackBuffers, bufferKey, "char_limit", deps);
83
+ }
84
+ else {
85
+ resetMemoryWritebackIdleTimer(writebackBuffers, buffer, config.maxAgeMs, deps);
86
+ }
87
+ }
88
+ function createMemoryWritebackBuffer(bufferKey, client, sessionKey, env, options, repositoryScope, clock, deps) {
89
+ const now = clock.now();
90
+ const buffer = {
91
+ bufferKey,
92
+ client,
93
+ sessionKey,
94
+ turns: [],
95
+ turnKeys: new Set(),
96
+ contentChars: 0,
97
+ createdAt: now,
98
+ updatedAt: now,
99
+ timerGeneration: 0,
100
+ clock,
101
+ env,
102
+ fetchImpl: options.fetchImpl,
103
+ memoryObservability: options.memoryObservability,
104
+ memoryObservabilitySource: options.memoryObservabilitySource,
105
+ repositoryScope,
106
+ deps,
107
+ };
108
+ return buffer;
109
+ }
110
+ function resetMemoryWritebackIdleTimer(writebackBuffers, buffer, maxAgeMs, deps) {
111
+ if (buffer.timer)
112
+ buffer.clock.clearTimeout(buffer.timer);
113
+ const clock = deps.clock ?? SYSTEM_CLOCK;
114
+ const generation = buffer.timerGeneration + 1;
115
+ buffer.clock = clock;
116
+ buffer.timerGeneration = generation;
117
+ buffer.idleDeadlineAt = buffer.updatedAt + maxAgeMs;
118
+ const delayMs = Math.max(0, buffer.idleDeadlineAt - clock.now());
119
+ buffer.timer = clock.setTimeout(() => {
120
+ const current = writebackBuffers.get(buffer.bufferKey);
121
+ if (current !== buffer || current.timerGeneration !== generation)
122
+ return;
123
+ flushMemoryWritebackBuffer(writebackBuffers, buffer.bufferKey, "idle_limit", deps);
124
+ }, delayMs);
125
+ if (typeof buffer.timer.unref === "function")
126
+ buffer.timer.unref();
127
+ }
128
+ function flushMemoryWritebackBuffer(writebackBuffers, bufferKey, flushReason, deps) {
129
+ const buffer = writebackBuffers.get(bufferKey);
130
+ if (!buffer)
131
+ return false;
132
+ writebackBuffers.delete(bufferKey);
133
+ if (buffer.timer)
134
+ buffer.clock.clearTimeout(buffer.timer);
135
+ if (buffer.turns.length === 0)
136
+ return false;
137
+ const sessionKey = buffer.sessionKey;
138
+ const messages = bufferedMessages(buffer);
139
+ const scopeHash = deps.hashText(buffer.repositoryScope.effectiveUserId);
140
+ const idempotencyKey = `automatic-buffer:v1:${buffer.client}:${scopeHash}:${sessionKey}:${deps.hashText(messages.map((message) => `${message.role}:${message.content}`).join("\n"))}`;
141
+ const dedupeKeys = [idempotencyKey, ...buffer.turns.map((turn) => turn.idempotencyKey)];
142
+ if (dedupeKeys.some((key) => deps.hasPendingWriteback(key)))
143
+ return false;
144
+ deps.reservePendingWritebacks(dedupeKeys);
145
+ deps.debug("memory.automatic_writeback", {
146
+ scheduled: true,
147
+ buffered: true,
148
+ sessionKey,
149
+ idempotencyKey,
150
+ flushReason,
151
+ turnCount: buffer.turns.length,
152
+ messageCount: messages.length,
153
+ contentChars: buffer.contentChars,
154
+ });
155
+ deps.flush({
156
+ client: buffer.client,
157
+ sessionKey,
158
+ idempotencyKey,
159
+ messages,
160
+ dedupeKeys,
161
+ flushReason,
162
+ turnCount: buffer.turns.length,
163
+ }, {
164
+ sessionKey,
165
+ env: buffer.env,
166
+ fetchImpl: buffer.fetchImpl,
167
+ memoryObservability: buffer.memoryObservability,
168
+ memoryObservabilitySource: buffer.memoryObservabilitySource,
169
+ repositoryScope: buffer.repositoryScope,
170
+ relatedTurns: relatedTurnsForBuffer(buffer),
171
+ traceContext: sessionTraceContextForBuffer(buffer),
172
+ });
173
+ return true;
174
+ }
175
+ function memoryWritebackBufferKey(client, sessionKey, repositoryScope) {
176
+ return JSON.stringify([
177
+ client,
178
+ repositoryScope.effectiveUserId,
179
+ sessionKey,
180
+ ]);
181
+ }
182
+ function bufferedMessages(buffer) {
183
+ return buffer.turns.flatMap((turn) => turn.messages);
184
+ }
185
+ function relatedTurnsForBuffer(buffer) {
186
+ const relatedTurns = [];
187
+ for (const turn of buffer.turns) {
188
+ const context = turn.traceContext;
189
+ if (!context)
190
+ continue;
191
+ relatedTurns.push({
192
+ ...(context.turnId ? { turnId: context.turnId } : {}),
193
+ ...(context.requestId ? { requestId: context.requestId } : {}),
194
+ ...(context.nativeRequestId ? { nativeRequestId: context.nativeRequestId } : {}),
195
+ contextOrigin: context.contextOrigin,
196
+ capturedAt: context.capturedAt,
197
+ });
198
+ }
199
+ return relatedTurns.length > 0 ? relatedTurns : undefined;
200
+ }
201
+ function sessionTraceContextForBuffer(buffer) {
202
+ const contexts = buffer.turns.flatMap((turn) => turn.traceContext ? [turn.traceContext] : []);
203
+ const context = contexts.find((candidate) => candidate.sessionId === buffer.sessionKey) ?? contexts[0];
204
+ if (!context)
205
+ return undefined;
206
+ return {
207
+ schemaVersion: context.schemaVersion,
208
+ client: context.client,
209
+ sessionId: context.sessionId,
210
+ ...(context.threadId ? { threadId: context.threadId } : {}),
211
+ ...(context.transcriptPath ? { transcriptPath: context.transcriptPath } : {}),
212
+ ...(context.cwd ? { cwd: context.cwd } : {}),
213
+ ...(context.workspaceKind ? { workspaceKind: context.workspaceKind } : {}),
214
+ contextOrigin: context.contextOrigin,
215
+ capturedAt: context.capturedAt,
216
+ };
217
+ }
@@ -0,0 +1,120 @@
1
+ import { createHash } from "node:crypto";
2
+ import { memoryWritebackChunkConfig, memoryWritebackChunkEnabled, } from "./memorax-config.js";
3
+ const CODE_CHUNK_GROUP_ID_PREFIX = "memory-writeback-chunk:v1:";
4
+ export function memoryWritebackAddParts(decision, env) {
5
+ if (!memoryWritebackChunkEnabled(env)) {
6
+ return [{ idempotencyKey: decision.idempotencyKey, messages: decision.messages }];
7
+ }
8
+ const config = memoryWritebackChunkConfig(env);
9
+ const payloads = chunkWritebackMessages(decision.messages, config);
10
+ if (payloads.length <= 1) {
11
+ return [{ idempotencyKey: decision.idempotencyKey, messages: payloads[0] ?? decision.messages }];
12
+ }
13
+ const groupId = codeChunkGroupId(decision.idempotencyKey);
14
+ return payloads.map((messages, index) => ({
15
+ idempotencyKey: `${decision.idempotencyKey}:part:${index}`,
16
+ messages,
17
+ chunk: {
18
+ group_id: groupId,
19
+ index,
20
+ count: payloads.length,
21
+ },
22
+ }));
23
+ }
24
+ function codeChunkGroupId(idempotencyKey) {
25
+ return `${CODE_CHUNK_GROUP_ID_PREFIX}${createHash("sha256").update(idempotencyKey).digest("hex")}`;
26
+ }
27
+ export function writebackMessagesContentChars(messages) {
28
+ return messages.reduce((total, message) => total + message.content.length, 0);
29
+ }
30
+ function chunkWritebackMessages(messages, config) {
31
+ const turns = writebackMessageTurns(messages);
32
+ const payloads = [];
33
+ let current = [];
34
+ const flushCurrent = () => {
35
+ if (current.length > 0) {
36
+ payloads.push(current);
37
+ current = [];
38
+ }
39
+ };
40
+ const appendCurrent = (payload) => {
41
+ if (payload.length === 0)
42
+ return;
43
+ if (current.length > 0 && writebackMessagesContentChars([...current, ...payload]) > config.maxChars) {
44
+ flushCurrent();
45
+ }
46
+ current.push(...payload);
47
+ };
48
+ for (const turn of turns) {
49
+ const userChunks = turn.user ? chunkWritebackMessage(turn.user, config) : [];
50
+ const assistantChunks = turn.assistants.flatMap((message) => chunkWritebackMessage(message, config));
51
+ const needsDedicatedPayloads = userChunks.length > 1 || assistantChunks.length > turn.assistants.length;
52
+ if (!needsDedicatedPayloads) {
53
+ appendCurrent([...userChunks, ...assistantChunks]);
54
+ continue;
55
+ }
56
+ flushCurrent();
57
+ if (userChunks.length > 1) {
58
+ if (assistantChunks.length === 0) {
59
+ for (const userChunk of userChunks)
60
+ payloads.push([userChunk]);
61
+ continue;
62
+ }
63
+ for (const userChunk of userChunks.slice(0, -1))
64
+ payloads.push([userChunk]);
65
+ payloads.push([userChunks[userChunks.length - 1], assistantChunks[0]]);
66
+ for (const assistantChunk of assistantChunks.slice(1))
67
+ payloads.push([assistantChunk]);
68
+ continue;
69
+ }
70
+ if (assistantChunks.length === 0) {
71
+ if (userChunks.length === 1)
72
+ payloads.push(userChunks);
73
+ continue;
74
+ }
75
+ if (userChunks.length === 1) {
76
+ payloads.push([userChunks[0], assistantChunks[0]]);
77
+ for (const assistantChunk of assistantChunks.slice(1))
78
+ payloads.push([assistantChunk]);
79
+ continue;
80
+ }
81
+ for (const assistantChunk of assistantChunks)
82
+ payloads.push([assistantChunk]);
83
+ }
84
+ flushCurrent();
85
+ return payloads.filter((payload) => payload.length > 0);
86
+ }
87
+ function writebackMessageTurns(messages) {
88
+ const turns = [];
89
+ for (const message of messages) {
90
+ if (message.role === "user") {
91
+ turns.push({ user: message, assistants: [] });
92
+ continue;
93
+ }
94
+ const turn = turns[turns.length - 1] ?? { assistants: [] };
95
+ if (turns.length === 0)
96
+ turns.push(turn);
97
+ turn.assistants.push(message);
98
+ }
99
+ return turns;
100
+ }
101
+ function chunkWritebackMessage(message, config) {
102
+ return splitTextWithOverlap(message.content, config.maxChars, config.overlapRatio)
103
+ .map((content) => ({ role: message.role, content }))
104
+ .filter((part) => part.content.trim());
105
+ }
106
+ function splitTextWithOverlap(text, maxChars, overlapRatio) {
107
+ if (text.length <= maxChars)
108
+ return [text];
109
+ const overlap = Math.min(Math.floor(maxChars * overlapRatio), Math.floor(maxChars / 2));
110
+ const step = Math.max(1, maxChars - overlap);
111
+ const chunks = [];
112
+ for (let start = 0; start < text.length;) {
113
+ const end = Math.min(text.length, start + maxChars);
114
+ chunks.push(text.slice(start, end));
115
+ if (end >= text.length)
116
+ break;
117
+ start += step;
118
+ }
119
+ return chunks;
120
+ }
@@ -0,0 +1,244 @@
1
+ import { createHash } from "node:crypto";
2
+ import { backendDebug } from "./debug-log.js";
3
+ import { callMemoAddStatus, memoraxConfigFromEnv } from "./memorax-adapter.js";
4
+ import { MEMORAX_PROVIDER_ID, memoraxWritebackEnabled } from "./memorax-config.js";
5
+ import { completeMemoryWritebackTask, createMemoryWritebackTaskProjection, } from "./memory-writeback-task-projection.js";
6
+ import { clientTraceConfigFromEnv } from "./trace-config.js";
7
+ import { recordTraceEvent } from "./trace-store.js";
8
+ const DEFAULT_INTERVAL_MS = 60_000;
9
+ const DEFAULT_MAX_TASKS_PER_RUN = 20;
10
+ const DEFAULT_CONCURRENCY = 4;
11
+ const DEFAULT_MAX_BACKOFF_MS = 60 * 60_000;
12
+ export async function reconcileMemoryWritebackStatuses(options) {
13
+ return reconcileMemoryWritebackStatusesWithPolicy(options);
14
+ }
15
+ export function startMemoryWritebackReconciler(options) {
16
+ let closed = false;
17
+ let active;
18
+ let candidateOffset = 0;
19
+ const intervalMs = positiveInteger(options.intervalMs, DEFAULT_INTERVAL_MS);
20
+ const maxTasks = positiveInteger(options.maxTasks, DEFAULT_MAX_TASKS_PER_RUN);
21
+ const taskProjection = resolveTaskProjection(options);
22
+ const policy = createReconcileBackoffPolicy({
23
+ now: options.now ?? Date.now,
24
+ baseDelayMs: intervalMs,
25
+ maxDelayMs: Math.max(intervalMs, positiveInteger(options.maxBackoffMs, DEFAULT_MAX_BACKOFF_MS)),
26
+ });
27
+ const runNow = () => {
28
+ if (closed)
29
+ return Promise.resolve(emptyReport());
30
+ if (active)
31
+ return active;
32
+ active = reconcileMemoryWritebackStatusesWithPolicy({
33
+ ...options,
34
+ maxTasks,
35
+ candidateOffset,
36
+ taskProjection,
37
+ }, policy).finally(() => {
38
+ candidateOffset += maxTasks;
39
+ active = undefined;
40
+ });
41
+ return active;
42
+ };
43
+ const scheduleRun = () => {
44
+ void runNow().catch((error) => {
45
+ backendDebug("memory_writeback_reconciler.run_failed", {
46
+ error: error instanceof Error ? error.message : String(error),
47
+ });
48
+ });
49
+ };
50
+ scheduleRun();
51
+ const timer = setInterval(scheduleRun, intervalMs);
52
+ timer.unref?.();
53
+ return {
54
+ runNow,
55
+ async close() {
56
+ closed = true;
57
+ clearInterval(timer);
58
+ await active?.catch(() => undefined);
59
+ },
60
+ };
61
+ }
62
+ async function reconcileMemoryWritebackStatusesWithPolicy(options, policy) {
63
+ const env = { ...(options.env ?? process.env), MEMORAX_CODE_HOME: options.memoraxCodeHome };
64
+ const config = memoraxConfigFromEnv(env);
65
+ const taskProjection = resolveTaskProjection(options);
66
+ if (!clientTraceConfigFromEnv(taskProjection.client, env).enabled
67
+ || !config.ok
68
+ || !memoraxWritebackEnabled(env)) {
69
+ return emptyReport();
70
+ }
71
+ const maxTasks = positiveInteger(options.maxTasks, DEFAULT_MAX_TASKS_PER_RUN);
72
+ const concurrency = positiveInteger(options.concurrency, DEFAULT_CONCURRENCY);
73
+ const pendingWritebacks = await taskProjection.listPending();
74
+ policy?.retainPending(pendingWritebacks);
75
+ const dueWritebacks = pendingWritebacks.filter((task) => policy?.isDue(task) ?? true);
76
+ const candidates = rotatedBatch(dueWritebacks, maxTasks, options.candidateOffset ?? 0);
77
+ const queue = [...candidates];
78
+ const report = { inspected: 0, persisted: 0, pending: 0, failed: 0 };
79
+ const workers = Array.from({ length: Math.min(concurrency, queue.length) }, async () => {
80
+ for (;;) {
81
+ const task = queue.shift();
82
+ if (!task)
83
+ return;
84
+ report.inspected += 1;
85
+ try {
86
+ const raw = await callMemoAddStatus(config.config, task.taskId, options.fetchImpl);
87
+ const status = normalizeAddStatus(raw);
88
+ if (isPendingWritebackStatus(status.status)) {
89
+ report.pending += 1;
90
+ policy?.recordResult(task, "pending");
91
+ continue;
92
+ }
93
+ await persistTerminalWritebackStatus(options.memoraxCodeHome, env, task, status);
94
+ report.persisted += 1;
95
+ policy?.recordResult(task, "persisted");
96
+ }
97
+ catch (error) {
98
+ report.failed += 1;
99
+ policy?.recordResult(task, "failed");
100
+ backendDebug("memory_writeback_reconciler.status_failed", {
101
+ taskId: task.taskId,
102
+ error: error instanceof Error ? error.message : String(error),
103
+ });
104
+ }
105
+ }
106
+ });
107
+ await Promise.all(workers);
108
+ return report;
109
+ }
110
+ function resolveTaskProjection(options) {
111
+ return options.taskProjection ?? createMemoryWritebackTaskProjection({
112
+ memoraxCodeHome: options.memoraxCodeHome,
113
+ client: options.client ?? "codex",
114
+ });
115
+ }
116
+ async function persistTerminalWritebackStatus(memoraxCodeHome, env, task, status) {
117
+ const completed = completeMemoryWritebackTask({
118
+ status: status.status,
119
+ ...(status.memoryKnown ? { memory: status.memory, memoryKnown: true } : {}),
120
+ error: status.error,
121
+ });
122
+ const capturedAt = new Date().toISOString();
123
+ const recorded = await recordTraceEvent({
124
+ memoraxCodeHome,
125
+ env,
126
+ eventId: terminalEventId(task, completed.status),
127
+ traceContext: {
128
+ schemaVersion: "1",
129
+ client: task.client,
130
+ sessionId: task.sessionId,
131
+ ...(task.turnId ? { turnId: task.turnId } : {}),
132
+ ...(task.memoryProject ? { memoryProject: task.memoryProject } : {}),
133
+ contextOrigin: "manual",
134
+ capturedAt,
135
+ },
136
+ type: "memory_writeback_status",
137
+ source: "writeback_reconciler",
138
+ operation: "writeback",
139
+ ok: completed.ok,
140
+ request: {
141
+ task_id: task.taskId,
142
+ original_event_id: task.eventId,
143
+ provider: MEMORAX_PROVIDER_ID,
144
+ },
145
+ response: {
146
+ taskId: task.taskId,
147
+ status: completed.status,
148
+ outcome: completed.outcome,
149
+ ...(completed.savedMemoryCount === undefined ? {} : { savedMemoryCount: completed.savedMemoryCount }),
150
+ ...(completed.savedMemoryIds?.length ? { savedMemoryIds: completed.savedMemoryIds } : {}),
151
+ ...(completed.savedMemories?.length ? { savedMemories: completed.savedMemories } : {}),
152
+ },
153
+ error: completed.error,
154
+ });
155
+ if (!recorded.written && recorded.reason !== "duplicate_event") {
156
+ throw new Error(`writeback terminal status was not persisted: ${recorded.reason}`);
157
+ }
158
+ }
159
+ function createReconcileBackoffPolicy(options) {
160
+ const retries = new Map();
161
+ return {
162
+ retainPending(tasks) {
163
+ const pendingKeys = new Set(tasks.map(reconcileCandidateKey));
164
+ for (const key of retries.keys()) {
165
+ if (!pendingKeys.has(key))
166
+ retries.delete(key);
167
+ }
168
+ },
169
+ isDue(task) {
170
+ const key = reconcileCandidateKey(task);
171
+ return (retries.get(key)?.nextAttemptAt ?? 0) <= options.now();
172
+ },
173
+ recordResult(task, result) {
174
+ const key = reconcileCandidateKey(task);
175
+ if (result === "persisted") {
176
+ retries.delete(key);
177
+ return;
178
+ }
179
+ const attempts = (retries.get(key)?.attempts ?? 0) + 1;
180
+ const multiplier = 2 ** Math.min(attempts - 1, 30);
181
+ const delayMs = Math.min(options.maxDelayMs, options.baseDelayMs * multiplier);
182
+ retries.set(key, {
183
+ attempts,
184
+ nextAttemptAt: options.now() + delayMs,
185
+ });
186
+ },
187
+ };
188
+ }
189
+ function reconcileCandidateKey(task) {
190
+ return JSON.stringify([
191
+ task.client,
192
+ task.sessionId,
193
+ task.eventId,
194
+ task.taskId,
195
+ ]);
196
+ }
197
+ function normalizeAddStatus(raw) {
198
+ const envelope = record(raw);
199
+ const data = record(envelope?.data) ?? envelope;
200
+ const status = typeof data?.status === "string" ? data.status.trim().toLowerCase() : "unknown";
201
+ const error = typeof data?.error === "string" && data.error.trim() ? data.error.trim() : null;
202
+ const hasMemoryField = Boolean(data)
203
+ && (Object.prototype.hasOwnProperty.call(data, "memory")
204
+ || Object.prototype.hasOwnProperty.call(data, "memories"));
205
+ const memory = data?.memory ?? data?.memories;
206
+ const memoryKnown = hasMemoryField && memory !== null && memory !== undefined;
207
+ return {
208
+ status,
209
+ ...(memoryKnown ? { memory } : {}),
210
+ memoryKnown,
211
+ error,
212
+ };
213
+ }
214
+ function isPendingWritebackStatus(status) {
215
+ return status === "accepted"
216
+ || status === "processing"
217
+ || status === "queued"
218
+ || status === "pending"
219
+ || status === "unknown";
220
+ }
221
+ function terminalEventId(task, status) {
222
+ const digest = createHash("sha256")
223
+ .update(`${task.sessionId}\u0000${task.eventId}\u0000${task.taskId}\u0000${status}`)
224
+ .digest("hex")
225
+ .slice(0, 32);
226
+ return `memory-writeback-status-${digest}`;
227
+ }
228
+ function positiveInteger(value, fallback) {
229
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : fallback;
230
+ }
231
+ function rotatedBatch(items, limit, offset) {
232
+ if (items.length <= limit)
233
+ return [...items];
234
+ const start = Number.isSafeInteger(offset) && offset > 0 ? offset % items.length : 0;
235
+ return Array.from({ length: limit }, (_, index) => items[(start + index) % items.length]);
236
+ }
237
+ function emptyReport() {
238
+ return { inspected: 0, persisted: 0, pending: 0, failed: 0 };
239
+ }
240
+ function record(value) {
241
+ return value && typeof value === "object" && !Array.isArray(value)
242
+ ? value
243
+ : undefined;
244
+ }