@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,391 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { spawnSync } from "node:child_process";
3
+ import {
4
+ closeSync,
5
+ existsSync,
6
+ linkSync,
7
+ mkdirSync,
8
+ openSync,
9
+ readFileSync,
10
+ readdirSync,
11
+ renameSync,
12
+ rmSync,
13
+ statSync,
14
+ unlinkSync,
15
+ writeFileSync,
16
+ } from "node:fs";
17
+ import { basename, dirname, join } from "node:path";
18
+ import { performance } from "node:perf_hooks";
19
+ import { ensurePrivateDirectory } from "./runtime-record.mjs";
20
+
21
+ const JSON_FILE_LOCK_TIMEOUT_MS = 1500;
22
+ const JSON_FILE_LOCK_STALE_MS = 30000;
23
+ const JSON_FILE_LOCK_RETRY_MS = 10;
24
+ const PROCESS_START_TOLERANCE_MS = 5000;
25
+ const LOCK_SLEEP_BUFFER = new Int32Array(new SharedArrayBuffer(4));
26
+ const HOOK_INPUT_SYMBOL = Symbol.for("memorax-code.client-hook.input.v1");
27
+
28
+ export function readAdapterState(path) {
29
+ const state = readJsonFile(path);
30
+ if (state?.unreadable) return { unreadable: true };
31
+ return state?.value;
32
+ }
33
+
34
+ export function readJsonFile(path) {
35
+ if (!path || !existsSync(path)) return undefined;
36
+ try {
37
+ return { value: JSON.parse(readFileSync(path, "utf8")) };
38
+ } catch {
39
+ return { unreadable: true };
40
+ }
41
+ }
42
+
43
+ export function readJsonValue(path) {
44
+ return readJsonFile(path)?.value;
45
+ }
46
+
47
+ export async function readStdinJson() {
48
+ const injected = globalThis[HOOK_INPUT_SYMBOL];
49
+ if (injected && typeof injected === "object" && !Array.isArray(injected)) return injected;
50
+ let text = "";
51
+ for await (const chunk of process.stdin) text += chunk;
52
+ if (!text.trim()) return {};
53
+ try {
54
+ return JSON.parse(text);
55
+ } catch {
56
+ return {};
57
+ }
58
+ }
59
+
60
+ export function injectClientHookInput(input) {
61
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
62
+ throw new TypeError("client Hook input must be an object");
63
+ }
64
+ globalThis[HOOK_INPUT_SYMBOL] = input;
65
+ }
66
+
67
+ export function sha256(value) {
68
+ return createHash("sha256").update(value).digest("hex");
69
+ }
70
+
71
+ export function stringOption(value) {
72
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
73
+ }
74
+
75
+ export function atomicWriteJson(path, value) {
76
+ atomicWriteText(path, `${JSON.stringify(value, null, 2)}\n`);
77
+ }
78
+
79
+ export function atomicWriteText(path, value) {
80
+ mkdirSync(dirname(path), { recursive: true });
81
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
82
+ try {
83
+ writeFileSync(tmp, value);
84
+ renameSync(tmp, path);
85
+ } catch (error) {
86
+ rmSync(tmp, { force: true });
87
+ throw error;
88
+ }
89
+ }
90
+
91
+ export function withJsonFileLock(path, operation, options = {}) {
92
+ const timeoutMs = positiveInteger(options.timeoutMs, JSON_FILE_LOCK_TIMEOUT_MS);
93
+ const staleMs = positiveInteger(options.staleMs, JSON_FILE_LOCK_STALE_MS);
94
+ const retryMs = positiveInteger(options.retryMs, JSON_FILE_LOCK_RETRY_MS);
95
+ const lockPath = `${path}.lock`;
96
+ const ownerId = `${process.pid}:${randomUUID()}`;
97
+ const deadline = Date.now() + timeoutMs;
98
+ const observedProcessStarts = new Map();
99
+ const directory = dirname(path);
100
+ ensurePrivateDirectory(directory, { durableBoundary: directory });
101
+
102
+ while (!tryAcquireJsonFileLock(lockPath, ownerId)) {
103
+ if (removeStaleJsonFileLock(lockPath, staleMs, observedProcessStarts)) continue;
104
+ const remainingMs = deadline - Date.now();
105
+ if (remainingMs <= 0) {
106
+ const error = new Error(`timed out waiting for JSON state lock: ${lockPath}`);
107
+ error.code = "JSON_FILE_LOCK_TIMEOUT";
108
+ error.path = path;
109
+ error.lockPath = lockPath;
110
+ throw error;
111
+ }
112
+ sleepSync(Math.min(retryMs, remainingMs));
113
+ }
114
+
115
+ try {
116
+ const result = operation();
117
+ if (result && typeof result.then === "function") {
118
+ throw new TypeError("withJsonFileLock operation must be synchronous");
119
+ }
120
+ return result;
121
+ } finally {
122
+ releaseJsonFileLock(lockPath, ownerId);
123
+ }
124
+ }
125
+
126
+ export async function withJsonFileLockAsync(path, operation, options = {}) {
127
+ const timeoutMs = positiveInteger(options.timeoutMs, JSON_FILE_LOCK_TIMEOUT_MS);
128
+ const staleMs = positiveInteger(options.staleMs, JSON_FILE_LOCK_STALE_MS);
129
+ const retryMs = positiveInteger(options.retryMs, JSON_FILE_LOCK_RETRY_MS);
130
+ const lockPath = `${path}.lock`;
131
+ const ownerId = `${process.pid}:${randomUUID()}`;
132
+ const deadline = Date.now() + timeoutMs;
133
+ const observedProcessStarts = new Map();
134
+ const directory = dirname(path);
135
+ ensurePrivateDirectory(directory, { durableBoundary: directory });
136
+
137
+ while (!tryAcquireJsonFileLock(lockPath, ownerId)) {
138
+ if (removeStaleJsonFileLock(lockPath, staleMs, observedProcessStarts)) continue;
139
+ const remainingMs = deadline - Date.now();
140
+ if (remainingMs <= 0) {
141
+ const error = new Error(`timed out waiting for JSON state lock: ${lockPath}`);
142
+ error.code = "JSON_FILE_LOCK_TIMEOUT";
143
+ error.path = path;
144
+ error.lockPath = lockPath;
145
+ throw error;
146
+ }
147
+ await sleep(Math.min(retryMs, remainingMs));
148
+ }
149
+
150
+ try {
151
+ return await operation();
152
+ } finally {
153
+ releaseJsonFileLock(lockPath, ownerId);
154
+ }
155
+ }
156
+
157
+ function tryAcquireJsonFileLock(lockPath, ownerId) {
158
+ let descriptor;
159
+ try {
160
+ descriptor = openSync(lockPath, "wx", 0o600);
161
+ writeFileSync(descriptor, `${JSON.stringify({
162
+ version: 1,
163
+ ownerId,
164
+ pid: process.pid,
165
+ processStartedAt: new Date(performance.timeOrigin).toISOString(),
166
+ createdAt: new Date().toISOString(),
167
+ })}\n`);
168
+ closeSync(descriptor);
169
+ return true;
170
+ } catch (error) {
171
+ if (descriptor !== undefined) {
172
+ try {
173
+ closeSync(descriptor);
174
+ } catch {
175
+ // Best-effort cleanup after an incomplete lock acquisition.
176
+ }
177
+ rmSync(lockPath, { force: true });
178
+ }
179
+ if (error?.code === "EEXIST") return false;
180
+ throw error;
181
+ }
182
+ }
183
+
184
+ function removeStaleJsonFileLock(lockPath, staleMs, observedProcessStarts) {
185
+ let snapshot;
186
+ try {
187
+ snapshot = readJsonFileLockSnapshot(lockPath);
188
+ } catch {
189
+ return false;
190
+ }
191
+ const staleByAge = Date.now() - snapshot.mtimeMs >= staleMs;
192
+ if (snapshot.pid) {
193
+ if (pidIsAlive(snapshot.pid)) {
194
+ if (!staleByAge) return false;
195
+ // PID liveness alone is insufficient because operating systems reuse PIDs.
196
+ // A matching process birth keeps even a long-running owner authoritative.
197
+ const liveProcessStartedAtMs = observedProcessStart(
198
+ snapshot.pid,
199
+ observedProcessStarts,
200
+ );
201
+ if (liveProcessStartedAtMs === undefined) return false;
202
+ if (snapshot.processStartedAtMs !== undefined) {
203
+ if (sameProcessStart(snapshot.processStartedAtMs, liveProcessStartedAtMs)) return false;
204
+ } else {
205
+ const lockCreatedAtMs = snapshot.createdAtMs ?? snapshot.mtimeMs;
206
+ if (liveProcessStartedAtMs <= lockCreatedAtMs + PROCESS_START_TOLERANCE_MS) return false;
207
+ }
208
+ }
209
+ } else if (!staleByAge) {
210
+ return false;
211
+ }
212
+
213
+ removeAbandonedReapClaims(lockPath, observedProcessStarts);
214
+ // The hard-link count is the reaper election: only a claimant that observes
215
+ // exactly the lock path and its own claim may remove the stale lock.
216
+ const claimId = randomUUID().replaceAll("-", "").slice(0, 24);
217
+ const claimPath = `${lockPath}.reap-v1-${process.pid}-${Math.trunc(performance.timeOrigin)}-${claimId}`;
218
+ try {
219
+ linkSync(lockPath, claimPath);
220
+ } catch {
221
+ return false;
222
+ }
223
+ try {
224
+ const current = statSync(lockPath);
225
+ const claim = statSync(claimPath);
226
+ if (current.dev !== claim.dev || current.ino !== claim.ino) return false;
227
+ if (current.nlink !== 2 || claim.nlink !== 2) return false;
228
+ if (readFileSync(claimPath, "utf8") !== snapshot.raw) return false;
229
+ unlinkSync(lockPath);
230
+ return true;
231
+ } catch {
232
+ return false;
233
+ } finally {
234
+ rmSync(claimPath, { force: true });
235
+ }
236
+ }
237
+
238
+ function removeAbandonedReapClaims(lockPath, observedProcessStarts) {
239
+ const directory = dirname(lockPath);
240
+ const prefix = `${basename(lockPath)}.reap-`;
241
+ let entries;
242
+ try {
243
+ entries = readdirSync(directory);
244
+ } catch {
245
+ return;
246
+ }
247
+ for (const entry of entries) {
248
+ if (!entry.startsWith(prefix)) continue;
249
+ const suffix = entry.slice(prefix.length);
250
+ const match = /^v1-(\d+)-(\d+)-[a-f0-9]{24}$/.exec(suffix);
251
+ if (!match) continue;
252
+ const pid = Number(match[1]);
253
+ const expectedProcessStartedAtMs = Number(match[2]);
254
+ if (reapClaimOwnerIsAlive(
255
+ pid,
256
+ expectedProcessStartedAtMs,
257
+ observedProcessStarts,
258
+ )) continue;
259
+ rmSync(join(directory, entry), { force: true });
260
+ }
261
+ }
262
+
263
+ function reapClaimOwnerIsAlive(pid, expectedProcessStartedAtMs, observedProcessStarts) {
264
+ if (!Number.isSafeInteger(pid) || pid <= 0) return false;
265
+ if (!Number.isSafeInteger(expectedProcessStartedAtMs) || expectedProcessStartedAtMs <= 0) {
266
+ return false;
267
+ }
268
+ if (!pidIsAlive(pid)) return false;
269
+ const actualProcessStartedAtMs = observedProcessStart(pid, observedProcessStarts);
270
+ if (actualProcessStartedAtMs === undefined) return true;
271
+ return sameProcessStart(expectedProcessStartedAtMs, actualProcessStartedAtMs);
272
+ }
273
+
274
+ function releaseJsonFileLock(lockPath, ownerId) {
275
+ try {
276
+ const lock = JSON.parse(readFileSync(lockPath, "utf8"));
277
+ if (lock?.ownerId === ownerId) unlinkSync(lockPath);
278
+ } catch {
279
+ // A missing, changed, or unreadable lock is not ours to remove.
280
+ }
281
+ }
282
+
283
+ function readJsonFileLockSnapshot(lockPath) {
284
+ const raw = readFileSync(lockPath, "utf8");
285
+ const stat = statSync(lockPath);
286
+ let pid;
287
+ let processStartedAtMs;
288
+ let createdAtMs;
289
+ try {
290
+ const parsed = JSON.parse(raw);
291
+ if (Number.isInteger(parsed?.pid) && parsed.pid > 0) pid = parsed.pid;
292
+ processStartedAtMs = timestampMs(parsed?.processStartedAt);
293
+ createdAtMs = timestampMs(parsed?.createdAt);
294
+ } catch {
295
+ // Invalid abandoned locks become reclaimable only after the stale threshold.
296
+ }
297
+ return {
298
+ raw,
299
+ pid,
300
+ processStartedAtMs,
301
+ createdAtMs,
302
+ dev: stat.dev,
303
+ ino: stat.ino,
304
+ mtimeMs: stat.mtimeMs,
305
+ };
306
+ }
307
+
308
+ function pidIsAlive(pid) {
309
+ try {
310
+ process.kill(pid, 0);
311
+ return true;
312
+ } catch (error) {
313
+ return error?.code !== "ESRCH";
314
+ }
315
+ }
316
+
317
+ function observedProcessStart(pid, observedProcessStarts) {
318
+ if (observedProcessStarts.has(pid)) {
319
+ return observedProcessStarts.get(pid);
320
+ }
321
+ const startedAtMs = readProcessStartedAtMs(pid);
322
+ observedProcessStarts.set(pid, startedAtMs);
323
+ return startedAtMs;
324
+ }
325
+
326
+ function readProcessStartedAtMs(pid) {
327
+ if (!Number.isSafeInteger(pid) || pid <= 0) return undefined;
328
+ if (pid === process.pid) return performance.timeOrigin;
329
+ if (process.platform === "win32") return readWindowsProcessStartedAtMs(pid);
330
+ const ps = ["/bin/ps", "/usr/bin/ps"].find(existsSync);
331
+ if (!ps) return undefined;
332
+ const result = spawnSync(
333
+ ps,
334
+ ["-p", String(pid), "-o", "lstart="],
335
+ {
336
+ encoding: "utf8",
337
+ env: { ...process.env, LANG: "C", LC_ALL: "C" },
338
+ timeout: 1000,
339
+ windowsHide: true,
340
+ },
341
+ );
342
+ if (result.status !== 0) return undefined;
343
+ return timestampMs(result.stdout.trim());
344
+ }
345
+
346
+ function readWindowsProcessStartedAtMs(pid) {
347
+ const systemRoot = process.env.SystemRoot;
348
+ if (!systemRoot) return undefined;
349
+ const powershell = join(
350
+ systemRoot,
351
+ "System32",
352
+ "WindowsPowerShell",
353
+ "v1.0",
354
+ "powershell.exe",
355
+ );
356
+ if (!existsSync(powershell)) return undefined;
357
+ const command = [
358
+ `$item = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}' -ErrorAction SilentlyContinue`,
359
+ "if ($null -ne $item) { $item.CreationDate.ToUniversalTime().ToString('o') }",
360
+ ].join("; ");
361
+ const result = spawnSync(
362
+ powershell,
363
+ ["-NoProfile", "-NonInteractive", "-Command", command],
364
+ { encoding: "utf8", timeout: 1000, windowsHide: true },
365
+ );
366
+ if (result.status !== 0) return undefined;
367
+ return timestampMs(result.stdout.trim());
368
+ }
369
+
370
+ function sameProcessStart(expectedMs, actualMs) {
371
+ return Math.abs(expectedMs - actualMs) <= PROCESS_START_TOLERANCE_MS;
372
+ }
373
+
374
+ function timestampMs(value) {
375
+ if (typeof value !== "string" || !value.trim()) return undefined;
376
+ const parsed = Date.parse(value);
377
+ return Number.isFinite(parsed) ? parsed : undefined;
378
+ }
379
+
380
+ function sleepSync(milliseconds) {
381
+ Atomics.wait(LOCK_SLEEP_BUFFER, 0, 0, Math.max(1, Math.trunc(milliseconds)));
382
+ }
383
+
384
+ function sleep(milliseconds) {
385
+ return new Promise((resolve) => setTimeout(resolve, Math.max(1, Math.trunc(milliseconds))));
386
+ }
387
+
388
+ function positiveInteger(value, fallback) {
389
+ const normalized = Number.isFinite(value) ? Math.trunc(value) : 0;
390
+ return normalized > 0 ? normalized : fallback;
391
+ }
@@ -0,0 +1,137 @@
1
+ import { existsSync, realpathSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import {
4
+ atomicWriteJson,
5
+ readJsonFile,
6
+ readStdinJson,
7
+ stringOption,
8
+ withJsonFileLock,
9
+ } from "../config-utils.mjs";
10
+
11
+ export async function runCaptureCwdHook(options) {
12
+ const input = await readStdinJson();
13
+ const transcriptPath = stringOption(input.transcript_path) ?? stringOption(input.transcriptPath);
14
+ if (options.requireTranscriptPathForTurnEvents && isTurnScopedEvent(input) && !transcriptPath) return;
15
+ const cwd = typeof input.cwd === "string" && input.cwd.trim()
16
+ ? safeRealpath(input.cwd.trim())
17
+ : undefined;
18
+
19
+ const record = {
20
+ event: stringOption(input.hook_event_name) ?? stringOption(input.event) ?? stringOption(input.type) ?? "unknown",
21
+ sessionId: stringOption(input.session_id) ?? stringOption(input.sessionId),
22
+ transcriptPath,
23
+ cwd,
24
+ capturedAt: new Date().toISOString(),
25
+ };
26
+
27
+ const registryPath = memoraxCodeSessionRegistryPath(options);
28
+
29
+ if (cwd) {
30
+ const targets = [
31
+ memoraxCodeWorkspacePath(options),
32
+ pluginDataWorkspacePath(),
33
+ ].filter(Boolean);
34
+
35
+ for (const target of targets) writeWorkspaceState(target, record, options);
36
+ }
37
+
38
+ writeSessionRegistry(registryPath, record, options);
39
+ return input;
40
+ }
41
+
42
+ function isTurnScopedEvent(input) {
43
+ const event = stringOption(input.hook_event_name) ?? stringOption(input.event) ?? stringOption(input.type);
44
+ return event === "UserPromptSubmit" || event === "Stop";
45
+ }
46
+
47
+ function memoraxCodeWorkspacePath(options) {
48
+ const home = memoraxCodeHome();
49
+ return home ? join(home, "adapters", options.adapterDir, "workspaces.json") : undefined;
50
+ }
51
+
52
+ function memoraxCodeSessionRegistryPath(options) {
53
+ const home = memoraxCodeHome();
54
+ return home ? join(home, "adapters", options.adapterDir, "session-registry.json") : undefined;
55
+ }
56
+
57
+ function memoraxCodeHome() {
58
+ return process.env.MEMORAX_CODE_HOME || (process.env.HOME ? join(process.env.HOME, ".memorax-code") : undefined);
59
+ }
60
+
61
+ function pluginDataWorkspacePath() {
62
+ return process.env.PLUGIN_DATA ? join(process.env.PLUGIN_DATA, "workspaces.json") : undefined;
63
+ }
64
+
65
+ function writeWorkspaceState(path, record, options) {
66
+ withJsonFileLock(path, () => {
67
+ const existing = readJsonFile(path);
68
+ if (existing?.unreadable) return;
69
+ const state = existing?.value ?? { version: 1, runtime: options.runtime, sessions: {} };
70
+ state.version = 1;
71
+ state.runtime = options.runtime;
72
+ state.updatedAt = record.capturedAt;
73
+ state.latest = record;
74
+ state.sessions = typeof state.sessions === "object" && state.sessions && !Array.isArray(state.sessions)
75
+ ? state.sessions
76
+ : {};
77
+ for (const key of recordKeys(record, options)) state.sessions[key] = record;
78
+ atomicWriteJson(path, state);
79
+ });
80
+ }
81
+
82
+ function writeSessionRegistry(path, record, options) {
83
+ if (!path) return undefined;
84
+ const keys = recordKeys(record, options);
85
+ if (keys.length === 0) return undefined;
86
+ return withJsonFileLock(path, () => {
87
+ const existing = readJsonFile(path);
88
+ if (existing?.unreadable) return undefined;
89
+ const state = existing?.value ?? { version: 1, runtime: options.runtime, sessions: {} };
90
+ state.version = 1;
91
+ state.runtime = options.runtime;
92
+ state.sessions = typeof state.sessions === "object" && state.sessions && !Array.isArray(state.sessions)
93
+ ? state.sessions
94
+ : {};
95
+ const matchedKey = keys.find((key) => state.sessions[key]);
96
+ const key = matchedKey ?? keys[0];
97
+ const current = state.sessions[key];
98
+ const session = {
99
+ key,
100
+ title: current?.title,
101
+ [options.sessionIdField]: record.sessionId ?? current?.[options.sessionIdField] ?? key,
102
+ transcriptPath: record.transcriptPath ?? current?.transcriptPath,
103
+ workspace: record.cwd ?? current?.workspace,
104
+ };
105
+ state.updatedAt = record.capturedAt;
106
+ state.sessions[key] = session;
107
+ atomicWriteJson(path, state);
108
+ });
109
+ }
110
+
111
+ function recordKeys(record, options) {
112
+ const values = [];
113
+ if (record.sessionId) values.push(record.sessionId);
114
+ if (record.transcriptPath) values.push(record.transcriptPath, basenameWithoutExt(record.transcriptPath));
115
+ const keys = new Set();
116
+ for (const value of values) {
117
+ if (!value) continue;
118
+ keys.add(value);
119
+ if (value.startsWith(`${options.sessionKeyPrefix}_`)) keys.add(value.slice(options.sessionKeyPrefix.length + 1));
120
+ else keys.add(`${options.sessionKeyPrefix}_${value}`);
121
+ }
122
+ return [...keys];
123
+ }
124
+
125
+ function basenameWithoutExt(value) {
126
+ const base = value.split(/[\\/]/).pop() ?? value;
127
+ return base.replace(/\.[^.]+$/, "");
128
+ }
129
+
130
+ function safeRealpath(path) {
131
+ try {
132
+ const resolved = resolve(path);
133
+ return existsSync(resolved) ? realpathSync(resolved) : undefined;
134
+ } catch {
135
+ return undefined;
136
+ }
137
+ }