@memorax/memorax-code 0.1.2 → 0.1.4
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.
- package/README.md +16 -12
- package/bin/memorax-code-npm-preinstall.mjs +7 -2
- package/bin/memorax-code-opencode.mjs +4 -0
- package/bin/memorax-code-plugin-postinstall.mjs +342 -93
- package/docs/configuration.md +148 -35
- package/docs/troubleshooting.md +73 -13
- package/lib/dsh-plugin-install.mjs +22 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
- package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
- package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
- package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
- package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
- package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
- package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
- package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
- package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
- package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
- package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
- package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
- package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
- package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
- package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
- package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
- package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
- package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
- package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
- package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
- package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
- package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
- package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
- package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
- package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
- package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
- package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
- package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
- package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
- package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
- package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
- package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
- package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
- package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
- package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
- package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
- package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
- package/lib/memorax-code-backend/dist/server.js +3 -212
- package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
- package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
- package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
- package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
- package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
- package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
- package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
- package/lib/memorax-code-backend/package.json +3 -3
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- 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
- 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
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-codex-adapter/package.json +1 -1
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
- package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
- package/lib/memorax-code-dsh-adapter/package.json +69 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
- package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
- package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
- package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
- package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1358 -0
- package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
- package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
- package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/package.json +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
- package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
- package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
- package/lib/memorax-code-opencode-adapter/src/plugin.mjs +539 -0
- package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +442 -0
- package/lib/run-entrypoint.mjs +6 -0
- package/package.json +7 -3
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
- /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
- /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
- /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
- /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
- /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
- /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
- /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
export const OPENCODE_REPO_MEMORY_AGENT = "memorax-code-repo-memory";
|
|
8
|
+
|
|
9
|
+
const OWNED_SERVER_USERNAME = "memorax-code";
|
|
10
|
+
const DEFAULT_SERVER_START_TIMEOUT_MS = 20_000;
|
|
11
|
+
const DEFAULT_SERVER_STOP_TIMEOUT_MS = 5_000;
|
|
12
|
+
const MAX_SERVER_START_OUTPUT = 8_192;
|
|
13
|
+
|
|
14
|
+
class OpenCodeTransportError extends Error {
|
|
15
|
+
constructor(operation, cause) {
|
|
16
|
+
super(`OpenCode ${operation} request failed: ${errorMessage(cause)}`);
|
|
17
|
+
this.name = "OpenCodeTransportError";
|
|
18
|
+
this.operation = operation;
|
|
19
|
+
this.cause = cause;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function runOpenCodeRepoMemory(input, options = {}) {
|
|
24
|
+
const env = options.env ?? process.env;
|
|
25
|
+
const managedServerUrl = stringValue(env.MEMORAX_CODE_OPENCODE_SERVER_URL);
|
|
26
|
+
const serverUrl = stringValue(input?.serverUrl) ?? managedServerUrl;
|
|
27
|
+
const repo = stringValue(input?.repo);
|
|
28
|
+
if (!repo) throw new Error("OpenCode repo memory runner requires --repo");
|
|
29
|
+
const prompt = stringValue(input?.prompt);
|
|
30
|
+
if (!prompt) throw new Error("OpenCode repo memory runner requires --prompt");
|
|
31
|
+
|
|
32
|
+
const directory = resolve(repo);
|
|
33
|
+
const parentID = stringValue(input?.parentID)
|
|
34
|
+
?? stringValue(env.MEMORAX_CODE_MEMORY_CLI_SESSION_ID);
|
|
35
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
36
|
+
let inheritedError;
|
|
37
|
+
if (serverUrl) {
|
|
38
|
+
const baseUrl = normalizedServerUrl(serverUrl);
|
|
39
|
+
try {
|
|
40
|
+
return await runOpenCodeRepoMemorySession({
|
|
41
|
+
authorization: serverAuthorization(env, baseUrl, managedServerUrl),
|
|
42
|
+
baseUrl,
|
|
43
|
+
directory,
|
|
44
|
+
fetchImpl,
|
|
45
|
+
parentID,
|
|
46
|
+
prompt,
|
|
47
|
+
});
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (!isSessionCreationTransportError(error)) throw error;
|
|
50
|
+
inheritedError = error;
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
inheritedError = new Error(
|
|
54
|
+
"OpenCode repo memory runner requires --server-url or MEMORAX_CODE_OPENCODE_SERVER_URL",
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const openCodeCommand = stringValue(env.MEMORAX_CODE_OPENCODE_COMMAND);
|
|
59
|
+
if (!openCodeCommand) throw inheritedError;
|
|
60
|
+
|
|
61
|
+
let ownedServer;
|
|
62
|
+
try {
|
|
63
|
+
ownedServer = await startOwnedOpenCodeServer({
|
|
64
|
+
command: openCodeCommand,
|
|
65
|
+
directory,
|
|
66
|
+
env,
|
|
67
|
+
options,
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`${errorMessage(inheritedError)}; managed OpenCode server fallback failed: ${errorMessage(error)}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
return await runOpenCodeRepoMemorySession({
|
|
77
|
+
authorization: ownedServer.authorization,
|
|
78
|
+
baseUrl: ownedServer.baseUrl,
|
|
79
|
+
directory,
|
|
80
|
+
fetchImpl,
|
|
81
|
+
parentID,
|
|
82
|
+
prompt,
|
|
83
|
+
signal: ownedServer.signal,
|
|
84
|
+
});
|
|
85
|
+
} finally {
|
|
86
|
+
await ownedServer.close();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function runOpenCodeRepoMemorySession(input) {
|
|
91
|
+
let sessionID;
|
|
92
|
+
try {
|
|
93
|
+
const session = await requestJson(input.fetchImpl, endpoint(input.baseUrl, "/session", input.directory), {
|
|
94
|
+
method: "POST",
|
|
95
|
+
headers: {
|
|
96
|
+
"content-type": "application/json",
|
|
97
|
+
...(input.authorization ? { authorization: input.authorization } : {}),
|
|
98
|
+
},
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
...(input.parentID ? { parentID: input.parentID } : {}),
|
|
101
|
+
title: "MemoraX Code Repo Memory",
|
|
102
|
+
permission: [
|
|
103
|
+
{ permission: "edit", pattern: "*", action: "allow" },
|
|
104
|
+
{ permission: "bash", pattern: "*", action: "allow" },
|
|
105
|
+
{ permission: "webfetch", pattern: "*", action: "allow" },
|
|
106
|
+
{ permission: "doom_loop", pattern: "*", action: "allow" },
|
|
107
|
+
{ permission: "external_directory", pattern: "*", action: "allow" },
|
|
108
|
+
],
|
|
109
|
+
}),
|
|
110
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
111
|
+
}, "session creation");
|
|
112
|
+
sessionID = stringValue(session?.id);
|
|
113
|
+
if (!sessionID) throw new Error("OpenCode session creation returned no session id");
|
|
114
|
+
|
|
115
|
+
const message = await requestJson(
|
|
116
|
+
input.fetchImpl,
|
|
117
|
+
endpoint(input.baseUrl, `/session/${encodeURIComponent(sessionID)}/message`, input.directory),
|
|
118
|
+
{
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"content-type": "application/json",
|
|
122
|
+
...(input.authorization ? { authorization: input.authorization } : {}),
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify({
|
|
125
|
+
agent: OPENCODE_REPO_MEMORY_AGENT,
|
|
126
|
+
parts: [{ type: "text", text: input.prompt }],
|
|
127
|
+
}),
|
|
128
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
129
|
+
},
|
|
130
|
+
"blocking prompt",
|
|
131
|
+
);
|
|
132
|
+
const finalText = messageText(message);
|
|
133
|
+
if (!finalText) throw new Error("OpenCode repo memory runner received no final text");
|
|
134
|
+
return finalText;
|
|
135
|
+
} finally {
|
|
136
|
+
if (sessionID) {
|
|
137
|
+
await bestEffortDelete(
|
|
138
|
+
input.fetchImpl,
|
|
139
|
+
endpoint(input.baseUrl, `/session/${encodeURIComponent(sessionID)}`, input.directory),
|
|
140
|
+
input.authorization,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function startOwnedOpenCodeServer(input) {
|
|
147
|
+
const username = OWNED_SERVER_USERNAME;
|
|
148
|
+
const password = randomBytes(24).toString("base64url");
|
|
149
|
+
const spawnImpl = input.options.spawnImpl ?? spawn;
|
|
150
|
+
const child = spawnImpl(input.command, [
|
|
151
|
+
"serve",
|
|
152
|
+
"--hostname=127.0.0.1",
|
|
153
|
+
"--port=0",
|
|
154
|
+
], {
|
|
155
|
+
cwd: input.directory,
|
|
156
|
+
env: {
|
|
157
|
+
...input.env,
|
|
158
|
+
OPENCODE_SERVER_USERNAME: username,
|
|
159
|
+
OPENCODE_SERVER_PASSWORD: password,
|
|
160
|
+
},
|
|
161
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
162
|
+
windowsHide: true,
|
|
163
|
+
});
|
|
164
|
+
const lifecycle = ownedServerLifecycle(child);
|
|
165
|
+
let closePromise;
|
|
166
|
+
const close = () => {
|
|
167
|
+
closePromise ??= stopOwnedServer(
|
|
168
|
+
child,
|
|
169
|
+
positiveInteger(input.options.serverStopTimeoutMs, DEFAULT_SERVER_STOP_TIMEOUT_MS),
|
|
170
|
+
).finally(lifecycle.dispose);
|
|
171
|
+
return closePromise;
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
const baseUrl = await waitForOwnedServer(
|
|
175
|
+
child,
|
|
176
|
+
positiveInteger(input.options.serverStartTimeoutMs, DEFAULT_SERVER_START_TIMEOUT_MS),
|
|
177
|
+
);
|
|
178
|
+
return {
|
|
179
|
+
authorization: basicAuthorization(username, password),
|
|
180
|
+
baseUrl,
|
|
181
|
+
close,
|
|
182
|
+
signal: lifecycle.signal,
|
|
183
|
+
};
|
|
184
|
+
} catch (error) {
|
|
185
|
+
await close();
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function waitForOwnedServer(child, timeoutMs) {
|
|
191
|
+
return new Promise((resolveReady, rejectReady) => {
|
|
192
|
+
let output = "";
|
|
193
|
+
let settled = false;
|
|
194
|
+
let timer;
|
|
195
|
+
const finish = (error, value) => {
|
|
196
|
+
if (settled) return;
|
|
197
|
+
settled = true;
|
|
198
|
+
clearTimeout(timer);
|
|
199
|
+
child.off("error", onError);
|
|
200
|
+
child.off("exit", onExit);
|
|
201
|
+
child.stdout?.off("data", onOutput);
|
|
202
|
+
child.stderr?.off("data", onOutput);
|
|
203
|
+
child.stdout?.resume();
|
|
204
|
+
child.stderr?.resume();
|
|
205
|
+
if (error) rejectReady(error);
|
|
206
|
+
else resolveReady(value);
|
|
207
|
+
};
|
|
208
|
+
const onOutput = (chunk) => {
|
|
209
|
+
output = `${output}${String(chunk)}`.slice(-MAX_SERVER_START_OUTPUT);
|
|
210
|
+
const match = output.match(/opencode server listening on (https?:\/\/[^\s\u001b]+)/i);
|
|
211
|
+
if (!match) return;
|
|
212
|
+
let url;
|
|
213
|
+
try {
|
|
214
|
+
url = normalizedOwnedServerUrl(match[1]);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
finish(error);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
finish(undefined, url);
|
|
220
|
+
};
|
|
221
|
+
const onError = (error) => finish(error);
|
|
222
|
+
const onExit = (code, signal) => finish(new Error(
|
|
223
|
+
`OpenCode managed server exited before readiness${code === null ? "" : ` with code ${code}`}`
|
|
224
|
+
+ `${signal ? ` after ${signal}` : ""}${output.trim() ? `: ${output.trim().slice(-500)}` : ""}`,
|
|
225
|
+
));
|
|
226
|
+
timer = setTimeout(() => finish(new Error(
|
|
227
|
+
`timed out waiting for OpenCode managed server readiness after ${timeoutMs} ms`,
|
|
228
|
+
)), timeoutMs);
|
|
229
|
+
child.once("error", onError);
|
|
230
|
+
child.once("exit", onExit);
|
|
231
|
+
child.stdout?.on("data", onOutput);
|
|
232
|
+
child.stderr?.on("data", onOutput);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function normalizedOwnedServerUrl(value) {
|
|
237
|
+
const url = normalizedServerUrl(value);
|
|
238
|
+
if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || !url.port) {
|
|
239
|
+
throw new Error("OpenCode managed server did not bind to the requested loopback address");
|
|
240
|
+
}
|
|
241
|
+
return url;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function ownedServerLifecycle(child) {
|
|
245
|
+
const controller = new AbortController();
|
|
246
|
+
const handlers = new Map();
|
|
247
|
+
const onExit = (code, signal) => {
|
|
248
|
+
if (controller.signal.aborted) return;
|
|
249
|
+
controller.abort(new Error(
|
|
250
|
+
`OpenCode managed server exited${code === null ? "" : ` with code ${code}`}`
|
|
251
|
+
+ `${signal ? ` after ${signal}` : ""}`,
|
|
252
|
+
));
|
|
253
|
+
};
|
|
254
|
+
child.once("exit", onExit);
|
|
255
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
256
|
+
const handler = () => {
|
|
257
|
+
controller.abort(new Error(`OpenCode managed server interrupted by ${signal}`));
|
|
258
|
+
if (!childStopped(child)) child.kill(signal);
|
|
259
|
+
};
|
|
260
|
+
handlers.set(signal, handler);
|
|
261
|
+
process.once(signal, handler);
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
signal: controller.signal,
|
|
265
|
+
dispose() {
|
|
266
|
+
child.off("exit", onExit);
|
|
267
|
+
for (const [signal, handler] of handlers) process.off(signal, handler);
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
async function stopOwnedServer(child, timeoutMs) {
|
|
273
|
+
if (childStopped(child)) return;
|
|
274
|
+
const exited = new Promise((resolveExit) => child.once("exit", resolveExit));
|
|
275
|
+
child.kill("SIGTERM");
|
|
276
|
+
if (await settlesWithin(exited, timeoutMs) || childStopped(child)) return;
|
|
277
|
+
child.kill("SIGKILL");
|
|
278
|
+
if (await settlesWithin(exited, timeoutMs) || childStopped(child)) return;
|
|
279
|
+
child.stdout?.destroy();
|
|
280
|
+
child.stderr?.destroy();
|
|
281
|
+
child.unref?.();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async function settlesWithin(promise, timeoutMs) {
|
|
285
|
+
let timer;
|
|
286
|
+
try {
|
|
287
|
+
return await Promise.race([
|
|
288
|
+
promise.then(() => true, () => true),
|
|
289
|
+
new Promise((resolveTimeout) => {
|
|
290
|
+
timer = setTimeout(() => resolveTimeout(false), timeoutMs);
|
|
291
|
+
}),
|
|
292
|
+
]);
|
|
293
|
+
} finally {
|
|
294
|
+
clearTimeout(timer);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function childStopped(child) {
|
|
299
|
+
return child.exitCode !== null || child.signalCode !== null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function parseArgs(values) {
|
|
303
|
+
const result = {};
|
|
304
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
305
|
+
const value = values[index];
|
|
306
|
+
if (value === "--server-url") result.serverUrl = requiredValue(values, ++index, value);
|
|
307
|
+
else if (value === "--repo") result.repo = requiredValue(values, ++index, value);
|
|
308
|
+
else if (value === "--prompt") result.prompt = requiredValue(values, ++index, value);
|
|
309
|
+
else if (value === "--parent-id") result.parentID = requiredValue(values, ++index, value);
|
|
310
|
+
else throw new Error(`unknown argument: ${value}`);
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function requiredValue(values, index, option) {
|
|
316
|
+
const value = values[index];
|
|
317
|
+
if (!value || value.startsWith("--")) throw new Error(`${option} requires a value`);
|
|
318
|
+
return value;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function normalizedServerUrl(value) {
|
|
322
|
+
try {
|
|
323
|
+
const url = new URL(value);
|
|
324
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error();
|
|
325
|
+
return url;
|
|
326
|
+
} catch {
|
|
327
|
+
throw new Error("OpenCode repo memory runner requires a valid HTTP server URL");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function endpoint(baseUrl, pathname, directory) {
|
|
332
|
+
const url = new URL(pathname, baseUrl);
|
|
333
|
+
url.searchParams.set("directory", directory);
|
|
334
|
+
return url;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function serverAuthorization(env, targetUrl, managedServerUrl) {
|
|
338
|
+
const password = rawString(env.OPENCODE_SERVER_PASSWORD);
|
|
339
|
+
if (!password || !managedServerUrl) return undefined;
|
|
340
|
+
let managedUrl;
|
|
341
|
+
try {
|
|
342
|
+
managedUrl = normalizedServerUrl(managedServerUrl);
|
|
343
|
+
} catch {
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
if (targetUrl.origin !== managedUrl.origin) return undefined;
|
|
347
|
+
const username = rawString(env.OPENCODE_SERVER_USERNAME) ?? "opencode";
|
|
348
|
+
return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async function requestJson(fetchImpl, url, init, operation) {
|
|
352
|
+
let response;
|
|
353
|
+
try {
|
|
354
|
+
response = await fetchImpl(url, init);
|
|
355
|
+
} catch (error) {
|
|
356
|
+
throw new OpenCodeTransportError(operation, error);
|
|
357
|
+
}
|
|
358
|
+
const body = await response.text();
|
|
359
|
+
if (!response.ok) {
|
|
360
|
+
const detail = responseDetail(body);
|
|
361
|
+
throw new Error(
|
|
362
|
+
`OpenCode ${operation} failed with HTTP ${response.status}${detail ? `: ${detail}` : ""}`,
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
if (!body.trim()) throw new Error(`OpenCode ${operation} returned an empty response`);
|
|
366
|
+
try {
|
|
367
|
+
return JSON.parse(body);
|
|
368
|
+
} catch {
|
|
369
|
+
throw new Error(`OpenCode ${operation} returned invalid JSON`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function isSessionCreationTransportError(error) {
|
|
374
|
+
return error instanceof OpenCodeTransportError && error.operation === "session creation";
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function basicAuthorization(username, password) {
|
|
378
|
+
return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function positiveInteger(value, fallback) {
|
|
382
|
+
const parsed = Number(value);
|
|
383
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
async function bestEffortDelete(fetchImpl, url, authorization) {
|
|
387
|
+
try {
|
|
388
|
+
await fetchImpl(url, {
|
|
389
|
+
method: "DELETE",
|
|
390
|
+
headers: authorization ? { authorization } : {},
|
|
391
|
+
});
|
|
392
|
+
} catch {
|
|
393
|
+
// Session cleanup must not replace the prompt result or its error.
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function messageText(message) {
|
|
398
|
+
const payload = message?.data ?? message;
|
|
399
|
+
if (!Array.isArray(payload?.parts)) return undefined;
|
|
400
|
+
return payload.parts
|
|
401
|
+
.flatMap((part) => part?.type === "text" && stringValue(part.text) ? [part.text.trim()] : [])
|
|
402
|
+
.join("\n\n")
|
|
403
|
+
.trim() || undefined;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function responseDetail(body) {
|
|
407
|
+
if (!body.trim()) return undefined;
|
|
408
|
+
try {
|
|
409
|
+
const parsed = JSON.parse(body);
|
|
410
|
+
return stringValue(parsed?.data?.message)
|
|
411
|
+
?? stringValue(parsed?.message)
|
|
412
|
+
?? stringValue(parsed?.error);
|
|
413
|
+
} catch {
|
|
414
|
+
return body.trim().slice(0, 300);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function stringValue(value) {
|
|
419
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function rawString(value) {
|
|
423
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
function errorMessage(error) {
|
|
427
|
+
return error instanceof Error ? error.message : String(error);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function isDirectExecution() {
|
|
431
|
+
return process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
if (isDirectExecution()) {
|
|
435
|
+
try {
|
|
436
|
+
const finalText = await runOpenCodeRepoMemory(parseArgs(process.argv.slice(2)));
|
|
437
|
+
process.stdout.write(`${finalText}\n`);
|
|
438
|
+
} catch (error) {
|
|
439
|
+
process.stderr.write(`${errorMessage(error)}\n`);
|
|
440
|
+
process.exitCode = 1;
|
|
441
|
+
}
|
|
442
|
+
}
|
package/lib/run-entrypoint.mjs
CHANGED
|
@@ -74,6 +74,12 @@ export async function runClaudeAdapterCli() {
|
|
|
74
74
|
await import(pathToFileURL(entrypoint).href);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
export async function runOpenCodeAdapterCli() {
|
|
78
|
+
if (!ensureSupportedNodeRuntime()) return;
|
|
79
|
+
const entrypoint = join(packageRoot, "lib", "memorax-code-opencode-adapter", "src", "cli.mjs");
|
|
80
|
+
await import(pathToFileURL(entrypoint).href);
|
|
81
|
+
}
|
|
82
|
+
|
|
77
83
|
function ensureSupportedNodeRuntime() {
|
|
78
84
|
const message = unsupportedNodeVersionMessage();
|
|
79
85
|
if (!message) return true;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memorax/memorax-code",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "Persistent coding memory for Codex, Claude Code, DeepSeek Harness, and OpenCode.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/memorax-ai/memorax-code#readme",
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
"keywords": [
|
|
16
16
|
"agent",
|
|
17
17
|
"codex",
|
|
18
|
+
"deepseek-harness",
|
|
19
|
+
"dsh",
|
|
20
|
+
"opencode",
|
|
18
21
|
"memory",
|
|
19
22
|
"memorax"
|
|
20
23
|
],
|
|
@@ -23,7 +26,8 @@
|
|
|
23
26
|
"memorax-cli": "bin/memorax-cli.mjs",
|
|
24
27
|
"memorax-code-backend": "bin/memorax-code-backend.mjs",
|
|
25
28
|
"memorax-code-claude": "bin/memorax-code-claude.mjs",
|
|
26
|
-
"memorax-code-codex": "bin/memorax-code-codex.mjs"
|
|
29
|
+
"memorax-code-codex": "bin/memorax-code-codex.mjs",
|
|
30
|
+
"memorax-code-opencode": "bin/memorax-code-opencode.mjs"
|
|
27
31
|
},
|
|
28
32
|
"files": [
|
|
29
33
|
"bin",
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join, resolve } from "node:path";
|
|
5
|
-
import { cleanupCodexAfterBackendRemoval, } from "./codex-plugin-install.js";
|
|
6
|
-
export async function prepareClientPluginRemovalCleanup(options = {}) {
|
|
7
|
-
const claudePluginInstaller = await loadClaudePluginInstaller();
|
|
8
|
-
const home = resolveHome(options.homeDir);
|
|
9
|
-
const memoraxCodeHome = resolve(options.memoraxCodeHome ?? process.env.MEMORAX_CODE_HOME ?? join(home, ".memorax-code"));
|
|
10
|
-
const claudeState = await readJsonRecord(join(memoraxCodeHome, "adapters", "claude-code", "state.json"));
|
|
11
|
-
const claudeHome = options.claudeHome ?? stringField(claudeState, "claudeHome");
|
|
12
|
-
return async () => {
|
|
13
|
-
const [codexPlugin, claudePlugin] = await Promise.all([
|
|
14
|
-
cleanupCodexAfterBackendRemoval({
|
|
15
|
-
memoraxCodeHome,
|
|
16
|
-
homeDir: home,
|
|
17
|
-
codexHome: options.codexHome,
|
|
18
|
-
codexCommand: options.codexCommand,
|
|
19
|
-
}).catch((error) => removalFailure("backend-removal-cleanup", error)),
|
|
20
|
-
Promise.resolve()
|
|
21
|
-
.then(() => claudePluginInstaller.removeClaudePluginInstallation({
|
|
22
|
-
memoraxCodeHome,
|
|
23
|
-
...(claudeHome ? { claudeHome } : {}),
|
|
24
|
-
...(options.claudeCommand ? { claudeCommand: options.claudeCommand } : {}),
|
|
25
|
-
}))
|
|
26
|
-
.catch((error) => removalFailure("claude-plugin-remove", error)),
|
|
27
|
-
]);
|
|
28
|
-
return {
|
|
29
|
-
ok: codexPlugin.ok && claudePlugin.ok,
|
|
30
|
-
action: "client-plugin-removal-cleanup",
|
|
31
|
-
codexPlugin,
|
|
32
|
-
claudePlugin,
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
async function loadClaudePluginInstaller() {
|
|
37
|
-
return await import(new URL("../../memorax-code-claude-adapter/src/plugin-install.mjs", import.meta.url).href);
|
|
38
|
-
}
|
|
39
|
-
async function readJsonRecord(path) {
|
|
40
|
-
if (!existsSync(path))
|
|
41
|
-
return undefined;
|
|
42
|
-
try {
|
|
43
|
-
const parsed = JSON.parse(await readFile(path, "utf8"));
|
|
44
|
-
return isRecord(parsed) ? parsed : undefined;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function stringField(record, key) {
|
|
51
|
-
const value = record?.[key];
|
|
52
|
-
return typeof value === "string" && value.trim() ? value : undefined;
|
|
53
|
-
}
|
|
54
|
-
function resolveHome(value) {
|
|
55
|
-
return resolve(value ?? process.env.HOME ?? homedir());
|
|
56
|
-
}
|
|
57
|
-
function removalFailure(action, error) {
|
|
58
|
-
return {
|
|
59
|
-
ok: false,
|
|
60
|
-
action,
|
|
61
|
-
reason: "plugin_remove_failed",
|
|
62
|
-
message: error instanceof Error ? error.message : String(error),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function isRecord(value) {
|
|
66
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
67
|
-
}
|
|
File without changes
|
|
File without changes
|
/package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js}
RENAMED
|
File without changes
|
|
File without changes
|
/package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js}
RENAMED
|
File without changes
|
/package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|