@memorax/memorax-code 0.1.2 → 0.1.3

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 (242) hide show
  1. package/README.md +16 -12
  2. package/bin/memorax-code-npm-preinstall.mjs +7 -2
  3. package/bin/memorax-code-opencode.mjs +4 -0
  4. package/bin/memorax-code-plugin-postinstall.mjs +342 -93
  5. package/docs/configuration.md +144 -35
  6. package/docs/troubleshooting.md +73 -13
  7. package/lib/dsh-plugin-install.mjs +22 -0
  8. package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  9. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  10. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  11. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  12. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  13. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  14. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  15. package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
  16. package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
  17. package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
  18. package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
  19. package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
  20. package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
  21. package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
  22. package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
  23. package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
  24. package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
  25. package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
  26. package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
  27. package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
  28. package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
  29. package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
  30. package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
  31. package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
  32. package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
  33. package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
  34. package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
  35. package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
  36. package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
  37. package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
  38. package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
  39. package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
  40. package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
  41. package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
  42. package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
  43. package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
  44. package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
  45. package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
  46. package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
  47. package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
  48. package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
  49. package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
  50. package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
  51. package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
  52. package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
  53. package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
  54. package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
  55. package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
  56. package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
  57. package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
  58. package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
  59. package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
  60. package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
  61. package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
  62. package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
  63. package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
  64. package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
  65. package/lib/memorax-code-backend/dist/server.js +3 -212
  66. package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
  67. package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
  68. package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
  69. package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
  70. package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
  71. package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
  72. package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
  73. package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
  74. package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
  75. package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
  76. package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
  77. package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
  78. package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
  79. package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
  80. package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
  81. package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
  82. package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
  83. package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
  84. package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
  85. package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
  86. package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
  87. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
  88. package/lib/memorax-code-backend/package.json +3 -3
  89. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  90. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  91. package/lib/memorax-code-claude-adapter/package.json +1 -1
  92. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  93. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  94. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  95. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  96. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  97. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  98. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  99. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  100. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  101. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  102. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  103. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  104. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  105. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  106. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  107. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  108. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  109. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  110. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
  111. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
  112. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
  113. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
  114. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
  115. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
  116. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
  117. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
  118. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
  119. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
  120. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  121. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  122. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
  123. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
  124. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
  125. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
  126. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  127. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
  128. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  129. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  130. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  131. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  132. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  133. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
  134. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
  135. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
  136. package/lib/memorax-code-codex-adapter/package.json +1 -1
  137. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
  138. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
  139. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
  140. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
  141. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
  142. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
  143. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
  144. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
  145. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
  146. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
  147. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
  148. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
  149. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
  150. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
  151. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
  152. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
  153. package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
  154. package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
  155. package/lib/memorax-code-dsh-adapter/package.json +69 -0
  156. package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
  157. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  158. package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  159. package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
  160. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  161. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  162. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
  163. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
  164. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
  165. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
  166. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  167. package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
  168. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  169. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  170. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  171. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  172. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  173. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  174. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  175. package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  176. package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
  177. package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
  178. package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
  179. package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
  180. package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
  181. package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
  182. package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
  183. package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
  184. package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1289 -0
  185. package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
  186. package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
  187. package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
  188. package/lib/memorax-code-opencode-adapter/package.json +10 -0
  189. package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
  190. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  191. package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  192. package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
  193. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
  194. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
  195. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
  196. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
  197. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
  198. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
  199. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  200. package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
  201. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  202. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  203. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  204. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  205. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  206. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  207. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  208. package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  209. package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
  210. package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
  211. package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
  212. package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
  213. package/lib/memorax-code-opencode-adapter/src/plugin.mjs +536 -0
  214. package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +207 -0
  215. package/lib/run-entrypoint.mjs +6 -0
  216. package/package.json +7 -3
  217. package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
  218. /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
  219. /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
  220. /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
  221. /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
  222. /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
  223. /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
  224. /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
  225. /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
  226. /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
  227. /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
  228. /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
  229. /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
  230. /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
  231. /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
  232. /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
  233. /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
  234. /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
  235. /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
  236. /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
  237. /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
  238. /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
  239. /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
  240. /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
  241. /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
  242. /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
@@ -0,0 +1,673 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import {
3
+ cpSync,
4
+ existsSync,
5
+ lstatSync,
6
+ mkdirSync,
7
+ readFileSync,
8
+ readdirSync,
9
+ readlinkSync,
10
+ renameSync,
11
+ rmSync,
12
+ } from "node:fs";
13
+ import { dirname, join, relative, resolve } from "node:path";
14
+ import { pathToFileURL, fileURLToPath } from "node:url";
15
+ import {
16
+ atomicWriteJson,
17
+ atomicWriteText,
18
+ readAdapterState,
19
+ stringOption,
20
+ } from "../../memorax-code-adapter-common/src/config-utils.mjs";
21
+ import { DEFAULT_BACKEND_URL as BACKEND_DEFAULT } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
22
+ import {
23
+ adapterStatePath,
24
+ defaultMemoraxCodeHome,
25
+ defaultOpenCodeConfigDir,
26
+ openCodePluginPath,
27
+ openCodeRepoMemoryHelperPath,
28
+ openCodeSkillPath,
29
+ } from "./adapter-paths.mjs";
30
+
31
+ const STATE_VERSION = 1;
32
+ const MANAGED_LOADER_HEADER = "// Managed by MemoraX Code. Do not edit.";
33
+ const ADAPTER_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
34
+
35
+ export function ensureOpenCodePluginInstalled(options = {}) {
36
+ const paths = resolvePaths(options);
37
+ const previousState = readAdapterState(paths.statePath);
38
+ const stateProblem = validateState(previousState, paths.statePath);
39
+ if (stateProblem) return { ...stateProblem, action: "opencode-plugin-install" };
40
+ const sourceProblem = validateSources(paths);
41
+ if (sourceProblem) return { ...sourceProblem, action: "opencode-plugin-install" };
42
+
43
+ const pluginExists = existsSync(paths.pluginPath);
44
+ const pluginIsManaged = previousState?.pluginPath === paths.pluginPath
45
+ && (!pluginExists || isManagedLoader(paths.pluginPath));
46
+ const skillIsManaged = previousState?.skillPath === paths.skillPath;
47
+ const repoMemoryHelperExists = existsSync(paths.repoMemoryHelperPath);
48
+ const repoMemoryHelperIsManaged = previousState?.repoMemoryHelperPath
49
+ === paths.repoMemoryHelperPath
50
+ && (!repoMemoryHelperExists || isManagedLoader(paths.repoMemoryHelperPath));
51
+ if (pluginExists && !pluginIsManaged) {
52
+ return conflict("plugin_conflict", paths, paths.pluginPath);
53
+ }
54
+ if (existsSync(paths.skillPath) && !skillIsManaged) {
55
+ return conflict("skill_conflict", paths, paths.skillPath);
56
+ }
57
+ if (repoMemoryHelperExists && !repoMemoryHelperIsManaged) {
58
+ return conflict("repo_memory_helper_conflict", paths, paths.repoMemoryHelperPath);
59
+ }
60
+
61
+ const backendUrl = normalizeBackendUrl(
62
+ options.backendUrl ?? previousState?.backendUrl ?? BACKEND_DEFAULT,
63
+ );
64
+ const pluginSourceSha256 = fileSha256(paths.pluginSourcePath);
65
+ const repoMemoryHelperSourceSha256 = fileSha256(paths.repoMemoryHelperSourcePath);
66
+ const loader = createManagedLoader(paths, pluginSourceSha256);
67
+ const repoMemoryHelperLoader = createManagedRepoMemoryHelperLoader(
68
+ paths,
69
+ repoMemoryHelperSourceSha256,
70
+ );
71
+ const pluginCurrent = pluginIsManaged && fileContentsEqual(paths.pluginPath, loader);
72
+ const skillCurrent = skillIsManaged && directoriesEqual(paths.skillSourcePath, paths.skillPath);
73
+ const repoMemoryHelperCurrent = repoMemoryHelperIsManaged
74
+ && fileContentsEqual(paths.repoMemoryHelperPath, repoMemoryHelperLoader);
75
+ const artifactsCurrent = pluginCurrent && skillCurrent && repoMemoryHelperCurrent;
76
+ const current = artifactsCurrent
77
+ && previousState?.enabled === true
78
+ && normalizeOptionalBackendUrl(previousState.backendUrl) === backendUrl;
79
+
80
+ const now = new Date().toISOString();
81
+ const state = {
82
+ version: STATE_VERSION,
83
+ runtime: "opencode",
84
+ integration: "plugin",
85
+ enabled: true,
86
+ backendUrl,
87
+ openCodeConfigDir: paths.openCodeConfigDir,
88
+ pluginPath: paths.pluginPath,
89
+ pluginSourcePath: paths.pluginSourcePath,
90
+ pluginSourceSha256,
91
+ skillPath: paths.skillPath,
92
+ skillSourcePath: paths.skillSourcePath,
93
+ repoMemoryHelperPath: paths.repoMemoryHelperPath,
94
+ repoMemoryHelperSourcePath: paths.repoMemoryHelperSourcePath,
95
+ repoMemoryHelperSourceSha256,
96
+ ...(paths.cliBinDir ? { cliBinDir: paths.cliBinDir } : {}),
97
+ installedAt: stringOption(previousState?.installedAt) ?? now,
98
+ updatedAt: now,
99
+ };
100
+ const pluginExisted = existsSync(paths.pluginPath);
101
+ const skillExisted = existsSync(paths.skillPath);
102
+ const repoMemoryHelperExisted = existsSync(paths.repoMemoryHelperPath);
103
+ try {
104
+ if (!skillCurrent) materializeSkill(paths.skillSourcePath, paths.skillPath);
105
+ if (!pluginCurrent) atomicWriteText(paths.pluginPath, loader);
106
+ if (!repoMemoryHelperCurrent) {
107
+ atomicWriteText(paths.repoMemoryHelperPath, repoMemoryHelperLoader);
108
+ }
109
+ atomicWriteJson(paths.statePath, state);
110
+ } catch (error) {
111
+ removeNewArtifact(paths.pluginPath, pluginExisted);
112
+ removeNewArtifact(paths.skillPath, skillExisted, true);
113
+ removeNewArtifact(paths.repoMemoryHelperPath, repoMemoryHelperExisted);
114
+ throw error;
115
+ }
116
+ removePreviousInstallation(previousState, paths);
117
+
118
+ return {
119
+ ok: true,
120
+ action: "opencode-plugin-install",
121
+ installed: true,
122
+ enabled: true,
123
+ managed: true,
124
+ integration: "plugin",
125
+ configuredBackendUrl: backendUrl,
126
+ expectedBackendUrl: backendUrl,
127
+ backendUrlMatches: true,
128
+ opencodeSkills: skillSummary(paths.skillPath, true),
129
+ changed: !current,
130
+ restartRequired: !pluginCurrent || !skillCurrent || previousState?.enabled !== true,
131
+ statePath: paths.statePath,
132
+ pluginPath: paths.pluginPath,
133
+ skillPath: paths.skillPath,
134
+ repoMemoryHelperPath: paths.repoMemoryHelperPath,
135
+ state,
136
+ };
137
+ }
138
+
139
+ export function readOpenCodePluginStatus(options = {}) {
140
+ const paths = resolvePaths(options);
141
+ const state = readAdapterState(paths.statePath);
142
+ const stateProblem = validateState(state, paths.statePath);
143
+ if (stateProblem) return { ...stateProblem, action: "opencode-plugin-status", installed: false, enabled: false };
144
+ if (!state) {
145
+ return {
146
+ ok: true,
147
+ action: "opencode-plugin-status",
148
+ installed: false,
149
+ enabled: false,
150
+ managed: false,
151
+ integration: "plugin",
152
+ configuredBackendUrl: undefined,
153
+ expectedBackendUrl: normalizeOptionalBackendUrl(options.backendUrl),
154
+ backendUrlMatches: true,
155
+ opencodeSkills: skillSummary(paths.skillPath, false),
156
+ statePath: paths.statePath,
157
+ pluginPath: paths.pluginPath,
158
+ skillPath: paths.skillPath,
159
+ repoMemoryHelperPath: paths.repoMemoryHelperPath,
160
+ skipped: true,
161
+ reason: "not_managed",
162
+ };
163
+ }
164
+
165
+ const configuredPaths = resolvePaths({
166
+ ...options,
167
+ openCodeConfigDir: state.openCodeConfigDir,
168
+ pluginSourcePath: options.pluginSourcePath ?? state.pluginSourcePath,
169
+ skillSourcePath: options.skillSourcePath ?? state.skillSourcePath,
170
+ repoMemoryHelperSourcePath: options.repoMemoryHelperSourcePath
171
+ ?? state.repoMemoryHelperSourcePath,
172
+ cliBinDir: options.cliBinDir ?? state.cliBinDir,
173
+ });
174
+ if (state.pluginPath !== configuredPaths.pluginPath
175
+ || state.skillPath !== configuredPaths.skillPath
176
+ || (state.repoMemoryHelperPath
177
+ && state.repoMemoryHelperPath !== configuredPaths.repoMemoryHelperPath)) {
178
+ return {
179
+ ok: false,
180
+ action: "opencode-plugin-status",
181
+ installed: false,
182
+ enabled: false,
183
+ managed: true,
184
+ reason: "state_paths_invalid",
185
+ statePath: paths.statePath,
186
+ };
187
+ }
188
+
189
+ const pluginExists = existsSync(configuredPaths.pluginPath);
190
+ const skillExists = existsSync(join(configuredPaths.skillPath, "SKILL.md"));
191
+ const repoMemoryHelperExists = existsSync(configuredPaths.repoMemoryHelperPath);
192
+ const repoMemoryHelperRecorded = state.repoMemoryHelperPath
193
+ === configuredPaths.repoMemoryHelperPath;
194
+ const sourcesReady = !validateSources(configuredPaths);
195
+ const pluginSourceSha256 = sourcesReady ? fileSha256(configuredPaths.pluginSourcePath) : undefined;
196
+ const repoMemoryHelperSourceSha256 = sourcesReady
197
+ ? fileSha256(configuredPaths.repoMemoryHelperSourcePath)
198
+ : undefined;
199
+ const pluginCurrent = sourcesReady && fileContentsEqual(
200
+ configuredPaths.pluginPath,
201
+ createManagedLoader(configuredPaths, pluginSourceSha256),
202
+ );
203
+ const skillCurrent = sourcesReady
204
+ && directoriesEqual(configuredPaths.skillSourcePath, configuredPaths.skillPath);
205
+ const repoMemoryHelperCurrent = repoMemoryHelperRecorded
206
+ && sourcesReady
207
+ && fileContentsEqual(
208
+ configuredPaths.repoMemoryHelperPath,
209
+ createManagedRepoMemoryHelperLoader(configuredPaths, repoMemoryHelperSourceSha256),
210
+ );
211
+ const installed = pluginExists && skillExists && repoMemoryHelperExists;
212
+ const enabled = state.enabled === true
213
+ && installed
214
+ && pluginCurrent
215
+ && skillCurrent
216
+ && repoMemoryHelperCurrent;
217
+ const configuredBackendUrl = normalizeOptionalBackendUrl(state.backendUrl);
218
+ const expectedBackendUrl = normalizeOptionalBackendUrl(options.backendUrl);
219
+ const backendUrlMatches = !expectedBackendUrl || configuredBackendUrl === expectedBackendUrl;
220
+ return {
221
+ ok: true,
222
+ action: "opencode-plugin-status",
223
+ installed,
224
+ enabled,
225
+ managed: true,
226
+ integration: "plugin",
227
+ current: pluginCurrent && skillCurrent && repoMemoryHelperCurrent,
228
+ pluginExists,
229
+ pluginCurrent,
230
+ skillExists,
231
+ skillCurrent,
232
+ repoMemoryHelperExists,
233
+ repoMemoryHelperCurrent,
234
+ configuredBackendUrl,
235
+ expectedBackendUrl,
236
+ backendUrlMatches,
237
+ opencodeSkills: skillSummary(configuredPaths.skillPath, skillCurrent),
238
+ statePath: paths.statePath,
239
+ pluginPath: configuredPaths.pluginPath,
240
+ skillPath: configuredPaths.skillPath,
241
+ repoMemoryHelperPath: configuredPaths.repoMemoryHelperPath,
242
+ state,
243
+ ...(!backendUrlMatches
244
+ ? { reason: "backend_url_mismatch" }
245
+ : !enabled
246
+ ? { reason: statusReason({
247
+ sourcesReady,
248
+ pluginExists,
249
+ pluginCurrent,
250
+ skillExists,
251
+ skillCurrent,
252
+ repoMemoryHelperExists,
253
+ repoMemoryHelperRecorded,
254
+ repoMemoryHelperCurrent,
255
+ }) }
256
+ : {}),
257
+ };
258
+ }
259
+
260
+ export function disableOpenCodePlugin(options = {}) {
261
+ const paths = resolvePaths(options);
262
+ const state = readAdapterState(paths.statePath);
263
+ const stateProblem = validateState(state, paths.statePath);
264
+ if (stateProblem) return { ...stateProblem, action: "opencode-plugin-disable" };
265
+ if (!state) {
266
+ return {
267
+ ok: true,
268
+ action: "opencode-plugin-disable",
269
+ installed: false,
270
+ enabled: false,
271
+ managed: false,
272
+ integration: "plugin",
273
+ skipped: true,
274
+ reason: "not_managed",
275
+ statePath: paths.statePath,
276
+ };
277
+ }
278
+
279
+ const nextState = {
280
+ ...state,
281
+ enabled: false,
282
+ disabledAt: new Date().toISOString(),
283
+ };
284
+ atomicWriteJson(paths.statePath, nextState);
285
+ const repoMemoryHelperPath = stringOption(state.repoMemoryHelperPath);
286
+ return {
287
+ ok: true,
288
+ action: "opencode-plugin-disable",
289
+ installed: existsSync(state.pluginPath)
290
+ && existsSync(join(state.skillPath, "SKILL.md"))
291
+ && Boolean(repoMemoryHelperPath && existsSync(repoMemoryHelperPath)),
292
+ enabled: false,
293
+ managed: true,
294
+ integration: "plugin",
295
+ changed: state.enabled === true,
296
+ statePath: paths.statePath,
297
+ state: nextState,
298
+ };
299
+ }
300
+
301
+ export function removeOpenCodePluginInstallation(options = {}) {
302
+ const paths = resolvePaths(options);
303
+ const state = readAdapterState(paths.statePath);
304
+ const stateProblem = validateState(state, paths.statePath);
305
+ if (stateProblem) return { ...stateProblem, action: "opencode-plugin-remove" };
306
+ if (!state) {
307
+ return {
308
+ ok: true,
309
+ action: "opencode-plugin-remove",
310
+ skipped: true,
311
+ reason: "not_managed",
312
+ statePath: paths.statePath,
313
+ };
314
+ }
315
+
316
+ const openCodeConfigDir = resolve(state.openCodeConfigDir);
317
+ const pluginPath = openCodePluginPath(openCodeConfigDir);
318
+ const skillPath = openCodeSkillPath(openCodeConfigDir);
319
+ const repoMemoryHelperPath = openCodeRepoMemoryHelperPath(openCodeConfigDir);
320
+ const recordedRepoMemoryHelperPath = stringOption(state.repoMemoryHelperPath);
321
+ if (state.pluginPath !== pluginPath
322
+ || state.skillPath !== skillPath
323
+ || (recordedRepoMemoryHelperPath
324
+ && recordedRepoMemoryHelperPath !== repoMemoryHelperPath)) {
325
+ return {
326
+ ok: false,
327
+ action: "opencode-plugin-remove",
328
+ reason: "state_paths_invalid",
329
+ statePath: paths.statePath,
330
+ };
331
+ }
332
+ if (existsSync(pluginPath) && !isManagedLoader(pluginPath)) {
333
+ return {
334
+ ok: false,
335
+ action: "opencode-plugin-remove",
336
+ reason: "plugin_not_managed",
337
+ statePath: paths.statePath,
338
+ pluginPath,
339
+ };
340
+ }
341
+ if (recordedRepoMemoryHelperPath
342
+ && existsSync(repoMemoryHelperPath)
343
+ && !isManagedLoader(repoMemoryHelperPath)) {
344
+ return {
345
+ ok: false,
346
+ action: "opencode-plugin-remove",
347
+ reason: "repo_memory_helper_not_managed",
348
+ statePath: paths.statePath,
349
+ repoMemoryHelperPath,
350
+ };
351
+ }
352
+
353
+ rmSync(pluginPath, { force: true });
354
+ rmSync(skillPath, { recursive: true, force: true });
355
+ if (recordedRepoMemoryHelperPath) rmSync(repoMemoryHelperPath, { force: true });
356
+ rmSync(paths.statePath, { force: true });
357
+ return {
358
+ ok: true,
359
+ action: "opencode-plugin-remove",
360
+ installed: false,
361
+ enabled: false,
362
+ managed: false,
363
+ integration: "plugin",
364
+ statePath: paths.statePath,
365
+ pluginPath,
366
+ skillPath,
367
+ repoMemoryHelperPath,
368
+ };
369
+ }
370
+
371
+ export function defaultOpenCodePluginSourcePath() {
372
+ return join(ADAPTER_ROOT, "src", "plugin.mjs");
373
+ }
374
+
375
+ export function defaultOpenCodeSkillSourcePath() {
376
+ const packagedSkill = join(ADAPTER_ROOT, "skills", "memorax-code");
377
+ return existsSync(join(packagedSkill, "SKILL.md"))
378
+ ? packagedSkill
379
+ : resolve(ADAPTER_ROOT, "..", "memorax-code-codex-adapter", "skills", "memorax-code");
380
+ }
381
+
382
+ export function defaultOpenCodeRepoMemoryHelperSourcePath() {
383
+ return join(ADAPTER_ROOT, "hooks", "repo-memory-job.mjs");
384
+ }
385
+
386
+ export function defaultOpenCodeCliBinDir(adapterRoot = ADAPTER_ROOT) {
387
+ const packageRoot = resolve(adapterRoot, "..", "..");
388
+ const candidates = [
389
+ resolve(packageRoot, "..", "..", ".bin"),
390
+ resolve(packageRoot, "..", "..", ".."),
391
+ resolve(packageRoot, "..", "..", "..", "..", "bin"),
392
+ join(packageRoot, "bin"),
393
+ ];
394
+ return candidates.find(hasMemoraxCliCommand);
395
+ }
396
+
397
+ export function defaultMemoraxCodeCommand(adapterRoot = ADAPTER_ROOT) {
398
+ const packageRoot = resolve(adapterRoot, "..", "..");
399
+ return [
400
+ join(packageRoot, "bin", "memorax-code.mjs"),
401
+ join(packageRoot, "npm", "memorax-code", "bin", "memorax-code.mjs"),
402
+ ].find((path) => existsSync(path));
403
+ }
404
+
405
+ function resolvePaths(options) {
406
+ const memoraxCodeHome = resolve(options.memoraxCodeHome ?? defaultMemoraxCodeHome());
407
+ const openCodeConfigDir = resolve(options.openCodeConfigDir ?? defaultOpenCodeConfigDir());
408
+ return {
409
+ memoraxCodeHome,
410
+ openCodeConfigDir,
411
+ statePath: resolve(options.statePath ?? adapterStatePath(memoraxCodeHome)),
412
+ pluginPath: openCodePluginPath(openCodeConfigDir),
413
+ skillPath: openCodeSkillPath(openCodeConfigDir),
414
+ repoMemoryHelperPath: openCodeRepoMemoryHelperPath(openCodeConfigDir),
415
+ pluginSourcePath: resolve(options.pluginSourcePath ?? defaultOpenCodePluginSourcePath()),
416
+ skillSourcePath: resolve(options.skillSourcePath ?? defaultOpenCodeSkillSourcePath()),
417
+ repoMemoryHelperSourcePath: resolve(
418
+ options.repoMemoryHelperSourcePath ?? defaultOpenCodeRepoMemoryHelperSourcePath(),
419
+ ),
420
+ cliBinDir: stringOption(options.cliBinDir)
421
+ ? resolve(options.cliBinDir)
422
+ : defaultOpenCodeCliBinDir(),
423
+ nodePath: stringOption(options.nodePath)
424
+ ? resolve(options.nodePath)
425
+ : process.execPath,
426
+ memoraxCodeCommand: stringOption(options.memoraxCodeCommand)
427
+ ? resolve(options.memoraxCodeCommand)
428
+ : defaultMemoraxCodeCommand(),
429
+ };
430
+ }
431
+
432
+ function validateState(state, statePath) {
433
+ if (state?.unreadable) {
434
+ return { ok: false, reason: "state_unreadable", statePath };
435
+ }
436
+ if (state && state.version !== STATE_VERSION) {
437
+ return {
438
+ ok: false,
439
+ reason: "state_version_unsupported",
440
+ statePath,
441
+ expectedVersion: STATE_VERSION,
442
+ actualVersion: state.version,
443
+ };
444
+ }
445
+ if (state) {
446
+ const openCodeConfigDir = stringOption(state.openCodeConfigDir);
447
+ const pluginPath = stringOption(state.pluginPath);
448
+ const skillPath = stringOption(state.skillPath);
449
+ const repoMemoryHelperPath = stringOption(state.repoMemoryHelperPath);
450
+ const repoMemoryHelperSourcePath = stringOption(state.repoMemoryHelperSourcePath);
451
+ const repoMemoryHelperSourceSha256 = stringOption(state.repoMemoryHelperSourceSha256);
452
+ const hasRepoMemoryHelperState = [
453
+ "repoMemoryHelperPath",
454
+ "repoMemoryHelperSourcePath",
455
+ "repoMemoryHelperSourceSha256",
456
+ ].some((field) => Object.hasOwn(state, field));
457
+ if (state.runtime !== "opencode"
458
+ || state.integration !== "plugin"
459
+ || !openCodeConfigDir
460
+ || !pluginPath
461
+ || !skillPath
462
+ || (hasRepoMemoryHelperState && (
463
+ !repoMemoryHelperPath
464
+ || !repoMemoryHelperSourcePath
465
+ || !/^[a-f0-9]{64}$/.test(repoMemoryHelperSourceSha256 ?? "")
466
+ ))) {
467
+ return { ok: false, reason: "state_invalid", statePath };
468
+ }
469
+ const resolvedConfigDir = resolve(openCodeConfigDir);
470
+ if (openCodeConfigDir !== resolvedConfigDir
471
+ || pluginPath !== openCodePluginPath(resolvedConfigDir)
472
+ || skillPath !== openCodeSkillPath(resolvedConfigDir)
473
+ || (repoMemoryHelperPath
474
+ && repoMemoryHelperPath !== openCodeRepoMemoryHelperPath(resolvedConfigDir))) {
475
+ return { ok: false, reason: "state_paths_invalid", statePath };
476
+ }
477
+ }
478
+ return undefined;
479
+ }
480
+
481
+ function validateSources(paths) {
482
+ if (!existsSync(paths.pluginSourcePath)) {
483
+ return { ok: false, reason: "plugin_source_missing", sourcePath: paths.pluginSourcePath };
484
+ }
485
+ if (!existsSync(join(paths.skillSourcePath, "SKILL.md"))) {
486
+ return { ok: false, reason: "skill_source_missing", sourcePath: paths.skillSourcePath };
487
+ }
488
+ if (!existsSync(paths.repoMemoryHelperSourcePath)) {
489
+ return {
490
+ ok: false,
491
+ reason: "repo_memory_helper_source_missing",
492
+ sourcePath: paths.repoMemoryHelperSourcePath,
493
+ };
494
+ }
495
+ return undefined;
496
+ }
497
+
498
+ function conflict(reason, paths, conflictPath) {
499
+ return {
500
+ ok: false,
501
+ action: "opencode-plugin-install",
502
+ reason,
503
+ conflictPath,
504
+ statePath: paths.statePath,
505
+ pluginPath: paths.pluginPath,
506
+ skillPath: paths.skillPath,
507
+ repoMemoryHelperPath: paths.repoMemoryHelperPath,
508
+ };
509
+ }
510
+
511
+ function createManagedLoader(paths, pluginSourceSha256) {
512
+ const pluginUrl = pathToFileURL(paths.pluginSourcePath).href;
513
+ const pluginOptions = {
514
+ memoraxCodeHome: paths.memoraxCodeHome,
515
+ statePath: paths.statePath,
516
+ openCodeConfigDir: paths.openCodeConfigDir,
517
+ ...(paths.memoraxCodeCommand ? { memoraxCodeCommand: paths.memoraxCodeCommand } : {}),
518
+ nodePath: paths.nodePath,
519
+ ...(paths.cliBinDir ? { cliBinDir: paths.cliBinDir } : {}),
520
+ };
521
+ return [
522
+ MANAGED_LOADER_HEADER,
523
+ `// Plugin source SHA-256: ${pluginSourceSha256}`,
524
+ `import { createMemoraxOpenCodePlugin } from ${JSON.stringify(pluginUrl)};`,
525
+ "",
526
+ `export const MemoraxOpenCodePlugin = createMemoraxOpenCodePlugin(${JSON.stringify(pluginOptions)});`,
527
+ "",
528
+ ].join("\n");
529
+ }
530
+
531
+ function createManagedRepoMemoryHelperLoader(paths, sourceSha256) {
532
+ const helperUrl = pathToFileURL(paths.repoMemoryHelperSourcePath).href;
533
+ return [
534
+ MANAGED_LOADER_HEADER,
535
+ `// Repo Memory helper source SHA-256: ${sourceSha256}`,
536
+ `import ${JSON.stringify(helperUrl)};`,
537
+ "",
538
+ ].join("\n");
539
+ }
540
+
541
+ function materializeSkill(sourcePath, targetPath) {
542
+ mkdirSync(dirname(targetPath), { recursive: true });
543
+ const stagePath = `${targetPath}.tmp-${process.pid}-${randomUUID()}`;
544
+ try {
545
+ cpSync(sourcePath, stagePath, { recursive: true });
546
+ rmSync(targetPath, { recursive: true, force: true });
547
+ renameSync(stagePath, targetPath);
548
+ } finally {
549
+ rmSync(stagePath, { recursive: true, force: true });
550
+ }
551
+ }
552
+
553
+ function removePreviousInstallation(previousState, paths) {
554
+ if (!previousState) return;
555
+ if (previousState.pluginPath !== paths.pluginPath && isManagedLoader(previousState.pluginPath)) {
556
+ rmSync(previousState.pluginPath, { force: true });
557
+ }
558
+ if (previousState.skillPath !== paths.skillPath) {
559
+ rmSync(previousState.skillPath, { recursive: true, force: true });
560
+ }
561
+ if (previousState.repoMemoryHelperPath !== paths.repoMemoryHelperPath
562
+ && isManagedLoader(previousState.repoMemoryHelperPath)) {
563
+ rmSync(previousState.repoMemoryHelperPath, { force: true });
564
+ }
565
+ }
566
+
567
+ function removeNewArtifact(path, existed, recursive = false) {
568
+ if (existed) return;
569
+ try {
570
+ rmSync(path, { recursive, force: true });
571
+ } catch {
572
+ // Preserve the original installation failure.
573
+ }
574
+ }
575
+
576
+ function isManagedLoader(path) {
577
+ if (!path || !existsSync(path)) return false;
578
+ try {
579
+ return readFileSync(path, "utf8").startsWith(`${MANAGED_LOADER_HEADER}\n`);
580
+ } catch {
581
+ return false;
582
+ }
583
+ }
584
+
585
+ function fileContentsEqual(path, expected) {
586
+ try {
587
+ return readFileSync(path, "utf8") === expected;
588
+ } catch {
589
+ return false;
590
+ }
591
+ }
592
+
593
+ function fileSha256(path) {
594
+ return createHash("sha256").update(readFileSync(path)).digest("hex");
595
+ }
596
+
597
+ function hasMemoraxCliCommand(directory) {
598
+ return ["memorax-cli", "memorax-cli.cmd", "memorax-cli.exe"]
599
+ .some((name) => existsSync(join(directory, name)));
600
+ }
601
+
602
+ function directoriesEqual(sourceRoot, targetRoot) {
603
+ if (!existsSync(sourceRoot) || !existsSync(targetRoot)) return false;
604
+ const sourceEntries = collectDirectoryEntries(sourceRoot);
605
+ const targetEntries = collectDirectoryEntries(targetRoot);
606
+ if (sourceEntries.length !== targetEntries.length) return false;
607
+ return sourceEntries.every((source, index) => {
608
+ const target = targetEntries[index];
609
+ return source.path === target.path
610
+ && source.kind === target.kind
611
+ && source.content === target.content;
612
+ });
613
+ }
614
+
615
+ function collectDirectoryEntries(root) {
616
+ const entries = [];
617
+ visit(root);
618
+ return entries.sort((left, right) => left.path.localeCompare(right.path));
619
+
620
+ function visit(path) {
621
+ for (const name of readdirSync(path)) {
622
+ const absolutePath = join(path, name);
623
+ const entryPath = relative(root, absolutePath);
624
+ const stat = lstatSync(absolutePath);
625
+ if (stat.isDirectory()) {
626
+ entries.push({ path: entryPath, kind: "directory", content: "" });
627
+ visit(absolutePath);
628
+ } else if (stat.isSymbolicLink()) {
629
+ entries.push({ path: entryPath, kind: "symlink", content: readlinkSync(absolutePath) });
630
+ } else {
631
+ entries.push({ path: entryPath, kind: "file", content: readFileSync(absolutePath).toString("base64") });
632
+ }
633
+ }
634
+ }
635
+ }
636
+
637
+ function statusReason({
638
+ sourcesReady,
639
+ pluginExists,
640
+ pluginCurrent,
641
+ skillExists,
642
+ skillCurrent,
643
+ repoMemoryHelperExists,
644
+ repoMemoryHelperRecorded,
645
+ repoMemoryHelperCurrent,
646
+ }) {
647
+ if (!sourcesReady) return "source_missing";
648
+ if (!pluginExists) return "plugin_missing";
649
+ if (!pluginCurrent) return "plugin_stale";
650
+ if (!skillExists) return "skill_missing";
651
+ if (!skillCurrent) return "skill_stale";
652
+ if (!repoMemoryHelperExists) return "repo_memory_helper_missing";
653
+ if (!repoMemoryHelperRecorded) return "repo_memory_helper_unmanaged";
654
+ if (!repoMemoryHelperCurrent) return "repo_memory_helper_stale";
655
+ return "not_enabled";
656
+ }
657
+
658
+ function normalizeBackendUrl(value) {
659
+ return String(value).replace(/\/+$/, "");
660
+ }
661
+
662
+ function normalizeOptionalBackendUrl(value) {
663
+ return stringOption(value) ? normalizeBackendUrl(value) : undefined;
664
+ }
665
+
666
+ function skillSummary(skillPath, ok) {
667
+ return {
668
+ ok,
669
+ status: ok ? "installed" : "missing",
670
+ sourceKind: "canonical",
671
+ path: skillPath,
672
+ };
673
+ }