@memorax/memorax-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/bin/memorax-cli.mjs +28 -0
- package/bin/memorax-code-backend.mjs +4 -0
- package/bin/memorax-code-claude.mjs +4 -0
- package/bin/memorax-code-codex.mjs +4 -0
- package/bin/memorax-code-npm-preinstall.mjs +55 -0
- package/bin/memorax-code-plugin-postinstall.mjs +1236 -0
- package/bin/memorax-code.mjs +204 -0
- package/docs/configuration.md +232 -0
- package/docs/troubleshooting.md +179 -0
- package/lib/client-hook-runtime.mjs +32 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-backend/dist/active-client-selection.js +35 -0
- package/lib/memorax-code-backend/dist/adapter-lifecycle-participant.js +1 -0
- package/lib/memorax-code-backend/dist/automatic-memory-retrieval.js +113 -0
- package/lib/memorax-code-backend/dist/automatic-memory-writeback.js +297 -0
- package/lib/memorax-code-backend/dist/backend-env.js +13 -0
- package/lib/memorax-code-backend/dist/backend-lifecycle-lock.js +42 -0
- package/lib/memorax-code-backend/dist/backend-process.js +147 -0
- package/lib/memorax-code-backend/dist/backend-service-cleanup.js +18 -0
- package/lib/memorax-code-backend/dist/backend-service-record.js +206 -0
- package/lib/memorax-code-backend/dist/backend-service-result.js +37 -0
- package/lib/memorax-code-backend/dist/backend-service-token.js +11 -0
- package/lib/memorax-code-backend/dist/backend-shutdown-request.js +133 -0
- package/lib/memorax-code-backend/dist/backend-state.js +58 -0
- package/lib/memorax-code-backend/dist/backend-status.js +53 -0
- package/lib/memorax-code-backend/dist/backend-token-record.js +79 -0
- package/lib/memorax-code-backend/dist/claude-adapter-lifecycle.js +134 -0
- package/lib/memorax-code-backend/dist/claude-local-transcript.js +648 -0
- package/lib/memorax-code-backend/dist/claude-memory-hook-runtime.js +472 -0
- package/lib/memorax-code-backend/dist/claude-transcript-turn.js +876 -0
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +67 -0
- package/lib/memorax-code-backend/dist/client-selection.js +36 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/codex-effective-prompt.js +54 -0
- package/lib/memorax-code-backend/dist/codex-memory-hook-runtime.js +541 -0
- package/lib/memorax-code-backend/dist/codex-plugin-hooks.js +421 -0
- package/lib/memorax-code-backend/dist/codex-plugin-install.js +523 -0
- package/lib/memorax-code-backend/dist/codex-rollout-turn.js +402 -0
- package/lib/memorax-code-backend/dist/codex-session-turn-index.js +88 -0
- package/lib/memorax-code-backend/dist/codex-workspace-links.js +55 -0
- package/lib/memorax-code-backend/dist/debug-log.js +21 -0
- package/lib/memorax-code-backend/dist/entrypoint.js +14 -0
- package/lib/memorax-code-backend/dist/incremental-jsonl-projection.js +271 -0
- package/lib/memorax-code-backend/dist/install-watchdog.js +71 -0
- package/lib/memorax-code-backend/dist/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/memorax-adapter.js +451 -0
- package/lib/memorax-code-backend/dist/memorax-cli.js +14 -0
- package/lib/memorax-code-backend/dist/memorax-code-config.js +279 -0
- package/lib/memorax-code-backend/dist/memorax-code-lifecycle.js +523 -0
- package/lib/memorax-code-backend/dist/memorax-code.js +3 -0
- package/lib/memorax-code-backend/dist/memorax-config.js +283 -0
- package/lib/memorax-code-backend/dist/memorax-http.js +142 -0
- package/lib/memorax-code-backend/dist/memory-cli.js +345 -0
- package/lib/memorax-code-backend/dist/memory-hook-command.js +200 -0
- package/lib/memorax-code-backend/dist/memory-observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory-project.js +89 -0
- package/lib/memorax-code-backend/dist/memory-reminder-trace-recorder.js +58 -0
- package/lib/memorax-code-backend/dist/memory-service.js +66 -0
- package/lib/memorax-code-backend/dist/memory-turn-coordinator.js +139 -0
- package/lib/memorax-code-backend/dist/memory-viewer-activity.js +113 -0
- package/lib/memorax-code-backend/dist/memory-viewer-data-projection-cache.js +69 -0
- package/lib/memorax-code-backend/dist/memory-viewer-event-identity.js +3 -0
- package/lib/memorax-code-backend/dist/memory-viewer-history-projection.js +79 -0
- package/lib/memorax-code-backend/dist/memory-viewer-logo.js +1 -0
- package/lib/memorax-code-backend/dist/memory-viewer-observability.js +8 -0
- package/lib/memorax-code-backend/dist/memory-viewer-redaction.js +52 -0
- package/lib/memorax-code-backend/dist/memory-viewer-session-title.js +93 -0
- package/lib/memorax-code-backend/dist/memory-viewer-store.js +964 -0
- package/lib/memorax-code-backend/dist/memory-viewer-turn-reference.js +12 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-html.js +115 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-projection.js +168 -0
- package/lib/memorax-code-backend/dist/memory-viewer-writeback-status.js +97 -0
- package/lib/memorax-code-backend/dist/memory-writeback-buffer.js +217 -0
- package/lib/memorax-code-backend/dist/memory-writeback-chunk.js +120 -0
- package/lib/memorax-code-backend/dist/memory-writeback-reconciler.js +244 -0
- package/lib/memorax-code-backend/dist/memory-writeback-task-projection.js +377 -0
- package/lib/memorax-code-backend/dist/proxy-env.js +54 -0
- package/lib/memorax-code-backend/dist/repo-memory-readiness.js +188 -0
- package/lib/memorax-code-backend/dist/repository-memory-context.js +134 -0
- package/lib/memorax-code-backend/dist/repository-memory-scope.js +490 -0
- package/lib/memorax-code-backend/dist/server-cli.js +787 -0
- package/lib/memorax-code-backend/dist/server-health.js +16 -0
- package/lib/memorax-code-backend/dist/server-http.js +110 -0
- package/lib/memorax-code-backend/dist/server-json.js +4 -0
- package/lib/memorax-code-backend/dist/server-memory-hook.js +32 -0
- package/lib/memorax-code-backend/dist/server-memory-viewer.js +135 -0
- package/lib/memorax-code-backend/dist/server-observability.js +102 -0
- package/lib/memorax-code-backend/dist/server.js +220 -0
- package/lib/memorax-code-backend/dist/service-entrypoint.js +10 -0
- package/lib/memorax-code-backend/dist/service.js +567 -0
- package/lib/memorax-code-backend/dist/trace-config.js +112 -0
- package/lib/memorax-code-backend/dist/trace-context.js +111 -0
- package/lib/memorax-code-backend/dist/trace-store.js +571 -0
- package/lib/memorax-code-backend/dist/utils.js +3 -0
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/package.json +26 -0
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-claude-marketplace/.claude-plugin/marketplace.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +33 -0
- package/lib/memorax-code-codex-adapter/assets/composer-icon.png +0 -0
- package/lib/memorax-code-codex-adapter/assets/logo.png +0 -0
- package/lib/memorax-code-codex-adapter/hooks/hook-launcher.mjs +26 -0
- package/lib/memorax-code-codex-adapter/hooks/hooks.json +61 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-job.mjs +38 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-update-policy.mjs +10 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-codex-adapter/package.json +13 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/capture-cwd.mjs +18 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +82 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +125 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-writeback.mjs +52 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-codex-adapter/src/adapter-paths.mjs +29 -0
- package/lib/memorax-code-codex-adapter/src/cli.mjs +368 -0
- package/lib/memorax-code-codex-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-codex-adapter/src/config.mjs +226 -0
- package/lib/memorax-code-codex-adapter/src/session-registry.mjs +331 -0
- package/lib/memorax-code-codex-adapter/src/workspace-kind.mjs +68 -0
- package/lib/node-version.mjs +11 -0
- package/lib/npm-invocation.mjs +31 -0
- package/lib/resolve-claude-command.mjs +47 -0
- package/lib/resolve-codex-command.mjs +94 -0
- package/lib/run-entrypoint.mjs +83 -0
- package/lib/vscode-extension-command.mjs +119 -0
- package/lib/windows-cli-invocation.mjs +100 -0
- package/package.json +45 -0
|
@@ -0,0 +1,787 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
import { backendServiceEndpoint, backendServiceLogs, isProcessAlive, readBackendServiceState, readBackendToken, writeBackendToken, } from "./service.js";
|
|
3
|
+
import { BackendConnectionAuthorityError, resolveBackendConnection, } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
|
|
4
|
+
import { RuntimeRecordError, } from "../../memorax-code-adapter-common/src/runtime-record.mjs";
|
|
5
|
+
import { activateClientHookRuntimeGeneration, CLIENT_HOOK_RUNTIME_ABI, } from "../../memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs";
|
|
6
|
+
import { createBackendState } from "./backend-state.js";
|
|
7
|
+
import { createBackendServer } from "./server.js";
|
|
8
|
+
import { backendDebug } from "./debug-log.js";
|
|
9
|
+
import { prepareClientPluginRemovalCleanup } from "./client-plugin-removal.js";
|
|
10
|
+
import { resolveBackendInstallWatchdogConfig, startBackendInstallWatchdog, } from "./install-watchdog.js";
|
|
11
|
+
import { activateCodexPlugin, installCodexPlugin } from "./codex-plugin-install.js";
|
|
12
|
+
import { inspectCodexPluginHooks, trustCodexPluginHooks } from "./codex-plugin-hooks.js";
|
|
13
|
+
import { collectMemoraxCodeStatus, isAdapterReady, isOptionalUnconfiguredClaudeAdapter, restartMemoraxCodeService, startMemoraxCodeService, stopMemoraxCodeService, uninstallMemoraxCodeService, } from "./memorax-code-lifecycle.js";
|
|
14
|
+
import { backendEnv } from "./backend-env.js";
|
|
15
|
+
import { backendServiceHome, BackendLifecycleLockError, withBackendLifecycleLock, } from "./backend-lifecycle-lock.js";
|
|
16
|
+
import { startBackendShutdownRequestWatcher, } from "./backend-shutdown-request.js";
|
|
17
|
+
import { runtimeRecordDurabilityWarning } from "./backend-service-result.js";
|
|
18
|
+
// Keep process-facing CLI orchestration outside the HTTP server module.
|
|
19
|
+
// This preserves server.ts as the importable route factory used by tests and tools.
|
|
20
|
+
export function runBackendCli(argv = process.argv) {
|
|
21
|
+
const program = basename(argv[1] ?? "memorax-code-backend");
|
|
22
|
+
const usageName = program === "memorax-code" || program === "memorax-code.js" ? "memorax-code" : "memorax-code-backend";
|
|
23
|
+
const command = argv[2];
|
|
24
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
25
|
+
const commands = usageName === "memorax-code"
|
|
26
|
+
? "start|stop|restart|uninstall|logs|token|status"
|
|
27
|
+
: "status|logs";
|
|
28
|
+
console.log([
|
|
29
|
+
`Usage: ${usageName} [${commands}] [--backend-url URL] [--backend-token TOKEN] [--home DIR]`,
|
|
30
|
+
"[--host HOST] [--port PORT] [--rotate] [--show]",
|
|
31
|
+
"[--codex-command CMD]",
|
|
32
|
+
"[--codex-home DIR] [--claude-home DIR]",
|
|
33
|
+
"[--clients codex|claude|codex,claude|all|none]",
|
|
34
|
+
"[--json]",
|
|
35
|
+
"[--marketplace-path FILE] [--plugin-source-path DIR] [--claude-command CMD] [--help]",
|
|
36
|
+
"[--yes]",
|
|
37
|
+
"",
|
|
38
|
+
"Common local flow: memorax-code start, memorax-code status, memorax-code logs, memorax-code stop",
|
|
39
|
+
"Uninstall flow: memorax-code uninstall stops the backend, removes only selected client integrations, and removes the npm package when applicable",
|
|
40
|
+
"Codex plugin flow: memorax-code codex-plugin install; memorax-code codex-plugin activate --yes; memorax-code codex-plugin trust-hooks",
|
|
41
|
+
"Memory CLI: memorax-cli status, memorax-cli search --query TEXT [--session-id ID], memorax-cli add --memory TEXT --type TYPE --reason REASON [--session-id ID] [--content-type code]",
|
|
42
|
+
"Adapter flow: lifecycle commands use --clients when provided, otherwise persisted [clients] config; client provider settings stay client-owned.",
|
|
43
|
+
"",
|
|
44
|
+
"Environment: MEMORAX_CODE_BACKEND_HOST=127.0.0.1 MEMORAX_CODE_BACKEND_PORT=8787",
|
|
45
|
+
"MEMORAX_CODE_BACKEND_TOKEN=<optional local token>",
|
|
46
|
+
].join("\n"));
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
if (usageName === "memorax-code-backend"
|
|
50
|
+
&& command !== undefined
|
|
51
|
+
&& command !== "status"
|
|
52
|
+
&& command !== "logs") {
|
|
53
|
+
console.error(`${usageName}: unknown command '${command}'. Run '${usageName} --help' for usage.`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
let serviceOptions;
|
|
57
|
+
let pendingClientHookRuntime;
|
|
58
|
+
try {
|
|
59
|
+
serviceOptions = parseServiceOptions(argv);
|
|
60
|
+
pendingClientHookRuntime = takePendingClientHookRuntime(command, argv, serviceOptions);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
if (command === "status") {
|
|
67
|
+
let backendUrl;
|
|
68
|
+
let backendToken;
|
|
69
|
+
try {
|
|
70
|
+
backendUrl = argValue(argv, "--backend-url")
|
|
71
|
+
?? backendEnv("URL")
|
|
72
|
+
?? backendServiceEndpoint(serviceOptions).url;
|
|
73
|
+
backendToken = resolveBackendConnection({
|
|
74
|
+
memoraxCodeHome: serviceOptions.home,
|
|
75
|
+
backendUrl,
|
|
76
|
+
backendToken: argValue(argv, "--backend-token"),
|
|
77
|
+
}).token;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const status = backendConnectionStatusFailure(error, serviceOptions);
|
|
81
|
+
if (argv.includes("--json"))
|
|
82
|
+
console.log(JSON.stringify(status, null, 2));
|
|
83
|
+
else
|
|
84
|
+
printMemoraxCodeStatus(status);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
collectMemoraxCodeStatus(backendUrl, backendToken, serviceOptions, argv).then((status) => {
|
|
88
|
+
if (argv.includes("--json"))
|
|
89
|
+
console.log(JSON.stringify(status, null, 2));
|
|
90
|
+
else
|
|
91
|
+
printMemoraxCodeStatus(status);
|
|
92
|
+
process.exit(status.ok ? 0 : 1);
|
|
93
|
+
}).catch((error) => {
|
|
94
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else if (command === "codex-plugin") {
|
|
99
|
+
runCodexPluginCommand(argv).then((result) => {
|
|
100
|
+
if (argv.includes("--json"))
|
|
101
|
+
console.log(JSON.stringify(result, null, 2));
|
|
102
|
+
else
|
|
103
|
+
printCodexPluginInstallResult(result);
|
|
104
|
+
process.exit(result.ok ? 0 : 1);
|
|
105
|
+
}).catch((error) => {
|
|
106
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else if (command === "start") {
|
|
111
|
+
startMemoraxCodeService(serviceOptions, argv, () => {
|
|
112
|
+
activatePendingClientHookRuntime(pendingClientHookRuntime);
|
|
113
|
+
}).then((result) => {
|
|
114
|
+
if (argv.includes("--json"))
|
|
115
|
+
console.log(JSON.stringify(result, null, 2));
|
|
116
|
+
else
|
|
117
|
+
printLifecycleResult(result);
|
|
118
|
+
process.exit(result.ok ? 0 : 1);
|
|
119
|
+
}).catch((error) => {
|
|
120
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else if (command === "stop") {
|
|
125
|
+
stopMemoraxCodeService(serviceOptions, argv).then((result) => {
|
|
126
|
+
if (argv.includes("--json"))
|
|
127
|
+
console.log(JSON.stringify(result, null, 2));
|
|
128
|
+
else
|
|
129
|
+
printLifecycleResult(result);
|
|
130
|
+
process.exit(result.ok ? 0 : 1);
|
|
131
|
+
}).catch((error) => {
|
|
132
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else if (command === "restart") {
|
|
137
|
+
restartMemoraxCodeService(serviceOptions, argv, () => {
|
|
138
|
+
activatePendingClientHookRuntime(pendingClientHookRuntime);
|
|
139
|
+
}).then((result) => {
|
|
140
|
+
if (argv.includes("--json"))
|
|
141
|
+
console.log(JSON.stringify(result, null, 2));
|
|
142
|
+
else
|
|
143
|
+
printLifecycleResult(result);
|
|
144
|
+
process.exit(result.ok ? 0 : 1);
|
|
145
|
+
}).catch((error) => {
|
|
146
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
147
|
+
process.exit(1);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else if (command === "uninstall") {
|
|
151
|
+
uninstallMemoraxCodeService(serviceOptions, argv).then((result) => {
|
|
152
|
+
if (argv.includes("--json"))
|
|
153
|
+
console.log(JSON.stringify(result, null, 2));
|
|
154
|
+
else
|
|
155
|
+
printLifecycleResult(result);
|
|
156
|
+
process.exit(result.ok ? 0 : 1);
|
|
157
|
+
}).catch((error) => {
|
|
158
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else if (command === "logs") {
|
|
163
|
+
const result = backendServiceLogs(serviceOptions);
|
|
164
|
+
console.log(JSON.stringify(result, null, 2));
|
|
165
|
+
process.exit(result.ok ? 0 : 1);
|
|
166
|
+
}
|
|
167
|
+
else if (command === "token") {
|
|
168
|
+
runBackendTokenCommand(serviceOptions, argv).then((result) => {
|
|
169
|
+
console.log(JSON.stringify(result, null, 2));
|
|
170
|
+
process.exit(result.ok ? 0 : 1);
|
|
171
|
+
}).catch((error) => {
|
|
172
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
173
|
+
process.exit(1);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else if (usageName === "memorax-code") {
|
|
177
|
+
// `memorax-code` is the service-management CLI. An unrecognised or missing subcommand
|
|
178
|
+
// is always a user error here; do not fall through to raw-server mode.
|
|
179
|
+
if (command !== undefined) {
|
|
180
|
+
console.error(`memorax-code: unknown command '${command}'. Run 'memorax-code --help' for usage.`);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.error("memorax-code: no command given. Run 'memorax-code --help' for usage.");
|
|
184
|
+
}
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
else if (command !== undefined) {
|
|
188
|
+
console.error(`${usageName}: unknown command '${command}'. Run '${usageName} --help' for usage.`);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// Raw server mode: invoked directly as `memorax-code-backend` without a subcommand.
|
|
193
|
+
const port = Number(backendEnv("PORT") ?? "8787");
|
|
194
|
+
const host = backendEnv("HOST") ?? "127.0.0.1";
|
|
195
|
+
const state = createBackendState(host);
|
|
196
|
+
void startRawBackendServer(state, host, port, argv).catch((error) => {
|
|
197
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
198
|
+
process.exit(1);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function startRawBackendServer(state, host, port, argv) {
|
|
203
|
+
const installWatchdogConfig = resolveBackendInstallWatchdogConfig();
|
|
204
|
+
const clientPluginCleanup = installWatchdogConfig?.enabled
|
|
205
|
+
? await prepareClientPluginRemovalCleanup({
|
|
206
|
+
memoraxCodeHome: state.sessionHome,
|
|
207
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
208
|
+
claudeHome: argValue(argv, "--claude-home"),
|
|
209
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
210
|
+
claudeCommand: argValue(argv, "--claude-command"),
|
|
211
|
+
})
|
|
212
|
+
: undefined;
|
|
213
|
+
const server = createBackendServer(state);
|
|
214
|
+
let installRemovalStarted = false;
|
|
215
|
+
const installWatchdog = startBackendInstallWatchdog(installWatchdogConfig, async (event) => {
|
|
216
|
+
if (installRemovalStarted)
|
|
217
|
+
return;
|
|
218
|
+
installRemovalStarted = true;
|
|
219
|
+
backendDebug("install_watchdog.backend_uninstalled", {
|
|
220
|
+
reason: event.reason,
|
|
221
|
+
missingPaths: event.missingPaths,
|
|
222
|
+
});
|
|
223
|
+
const cleanup = await clientPluginCleanup?.();
|
|
224
|
+
if (cleanup?.ok === false) {
|
|
225
|
+
backendDebug("install_watchdog.client_plugin_cleanup_failed", {
|
|
226
|
+
codexOk: cleanup.codexPlugin.ok,
|
|
227
|
+
codexReason: "reason" in cleanup.codexPlugin ? cleanup.codexPlugin.reason : undefined,
|
|
228
|
+
claudeOk: cleanup.claudePlugin.ok,
|
|
229
|
+
claudeReason: cleanup.claudePlugin.reason,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
server.close(() => {
|
|
233
|
+
if (installWatchdogConfig?.exitProcess !== false) {
|
|
234
|
+
setTimeout(() => process.exit(0), 50).unref?.();
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
installBackendShutdownControls(server, state);
|
|
239
|
+
server.once("close", () => installWatchdog?.close());
|
|
240
|
+
server.on("error", (error) => {
|
|
241
|
+
if (error.code === "EADDRINUSE") {
|
|
242
|
+
console.error(`memorax-code-backend failed to listen on http://${host}:${port}: address already in use`);
|
|
243
|
+
console.error("Stop the existing Backend process or set MEMORAX_CODE_BACKEND_PORT to a free port.");
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
247
|
+
}
|
|
248
|
+
process.exit(1);
|
|
249
|
+
});
|
|
250
|
+
server.listen(port, host, () => {
|
|
251
|
+
console.log(`memorax-code-backend listening on http://${host}:${port}`);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function installBackendShutdownControls(server, state) {
|
|
255
|
+
let stopping = false;
|
|
256
|
+
let shutdownRequestWatcher;
|
|
257
|
+
const remove = () => {
|
|
258
|
+
process.off("SIGTERM", onSigterm);
|
|
259
|
+
process.off("SIGINT", onSigint);
|
|
260
|
+
shutdownRequestWatcher?.close();
|
|
261
|
+
};
|
|
262
|
+
const stop = (source, signal) => {
|
|
263
|
+
if (stopping)
|
|
264
|
+
return;
|
|
265
|
+
stopping = true;
|
|
266
|
+
remove();
|
|
267
|
+
if (source === "signal")
|
|
268
|
+
backendDebug("shutdown.signal_received", { signal });
|
|
269
|
+
else
|
|
270
|
+
backendDebug("shutdown.request_received", { pid: process.pid });
|
|
271
|
+
void server.shutdown().then(() => process.exit(0), (error) => {
|
|
272
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
273
|
+
process.exit(1);
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
const onSigterm = () => stop("signal", "SIGTERM");
|
|
277
|
+
const onSigint = () => stop("signal", "SIGINT");
|
|
278
|
+
process.once("SIGTERM", onSigterm);
|
|
279
|
+
process.once("SIGINT", onSigint);
|
|
280
|
+
const instanceId = backendEnv("INSTANCE_ID");
|
|
281
|
+
if (process.platform === "win32" && instanceId) {
|
|
282
|
+
const logWatchFailure = (error) => {
|
|
283
|
+
backendDebug("shutdown.request_watch_failed", {
|
|
284
|
+
error: error instanceof Error ? error.message : String(error),
|
|
285
|
+
});
|
|
286
|
+
};
|
|
287
|
+
try {
|
|
288
|
+
shutdownRequestWatcher = startBackendShutdownRequestWatcher({
|
|
289
|
+
memoraxCodeHome: state.sessionHome,
|
|
290
|
+
pid: process.pid,
|
|
291
|
+
instanceId,
|
|
292
|
+
onShutdown() {
|
|
293
|
+
stop("request");
|
|
294
|
+
},
|
|
295
|
+
onError: logWatchFailure,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
// The verified lifecycle can still fall back to taskkill when the local
|
|
300
|
+
// filesystem does not support the graceful request watcher.
|
|
301
|
+
logWatchFailure(error);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
server.once("close", remove);
|
|
305
|
+
}
|
|
306
|
+
const PENDING_CLIENT_HOOK_RUNTIME_ENV = "MEMORAX_CODE_PENDING_CLIENT_HOOK_RUNTIME_V1";
|
|
307
|
+
function takePendingClientHookRuntime(command, _argv, serviceOptions) {
|
|
308
|
+
const acceptsPending = command === "start" || command === "restart";
|
|
309
|
+
if (!acceptsPending)
|
|
310
|
+
return undefined;
|
|
311
|
+
const raw = process.env[PENDING_CLIENT_HOOK_RUNTIME_ENV];
|
|
312
|
+
if (raw === undefined)
|
|
313
|
+
return undefined;
|
|
314
|
+
delete process.env[PENDING_CLIENT_HOOK_RUNTIME_ENV];
|
|
315
|
+
let value;
|
|
316
|
+
try {
|
|
317
|
+
value = JSON.parse(raw);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
throw new Error("pending client Hook runtime is malformed");
|
|
321
|
+
}
|
|
322
|
+
if (!isRecord(value)
|
|
323
|
+
|| value.version !== 1
|
|
324
|
+
|| typeof value.memoraxCodeHome !== "string"
|
|
325
|
+
|| !value.memoraxCodeHome.trim()
|
|
326
|
+
|| !isClientHookRuntimeGeneration(value.generation)) {
|
|
327
|
+
throw new Error("pending client Hook runtime is invalid");
|
|
328
|
+
}
|
|
329
|
+
const memoraxCodeHome = resolve(value.memoraxCodeHome);
|
|
330
|
+
if (memoraxCodeHome !== resolve(backendServiceHome(serviceOptions))) {
|
|
331
|
+
throw new Error("pending client Hook runtime targets another MemoraX Code home");
|
|
332
|
+
}
|
|
333
|
+
return { memoraxCodeHome, generation: value.generation };
|
|
334
|
+
}
|
|
335
|
+
function activatePendingClientHookRuntime(pending) {
|
|
336
|
+
if (!pending)
|
|
337
|
+
return;
|
|
338
|
+
let activated;
|
|
339
|
+
try {
|
|
340
|
+
activated = activateClientHookRuntimeGeneration(pending);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
throw new Error(`client Hook runtime activation failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
344
|
+
}
|
|
345
|
+
if (activated.durability === "uncertain") {
|
|
346
|
+
console.error("memorax-code: client Hook runtime activated with uncertain crash durability; retry `memorax-code start`.");
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function isClientHookRuntimeGeneration(value) {
|
|
350
|
+
return isRecord(value)
|
|
351
|
+
&& value.version === 1
|
|
352
|
+
&& value.runtimeAbi === CLIENT_HOOK_RUNTIME_ABI
|
|
353
|
+
&& typeof value.generationId === "string"
|
|
354
|
+
&& value.generationId !== "."
|
|
355
|
+
&& value.generationId !== ".."
|
|
356
|
+
&& /^[a-zA-Z0-9._-]{1,160}$/.test(value.generationId)
|
|
357
|
+
&& typeof value.packageVersion === "string"
|
|
358
|
+
&& value.packageVersion.trim().length > 0
|
|
359
|
+
&& typeof value.contentDigest === "string"
|
|
360
|
+
&& /^[a-f0-9]{64}$/.test(value.contentDigest)
|
|
361
|
+
&& typeof value.createdAt === "string"
|
|
362
|
+
&& Number.isFinite(Date.parse(value.createdAt));
|
|
363
|
+
}
|
|
364
|
+
async function runCodexPluginCommand(argv) {
|
|
365
|
+
const subcommand = argv[3] ?? "install";
|
|
366
|
+
if (subcommand === "activate") {
|
|
367
|
+
return await activateCodexPlugin({
|
|
368
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
369
|
+
marketplacePath: argValue(argv, "--marketplace-path"),
|
|
370
|
+
pluginSourcePath: argValue(argv, "--plugin-source-path"),
|
|
371
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
372
|
+
workspace: argValue(argv, "--workspace"),
|
|
373
|
+
yes: argv.includes("--yes"),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
if (subcommand === "hooks") {
|
|
377
|
+
return await inspectCodexPluginHooks({
|
|
378
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
379
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
380
|
+
workspace: argValue(argv, "--workspace"),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (subcommand === "trust-hooks") {
|
|
384
|
+
return await trustCodexPluginHooks({
|
|
385
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
386
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
387
|
+
workspace: argValue(argv, "--workspace"),
|
|
388
|
+
yes: argv.includes("--yes"),
|
|
389
|
+
check: argv.includes("--check"),
|
|
390
|
+
previousHooks: codexHooksFromEnv("MEMORAX_CODE_CODEX_PREVIOUS_HOOKS_JSON"),
|
|
391
|
+
selectedHooks: codexHooksFromEnv("MEMORAX_CODE_CODEX_HOOK_TRUST_SELECTION_JSON"),
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
if (subcommand !== "install")
|
|
395
|
+
throw new Error(`memorax-code codex-plugin: unknown command '${subcommand}'. Run 'memorax-code --help' for usage.`);
|
|
396
|
+
return await installCodexPlugin({
|
|
397
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
398
|
+
marketplacePath: argValue(argv, "--marketplace-path"),
|
|
399
|
+
pluginSourcePath: argValue(argv, "--plugin-source-path"),
|
|
400
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
function printCodexPluginInstallResult(report) {
|
|
404
|
+
console.log(`${report.action}: ${report.ok ? "ok" : "needs attention"}`);
|
|
405
|
+
if (report.action === "codex-plugin-hooks") {
|
|
406
|
+
console.log(`codex home: ${report.codexHome}`);
|
|
407
|
+
console.log(`hooks: ${report.hooks.length}`);
|
|
408
|
+
console.log("backend: not started");
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (report.action === "codex-plugin-trust-hooks") {
|
|
412
|
+
console.log(`codex home: ${report.codexHome}`);
|
|
413
|
+
console.log(`hooks reviewed: ${report.hooks.length}`);
|
|
414
|
+
console.log(`trusted hooks: ${report.trustedHooks}`);
|
|
415
|
+
if (report.requiresFullReview)
|
|
416
|
+
console.log("incremental trust: blocked by plugin marketplace identity change");
|
|
417
|
+
console.log(`config: ${report.configPath}`);
|
|
418
|
+
console.log("backend: not started");
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const install = report.action === "codex-plugin-activate" ? report.install : report;
|
|
422
|
+
console.log(`codex home: ${install.codexHome}`);
|
|
423
|
+
console.log(`plugin source: ${install.pluginSourcePath}`);
|
|
424
|
+
console.log(`personal marketplace: ${install.marketplacePath}`);
|
|
425
|
+
if (report.action === "codex-plugin-activate") {
|
|
426
|
+
console.log(`trusted hooks: ${report.trustedHooks}`);
|
|
427
|
+
console.log(`config: ${report.configPath}`);
|
|
428
|
+
}
|
|
429
|
+
console.log("backend: not started");
|
|
430
|
+
}
|
|
431
|
+
function codexHooksFromEnv(name) {
|
|
432
|
+
const raw = process.env[name];
|
|
433
|
+
if (raw === undefined)
|
|
434
|
+
return undefined;
|
|
435
|
+
let parsed;
|
|
436
|
+
try {
|
|
437
|
+
parsed = JSON.parse(raw);
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
throw new Error(`${name} must contain a JSON array`);
|
|
441
|
+
}
|
|
442
|
+
if (!Array.isArray(parsed))
|
|
443
|
+
throw new Error(`${name} must contain a JSON array`);
|
|
444
|
+
return parsed.map((value, index) => {
|
|
445
|
+
if (!isRecord(value) || typeof value.key !== "string" || typeof value.currentHash !== "string") {
|
|
446
|
+
throw new Error(`${name}[${index}] must contain string key and currentHash fields`);
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
key: value.key,
|
|
450
|
+
currentHash: value.currentHash,
|
|
451
|
+
...(typeof value.pluginId === "string" ? { pluginId: value.pluginId } : {}),
|
|
452
|
+
...(typeof value.handlerType === "string" ? { handlerType: value.handlerType } : {}),
|
|
453
|
+
...(typeof value.eventName === "string" ? { eventName: value.eventName } : {}),
|
|
454
|
+
...(typeof value.command === "string" ? { command: value.command } : {}),
|
|
455
|
+
...(typeof value.statusMessage === "string" ? { statusMessage: value.statusMessage } : {}),
|
|
456
|
+
...(typeof value.trustStatus === "string" ? { trustStatus: value.trustStatus } : {}),
|
|
457
|
+
};
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
function isRecord(value) {
|
|
461
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
462
|
+
}
|
|
463
|
+
function printMemoraxCodeStatus(report) {
|
|
464
|
+
const backend = report.backend;
|
|
465
|
+
backendLog(`MemoraX Code Backend status: ${report.ok ? blueBold("Enabled") : redBold("Unavailable")}`);
|
|
466
|
+
backendLog(report.ok
|
|
467
|
+
? green("MemoraX Code is ready for new client sessions.")
|
|
468
|
+
: red("MemoraX Code is not ready for new client sessions."));
|
|
469
|
+
backendLog(`Backend status: ${backend.ok ? blueBold("Enabled") : redBold("Unavailable")} ${backend.url}${backend.status ? ` status=${backend.status}` : ""}${backendIdentityDetail(backend.identity)}${backend.error ? ` error=${backend.error}` : ""}`);
|
|
470
|
+
if (backend.service)
|
|
471
|
+
backendLog(`Backend service: ${backend.service}`);
|
|
472
|
+
if (typeof backend.authRequired === "boolean")
|
|
473
|
+
backendLog(`Client auth: ${backend.authRequired ? "required" : "not required"}`);
|
|
474
|
+
if (report.codexAdapter) {
|
|
475
|
+
backendLog(`Codex adapter: ${adapterStatusLine(report.codexAdapter)}`);
|
|
476
|
+
}
|
|
477
|
+
if (report.claudeAdapter)
|
|
478
|
+
backendLog(`Claude adapter: ${claudeAdapterStatusLine(report.claudeAdapter, report.codexAdapter)}`);
|
|
479
|
+
if (!suppressBackendGuidance()) {
|
|
480
|
+
for (const line of statusGuidance(report))
|
|
481
|
+
backendLog(line);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function backendConnectionStatusFailure(error, serviceOptions) {
|
|
485
|
+
let state;
|
|
486
|
+
try {
|
|
487
|
+
state = readBackendServiceState(serviceOptions);
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
// The connection error remains the first failed preflight. Service-state
|
|
491
|
+
// diagnostics are reported once connection resolution succeeds.
|
|
492
|
+
}
|
|
493
|
+
return {
|
|
494
|
+
ok: false,
|
|
495
|
+
action: "status",
|
|
496
|
+
backend: {
|
|
497
|
+
ok: false,
|
|
498
|
+
url: state?.url ?? "",
|
|
499
|
+
error: error instanceof Error ? error.message : String(error),
|
|
500
|
+
...runtimeRecordErrorFields(error),
|
|
501
|
+
},
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
function runtimeRecordErrorFields(error) {
|
|
505
|
+
return error instanceof BackendConnectionAuthorityError
|
|
506
|
+
|| error instanceof RuntimeRecordError
|
|
507
|
+
|| error instanceof BackendLifecycleLockError
|
|
508
|
+
? { errorCode: error.code }
|
|
509
|
+
: {};
|
|
510
|
+
}
|
|
511
|
+
export async function runBackendTokenCommand(serviceOptions, argv, recordWriteRuntime) {
|
|
512
|
+
try {
|
|
513
|
+
return await withBackendLifecycleLock(serviceOptions, () => {
|
|
514
|
+
if (argv.includes("--rotate")) {
|
|
515
|
+
const state = readBackendServiceState(serviceOptions);
|
|
516
|
+
if (state && isProcessAlive(state.pid)) {
|
|
517
|
+
return {
|
|
518
|
+
ok: false,
|
|
519
|
+
action: "token",
|
|
520
|
+
error: "stop the managed Backend before rotating its token, then run `memorax-code start`",
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
const record = argv.includes("--show")
|
|
525
|
+
? readBackendToken(serviceOptions)
|
|
526
|
+
: writeBackendToken(serviceOptions, argv.includes("--rotate"), recordWriteRuntime);
|
|
527
|
+
if (!record) {
|
|
528
|
+
return {
|
|
529
|
+
ok: false,
|
|
530
|
+
action: "token",
|
|
531
|
+
error: "backend token file does not exist",
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
const warning = runtimeRecordDurabilityWarning("token", record.persistence);
|
|
535
|
+
return {
|
|
536
|
+
ok: true,
|
|
537
|
+
action: "token",
|
|
538
|
+
...(warning ? { degraded: true, warnings: [warning] } : {}),
|
|
539
|
+
tokenPath: record.tokenPath,
|
|
540
|
+
token: record.token,
|
|
541
|
+
createdAt: record.createdAt,
|
|
542
|
+
rotatedAt: record.rotatedAt,
|
|
543
|
+
export: `export MEMORAX_CODE_BACKEND_TOKEN=${shellSingleQuote(record.token)}`,
|
|
544
|
+
};
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
return {
|
|
549
|
+
ok: false,
|
|
550
|
+
action: "token",
|
|
551
|
+
error: error instanceof Error ? error.message : String(error),
|
|
552
|
+
...runtimeRecordErrorFields(error),
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
function printLifecycleResult(report) {
|
|
557
|
+
const degraded = report.backend?.degraded === true;
|
|
558
|
+
backendLog(`${lifecycleActionLabel(report.action)}: ${report.ok ? green(degraded ? "ok (degraded)" : "ok") : red("needs attention")}`);
|
|
559
|
+
if (report.message)
|
|
560
|
+
backendLog(report.message);
|
|
561
|
+
if (report.backend) {
|
|
562
|
+
backendLog(`Backend: ${report.backend.ok ? green(report.backend.degraded ? "ok (degraded)" : "ok") : red("not ok")}${report.backend.state?.url ? ` ${report.backend.state.url}` : ""}${report.backend.errorCode ? ` code=${report.backend.errorCode}` : ""}${report.backend.error ? ` error=${report.backend.error}` : ""}`);
|
|
563
|
+
for (const warning of report.backend.warnings ?? []) {
|
|
564
|
+
backendLog(`Warning: ${warning.message}${warning.errorCode ? ` code=${warning.errorCode}` : ""}`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (report.codexAdapter)
|
|
568
|
+
backendLog(`Codex adapter: ${adapterStatusLine(report.codexAdapter)}`);
|
|
569
|
+
if (report.claudeAdapter)
|
|
570
|
+
backendLog(`Claude adapter: ${adapterStatusLine(report.claudeAdapter)}`);
|
|
571
|
+
if (report.codexPlugin) {
|
|
572
|
+
const removed = report.codexPlugin.removedPaths.length;
|
|
573
|
+
const marketplace = report.codexPlugin.marketplaceChanged ? " marketplace=updated" : " marketplace=unchanged";
|
|
574
|
+
backendLog(`Codex plugin: ${codexPluginRemoveStatusLine(report.codexPlugin.pluginRemove)} paths=${removed}${marketplace}`);
|
|
575
|
+
}
|
|
576
|
+
if (report.npmPackageRemoval)
|
|
577
|
+
backendLog(`npm package: ${npmPackageRemovalStatusLine(report.npmPackageRemoval)}`);
|
|
578
|
+
if (!suppressBackendGuidance()) {
|
|
579
|
+
for (const line of lifecycleGuidance(report))
|
|
580
|
+
backendLog(line);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
const BACKEND_PREFIX = "[MemoraX Code Backend]:";
|
|
584
|
+
const GREEN = "\x1b[32m";
|
|
585
|
+
const BLUE = "\x1b[34m";
|
|
586
|
+
const RED = "\x1b[31m";
|
|
587
|
+
const BOLD = "\x1b[1m";
|
|
588
|
+
const RESET = "\x1b[0m";
|
|
589
|
+
function backendLog(message) {
|
|
590
|
+
console.log(`${BACKEND_PREFIX} ${message}`);
|
|
591
|
+
}
|
|
592
|
+
function green(value) {
|
|
593
|
+
return `${GREEN}${value}${RESET}`;
|
|
594
|
+
}
|
|
595
|
+
function blueBold(value) {
|
|
596
|
+
return `${BLUE}${BOLD}${value}${RESET}`;
|
|
597
|
+
}
|
|
598
|
+
function red(value) {
|
|
599
|
+
return `${RED}${value}${RESET}`;
|
|
600
|
+
}
|
|
601
|
+
function redBold(value) {
|
|
602
|
+
return `${RED}${BOLD}${value}${RESET}`;
|
|
603
|
+
}
|
|
604
|
+
function suppressBackendGuidance() {
|
|
605
|
+
return ["1", "true", "yes"].includes(String(process.env.MEMORAX_CODE_BACKEND_SUPPRESS_GUIDANCE ?? "").toLowerCase());
|
|
606
|
+
}
|
|
607
|
+
function lifecycleActionLabel(action) {
|
|
608
|
+
if (action === "start")
|
|
609
|
+
return "Start";
|
|
610
|
+
if (action === "stop")
|
|
611
|
+
return "Stop";
|
|
612
|
+
if (action === "restart")
|
|
613
|
+
return "Restart";
|
|
614
|
+
if (action === "uninstall")
|
|
615
|
+
return "Uninstall";
|
|
616
|
+
return action;
|
|
617
|
+
}
|
|
618
|
+
function lifecycleGuidance(report) {
|
|
619
|
+
if (report.action === "start") {
|
|
620
|
+
if (report.backend?.ok === false) {
|
|
621
|
+
return [
|
|
622
|
+
red("Backend did not start cleanly."),
|
|
623
|
+
"Run `memorax-code logs` for details, then retry `memorax-code start`.",
|
|
624
|
+
];
|
|
625
|
+
}
|
|
626
|
+
if (!report.codexAdapter && !report.claudeAdapter) {
|
|
627
|
+
return [
|
|
628
|
+
green("Backend is running."),
|
|
629
|
+
"Adapters were not changed for this command.",
|
|
630
|
+
];
|
|
631
|
+
}
|
|
632
|
+
if ((!report.codexAdapter || isAdapterReady(report.codexAdapter)) && (!report.claudeAdapter || isAdapterReady(report.claudeAdapter))) {
|
|
633
|
+
return [
|
|
634
|
+
green("Backend is running and adapters are enabled."),
|
|
635
|
+
green("Existing sessions with the stable plugin shell select the active Hook runtime on their next user prompt."),
|
|
636
|
+
"Restart or refresh a client only if its plugin shell was installed, changed, or newly enabled, or MemoraX Code is not active on the next prompt.",
|
|
637
|
+
];
|
|
638
|
+
}
|
|
639
|
+
return [
|
|
640
|
+
red("Backend may be running, but one or more adapters are not enabled."),
|
|
641
|
+
"Run `memorax-code status` for details. Restart or refresh the client after fixing the adapter.",
|
|
642
|
+
];
|
|
643
|
+
}
|
|
644
|
+
if (report.action === "stop") {
|
|
645
|
+
return report.ok
|
|
646
|
+
? [
|
|
647
|
+
green("Backend is stopped."),
|
|
648
|
+
...(report.codexAdapter ? [green("Codex Hook integration is stopped; provider config was not changed.")] : []),
|
|
649
|
+
...(report.claudeAdapter ? [green("Claude Code Hook integration is stopped; provider config was not changed.")] : []),
|
|
650
|
+
]
|
|
651
|
+
: [
|
|
652
|
+
red("Backend did not stop cleanly."),
|
|
653
|
+
"Run `memorax-code status` and `memorax-code logs` for details.",
|
|
654
|
+
];
|
|
655
|
+
}
|
|
656
|
+
if (report.action === "restart") {
|
|
657
|
+
return report.ok
|
|
658
|
+
? [
|
|
659
|
+
green("Backend restarted."),
|
|
660
|
+
green("Existing sessions with the stable plugin shell use the active Hook runtime on their next user prompt."),
|
|
661
|
+
"Restart or refresh a client only if MemoraX Code is not active on the next prompt.",
|
|
662
|
+
]
|
|
663
|
+
: [
|
|
664
|
+
red("Backend restart needs attention."),
|
|
665
|
+
"Run `memorax-code status` and `memorax-code logs` for details.",
|
|
666
|
+
];
|
|
667
|
+
}
|
|
668
|
+
if (report.action === "uninstall") {
|
|
669
|
+
return report.ok
|
|
670
|
+
? [
|
|
671
|
+
green("MemoraX Code has been uninstalled from this npm installation."),
|
|
672
|
+
green("Restart or refresh Codex so it drops the removed adapter plugin."),
|
|
673
|
+
]
|
|
674
|
+
: [
|
|
675
|
+
red("Uninstall needs attention."),
|
|
676
|
+
"Run `memorax-code status` and `memorax-code logs` before retrying.",
|
|
677
|
+
];
|
|
678
|
+
}
|
|
679
|
+
return [];
|
|
680
|
+
}
|
|
681
|
+
function statusGuidance(report) {
|
|
682
|
+
if (report.ok) {
|
|
683
|
+
return [
|
|
684
|
+
green("MemoraX Code is ready; sessions with the stable plugin shell use the active Hook runtime on their next user prompt."),
|
|
685
|
+
"Restart or refresh a client only if its plugin shell was installed, changed, or newly enabled, or MemoraX Code is not active on the next prompt.",
|
|
686
|
+
];
|
|
687
|
+
}
|
|
688
|
+
if (!report.backend.ok) {
|
|
689
|
+
if (report.backend.identity && (!report.backend.identity.urlMatches
|
|
690
|
+
|| !report.backend.identity.instanceIdMatches
|
|
691
|
+
|| !report.backend.identity.sessionHomeMatches)) {
|
|
692
|
+
return [
|
|
693
|
+
red("Backend identity does not match the managed connection state."),
|
|
694
|
+
"Run `memorax-code stop`, verify the configured Backend endpoint, then run `memorax-code start`.",
|
|
695
|
+
];
|
|
696
|
+
}
|
|
697
|
+
return [
|
|
698
|
+
red("Backend is not reachable."),
|
|
699
|
+
"Run `memorax-code start`, then `memorax-code status`.",
|
|
700
|
+
];
|
|
701
|
+
}
|
|
702
|
+
if (report.codexAdapter && !isAdapterReady(report.codexAdapter)) {
|
|
703
|
+
return [
|
|
704
|
+
red("Codex adapter is not enabled."),
|
|
705
|
+
"Run `memorax-code start`, restart or refresh Codex, then enable the MemoraX Code Codex Adapter plugin.",
|
|
706
|
+
];
|
|
707
|
+
}
|
|
708
|
+
if (report.claudeAdapter && !isAdapterReady(report.claudeAdapter) && !isOptionalUnconfiguredClaudeAdapter(report.claudeAdapter, report.codexAdapter)) {
|
|
709
|
+
return [
|
|
710
|
+
red("Claude adapter is not enabled."),
|
|
711
|
+
"Run `memorax-code start`, then restart or refresh Claude Code.",
|
|
712
|
+
];
|
|
713
|
+
}
|
|
714
|
+
return [
|
|
715
|
+
red("MemoraX Code needs attention."),
|
|
716
|
+
"Run `memorax-code status` and `memorax-code logs` for details.",
|
|
717
|
+
];
|
|
718
|
+
}
|
|
719
|
+
function backendIdentityDetail(identity) {
|
|
720
|
+
if (!identity || (identity.urlMatches && identity.instanceIdMatches && identity.sessionHomeMatches))
|
|
721
|
+
return "";
|
|
722
|
+
const mismatches = [
|
|
723
|
+
!identity.urlMatches ? "url" : undefined,
|
|
724
|
+
!identity.instanceIdMatches ? "instance" : undefined,
|
|
725
|
+
!identity.sessionHomeMatches ? "home" : undefined,
|
|
726
|
+
].filter(Boolean);
|
|
727
|
+
return ` identity_mismatch=${mismatches.join(",")}`;
|
|
728
|
+
}
|
|
729
|
+
function codexPluginRemoveStatusLine(report) {
|
|
730
|
+
if (report.skipped)
|
|
731
|
+
return `skipped ${report.reason ?? "not-applicable"}`;
|
|
732
|
+
if (!report.ok)
|
|
733
|
+
return `not ok${report.stderr || report.stdout ? ` error=${report.stderr || report.stdout}` : ""}`;
|
|
734
|
+
return "removed";
|
|
735
|
+
}
|
|
736
|
+
function npmPackageRemovalStatusLine(report) {
|
|
737
|
+
if (report.skipped)
|
|
738
|
+
return `skipped ${report.reason ?? "not-applicable"}`;
|
|
739
|
+
if (!report.ok)
|
|
740
|
+
return `not ok${report.packageName ? ` ${report.packageName}` : ""}${report.error ? ` error=${report.error}` : ""}`;
|
|
741
|
+
return `removed ${report.packageName ?? "package"}`;
|
|
742
|
+
}
|
|
743
|
+
function adapterStatusLine(report) {
|
|
744
|
+
if (report.error)
|
|
745
|
+
return `not ok error=${report.error}`;
|
|
746
|
+
if (report.ok === false)
|
|
747
|
+
return `not ok ${report.message ?? report.reason ?? "failed"}`;
|
|
748
|
+
if (report.skipped)
|
|
749
|
+
return `skipped ${report.reason ?? "not-ready"}${report.message ? ` ${report.message}` : ""}`;
|
|
750
|
+
if (report.backendUrlMatches === false) {
|
|
751
|
+
return `not ok endpoint_mismatch configured=${report.configuredBackendUrl ?? "missing"} expected=${report.expectedBackendUrl ?? "unknown"}`;
|
|
752
|
+
}
|
|
753
|
+
const enabled = isAdapterReady(report);
|
|
754
|
+
const skillStatus = report.codexSkills?.status ?? report.claudeSkills?.status;
|
|
755
|
+
const skills = skillStatus ? ` skills=${skillStatus}` : "";
|
|
756
|
+
const changed = report.changed === true ? " changed" : "";
|
|
757
|
+
return `${enabled ? "ok" : "not enabled"} integration=hooks${skills}${changed}`;
|
|
758
|
+
}
|
|
759
|
+
function claudeAdapterStatusLine(report, codexAdapter) {
|
|
760
|
+
if (isOptionalUnconfiguredClaudeAdapter(report, codexAdapter)) {
|
|
761
|
+
return `skipped ${report.reason ?? "not-configured"}`;
|
|
762
|
+
}
|
|
763
|
+
return adapterStatusLine(report);
|
|
764
|
+
}
|
|
765
|
+
function argValue(argv, name) {
|
|
766
|
+
const index = argv.indexOf(name);
|
|
767
|
+
if (index >= 0)
|
|
768
|
+
return argv[index + 1];
|
|
769
|
+
const inline = argv.find((arg) => arg.startsWith(`${name}=`));
|
|
770
|
+
return inline?.slice(name.length + 1);
|
|
771
|
+
}
|
|
772
|
+
function parseServiceOptions(argv) {
|
|
773
|
+
const home = argValue(argv, "--home");
|
|
774
|
+
if (argv.some((arg) => arg === "--home" || arg.startsWith("--home="))
|
|
775
|
+
&& !home?.trim()) {
|
|
776
|
+
throw new Error("memorax-code: --home requires a directory");
|
|
777
|
+
}
|
|
778
|
+
return {
|
|
779
|
+
home,
|
|
780
|
+
host: argValue(argv, "--host"),
|
|
781
|
+
port: argValue(argv, "--port") ? Number(argValue(argv, "--port")) : undefined,
|
|
782
|
+
authToken: argValue(argv, "--backend-token"),
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
function shellSingleQuote(value) {
|
|
786
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
787
|
+
}
|