@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,206 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { linkSync, readFileSync, rmSync, statSync, unlinkSync } from "node:fs";
3
+ import { readJsonRuntimeRecord, RuntimeRecordError, writePrivateJsonRecord, } from "../../memorax-code-adapter-common/src/runtime-record.mjs";
4
+ export const BACKEND_SERVICE_RECORD_VERSION = 1;
5
+ const BACKEND_SERVICE_RECORD_KEYS = new Set([
6
+ "version",
7
+ "pid",
8
+ "instanceId",
9
+ "host",
10
+ "port",
11
+ "url",
12
+ "logPath",
13
+ "startedAt",
14
+ ]);
15
+ const BACKEND_INSTANCE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
16
+ export class BackendServiceStateError extends RuntimeRecordError {
17
+ constructor(state, path) {
18
+ super({
19
+ name: "Backend service state",
20
+ path,
21
+ state,
22
+ codePrefix: "BACKEND_SERVICE_STATE",
23
+ recovery: state.status === "unsupported"
24
+ ? "upgrade MemoraX Code or restore a supported service state record"
25
+ : "confirm that no managed Backend owns the recorded process before removing the state file",
26
+ });
27
+ this.name = "BackendServiceStateError";
28
+ }
29
+ }
30
+ export function readBackendServiceRecordAtPath(path) {
31
+ const state = readJsonRuntimeRecord(path);
32
+ if (state.status !== "present")
33
+ return state;
34
+ const value = state.value;
35
+ if (value.version !== BACKEND_SERVICE_RECORD_VERSION) {
36
+ if (Number.isSafeInteger(value.version) && value.version > 0) {
37
+ return { status: "unsupported", version: value.version };
38
+ }
39
+ return { status: "invalid", reason: "invalid_version" };
40
+ }
41
+ if (Object.keys(value).some((key) => !BACKEND_SERVICE_RECORD_KEYS.has(key))) {
42
+ return { status: "invalid", reason: "unknown_fields" };
43
+ }
44
+ if (!Number.isSafeInteger(value.pid) || value.pid <= 0) {
45
+ return { status: "invalid", reason: "invalid_pid" };
46
+ }
47
+ if (!Object.prototype.hasOwnProperty.call(value, "instanceId")) {
48
+ return { status: "invalid", reason: "missing_instance_id" };
49
+ }
50
+ if (typeof value.instanceId !== "string"
51
+ || !BACKEND_INSTANCE_ID_PATTERN.test(value.instanceId)) {
52
+ return { status: "invalid", reason: "invalid_instance_id" };
53
+ }
54
+ const host = nonEmptyString(value.host);
55
+ if (!host)
56
+ return { status: "invalid", reason: "invalid_host" };
57
+ if (!Number.isSafeInteger(value.port)
58
+ || value.port <= 0
59
+ || value.port > 65535) {
60
+ return { status: "invalid", reason: "invalid_port" };
61
+ }
62
+ const url = backendServiceRecordUrl(value.url, value.port);
63
+ if (!url)
64
+ return { status: "invalid", reason: "invalid_url" };
65
+ const logPath = nonEmptyString(value.logPath);
66
+ if (!logPath)
67
+ return { status: "invalid", reason: "invalid_log_path" };
68
+ const startedAt = timestampValue(value.startedAt);
69
+ if (!startedAt)
70
+ return { status: "invalid", reason: "invalid_started_at" };
71
+ return {
72
+ status: "valid",
73
+ record: {
74
+ version: BACKEND_SERVICE_RECORD_VERSION,
75
+ pid: value.pid,
76
+ instanceId: value.instanceId,
77
+ host,
78
+ port: value.port,
79
+ url,
80
+ logPath,
81
+ startedAt,
82
+ },
83
+ };
84
+ }
85
+ export function readBackendServiceStateAtPath(path) {
86
+ const state = readBackendServiceRecordAtPath(path);
87
+ if (state.status === "absent")
88
+ return undefined;
89
+ if (state.status !== "valid")
90
+ throw new BackendServiceStateError(state, path);
91
+ const { version: _version, ...serviceState } = state.record;
92
+ return serviceState;
93
+ }
94
+ export function writeBackendServiceStateAtPath(path, state, durableBoundary, runtime) {
95
+ return writePrivateJsonRecord(path, {
96
+ version: BACKEND_SERVICE_RECORD_VERSION,
97
+ ...state,
98
+ }, {
99
+ ...runtime,
100
+ durableBoundary,
101
+ });
102
+ }
103
+ export function removeBackendServiceStateIfOwnedAtPath(path, expected) {
104
+ const current = readBackendServiceRecordAtPath(path);
105
+ if (current.status === "absent") {
106
+ return { disposition: "not_owned", reason: "absent" };
107
+ }
108
+ if (current.status === "invalid" && current.reason === "unreadable") {
109
+ return removalIoFailure("failed to read Backend service state");
110
+ }
111
+ if (current.status !== "valid" || !sameServiceInstance(current.record, expected)) {
112
+ return { disposition: "not_owned", reason: "replacement" };
113
+ }
114
+ const claimPath = `${path}.delete-${randomUUID()}`;
115
+ try {
116
+ linkSync(path, claimPath);
117
+ }
118
+ catch (error) {
119
+ return isMissingPathError(error)
120
+ ? { disposition: "not_owned", reason: "absent" }
121
+ : removalIoFailure("failed to claim Backend service state", error);
122
+ }
123
+ let result;
124
+ try {
125
+ const pathStat = statSync(path);
126
+ const claimStat = statSync(claimPath);
127
+ if (pathStat.dev !== claimStat.dev || pathStat.ino !== claimStat.ino) {
128
+ result = { disposition: "not_owned", reason: "replacement" };
129
+ }
130
+ else {
131
+ const claimed = readBackendServiceRecordAtPath(claimPath);
132
+ if (claimed.status !== "valid" || !sameServiceInstance(claimed.record, expected)) {
133
+ result = { disposition: "not_owned", reason: "replacement" };
134
+ }
135
+ else if (readFileSync(path, "utf8") !== readFileSync(claimPath, "utf8")) {
136
+ result = { disposition: "not_owned", reason: "replacement" };
137
+ }
138
+ else {
139
+ unlinkSync(path);
140
+ result = { disposition: "removed" };
141
+ }
142
+ }
143
+ }
144
+ catch (error) {
145
+ result = isMissingPathError(error)
146
+ ? { disposition: "not_owned", reason: "absent" }
147
+ : removalIoFailure("failed to remove Backend service state", error);
148
+ }
149
+ try {
150
+ rmSync(claimPath, { force: true });
151
+ }
152
+ catch (error) {
153
+ return removalIoFailure("failed to remove Backend service state claim", error);
154
+ }
155
+ return result;
156
+ }
157
+ function sameServiceInstance(record, expected) {
158
+ return record.pid === expected.pid && record.instanceId === expected.instanceId;
159
+ }
160
+ function removalIoFailure(message, error) {
161
+ const detail = error instanceof Error ? error.message : undefined;
162
+ const errorCode = errorCodeOf(error);
163
+ return {
164
+ disposition: "io_failed",
165
+ error: detail ? `${message}: ${detail}` : message,
166
+ ...(errorCode ? { errorCode } : {}),
167
+ };
168
+ }
169
+ function isMissingPathError(error) {
170
+ return errorCodeOf(error) === "ENOENT";
171
+ }
172
+ function errorCodeOf(error) {
173
+ return typeof error === "object"
174
+ && error !== null
175
+ && "code" in error
176
+ && typeof error.code === "string"
177
+ ? error.code
178
+ : undefined;
179
+ }
180
+ function backendServiceRecordUrl(value, port) {
181
+ const candidate = nonEmptyString(value);
182
+ if (!candidate)
183
+ return undefined;
184
+ try {
185
+ const parsed = new URL(candidate);
186
+ if (parsed.protocol !== "http:"
187
+ || parsed.username
188
+ || parsed.password
189
+ || (parsed.pathname !== "" && parsed.pathname !== "/")
190
+ || parsed.search
191
+ || parsed.hash
192
+ || Number(parsed.port || "80") !== port)
193
+ return undefined;
194
+ return parsed.toString().replace(/\/+$/, "");
195
+ }
196
+ catch {
197
+ return undefined;
198
+ }
199
+ }
200
+ function nonEmptyString(value) {
201
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
202
+ }
203
+ function timestampValue(value) {
204
+ const candidate = nonEmptyString(value);
205
+ return candidate && Number.isFinite(Date.parse(candidate)) ? candidate : undefined;
206
+ }
@@ -0,0 +1,37 @@
1
+ import { BackendConnectionAuthorityError } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
2
+ import { RuntimeRecordError, } from "../../memorax-code-adapter-common/src/runtime-record.mjs";
3
+ export function runtimeRecordServiceFailure(action, error) {
4
+ return {
5
+ ok: false,
6
+ action,
7
+ error: error instanceof Error ? error.message : String(error),
8
+ ...runtimeRecordErrorFields(error),
9
+ };
10
+ }
11
+ export function runtimeRecordErrorFields(error) {
12
+ return error instanceof BackendConnectionAuthorityError || error instanceof RuntimeRecordError
13
+ ? { errorCode: error.code }
14
+ : {};
15
+ }
16
+ export function runtimeRecordDurabilityWarning(record, result) {
17
+ if (result?.durability !== "uncertain")
18
+ return undefined;
19
+ return {
20
+ code: "BACKEND_RUNTIME_RECORD_DURABILITY_UNCERTAIN",
21
+ record,
22
+ ...(result.durabilityErrorCode ? { errorCode: result.durabilityErrorCode } : {}),
23
+ message: `${runtimeRecordLabel(record)} was installed, but crash durability could not be confirmed`,
24
+ };
25
+ }
26
+ export function withRuntimeRecordWarnings(result, warnings) {
27
+ return warnings.length > 0
28
+ ? { ...result, degraded: true, warnings }
29
+ : result;
30
+ }
31
+ function runtimeRecordLabel(record) {
32
+ if (record === "pid")
33
+ return "Backend PID record";
34
+ if (record === "token")
35
+ return "Backend token record";
36
+ return "Backend connection authority";
37
+ }
@@ -0,0 +1,11 @@
1
+ import { backendServiceHome } from "./backend-lifecycle-lock.js";
2
+ import { persistBackendTokenForHome, readBackendTokenForHome, writeBackendTokenForHome, } from "./backend-token-record.js";
3
+ export function readBackendToken(options = {}) {
4
+ return readBackendTokenForHome(backendServiceHome(options));
5
+ }
6
+ export function writeBackendToken(options = {}, rotate = false, runtime) {
7
+ return writeBackendTokenForHome(backendServiceHome(options), rotate, runtime);
8
+ }
9
+ export function persistBackendToken(options, token, runtime) {
10
+ return persistBackendTokenForHome(backendServiceHome(options), token, runtime);
11
+ }
@@ -0,0 +1,133 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdirSync, readFileSync, renameSync, rmSync, unwatchFile, watchFile, writeFileSync, } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ const BACKEND_INSTANCE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
5
+ const BACKEND_SHUTDOWN_REQUEST_POLL_INTERVAL_MS = 50;
6
+ export function backendShutdownRequestPath(memoraxCodeHome) {
7
+ return join(memoraxCodeHome, "runtime", "backend", "backend.shutdown.json");
8
+ }
9
+ export function writeBackendShutdownRequest(memoraxCodeHome, target) {
10
+ assertShutdownTarget(target);
11
+ const path = backendShutdownRequestPath(memoraxCodeHome);
12
+ const directory = join(memoraxCodeHome, "runtime", "backend");
13
+ const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
14
+ const request = {
15
+ version: 1,
16
+ pid: target.pid,
17
+ instanceId: target.instanceId,
18
+ requestedAt: new Date().toISOString(),
19
+ };
20
+ mkdirSync(directory, { recursive: true });
21
+ rmSync(path, { force: true });
22
+ try {
23
+ writeFileSync(temporaryPath, `${JSON.stringify(request, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
24
+ renameSync(temporaryPath, path);
25
+ }
26
+ catch (error) {
27
+ rmSync(temporaryPath, { force: true });
28
+ throw error;
29
+ }
30
+ return path;
31
+ }
32
+ export function clearBackendShutdownRequest(memoraxCodeHome) {
33
+ rmSync(backendShutdownRequestPath(memoraxCodeHome), { force: true });
34
+ }
35
+ export function startBackendShutdownRequestWatcher(options) {
36
+ assertShutdownTarget(options);
37
+ const path = backendShutdownRequestPath(options.memoraxCodeHome);
38
+ const directory = dirname(path);
39
+ let closed = false;
40
+ let accepted = false;
41
+ let watching = false;
42
+ function invokeShutdown() {
43
+ if (closed)
44
+ return;
45
+ void Promise.resolve(options.onShutdown()).catch((error) => {
46
+ options.onError?.(error);
47
+ });
48
+ }
49
+ function stopWatching() {
50
+ if (!watching)
51
+ return;
52
+ watching = false;
53
+ unwatchFile(path, inspect);
54
+ }
55
+ function inspect() {
56
+ if (closed || accepted)
57
+ return;
58
+ try {
59
+ if (!takeMatchingShutdownRequest(path, options))
60
+ return;
61
+ accepted = true;
62
+ stopWatching();
63
+ queueMicrotask(invokeShutdown);
64
+ }
65
+ catch (error) {
66
+ options.onError?.(error);
67
+ }
68
+ }
69
+ mkdirSync(directory, { recursive: true });
70
+ inspect();
71
+ if (!accepted) {
72
+ watching = true;
73
+ // Directory fs.watch events may be coalesced or dropped. Poll the exact
74
+ // request path so a graceful Windows shutdown cannot depend on one event.
75
+ watchFile(path, {
76
+ persistent: false,
77
+ interval: BACKEND_SHUTDOWN_REQUEST_POLL_INTERVAL_MS,
78
+ }, inspect);
79
+ // Close the gap between the initial inspection and polling registration.
80
+ inspect();
81
+ }
82
+ return {
83
+ close() {
84
+ if (closed)
85
+ return;
86
+ closed = true;
87
+ stopWatching();
88
+ clearBackendShutdownRequest(options.memoraxCodeHome);
89
+ },
90
+ };
91
+ }
92
+ function takeMatchingShutdownRequest(path, target) {
93
+ let raw;
94
+ try {
95
+ raw = readFileSync(path, "utf8");
96
+ }
97
+ catch (error) {
98
+ if (error.code === "ENOENT")
99
+ return false;
100
+ throw error;
101
+ }
102
+ rmSync(path, { force: true });
103
+ let parsed;
104
+ try {
105
+ parsed = JSON.parse(raw);
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ if (!isShutdownRequest(parsed))
111
+ return false;
112
+ return parsed.pid === target.pid && parsed.instanceId === target.instanceId;
113
+ }
114
+ function isShutdownRequest(value) {
115
+ if (typeof value !== "object" || value === null || Array.isArray(value))
116
+ return false;
117
+ const request = value;
118
+ return request.version === 1
119
+ && Number.isSafeInteger(request.pid)
120
+ && request.pid > 0
121
+ && typeof request.instanceId === "string"
122
+ && BACKEND_INSTANCE_ID_PATTERN.test(request.instanceId)
123
+ && typeof request.requestedAt === "string"
124
+ && Number.isFinite(Date.parse(request.requestedAt));
125
+ }
126
+ function assertShutdownTarget(target) {
127
+ if (!Number.isSafeInteger(target.pid) || target.pid <= 0) {
128
+ throw new TypeError("Backend shutdown target PID must be a positive safe integer");
129
+ }
130
+ if (!BACKEND_INSTANCE_ID_PATTERN.test(target.instanceId)) {
131
+ throw new TypeError("Backend shutdown target instanceId is invalid");
132
+ }
133
+ }
@@ -0,0 +1,58 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { backendEnv } from "./backend-env.js";
4
+ export function createBackendState(host = "127.0.0.1", options = {}) {
5
+ const authToken = options.authToken ?? backendEnv("TOKEN");
6
+ const sessionHome = options.sessionHome ?? process.env.MEMORAX_CODE_HOME ?? join(homedir(), ".memorax-code");
7
+ const claudeProjectsRoot = options.claudeProjectsRoot
8
+ ?? memoryViewerClaudeProjectsRootFromEnv(process.env);
9
+ const security = {
10
+ ...envBackendSecurity(),
11
+ ...options.security,
12
+ };
13
+ validateBackendSecurity(host, authToken, security);
14
+ return {
15
+ sessionHome,
16
+ claudeProjectsRoot,
17
+ authToken,
18
+ security,
19
+ };
20
+ }
21
+ export function memoryViewerClaudeProjectsRootFromEnv(env) {
22
+ const configured = env.MEMORAX_CODE_MEMORY_VIEWER_CLAUDE_PROJECTS_ROOT?.trim();
23
+ if (!configured)
24
+ return undefined;
25
+ if (configured === "disabled")
26
+ return false;
27
+ return resolve(configured);
28
+ }
29
+ function envBackendSecurity() {
30
+ const mode = backendEnv("MODE") === "server" ? "server" : "local";
31
+ return {
32
+ mode,
33
+ allowExternalAccess: parseBooleanEnv(backendEnv("ALLOW_EXTERNAL")) ?? mode === "server",
34
+ };
35
+ }
36
+ function validateBackendSecurity(host, authToken, security) {
37
+ if (!isLoopbackHost(host) && !security.allowExternalAccess) {
38
+ const hint = "set MEMORAX_CODE_BACKEND_ALLOW_EXTERNAL=1 and configure MEMORAX_CODE_BACKEND_TOKEN to opt in";
39
+ throw new Error(`external Backend host "${host}" is disabled; ${hint}`);
40
+ }
41
+ if ((!isLoopbackHost(host) || security.mode === "server") && !authToken) {
42
+ throw new Error("MEMORAX_CODE_BACKEND_TOKEN is required for server mode or external Backend access");
43
+ }
44
+ }
45
+ export function isLoopbackHost(host) {
46
+ const normalized = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
47
+ return normalized === "localhost" || normalized === "127.0.0.1" || normalized === "::1";
48
+ }
49
+ function parseBooleanEnv(value) {
50
+ if (value === undefined)
51
+ return undefined;
52
+ const normalized = value.trim().toLowerCase();
53
+ if (["1", "true", "yes", "on", "enabled"].includes(normalized))
54
+ return true;
55
+ if (["0", "false", "no", "off", "disabled"].includes(normalized))
56
+ return false;
57
+ return undefined;
58
+ }
@@ -0,0 +1,53 @@
1
+ //! Local backend health probe used by lifecycle status.
2
+ import { resolve } from "node:path";
3
+ export async function runBackendStatus(backendUrl, backendToken, timeoutMs = 5000, expectedIdentity) {
4
+ try {
5
+ const response = await fetch(new URL("/health", backendUrl), {
6
+ headers: backendHeaders(backendToken),
7
+ signal: AbortSignal.timeout(Math.max(1, Math.trunc(timeoutMs))),
8
+ });
9
+ const body = await response.json().catch(() => ({}));
10
+ const service = typeof body.service === "string" ? body.service : undefined;
11
+ const instanceId = typeof body.instanceId === "string" ? body.instanceId : undefined;
12
+ const identity = expectedIdentity
13
+ ? {
14
+ urlMatches: normalizeUrl(backendUrl) === normalizeUrl(expectedIdentity.url),
15
+ instanceIdMatches: !expectedIdentity.instanceId || instanceId === expectedIdentity.instanceId,
16
+ sessionHomeMatches: !expectedIdentity.sessionHome
17
+ || (typeof body.state?.sessionHome === "string"
18
+ && resolve(body.state.sessionHome) === resolve(expectedIdentity.sessionHome)),
19
+ }
20
+ : undefined;
21
+ return {
22
+ ok: response.ok
23
+ && body.ok === true
24
+ && service === "memorax-code-backend"
25
+ && (!identity || (identity.urlMatches && identity.instanceIdMatches && identity.sessionHomeMatches)),
26
+ url: backendUrl,
27
+ status: response.status,
28
+ service,
29
+ instanceId,
30
+ authRequired: typeof body.authRequired === "boolean" ? body.authRequired : undefined,
31
+ state: body.state,
32
+ identity,
33
+ };
34
+ }
35
+ catch (error) {
36
+ return { ok: false, url: backendUrl, error: error instanceof Error ? error.message : String(error) };
37
+ }
38
+ }
39
+ function normalizeUrl(value) {
40
+ try {
41
+ return new URL(value).toString().replace(/\/+$/, "");
42
+ }
43
+ catch {
44
+ return value.replace(/\/+$/, "");
45
+ }
46
+ }
47
+ function backendHeaders(backendToken, extra = {}) {
48
+ return {
49
+ ...extra,
50
+ connection: "close",
51
+ ...(backendToken ? { authorization: `Bearer ${backendToken}` } : {}),
52
+ };
53
+ }
@@ -0,0 +1,79 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { backendTokenPath, BackendTokenRecordError, readBackendTokenRecordState, writeBackendTokenRecord, } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
3
+ export function readBackendTokenForHome(memoraxCodeHome) {
4
+ const state = readBackendTokenRecordState(memoraxCodeHome);
5
+ if (state.status === "absent")
6
+ return undefined;
7
+ if (state.status !== "valid") {
8
+ throw new BackendTokenRecordError(state, backendTokenPath(memoraxCodeHome));
9
+ }
10
+ return serviceTokenRecord(state.record, backendTokenPath(memoraxCodeHome));
11
+ }
12
+ export function writeBackendTokenForHome(memoraxCodeHome, rotate = false, runtime) {
13
+ const state = readBackendTokenRecordState(memoraxCodeHome);
14
+ if (state.status === "unsupported") {
15
+ throw new BackendTokenRecordError(state, backendTokenPath(memoraxCodeHome));
16
+ }
17
+ if (state.status === "invalid" && !rotate) {
18
+ throw new BackendTokenRecordError(state, backendTokenPath(memoraxCodeHome));
19
+ }
20
+ const existing = state.status === "valid"
21
+ ? serviceTokenRecord(state.record, backendTokenPath(memoraxCodeHome))
22
+ : undefined;
23
+ if (existing && !rotate)
24
+ return existing;
25
+ const now = new Date().toISOString();
26
+ return persistTokenRecord(memoraxCodeHome, {
27
+ token: randomBytes(32).toString("base64url"),
28
+ tokenPath: backendTokenPath(memoraxCodeHome),
29
+ createdAt: existing?.createdAt ?? now,
30
+ ...(existing ? { rotatedAt: now } : {}),
31
+ }, runtime);
32
+ }
33
+ export function persistBackendTokenForHome(memoraxCodeHome, token, runtime) {
34
+ const state = readBackendTokenRecordState(memoraxCodeHome);
35
+ if (state.status !== "absent" && state.status !== "valid") {
36
+ throw new BackendTokenRecordError(state, backendTokenPath(memoraxCodeHome));
37
+ }
38
+ const existing = state.status === "valid"
39
+ ? serviceTokenRecord(state.record, backendTokenPath(memoraxCodeHome))
40
+ : undefined;
41
+ if (existing?.token === token)
42
+ return existing;
43
+ const now = new Date().toISOString();
44
+ return persistTokenRecord(memoraxCodeHome, {
45
+ token,
46
+ tokenPath: backendTokenPath(memoraxCodeHome),
47
+ createdAt: existing?.createdAt ?? now,
48
+ ...(existing ? { rotatedAt: now } : {}),
49
+ }, runtime);
50
+ }
51
+ export function assertBackendTokenPersistenceEligible(memoraxCodeHome) {
52
+ const state = readBackendTokenRecordState(memoraxCodeHome);
53
+ if (state.status === "invalid" || state.status === "unsupported") {
54
+ throw new BackendTokenRecordError(state, backendTokenPath(memoraxCodeHome));
55
+ }
56
+ }
57
+ function serviceTokenRecord(record, path, persistence) {
58
+ return {
59
+ token: record.token,
60
+ tokenPath: path,
61
+ createdAt: record.createdAt,
62
+ ...(record.rotatedAt ? { rotatedAt: record.rotatedAt } : {}),
63
+ ...(persistence ? { persistence } : {}),
64
+ };
65
+ }
66
+ function persistTokenRecord(memoraxCodeHome, record, runtime) {
67
+ const written = writeBackendTokenRecord({
68
+ memoraxCodeHome,
69
+ token: record.token,
70
+ createdAt: record.createdAt,
71
+ ...(record.rotatedAt ? { rotatedAt: record.rotatedAt } : {}),
72
+ }, runtime);
73
+ return serviceTokenRecord(written.record, written.path, {
74
+ durability: written.durability,
75
+ ...(written.durabilityErrorCode
76
+ ? { durabilityErrorCode: written.durabilityErrorCode }
77
+ : {}),
78
+ });
79
+ }