@memorax/memorax-code 0.1.1 → 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.
- 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 +424 -108
- package/docs/configuration.md +153 -29
- package/docs/troubleshooting.md +93 -7
- 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 +38 -0
- 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} +16 -9
- 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} +18 -11
- 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} +157 -34
- 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 +3 -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} +82 -21
- package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +45 -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} +25 -4
- package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +30 -6
- package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +7 -3
- package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +31 -2
- 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/{repository-memory-scope.js → repository/scope.js} +81 -33
- 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} +25 -14
- 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/viewer/ui/icon.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +14 -12
- 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/runtime-hooks/memory-turn.mjs +5 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
- 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 +5 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- 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 +2 -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 +38 -0
- 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/runtime-hooks/memory-turn.mjs +5 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
- 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 +5 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- 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 +2 -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 +16 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +23 -15
- 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 +5 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- 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 +1289 -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 +536 -0
- package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +207 -0
- package/lib/resolve-claude-command.mjs +154 -1
- package/lib/resolve-codex-command.mjs +56 -1
- 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/{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-logo.js → viewer/ui/logo.js} +0 -0
package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js}
RENAMED
|
@@ -3,17 +3,22 @@ import { readFile } from "node:fs/promises";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { BackendConnectionAuthorityError } from "
|
|
7
|
-
import { RuntimeRecordError } from "
|
|
8
|
-
import { runBackendStatus } from "./backend
|
|
9
|
-
import { readBackendServiceState, preflightBackendServiceStart, startBackendService, stopBackendService, } from "./service.js";
|
|
10
|
-
import { backendServiceHome, BackendLifecycleLockError, withBackendLifecycleLock, } from "./
|
|
11
|
-
import { seedMissingMemoraxCodeConfig } from "
|
|
12
|
-
import { runProcessWithWindowsNpm } from "
|
|
6
|
+
import { BackendConnectionAuthorityError } from "../../../memorax-code-adapter-common/src/backend-connection.mjs";
|
|
7
|
+
import { RuntimeRecordError } from "../../../memorax-code-adapter-common/src/runtime-record.mjs";
|
|
8
|
+
import { runBackendStatus } from "./backend/status.js";
|
|
9
|
+
import { readBackendServiceState, preflightBackendServiceStart, startBackendService, stopBackendService, } from "./backend/service.js";
|
|
10
|
+
import { backendServiceHome, BackendLifecycleLockError, withBackendLifecycleLock, } from "./lock.js";
|
|
11
|
+
import { seedMissingMemoraxCodeConfig } from "../provider/memorax/config.js";
|
|
12
|
+
import { runProcessWithWindowsNpm } from "../shared/windows-cli-invocation.js";
|
|
13
13
|
import { loadManagedClientsConfig, resolveManagedClients } from "./client-selection.js";
|
|
14
|
-
import { clearActiveManagedClients, readActiveManagedClients, writeActiveManagedClients } from "./active-
|
|
15
|
-
import { codexAdapterLifecycle } from "
|
|
16
|
-
import { claudeAdapterLifecycle } from "
|
|
14
|
+
import { clearActiveManagedClients, readActiveManagedClients, writeActiveManagedClients } from "./active-clients.js";
|
|
15
|
+
import { codexAdapterLifecycle } from "../clients/codex/lifecycle.js";
|
|
16
|
+
import { claudeAdapterLifecycle } from "../clients/claude/lifecycle.js";
|
|
17
|
+
import { collectDshAdapterLifecycleStatus, withDshAdapterLifecycleLock, } from "../clients/dsh/lifecycle.js";
|
|
18
|
+
import { openCodeAdapterLifecycle } from "../clients/opencode/lifecycle.js";
|
|
19
|
+
const PACKAGE_REPLACEMENT_ENV = "MEMORAX_CODE_PACKAGE_REPLACEMENT";
|
|
20
|
+
const DSH_RECOVERY_ENV = "MEMORAX_CODE_DSH_ADAPTER_RECOVERY";
|
|
21
|
+
const DSH_RECOVERY_REVISION_ENV = "MEMORAX_CODE_DSH_ADAPTER_EXPECTED_REVISION";
|
|
17
22
|
export async function collectMemoraxCodeStatus(backendUrl, backendToken, serviceOptions, argv) {
|
|
18
23
|
const clients = managedClientsFor(argv, serviceOptions, { preferActive: true });
|
|
19
24
|
let serviceState;
|
|
@@ -45,22 +50,34 @@ export async function collectMemoraxCodeStatus(backendUrl, backendToken, service
|
|
|
45
50
|
const claudeAdapter = clients.claude
|
|
46
51
|
? await claudeAdapterLifecycle.status({ argv, serviceOptions, backendUrl })
|
|
47
52
|
: undefined;
|
|
53
|
+
const dshAdapter = clients.dsh
|
|
54
|
+
? await collectDshAdapterLifecycleStatus({ argv, serviceOptions, backendUrl })
|
|
55
|
+
: undefined;
|
|
56
|
+
const opencodeAdapter = clients.opencode
|
|
57
|
+
? await openCodeAdapterLifecycle.status({ argv, serviceOptions, backendUrl })
|
|
58
|
+
: undefined;
|
|
48
59
|
const codexReady = codexAdapter ? isAdapterReady(codexAdapter) : true;
|
|
49
60
|
const claudeReady = claudeAdapter ? isAdapterReady(claudeAdapter) : true;
|
|
61
|
+
const dshReady = dshAdapter ? isAdapterReady(dshAdapter) : true;
|
|
62
|
+
const opencodeReady = opencodeAdapter ? isAdapterReady(opencodeAdapter) : true;
|
|
50
63
|
return {
|
|
51
64
|
ok: backend.ok
|
|
52
65
|
&& codexReady
|
|
53
|
-
&&
|
|
66
|
+
&& opencodeReady
|
|
67
|
+
&& (isOptionalUnconfiguredClaudeAdapter(claudeAdapter, codexAdapter) || claudeReady)
|
|
68
|
+
&& (isOptionalUnavailableDshAdapter(dshAdapter) || dshReady),
|
|
54
69
|
action: "status",
|
|
55
70
|
backend,
|
|
56
71
|
...(codexAdapter ? { codexAdapter } : {}),
|
|
57
72
|
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
73
|
+
...(dshAdapter ? { dshAdapter } : {}),
|
|
74
|
+
...(opencodeAdapter ? { opencodeAdapter } : {}),
|
|
58
75
|
};
|
|
59
76
|
}
|
|
60
77
|
export async function startMemoraxCodeService(serviceOptions, argv, commitReadyState) {
|
|
61
78
|
return withMemoraxCodeLifecycleLock("start", serviceOptions, async () => {
|
|
62
79
|
const report = await startMemoraxCodeServiceLocked(serviceOptions, argv);
|
|
63
|
-
if (report.ok)
|
|
80
|
+
if (report.ok && report.backend?.ok)
|
|
64
81
|
await commitReadyState?.(report);
|
|
65
82
|
return report;
|
|
66
83
|
});
|
|
@@ -88,16 +105,70 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
88
105
|
return { ok: false, action: "start", backend: serviceStateFailure };
|
|
89
106
|
}
|
|
90
107
|
const config = loadManagedClientsConfig(memoraxCodeHome);
|
|
91
|
-
const
|
|
108
|
+
const requestedClients = resolveManagedClients(argv, config);
|
|
109
|
+
const clients = isDshAdapterRecovery()
|
|
110
|
+
? { ...requestedClients, dsh: true }
|
|
111
|
+
: requestedClients;
|
|
92
112
|
const previousClients = readActiveManagedClients(memoraxCodeHome);
|
|
113
|
+
const context = { argv, serviceOptions };
|
|
114
|
+
if (clients.dsh || previousClients?.dsh || isDshAdapterRecovery()) {
|
|
115
|
+
try {
|
|
116
|
+
return await withDshAdapterLifecycleLock(context, (dshLifecycle) => (executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients, dshLifecycle)));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return dshLifecycleFailure("start", error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients);
|
|
123
|
+
}
|
|
124
|
+
async function executeMemoraxCodeStart(serviceOptions, argv, backendUrl, memoraxCodeHome, clients, previousClients, dshLifecycle) {
|
|
125
|
+
const lifecycleContext = { argv, serviceOptions };
|
|
126
|
+
const lifecycleBackendContext = { ...lifecycleContext, backendUrl };
|
|
127
|
+
if (isDshAdapterRecovery() && dshLifecycle) {
|
|
128
|
+
const status = await dshLifecycle.status(lifecycleBackendContext);
|
|
129
|
+
const expectedRevision = nonEmptyString(process.env[DSH_RECOVERY_REVISION_ENV])
|
|
130
|
+
? process.env[DSH_RECOVERY_REVISION_ENV]
|
|
131
|
+
: undefined;
|
|
132
|
+
if (!expectedRevision
|
|
133
|
+
|| status.ok !== true
|
|
134
|
+
|| status.enabled !== true
|
|
135
|
+
|| status.revision !== expectedRevision) {
|
|
136
|
+
return {
|
|
137
|
+
ok: true,
|
|
138
|
+
action: "start",
|
|
139
|
+
reason: "dsh_recovery_not_authorized",
|
|
140
|
+
dshAdapter: {
|
|
141
|
+
...status,
|
|
142
|
+
skipped: true,
|
|
143
|
+
reason: "dsh_recovery_not_authorized",
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const quiescedDsh = dshLifecycle && (clients.dsh || previousClients?.dsh)
|
|
149
|
+
? await dshLifecycle.quiesce?.(lifecycleContext)
|
|
150
|
+
: undefined;
|
|
151
|
+
if (quiescedDsh?.ok === false) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
action: "start",
|
|
155
|
+
backend: preservedBackendResult(serviceOptions, "dsh_adapter_quiesce_failed", "start"),
|
|
156
|
+
dshAdapter: quiescedDsh,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const recoverPreparationFailure = (reason) => recoverStartPreparationFailure(serviceOptions, reason, dshLifecycle, lifecycleBackendContext, quiescedDsh);
|
|
93
160
|
// A failed Backend ownership check must leave the active client generation
|
|
94
161
|
// and its conservative cleanup marker untouched.
|
|
95
162
|
const stopped = await stopBackendService(serviceOptions);
|
|
96
163
|
if (!stopped.ok) {
|
|
164
|
+
const restoredDsh = await reactivatePreviouslyEnabledDsh(dshLifecycle, lifecycleContext, quiescedDsh);
|
|
97
165
|
return {
|
|
98
166
|
ok: false,
|
|
99
167
|
action: "start",
|
|
100
168
|
backend: { ...stopped, action: "start" },
|
|
169
|
+
...(restoredDsh || quiescedDsh
|
|
170
|
+
? { dshAdapter: restoredDsh ?? quiescedDsh }
|
|
171
|
+
: {}),
|
|
101
172
|
};
|
|
102
173
|
}
|
|
103
174
|
const deselectedCodex = previousClients?.codex && !clients.codex
|
|
@@ -106,13 +177,27 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
106
177
|
const deselectedClaude = previousClients?.claude && !clients.claude
|
|
107
178
|
? await claudeAdapterLifecycle.disable({ argv, serviceOptions })
|
|
108
179
|
: undefined;
|
|
109
|
-
|
|
180
|
+
const deselectedDsh = previousClients?.dsh && !clients.dsh && dshLifecycle
|
|
181
|
+
? await dshLifecycle.disable({ argv, serviceOptions })
|
|
182
|
+
: undefined;
|
|
183
|
+
const deselectedOpenCode = previousClients?.opencode && !clients.opencode
|
|
184
|
+
? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
|
|
185
|
+
: undefined;
|
|
186
|
+
if (deselectedCodex?.ok === false
|
|
187
|
+
|| deselectedClaude?.ok === false
|
|
188
|
+
|| deselectedDsh?.ok === false
|
|
189
|
+
|| deselectedOpenCode?.ok === false) {
|
|
190
|
+
const recovery = await recoverPreparationFailure("adapter_disable_failed");
|
|
110
191
|
return {
|
|
111
192
|
ok: false,
|
|
112
193
|
action: "start",
|
|
113
|
-
backend:
|
|
194
|
+
backend: recovery.backend,
|
|
114
195
|
...(deselectedCodex ? { codexAdapter: deselectedCodex } : {}),
|
|
115
196
|
...(deselectedClaude ? { claudeAdapter: deselectedClaude } : {}),
|
|
197
|
+
...(recovery.dshAdapter || deselectedDsh
|
|
198
|
+
? { dshAdapter: recovery.dshAdapter ?? deselectedDsh }
|
|
199
|
+
: {}),
|
|
200
|
+
...(deselectedOpenCode ? { opencodeAdapter: deselectedOpenCode } : {}),
|
|
116
201
|
};
|
|
117
202
|
}
|
|
118
203
|
// The marker is a conservative cleanup scope, not a readiness signal. Persist
|
|
@@ -123,51 +208,95 @@ async function startMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
123
208
|
await seedMissingMemoraxCodeConfig(memoraxCodeHomeForService(serviceOptions));
|
|
124
209
|
}
|
|
125
210
|
catch (error) {
|
|
211
|
+
const recovery = await recoverPreparationFailure("lifecycle_state_prepare_failed");
|
|
126
212
|
return {
|
|
127
213
|
ok: false,
|
|
128
214
|
action: "start",
|
|
129
215
|
reason: "lifecycle_state_prepare_failed",
|
|
130
216
|
message: error instanceof Error ? error.message : String(error),
|
|
131
|
-
backend:
|
|
217
|
+
backend: recovery.backend,
|
|
218
|
+
...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
|
|
132
219
|
};
|
|
133
220
|
}
|
|
134
221
|
const codexAdapter = clients.codex
|
|
135
222
|
? await codexAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
|
|
136
223
|
: undefined;
|
|
137
224
|
if (codexAdapter?.ok === false) {
|
|
225
|
+
const recovery = await recoverPreparationFailure("codex_adapter_enable_failed");
|
|
138
226
|
return {
|
|
139
227
|
ok: false,
|
|
140
228
|
action: "start",
|
|
141
|
-
backend:
|
|
229
|
+
backend: recovery.backend,
|
|
142
230
|
codexAdapter,
|
|
231
|
+
...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
|
|
143
232
|
};
|
|
144
233
|
}
|
|
145
234
|
const claudeAdapter = clients.claude
|
|
146
235
|
? await claudeAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
|
|
147
236
|
: undefined;
|
|
237
|
+
const opencodeAdapter = clients.opencode
|
|
238
|
+
? await openCodeAdapterLifecycle.prepareEnable({ argv, serviceOptions, backendUrl })
|
|
239
|
+
: undefined;
|
|
240
|
+
if (opencodeAdapter?.ok === false) {
|
|
241
|
+
const recovery = await recoverPreparationFailure("opencode_adapter_enable_failed");
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
action: "start",
|
|
245
|
+
backend: recovery.backend,
|
|
246
|
+
...(codexAdapter ? { codexAdapter } : {}),
|
|
247
|
+
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
248
|
+
...(recovery.dshAdapter ? { dshAdapter: recovery.dshAdapter } : {}),
|
|
249
|
+
opencodeAdapter,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
const preparedDshAdapter = clients.dsh && dshLifecycle
|
|
253
|
+
? await dshLifecycle.prepareEnable(lifecycleBackendContext)
|
|
254
|
+
: undefined;
|
|
255
|
+
if (preparedDshAdapter?.ok === false) {
|
|
256
|
+
const recovery = await recoverPreparationFailure("dsh_adapter_enable_failed");
|
|
257
|
+
return {
|
|
258
|
+
ok: false,
|
|
259
|
+
action: "start",
|
|
260
|
+
backend: recovery.backend,
|
|
261
|
+
...(codexAdapter ? { codexAdapter } : {}),
|
|
262
|
+
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
263
|
+
dshAdapter: recovery.dshAdapter ?? preparedDshAdapter,
|
|
264
|
+
...(opencodeAdapter ? { opencodeAdapter } : {}),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
148
267
|
const backendStartOptions = {
|
|
149
268
|
...serviceOptions,
|
|
150
269
|
claudeProjectsRoot: claudeProjectsRootForStart(argv, claudeAdapter),
|
|
151
270
|
};
|
|
152
271
|
const backend = await startBackendService(backendStartOptions);
|
|
153
272
|
if (!backend.ok) {
|
|
154
|
-
const
|
|
273
|
+
const disabledCodex = codexAdapter
|
|
155
274
|
? await codexAdapterLifecycle.disable({ argv, serviceOptions })
|
|
156
275
|
: undefined;
|
|
276
|
+
const disabledOpenCode = opencodeAdapter
|
|
277
|
+
? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
|
|
278
|
+
: undefined;
|
|
157
279
|
return {
|
|
158
280
|
ok: false,
|
|
159
281
|
action: "start",
|
|
160
282
|
backend,
|
|
161
|
-
...(
|
|
283
|
+
...(disabledCodex ? { codexAdapter: disabledCodex } : {}),
|
|
162
284
|
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
285
|
+
...(preparedDshAdapter ? { dshAdapter: preparedDshAdapter } : {}),
|
|
286
|
+
...(disabledOpenCode ? { opencodeAdapter: disabledOpenCode } : {}),
|
|
163
287
|
};
|
|
164
288
|
}
|
|
289
|
+
const dshAdapter = preparedDshAdapter?.installed === true
|
|
290
|
+
? await dshLifecycle?.activate?.(lifecycleBackendContext)
|
|
291
|
+
: preparedDshAdapter;
|
|
165
292
|
return {
|
|
166
|
-
ok: claudeAdapter?.ok !== false,
|
|
293
|
+
ok: claudeAdapter?.ok !== false && dshAdapter?.ok !== false,
|
|
167
294
|
action: "start",
|
|
168
295
|
backend,
|
|
169
296
|
...(codexAdapter ? { codexAdapter } : {}),
|
|
170
297
|
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
298
|
+
...(dshAdapter ? { dshAdapter } : {}),
|
|
299
|
+
...(opencodeAdapter ? { opencodeAdapter } : {}),
|
|
171
300
|
};
|
|
172
301
|
}
|
|
173
302
|
function claudeProjectsRootForStart(argv, claudeAdapter) {
|
|
@@ -187,12 +316,20 @@ export async function stopMemoraxCodeService(serviceOptions, argv) {
|
|
|
187
316
|
}
|
|
188
317
|
async function stopMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
189
318
|
const context = memoraxCodeStopContext(serviceOptions, argv);
|
|
190
|
-
|
|
319
|
+
let execution;
|
|
320
|
+
try {
|
|
321
|
+
execution = context.clients.dsh
|
|
322
|
+
? await withDshAdapterLifecycleLock({ argv, serviceOptions }, (dshLifecycle) => (executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle)))
|
|
323
|
+
: await executeMemoraxCodeStop(serviceOptions, argv, context);
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
return dshLifecycleFailure("stop", error);
|
|
327
|
+
}
|
|
191
328
|
if (execution.report.ok)
|
|
192
329
|
commitActiveManagedClients(context.memoraxCodeHome, execution.remainingClients);
|
|
193
330
|
return execution.report;
|
|
194
331
|
}
|
|
195
|
-
async function executeMemoraxCodeStop(serviceOptions, argv, context) {
|
|
332
|
+
async function executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle) {
|
|
196
333
|
const { activeClients, clients } = context;
|
|
197
334
|
const serviceStateFailure = backendServiceStatePreflight(serviceOptions, "stop");
|
|
198
335
|
if (serviceStateFailure) {
|
|
@@ -209,22 +346,47 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
|
|
|
209
346
|
? {
|
|
210
347
|
codex: activeClients.codex && !clients.codex,
|
|
211
348
|
claude: activeClients.claude && !clients.claude,
|
|
349
|
+
dsh: activeClients.dsh && !clients.dsh,
|
|
350
|
+
opencode: activeClients.opencode && !clients.opencode,
|
|
212
351
|
}
|
|
213
352
|
: undefined;
|
|
214
|
-
const hasRemainingClients = remaining?.codex === true
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
353
|
+
const hasRemainingClients = remaining?.codex === true
|
|
354
|
+
|| remaining?.claude === true
|
|
355
|
+
|| remaining?.dsh === true
|
|
356
|
+
|| remaining?.opencode === true;
|
|
357
|
+
const backendOnlyStop = !clients.codex && !clients.claude && !clients.dsh && !clients.opencode;
|
|
358
|
+
const packageReplacement = isPackageReplacement();
|
|
359
|
+
const needsBackendStop = packageReplacement || backendOnlyStop || !hasRemainingClients;
|
|
360
|
+
const quiescedDsh = clients.dsh && dshLifecycle
|
|
361
|
+
? await dshLifecycle.quiesce?.({ argv, serviceOptions })
|
|
362
|
+
: undefined;
|
|
363
|
+
if (quiescedDsh?.ok === false) {
|
|
364
|
+
return {
|
|
365
|
+
report: {
|
|
366
|
+
ok: false,
|
|
367
|
+
action: "stop",
|
|
368
|
+
backend: preservedBackendResult(serviceOptions, "dsh_adapter_quiesce_failed"),
|
|
369
|
+
dshAdapter: quiescedDsh,
|
|
370
|
+
},
|
|
371
|
+
remainingClients: activeClients,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
// A true partial stop keeps the shared Backend for remaining clients. DSH
|
|
375
|
+
// publishes its inert sentinel first; every other adapter is disabled only
|
|
376
|
+
// after an accepted Backend shutdown.
|
|
219
377
|
const stoppedBackend = needsBackendStop
|
|
220
378
|
? await stopBackendService(serviceOptions)
|
|
221
379
|
: undefined;
|
|
222
380
|
if (stoppedBackend?.ok === false) {
|
|
381
|
+
const restoredDsh = await reactivatePreviouslyEnabledDsh(dshLifecycle, { argv, serviceOptions }, quiescedDsh);
|
|
223
382
|
return {
|
|
224
383
|
report: {
|
|
225
384
|
ok: false,
|
|
226
385
|
action: "stop",
|
|
227
386
|
backend: stoppedBackend,
|
|
387
|
+
...(restoredDsh || quiescedDsh
|
|
388
|
+
? { dshAdapter: restoredDsh ?? quiescedDsh }
|
|
389
|
+
: {}),
|
|
228
390
|
},
|
|
229
391
|
remainingClients: activeClients,
|
|
230
392
|
};
|
|
@@ -235,12 +397,25 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
|
|
|
235
397
|
const claudeAdapter = clients.claude
|
|
236
398
|
? await claudeAdapterLifecycle.disable({ argv, serviceOptions })
|
|
237
399
|
: undefined;
|
|
238
|
-
const
|
|
400
|
+
const dshAdapter = clients.dsh && dshLifecycle
|
|
401
|
+
? await dshLifecycle.disable({ argv, serviceOptions })
|
|
402
|
+
: undefined;
|
|
403
|
+
const opencodeAdapter = clients.opencode
|
|
404
|
+
? await openCodeAdapterLifecycle.disable({ argv, serviceOptions })
|
|
405
|
+
: undefined;
|
|
406
|
+
const adaptersOk = codexAdapter?.ok !== false
|
|
407
|
+
&& claudeAdapter?.ok !== false
|
|
408
|
+
&& dshAdapter?.ok !== false
|
|
409
|
+
&& opencodeAdapter?.ok !== false;
|
|
239
410
|
const backend = stoppedBackend
|
|
240
411
|
?? (adaptersOk
|
|
241
412
|
? preservedBackendResult(serviceOptions, "active_clients_remaining")
|
|
242
413
|
: preservedBackendResult(serviceOptions, "adapter_disable_failed"));
|
|
243
|
-
const ok = backend.ok
|
|
414
|
+
const ok = backend.ok
|
|
415
|
+
&& codexAdapter?.ok !== false
|
|
416
|
+
&& claudeAdapter?.ok !== false
|
|
417
|
+
&& dshAdapter?.ok !== false
|
|
418
|
+
&& opencodeAdapter?.ok !== false;
|
|
244
419
|
return {
|
|
245
420
|
report: {
|
|
246
421
|
ok,
|
|
@@ -248,6 +423,8 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
|
|
|
248
423
|
backend,
|
|
249
424
|
...(codexAdapter ? { codexAdapter } : {}),
|
|
250
425
|
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
426
|
+
...(dshAdapter ? { dshAdapter } : {}),
|
|
427
|
+
...(opencodeAdapter ? { opencodeAdapter } : {}),
|
|
251
428
|
},
|
|
252
429
|
remainingClients: remaining && hasRemainingClients ? remaining : undefined,
|
|
253
430
|
};
|
|
@@ -255,7 +432,7 @@ async function executeMemoraxCodeStop(serviceOptions, argv, context) {
|
|
|
255
432
|
export async function restartMemoraxCodeService(serviceOptions, argv, commitReadyState) {
|
|
256
433
|
return withMemoraxCodeLifecycleLock("restart", serviceOptions, async () => {
|
|
257
434
|
const report = await restartMemoraxCodeServiceLocked(serviceOptions, argv);
|
|
258
|
-
if (report.ok)
|
|
435
|
+
if (report.ok && report.backend?.ok)
|
|
259
436
|
await commitReadyState?.(report);
|
|
260
437
|
return report;
|
|
261
438
|
});
|
|
@@ -284,11 +461,22 @@ export async function uninstallMemoraxCodeService(serviceOptions, argv) {
|
|
|
284
461
|
}
|
|
285
462
|
async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
286
463
|
const context = memoraxCodeStopContext(serviceOptions, argv);
|
|
464
|
+
if (context.clients.dsh) {
|
|
465
|
+
try {
|
|
466
|
+
return await withDshAdapterLifecycleLock({ argv, serviceOptions }, (dshLifecycle) => (executeMemoraxCodeUninstall(serviceOptions, argv, context, dshLifecycle)));
|
|
467
|
+
}
|
|
468
|
+
catch (error) {
|
|
469
|
+
return dshLifecycleFailure("uninstall", error);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return executeMemoraxCodeUninstall(serviceOptions, argv, context);
|
|
473
|
+
}
|
|
474
|
+
async function executeMemoraxCodeUninstall(serviceOptions, argv, context, dshLifecycle) {
|
|
287
475
|
const { activeClients, clients, memoraxCodeHome } = context;
|
|
288
|
-
const configuredClients =
|
|
476
|
+
const configuredClients = configuredClientsForPackageRemoval(serviceOptions);
|
|
289
477
|
const canRemoveSharedPackage = includesManagedClients(clients, configuredClients)
|
|
290
478
|
&& (!activeClients || includesManagedClients(clients, activeClients));
|
|
291
|
-
const stopExecution = await executeMemoraxCodeStop(serviceOptions, argv, context);
|
|
479
|
+
const stopExecution = await executeMemoraxCodeStop(serviceOptions, argv, context, dshLifecycle);
|
|
292
480
|
const stopped = stopExecution.report;
|
|
293
481
|
if (!stopped.ok) {
|
|
294
482
|
return {
|
|
@@ -305,8 +493,16 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
305
493
|
const claudePlugin = clients.claude
|
|
306
494
|
? await claudeAdapterLifecycle.remove({ argv, serviceOptions })
|
|
307
495
|
: undefined;
|
|
496
|
+
const dshPlugin = clients.dsh && dshLifecycle
|
|
497
|
+
? await dshLifecycle.remove({ argv, serviceOptions })
|
|
498
|
+
: undefined;
|
|
499
|
+
const opencodePlugin = clients.opencode
|
|
500
|
+
? await openCodeAdapterLifecycle.remove({ argv, serviceOptions })
|
|
501
|
+
: undefined;
|
|
308
502
|
const pluginCleanupOk = codexPlugin?.ok !== false
|
|
309
|
-
&& claudePlugin?.ok !== false
|
|
503
|
+
&& claudePlugin?.ok !== false
|
|
504
|
+
&& dshPlugin?.ok !== false
|
|
505
|
+
&& opencodePlugin?.ok !== false;
|
|
310
506
|
const npmPackageRemoval = !pluginCleanupOk
|
|
311
507
|
? skippedNpmPackageRemoval("plugin_cleanup_failed")
|
|
312
508
|
: canRemoveSharedPackage
|
|
@@ -315,6 +511,10 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
315
511
|
const claudeAdapter = stopped.claudeAdapter && claudePlugin
|
|
316
512
|
? { ...stopped.claudeAdapter, pluginRemove: claudePlugin }
|
|
317
513
|
: stopped.claudeAdapter;
|
|
514
|
+
const dshAdapter = dshPlugin ?? stopped.dshAdapter;
|
|
515
|
+
const opencodeAdapter = stopped.opencodeAdapter && opencodePlugin
|
|
516
|
+
? { ...stopped.opencodeAdapter, pluginRemove: opencodePlugin }
|
|
517
|
+
: stopped.opencodeAdapter;
|
|
318
518
|
const ok = pluginCleanupOk && npmPackageRemoval.ok !== false;
|
|
319
519
|
if (ok)
|
|
320
520
|
commitActiveManagedClients(memoraxCodeHome, stopExecution.remainingClients);
|
|
@@ -324,8 +524,13 @@ async function uninstallMemoraxCodeServiceLocked(serviceOptions, argv) {
|
|
|
324
524
|
action: "uninstall",
|
|
325
525
|
...(codexPlugin ? { codexPlugin } : {}),
|
|
326
526
|
...(claudeAdapter ? { claudeAdapter } : {}),
|
|
527
|
+
...(dshAdapter ? { dshAdapter } : {}),
|
|
528
|
+
...(opencodeAdapter ? { opencodeAdapter } : {}),
|
|
327
529
|
npmPackageRemoval,
|
|
328
|
-
removesPlugin: codexPlugin?.ok === true
|
|
530
|
+
removesPlugin: codexPlugin?.ok === true
|
|
531
|
+
|| claudePlugin?.ok === true
|
|
532
|
+
|| (dshPlugin?.ok === true && dshPlugin.skipped !== true)
|
|
533
|
+
|| opencodePlugin?.ok === true,
|
|
329
534
|
removesUserState: false,
|
|
330
535
|
};
|
|
331
536
|
}
|
|
@@ -403,12 +608,25 @@ function managedClientsFor(argv, serviceOptions, options = {}) {
|
|
|
403
608
|
}
|
|
404
609
|
return resolveManagedClients(argv, loadManagedClientsConfig(memoraxCodeHome));
|
|
405
610
|
}
|
|
611
|
+
function configuredClientsForPackageRemoval(serviceOptions) {
|
|
612
|
+
const memoraxCodeHome = memoraxCodeHomeForService(serviceOptions);
|
|
613
|
+
const config = loadManagedClientsConfig(memoraxCodeHome);
|
|
614
|
+
const configured = resolveManagedClients([], config);
|
|
615
|
+
const legacyDshSelection = config.clients !== undefined
|
|
616
|
+
&& config.clients.dsh === undefined;
|
|
617
|
+
const ownsDshIntegration = existsSync(join(memoraxCodeHome, "adapters", "dsh", "state.json"));
|
|
618
|
+
return legacyDshSelection && !ownsDshIntegration
|
|
619
|
+
? { ...configured, dsh: false }
|
|
620
|
+
: configured;
|
|
621
|
+
}
|
|
406
622
|
function memoraxCodeStopContext(serviceOptions, argv) {
|
|
407
623
|
const memoraxCodeHome = memoraxCodeHomeForService(serviceOptions);
|
|
408
624
|
return {
|
|
409
625
|
memoraxCodeHome,
|
|
410
626
|
activeClients: readActiveManagedClients(memoraxCodeHome),
|
|
411
|
-
clients:
|
|
627
|
+
clients: isPackageReplacement()
|
|
628
|
+
? { codex: false, claude: false, dsh: true, opencode: false }
|
|
629
|
+
: managedClientsFor(argv, serviceOptions, { preferActive: true }),
|
|
412
630
|
};
|
|
413
631
|
}
|
|
414
632
|
function commitActiveManagedClients(memoraxCodeHome, clients) {
|
|
@@ -425,7 +643,19 @@ function argValue(argv, name) {
|
|
|
425
643
|
return index >= 0 ? argv[index + 1] : undefined;
|
|
426
644
|
}
|
|
427
645
|
function includesManagedClients(selection, required) {
|
|
428
|
-
return (!required.codex || selection.codex)
|
|
646
|
+
return (!required.codex || selection.codex)
|
|
647
|
+
&& (!required.claude || selection.claude)
|
|
648
|
+
&& (!required.dsh || selection.dsh)
|
|
649
|
+
&& (!required.opencode || selection.opencode);
|
|
650
|
+
}
|
|
651
|
+
function isPackageReplacement() {
|
|
652
|
+
return truthyEnv(process.env[PACKAGE_REPLACEMENT_ENV]);
|
|
653
|
+
}
|
|
654
|
+
function isDshAdapterRecovery() {
|
|
655
|
+
return truthyEnv(process.env[DSH_RECOVERY_ENV]);
|
|
656
|
+
}
|
|
657
|
+
function truthyEnv(value) {
|
|
658
|
+
return ["1", "true", "yes", "on"].includes(String(value ?? "").trim().toLowerCase());
|
|
429
659
|
}
|
|
430
660
|
function preservedBackendResult(serviceOptions, reason, action = "stop") {
|
|
431
661
|
const state = readBackendServiceState(serviceOptions);
|
|
@@ -457,6 +687,41 @@ async function recoverBackendAfterStartPreparationFailure(serviceOptions, reason
|
|
|
457
687
|
};
|
|
458
688
|
}
|
|
459
689
|
}
|
|
690
|
+
async function recoverStartPreparationFailure(serviceOptions, reason, dshLifecycle, context, quiescedDsh) {
|
|
691
|
+
const backend = await recoverBackendAfterStartPreparationFailure(serviceOptions, reason);
|
|
692
|
+
const dshAdapter = backend.ok
|
|
693
|
+
? await restorePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh)
|
|
694
|
+
: undefined;
|
|
695
|
+
return { backend, ...(dshAdapter ? { dshAdapter } : {}) };
|
|
696
|
+
}
|
|
697
|
+
async function restorePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh) {
|
|
698
|
+
const activated = await reactivatePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh);
|
|
699
|
+
if (activated?.ok !== false
|
|
700
|
+
&& activated?.enabled === true
|
|
701
|
+
&& sameDshProfileSet(activated.profiles, quiescedDsh?.profiles))
|
|
702
|
+
return activated;
|
|
703
|
+
if (!dshLifecycle || quiescedDsh?.previouslyEnabled !== true)
|
|
704
|
+
return undefined;
|
|
705
|
+
const prepared = await dshLifecycle.prepareEnable(context);
|
|
706
|
+
if (prepared.ok === false || prepared.installed !== true)
|
|
707
|
+
return prepared;
|
|
708
|
+
return await dshLifecycle.activate?.(context) ?? prepared;
|
|
709
|
+
}
|
|
710
|
+
function sameDshProfileSet(actual, expected) {
|
|
711
|
+
if (!actual?.every(nonEmptyString) || !expected?.every(nonEmptyString))
|
|
712
|
+
return false;
|
|
713
|
+
const actualNames = new Set(actual);
|
|
714
|
+
const expectedNames = new Set(expected);
|
|
715
|
+
return actualNames.size === actual.length
|
|
716
|
+
&& expectedNames.size === expected.length
|
|
717
|
+
&& actualNames.size === expectedNames.size
|
|
718
|
+
&& [...actualNames].every((name) => expectedNames.has(name));
|
|
719
|
+
}
|
|
720
|
+
async function reactivatePreviouslyEnabledDsh(dshLifecycle, context, quiescedDsh) {
|
|
721
|
+
if (!dshLifecycle || quiescedDsh?.previouslyEnabled !== true)
|
|
722
|
+
return undefined;
|
|
723
|
+
return await dshLifecycle.activate?.(context);
|
|
724
|
+
}
|
|
460
725
|
function backendServiceStatePreflight(serviceOptions, action) {
|
|
461
726
|
try {
|
|
462
727
|
readBackendServiceState(serviceOptions);
|
|
@@ -501,14 +766,22 @@ async function withMemoraxCodeLifecycleLock(action, serviceOptions, operation) {
|
|
|
501
766
|
}
|
|
502
767
|
}
|
|
503
768
|
export function isAdapterReady(report) {
|
|
504
|
-
const
|
|
505
|
-
return
|
|
769
|
+
const integration = report.integration ?? report.state?.integration;
|
|
770
|
+
return (integration === "hooks" || integration === "plugin")
|
|
506
771
|
&& report.ok !== false
|
|
507
772
|
&& report.installed === true
|
|
508
773
|
&& report.enabled === true
|
|
509
774
|
&& report.backendUrlMatches !== false
|
|
510
775
|
&& report.codexSkills?.ok !== false
|
|
511
|
-
&& report.claudeSkills?.ok !== false
|
|
776
|
+
&& report.claudeSkills?.ok !== false
|
|
777
|
+
&& report.opencodeSkills?.ok !== false;
|
|
778
|
+
}
|
|
779
|
+
export function isOptionalUnavailableDshAdapter(report) {
|
|
780
|
+
return Boolean(report
|
|
781
|
+
&& report.ok !== false
|
|
782
|
+
&& report.skipped === true
|
|
783
|
+
&& report.managed !== true
|
|
784
|
+
&& report.reason === "no_existing_profiles");
|
|
512
785
|
}
|
|
513
786
|
export function isOptionalUnconfiguredClaudeAdapter(report, codexAdapter) {
|
|
514
787
|
return Boolean(report
|
|
@@ -521,3 +794,16 @@ export function isOptionalUnconfiguredClaudeAdapter(report, codexAdapter) {
|
|
|
521
794
|
function nonEmptyString(value) {
|
|
522
795
|
return typeof value === "string" && value.trim().length > 0;
|
|
523
796
|
}
|
|
797
|
+
function dshLifecycleFailure(action, error) {
|
|
798
|
+
return {
|
|
799
|
+
ok: false,
|
|
800
|
+
action,
|
|
801
|
+
dshAdapter: {
|
|
802
|
+
ok: false,
|
|
803
|
+
action,
|
|
804
|
+
integration: "plugin",
|
|
805
|
+
runtime: "dsh",
|
|
806
|
+
error: error instanceof Error ? error.message : String(error),
|
|
807
|
+
},
|
|
808
|
+
};
|
|
809
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { runMemoryCli } from "./memory
|
|
2
|
+
import { runMemoryCli } from "./memory/cli.js";
|
|
3
3
|
runMemoryCli(process.argv.slice(2)).then((result) => {
|
|
4
4
|
if (!process.argv.includes("--json") && result.ok && result.action === "memory.search") {
|
|
5
|
+
if (result.userNotice)
|
|
6
|
+
console.warn(`Warning: ${result.userNotice}`);
|
|
5
7
|
console.log(result.answer?.trim() || "No memory context returned.");
|
|
6
8
|
}
|
|
7
9
|
else {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { invokeMemoraxMemoryProvider } from "
|
|
2
|
-
import { memoryRetrievalEnabled, startupRetrieveTimeoutMs, } from "
|
|
3
|
-
import { isRecord } from "
|
|
1
|
+
import { invokeMemoraxMemoryProvider } from "../provider/memorax/adapter.js";
|
|
2
|
+
import { memoryRetrievalEnabled, startupRetrieveTimeoutMs, } from "../provider/memorax/config.js";
|
|
3
|
+
import { isRecord } from "../shared/record.js";
|
|
4
4
|
const AUTOMATIC_MEMORY_CONTEXT_MAX_CHARS = 9_000;
|
|
5
5
|
export async function retrieveAutomaticMemoryContext(options) {
|
|
6
6
|
const startedAt = Date.now();
|