@memorax/memorax-code 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -12
- package/bin/memorax-code-npm-preinstall.mjs +7 -2
- package/bin/memorax-code-opencode.mjs +4 -0
- package/bin/memorax-code-plugin-postinstall.mjs +342 -93
- package/docs/configuration.md +148 -35
- package/docs/troubleshooting.md +73 -13
- package/lib/dsh-plugin-install.mjs +22 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
- package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
- package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
- package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
- package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
- package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
- package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
- package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
- package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
- package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
- package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
- package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
- package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
- package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
- package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
- package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
- package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
- package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
- package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
- package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
- package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
- package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
- package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
- package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
- package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
- package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
- package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
- package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
- package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
- package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
- package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
- package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
- package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
- package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
- package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
- package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
- package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
- package/lib/memorax-code-backend/dist/server.js +3 -212
- package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
- package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
- package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
- package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
- package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
- package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
- package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
- package/lib/memorax-code-backend/package.json +3 -3
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-codex-adapter/package.json +1 -1
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
- package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
- package/lib/memorax-code-dsh-adapter/package.json +69 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
- package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
- package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
- package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
- package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1358 -0
- package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
- package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
- package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/package.json +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
- package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
- package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
- package/lib/memorax-code-opencode-adapter/src/plugin.mjs +539 -0
- package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +442 -0
- package/lib/run-entrypoint.mjs +6 -0
- package/package.json +7 -3
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
- /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
- /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
- /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
- /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
- /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
- /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
- /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js}
RENAMED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { MEMORAX_ICON_DATA_URL } from "
|
|
3
|
-
import { isMemoryProjectId, UNCLASSIFIED_PROJECT_ID } from "
|
|
4
|
-
import { MEMORAX_LOGO_DATA_URL } from "
|
|
5
|
-
import { memoryViewerUserHtml } from "
|
|
6
|
-
import { projectMemoryViewerUserData } from "
|
|
7
|
-
import { listMemoryViewerDataWithHistory
|
|
8
|
-
import { repoMemoryReadinessForProject, } from "
|
|
9
|
-
import { json } from "
|
|
10
|
-
import { memoraxCodeHomeForTrace } from "
|
|
2
|
+
import { MEMORAX_ICON_DATA_URL } from "../ui/icon.js";
|
|
3
|
+
import { isMemoryProjectId, UNCLASSIFIED_PROJECT_ID } from "../../memory/project.js";
|
|
4
|
+
import { MEMORAX_LOGO_DATA_URL } from "../ui/logo.js";
|
|
5
|
+
import { memoryViewerUserHtml } from "../ui/user-html.js";
|
|
6
|
+
import { projectMemoryViewerUserData } from "../projection/user.js";
|
|
7
|
+
import { listMemoryViewerDataWithHistory } from "../store.js";
|
|
8
|
+
import { repoMemoryReadinessForProject, } from "../../repository/readiness.js";
|
|
9
|
+
import { json } from "../../transport/http/json.js";
|
|
10
|
+
import { memoraxCodeHomeForTrace } from "../../trace/config.js";
|
|
11
11
|
const MEMORY_VIEWER_SESSION_ACTIVITY_WINDOW_MS = 72 * 60 * 60 * 1_000;
|
|
12
12
|
const MEMORY_VIEWER_ACTIVITY_CUTOFF_GRANULARITY_MS = 60_000;
|
|
13
13
|
const MEMORY_VIEWER_LOGO = Buffer.from(MEMORAX_LOGO_DATA_URL.slice(MEMORAX_LOGO_DATA_URL.indexOf(",") + 1), "base64");
|
|
@@ -15,7 +15,7 @@ const MEMORY_VIEWER_ICON = Buffer.from(MEMORAX_ICON_DATA_URL.slice(MEMORAX_ICON_
|
|
|
15
15
|
export async function handleMemoryViewerRequest(url, req, res, options = {}) {
|
|
16
16
|
if (req.method === "GET" && url.pathname === "/memory-viewer") {
|
|
17
17
|
if (!memoryViewerUserClient(url)) {
|
|
18
|
-
json(res, 400, { ok: false, error: "client must be codex
|
|
18
|
+
json(res, 400, { ok: false, error: "client must be codex, claude-code, dsh, or opencode" });
|
|
19
19
|
return true;
|
|
20
20
|
}
|
|
21
21
|
res.writeHead(200, {
|
|
@@ -53,7 +53,7 @@ export async function handleMemoryViewerRequest(url, req, res, options = {}) {
|
|
|
53
53
|
const memoraxCodeHome = viewerMemoraxCodeHome(options);
|
|
54
54
|
const selectedClient = memoryViewerUserClient(url);
|
|
55
55
|
if (!selectedClient) {
|
|
56
|
-
json(res, 400, { ok: false, error: "client must be codex
|
|
56
|
+
json(res, 400, { ok: false, error: "client must be codex, claude-code, dsh, or opencode" });
|
|
57
57
|
return true;
|
|
58
58
|
}
|
|
59
59
|
const requestedProject = projectFilter(url);
|
|
@@ -77,7 +77,7 @@ export async function handleMemoryViewerRequest(url, req, res, options = {}) {
|
|
|
77
77
|
conditionalViewerJson(req, res, {
|
|
78
78
|
ok: true,
|
|
79
79
|
selectedClient: selectedClient.publicClient,
|
|
80
|
-
availableClients: ["codex", "claude-code"],
|
|
80
|
+
availableClients: ["codex", "claude-code", "dsh", "opencode"],
|
|
81
81
|
summary: projection.summary,
|
|
82
82
|
activities: projection.activities.slice(0, 100),
|
|
83
83
|
projects,
|
|
@@ -94,12 +94,12 @@ function memoryViewerUserClient(url) {
|
|
|
94
94
|
const value = url.searchParams.get("client");
|
|
95
95
|
const traceClient = value === null ? "codex" : traceClientFromPublicValue(value.trim().toLowerCase());
|
|
96
96
|
return traceClient
|
|
97
|
-
? { traceClient, publicClient: traceClient === "claude" ? "claude-code" :
|
|
97
|
+
? { traceClient, publicClient: traceClient === "claude" ? "claude-code" : traceClient }
|
|
98
98
|
: undefined;
|
|
99
99
|
}
|
|
100
100
|
function traceClientFromPublicValue(value) {
|
|
101
|
-
if (value === "codex")
|
|
102
|
-
return
|
|
101
|
+
if (value === "codex" || value === "dsh" || value === "opencode")
|
|
102
|
+
return value;
|
|
103
103
|
return value === "claude" || value === "claude-code" || value === "cc"
|
|
104
104
|
? "claude"
|
|
105
105
|
: undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UNCLASSIFIED_PROJECT_ID } from "
|
|
2
|
-
import { memoryViewerEventTurnIds } from "./
|
|
1
|
+
import { UNCLASSIFIED_PROJECT_ID } from "../../memory/project.js";
|
|
2
|
+
import { memoryViewerEventTurnIds } from "./turn-reference.js";
|
|
3
3
|
export function memoryViewerActivitySummary(allEvents) {
|
|
4
4
|
let recalledCount = 0;
|
|
5
5
|
let addCount = 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { memoryViewerEventKey } from "./
|
|
1
|
+
import { memoryViewerEventKey } from "./event-identity.js";
|
|
2
2
|
/**
|
|
3
3
|
* Marks a retained start without an end as interrupted only when a different
|
|
4
4
|
* Turn demonstrably started later in the same client session.
|
package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isTraceClient } from "
|
|
1
|
+
import { isTraceClient } from "../../trace/context.js";
|
|
2
2
|
/**
|
|
3
3
|
* Projects raw Viewer events into the deliberately small user-facing summary contract.
|
|
4
4
|
* Conversation, memory, session, turn, and diagnostic fields never cross this boundary.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { completeMemoryWritebackTask, memoryText, memoryWritebackTaskEventKey, memoryWritebackTaskOutcome, memoryWritebackTaskOutcomeForStatus, nonNegativeInteger, projectMemoryWritebackTasks, stringArray, } from "
|
|
1
|
+
import { completeMemoryWritebackTask, memoryText, memoryWritebackTaskEventKey, memoryWritebackTaskOutcome, memoryWritebackTaskOutcomeForStatus, nonNegativeInteger, projectMemoryWritebackTasks, stringArray, } from "../../memory/writeback-task-projection.js";
|
|
2
2
|
export { memoryText, nonNegativeInteger, stringArray, };
|
|
3
3
|
export function pendingMemoryViewerWritebacks(eventsToCheck) {
|
|
4
4
|
const tasks = new Map(projectMemoryWritebackTasks(eventsToCheck.flatMap(memoryViewerWritebackProjectionRecord)).map((task) => [memoryWritebackTaskEventKey(task), task]));
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
-
import { clearClaudeLocalTranscriptProjections, readClaudeLocalTranscriptHistory, } from "./claude-
|
|
4
|
-
import { stripCodexPreambleSegments } from "
|
|
5
|
-
import { clearIncrementalJsonlProjections, readIncrementalJsonlProjectionSnapshot, } from "
|
|
6
|
-
import { clearMemoryViewerDataProjectionCache, clearMemoryViewerDataProjections, memoryViewerDataProjectionCacheSize, prepareMemoryViewerDataProjectionHistory, readMemoryViewerDataProjection, shareMemoryViewerDataProjectionValue, shouldCacheMemoryViewerDataProjection, writeMemoryViewerDataProjection, } from "./
|
|
7
|
-
import { memoryViewerActivityProjection, memoryViewerActivitySummary, } from "./
|
|
8
|
-
import { memoryViewerEventKey } from "./
|
|
9
|
-
import { memoryViewerEventTurnIds } from "./
|
|
10
|
-
import { foldMemoryViewerSupersededTurnStarts, foldMemoryViewerTurnMaterializations, } from "./
|
|
11
|
-
import { memoryProjectFromUnknown, resolveMemoryProject, UNCLASSIFIED_PROJECT_ID, } from "
|
|
12
|
-
import { sanitizeMemoryViewerDetails } from "./
|
|
13
|
-
import { earliestMemoryViewerSessionTitleCandidates, } from "./
|
|
14
|
-
import { projectMemoryViewerUserData
|
|
15
|
-
import { completeMemoryViewerWriteback, foldMemoryViewerWritebackStatuses, memoryText, memoryViewerWritebackOutcome, nonNegativeInteger, pendingMemoryViewerWritebacks, stringArray, writebackOutcomeForStatus, } from "./
|
|
16
|
-
import { clientTracePaths, tracePaths } from "
|
|
3
|
+
import { clearClaudeLocalTranscriptProjections, readClaudeLocalTranscriptHistory, } from "./history/claude-transcript.js";
|
|
4
|
+
import { stripCodexPreambleSegments } from "../clients/codex/effective-prompt.js";
|
|
5
|
+
import { clearIncrementalJsonlProjections, readIncrementalJsonlProjectionSnapshot, } from "../shared/incremental-jsonl-projection.js";
|
|
6
|
+
import { clearMemoryViewerDataProjectionCache, clearMemoryViewerDataProjections, memoryViewerDataProjectionCacheSize, prepareMemoryViewerDataProjectionHistory, readMemoryViewerDataProjection, shareMemoryViewerDataProjectionValue, shouldCacheMemoryViewerDataProjection, writeMemoryViewerDataProjection, } from "./projection/cache.js";
|
|
7
|
+
import { memoryViewerActivityProjection, memoryViewerActivitySummary, } from "./projection/activity.js";
|
|
8
|
+
import { memoryViewerEventKey } from "./projection/event-identity.js";
|
|
9
|
+
import { memoryViewerEventTurnIds } from "./projection/turn-reference.js";
|
|
10
|
+
import { foldMemoryViewerSupersededTurnStarts, foldMemoryViewerTurnMaterializations, } from "./projection/history.js";
|
|
11
|
+
import { memoryProjectFromUnknown, resolveMemoryProject, UNCLASSIFIED_PROJECT_ID, } from "../memory/project.js";
|
|
12
|
+
import { sanitizeMemoryViewerDetails } from "./projection/redaction.js";
|
|
13
|
+
import { earliestMemoryViewerSessionTitleCandidates, } from "./history/session-title.js";
|
|
14
|
+
import { projectMemoryViewerUserData } from "./projection/user.js";
|
|
15
|
+
import { completeMemoryViewerWriteback, foldMemoryViewerWritebackStatuses, memoryText, memoryViewerWritebackOutcome, nonNegativeInteger, pendingMemoryViewerWritebacks, stringArray, writebackOutcomeForStatus, } from "./projection/writeback-status.js";
|
|
16
|
+
import { clientTracePaths, tracePaths } from "../trace/config.js";
|
|
17
17
|
export { completeMemoryViewerWriteback, memoryViewerEventTurnIds, pendingMemoryViewerWritebacks, };
|
|
18
18
|
const CAPACITY = 200;
|
|
19
19
|
const TURN_CAPACITY = 50;
|
|
@@ -25,6 +25,8 @@ const EMPTY_MEMORY_VIEWER_HISTORY = Object.freeze([]);
|
|
|
25
25
|
const claudeTranscriptSources = new Map();
|
|
26
26
|
export function recordMemoryViewerEvent(input) {
|
|
27
27
|
const client = memoryViewerClient(input);
|
|
28
|
+
if (!client)
|
|
29
|
+
return undefined;
|
|
28
30
|
const response = record(input.response);
|
|
29
31
|
const request = record(input.request);
|
|
30
32
|
const items = arrayValue(response?.items);
|
|
@@ -275,6 +277,13 @@ function eventContent(operation, request, response, items, error) {
|
|
|
275
277
|
return stringValue(payload?.query) || "Memory retrieval completed.";
|
|
276
278
|
}
|
|
277
279
|
async function readTraceHistory(memoraxCodeHome, resolveProject, client, claudeProjectsRoot = false) {
|
|
280
|
+
if (client !== undefined && !isMemoryViewerClient(client)) {
|
|
281
|
+
return {
|
|
282
|
+
values: [],
|
|
283
|
+
complete: true,
|
|
284
|
+
claudeLocal: EMPTY_MEMORY_VIEWER_HISTORY,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
278
287
|
const historyCacheRoot = resolve(memoraxCodeHome);
|
|
279
288
|
const projectsByCwd = new Map();
|
|
280
289
|
const resolveProjectOnce = (cwd) => {
|
|
@@ -310,9 +319,9 @@ async function readTraceHistory(memoraxCodeHome, resolveProject, client, claudeP
|
|
|
310
319
|
},
|
|
311
320
|
compare: compareMemoryViewerEvents,
|
|
312
321
|
});
|
|
313
|
-
if (client === "codex") {
|
|
314
|
-
const
|
|
315
|
-
return { ...
|
|
322
|
+
if (client === "codex" || client === "dsh" || client === "opencode") {
|
|
323
|
+
const selected = await readClient(client);
|
|
324
|
+
return { ...selected, claudeLocal: EMPTY_MEMORY_VIEWER_HISTORY };
|
|
316
325
|
}
|
|
317
326
|
const claudeLocalPromise = readClaudeLocalTranscriptHistory(claudeProjectsRoot, resolveProject);
|
|
318
327
|
if (client === "claude") {
|
|
@@ -321,33 +330,37 @@ async function readTraceHistory(memoraxCodeHome, resolveProject, client, claudeP
|
|
|
321
330
|
claudeLocalPromise,
|
|
322
331
|
]);
|
|
323
332
|
return {
|
|
324
|
-
values: combinedTraceHistory(`${historyCacheRoot}\u0000client=claude\u0000source=${claudeProjectsRoot || "disabled"}`, EMPTY_MEMORY_VIEWER_HISTORY, claude.values, claudeLocal),
|
|
333
|
+
values: combinedTraceHistory(`${historyCacheRoot}\u0000client=claude\u0000source=${claudeProjectsRoot || "disabled"}`, EMPTY_MEMORY_VIEWER_HISTORY, claude.values, EMPTY_MEMORY_VIEWER_HISTORY, EMPTY_MEMORY_VIEWER_HISTORY, claudeLocal),
|
|
325
334
|
complete: claude.complete,
|
|
326
335
|
claudeLocal,
|
|
327
336
|
};
|
|
328
337
|
}
|
|
329
|
-
const [codex, claude, claudeLocal] = await Promise.all([
|
|
338
|
+
const [codex, claude, dsh, opencode, claudeLocal] = await Promise.all([
|
|
330
339
|
readClient("codex"),
|
|
331
340
|
readClient("claude"),
|
|
341
|
+
readClient("dsh"),
|
|
342
|
+
readClient("opencode"),
|
|
332
343
|
claudeLocalPromise,
|
|
333
344
|
]);
|
|
334
345
|
return {
|
|
335
|
-
values: combinedTraceHistory(`${historyCacheRoot}\u0000client=all\u0000source=${claudeProjectsRoot || "disabled"}`, codex.values, claude.values, claudeLocal),
|
|
336
|
-
complete: codex.complete && claude.complete,
|
|
346
|
+
values: combinedTraceHistory(`${historyCacheRoot}\u0000client=all\u0000source=${claudeProjectsRoot || "disabled"}`, codex.values, claude.values, dsh.values, opencode.values, claudeLocal),
|
|
347
|
+
complete: codex.complete && claude.complete && dsh.complete && opencode.complete,
|
|
337
348
|
claudeLocal,
|
|
338
349
|
};
|
|
339
350
|
}
|
|
340
|
-
function combinedTraceHistory(cacheKey, codex, claude, claudeLocal) {
|
|
351
|
+
function combinedTraceHistory(cacheKey, codex, claude, dsh, opencode, claudeLocal) {
|
|
341
352
|
const cached = combinedTraceHistories.get(cacheKey);
|
|
342
353
|
if (cached?.codex === codex
|
|
343
354
|
&& cached.claude === claude
|
|
355
|
+
&& cached.dsh === dsh
|
|
356
|
+
&& cached.opencode === opencode
|
|
344
357
|
&& cached.claudeLocal === claudeLocal) {
|
|
345
358
|
return cached.values;
|
|
346
359
|
}
|
|
347
360
|
// Native Claude transcripts invalidate this cached identity, but they are
|
|
348
361
|
// admitted only after retained and live Hook trace events are merged.
|
|
349
|
-
const values = [...codex, ...claude].sort(compareMemoryViewerEvents);
|
|
350
|
-
combinedTraceHistories.set(cacheKey, { codex, claude, claudeLocal, values });
|
|
362
|
+
const values = [...codex, ...claude, ...dsh, ...opencode].sort(compareMemoryViewerEvents);
|
|
363
|
+
combinedTraceHistories.set(cacheKey, { codex, claude, dsh, opencode, claudeLocal, values });
|
|
351
364
|
return values;
|
|
352
365
|
}
|
|
353
366
|
function admitClaudeTranscriptEvents(traceEvents, localEvents) {
|
|
@@ -938,27 +951,41 @@ function sessionId(value) {
|
|
|
938
951
|
return safeMemoryViewerSessionId(value);
|
|
939
952
|
}
|
|
940
953
|
function memoryViewerClient(input) {
|
|
941
|
-
if (input.traceContext?.client
|
|
942
|
-
return
|
|
943
|
-
|
|
944
|
-
|
|
954
|
+
if (input.traceContext?.client !== undefined) {
|
|
955
|
+
return isMemoryViewerClient(input.traceContext.client)
|
|
956
|
+
? input.traceContext.client
|
|
957
|
+
: undefined;
|
|
958
|
+
}
|
|
959
|
+
if (input.source === "dsh_native_retrieval" || input.source === "dsh_native_writeback") {
|
|
960
|
+
return undefined;
|
|
961
|
+
}
|
|
945
962
|
if (input.source === "claude_hook_retrieval" || input.source === "claude_hook_writeback")
|
|
946
963
|
return "claude";
|
|
964
|
+
if (input.source === "opencode_plugin_retrieval" || input.source === "opencode_plugin_writeback")
|
|
965
|
+
return "opencode";
|
|
947
966
|
return "codex";
|
|
948
967
|
}
|
|
968
|
+
function isMemoryViewerClient(client) {
|
|
969
|
+
return client === "codex" || client === "claude" || client === "dsh" || client === "opencode";
|
|
970
|
+
}
|
|
949
971
|
function memoryViewerEventId(client, eventId) {
|
|
950
972
|
if (eventId)
|
|
951
973
|
return persistedMemoryViewerEventId(client, eventId);
|
|
952
|
-
return client === "codex"
|
|
953
|
-
? `memory-viewer:${randomUUID()}`
|
|
954
|
-
: `claude-memory-viewer:${randomUUID()}`;
|
|
974
|
+
return `${client === "codex" ? "" : `${client}-`}memory-viewer:${randomUUID()}`;
|
|
955
975
|
}
|
|
956
976
|
function persistedMemoryViewerEventId(client, eventId) {
|
|
957
|
-
return client === "codex" ? `trace:${eventId}` :
|
|
977
|
+
return client === "codex" ? `trace:${eventId}` : `${client}-trace:${eventId}`;
|
|
958
978
|
}
|
|
959
979
|
function memoryViewerProjectionKey(memoraxCodeHome, client) {
|
|
980
|
+
if (client !== undefined && !isMemoryViewerClient(client)) {
|
|
981
|
+
return `${resolve(memoraxCodeHome)}\u0000client=unsupported`;
|
|
982
|
+
}
|
|
960
983
|
if (client === "claude")
|
|
961
984
|
return clientTracePaths("claude", memoraxCodeHome).sessionsRoot;
|
|
985
|
+
if (client === "dsh")
|
|
986
|
+
return clientTracePaths("dsh", memoraxCodeHome).sessionsRoot;
|
|
987
|
+
if (client === "opencode")
|
|
988
|
+
return clientTracePaths("opencode", memoraxCodeHome).sessionsRoot;
|
|
962
989
|
const codexSessionsRoot = tracePaths(memoraxCodeHome).sessionsRoot;
|
|
963
990
|
return client === "codex" ? `${codexSessionsRoot}\u0000client=codex` : codexSessionsRoot;
|
|
964
991
|
}
|
|
@@ -16,9 +16,10 @@ export function memoryViewerUserHtml() {
|
|
|
16
16
|
document.documentElement.lang=language==='en'?'en':'zh-CN';
|
|
17
17
|
document.querySelector('meta[name="theme-color"]').content=theme==='dark'?'#10121a':'#f7f8fc';
|
|
18
18
|
window.addEventListener('DOMContentLoaded',()=>{
|
|
19
|
-
const E=id=>document.getElementById(id),project=E('project'),
|
|
19
|
+
const E=id=>document.getElementById(id),project=E('project'),clientSelect=E('client-select'),bootstrapUrl=new URL(location.href),params=bootstrapUrl.searchParams;
|
|
20
20
|
if(params.has('token')){bootstrapUrl.searchParams.delete('token');history.replaceState(null,'',bootstrapUrl)}
|
|
21
|
-
|
|
21
|
+
const requestedClient=(params.get('client')||'').toLowerCase();
|
|
22
|
+
let selected=params.get('projectId')||'',client=['claude','claude-code','cc'].includes(requestedClient)?'claude-code':['dsh','opencode'].includes(requestedClient)?requestedClient:'codex',controller,lastBody=null,connectionState=null;
|
|
22
23
|
const esc=value=>String(value??'').replace(/[&<>"']/g,char=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char]));
|
|
23
24
|
const COPY={
|
|
24
25
|
zh:{
|
|
@@ -29,7 +30,7 @@ export function memoryViewerUserHtml() {
|
|
|
29
30
|
empty:'当前范围还没有会话、搜索或写入活动',error:'暂时无法加载记忆活动,请稍后重试。',selectProject:'选择仓库',selectProjectForStatus:'选择仓库后查看状态',noProjects:'暂无可识别仓库',unassignedProject:'未归属仓库',systemActivity:'系统活动',
|
|
30
31
|
turnNote:'轮客户端会话',searchUnit:'次搜索',addUnit:'次写入',processingUnit:'个处理中',unknownUnit:'个数量未知',activityUnit:'条',
|
|
31
32
|
repoStates:{ready:'可用',preparing:'生成中',not_ready:'未就绪',unknown:'未知'},
|
|
32
|
-
reasons:{usable:'仓库知识可以使用',active_job:'正在生成或更新',bundle_missing:'正在生成仓库知识',bundle_invalid:'仓库知识需要重新生成',project_unresolved:'无法定位仓库',validator_unavailable:'暂时无法检查'},
|
|
33
|
+
reasons:{usable:'仓库知识可以使用',active_job:'正在生成或更新',bundle_missing:'正在生成仓库知识',bundle_missing_idle:'仓库知识尚未初始化',bundle_invalid:'仓库知识需要重新生成',project_unresolved:'无法定位仓库',validator_unavailable:'暂时无法检查'},
|
|
33
34
|
statuses:{completed:'完成',saved:'已保存',skipped:'未写入',processing:'进行中',interrupted:'已中断',failed:'失败',unknown:'数量未知'},
|
|
34
35
|
sources:{client:'客户端会话',assistant:'助手主动',automatic:'系统自动'}
|
|
35
36
|
},
|
|
@@ -41,7 +42,7 @@ export function memoryViewerUserHtml() {
|
|
|
41
42
|
empty:'No turn, Search, or Add activity in the current scope',error:'Memory activity is temporarily unavailable. Please try again later.',selectProject:'Select a repository',selectProjectForStatus:'Select a repository to view its status',noProjects:'No repositories found',unassignedProject:'Unassigned repository',systemActivity:'System activity',
|
|
42
43
|
turnNote:'client turns',searchUnit:'searches',addUnit:'adds',processingUnit:'processing',unknownUnit:'with unknown counts',activityUnit:'items',
|
|
43
44
|
repoStates:{ready:'Ready',preparing:'Generating',not_ready:'Not Ready',unknown:'Unknown'},
|
|
44
|
-
reasons:{usable:'Repository knowledge is ready',active_job:'Generating or updating repository knowledge',bundle_missing:'Generating repository knowledge',bundle_invalid:'Repository knowledge needs to be regenerated',project_unresolved:'Repository could not be resolved',validator_unavailable:'Status is temporarily unavailable'},
|
|
45
|
+
reasons:{usable:'Repository knowledge is ready',active_job:'Generating or updating repository knowledge',bundle_missing:'Generating repository knowledge',bundle_missing_idle:'Repository knowledge has not been initialized',bundle_invalid:'Repository knowledge needs to be regenerated',project_unresolved:'Repository could not be resolved',validator_unavailable:'Status is temporarily unavailable'},
|
|
45
46
|
statuses:{completed:'Completed',saved:'Saved',skipped:'No Add',processing:'Processing',interrupted:'Interrupted',failed:'Failed',unknown:'Count unknown'},
|
|
46
47
|
sources:{client:'Client session',assistant:'Assistant initiated',automatic:'Automatic'}
|
|
47
48
|
}
|
|
@@ -49,13 +50,13 @@ export function memoryViewerUserHtml() {
|
|
|
49
50
|
const icons={turn:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9"><path d="M5 6h14v10H9l-4 3z" stroke-linejoin="round"/></svg>',search:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9"><circle cx="10.5" cy="10.5" r="5.5"/><path d="m15 15 4 4" stroke-linecap="round"/></svg>',add:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9"><path d="M12 7v10M7 12h10" stroke-linecap="round"/></svg>'};
|
|
50
51
|
const copy=()=>COPY[language],locale=()=>language==='en'?'en-US':'zh-CN',number=value=>Number(value||0).toLocaleString(locale()),date=value=>new Intl.DateTimeFormat(locale(),{month:'short',day:'numeric',hour:'2-digit',minute:'2-digit'}).format(new Date(value));
|
|
51
52
|
function endpoint(){const next=new URL('/memory-viewer/api/summary',location.href);next.searchParams.set('client',client);if(selected)next.searchParams.set('projectId',selected);return next.pathname+next.search}
|
|
52
|
-
function syncClient(){
|
|
53
|
+
function syncClient(){clientSelect.value=client}
|
|
53
54
|
function syncStaticCopy(){const current=copy();document.title=current.pageTitle;document.documentElement.lang=language==='en'?'en':'zh-CN';document.querySelectorAll('[data-i18n]').forEach(node=>{const value=current[node.dataset.i18n];if(typeof value==='string')node.textContent=value});document.querySelectorAll('[data-i18n-aria]').forEach(node=>{const value=current[node.dataset.i18nAria];if(typeof value==='string')node.setAttribute('aria-label',value)});document.querySelectorAll('[data-i18n-title]').forEach(node=>{const value=current[node.dataset.i18nTitle];if(typeof value==='string')node.setAttribute('title',value)});E('language-toggle').textContent=language==='zh'?'EN':'中';E('language-toggle').setAttribute('aria-label',current.languageSwitch);E('language-toggle').title=current.languageSwitch;syncThemeButton()}
|
|
54
55
|
function syncThemeButton(){const label=theme==='dark'?copy().themeLight:copy().themeDark;E('theme-toggle').setAttribute('aria-label',label);E('theme-toggle').title=label}
|
|
55
56
|
function setTheme(next,persist=true){theme=next;document.documentElement.dataset.theme=theme;document.querySelector('meta[name="theme-color"]').content=theme==='dark'?'#10121a':'#f7f8fc';if(persist)writePreference(THEME_STORAGE_KEY,theme);syncThemeButton()}
|
|
56
57
|
function setLanguage(next,persist=true){language=next;if(persist)writePreference(LANGUAGE_STORAGE_KEY,language);syncStaticCopy();if(lastBody)render(lastBody);if(connectionState!==null)connection(connectionState)}
|
|
57
58
|
function syncProjects(items){const current=selected;project.innerHTML='<option value="">'+esc(copy().allProjects)+'</option>'+items.map(item=>'<option value="'+esc(item.projectId)+'">'+esc(item.projectLabel)+'</option>').join('');project.value=items.some(item=>item.projectId===current)?current:'';selected=project.value}
|
|
58
|
-
function repoState(items){const current=copy(),target=selected?items.find(item=>item.projectId===selected):items.length===1?items[0]:null,state=target?.repoMemory||{status:'unknown',reason:'project_unresolved'},displayStatus=state.reason==='bundle_missing'?'preparing':state.status;E('repo-state').className='repo-state';E('repo-dot').className='state-dot '+displayStatus;E('repo-label').textContent=target?(current.repoStates[displayStatus]||current.repoStates.unknown):current.selectProject;E('repo-note').classList.remove('skeleton','loading-copy');E('repo-note').textContent=target?(target.projectLabel+' · '+(current.reasons[
|
|
59
|
+
function repoState(items){const current=copy(),target=selected?items.find(item=>item.projectId===selected):items.length===1?items[0]:null,state=target?.repoMemory||{status:'unknown',reason:'project_unresolved'},idleOpenCodeBundle=client==='opencode'&&state.reason==='bundle_missing',displayStatus=state.reason==='bundle_missing'&&!idleOpenCodeBundle?'preparing':state.status,reason=idleOpenCodeBundle?'bundle_missing_idle':state.reason;E('repo-state').className='repo-state';E('repo-dot').className='state-dot '+displayStatus;E('repo-label').textContent=target?(current.repoStates[displayStatus]||current.repoStates.unknown):current.selectProject;E('repo-note').classList.remove('skeleton','loading-copy');E('repo-note').textContent=target?(target.projectLabel+' · '+(current.reasons[reason]||current.reasons.validator_unavailable)):items.length?current.selectProjectForStatus:current.noProjects}
|
|
59
60
|
function memoryCount(value){if(language==='zh')return value+' 条记忆';return value+' '+(value===1?'memory':'memories')}
|
|
60
61
|
function activityTitle(item){if(language==='zh'){if(item.kind==='turn')return item.status==='processing'?'会话进行中':item.status==='interrupted'?'会话已中断':'完成一轮会话';if(item.kind==='search')return item.status==='failed'?'搜索失败':'搜索 · '+memoryCount(item.count??0);if(item.status==='saved')return item.count===null?'写入 · 数量未知':'写入 · '+memoryCount(item.count);if(item.status==='skipped')return '写入 · 没有新记忆';if(item.status==='processing')return '写入处理中';if(item.status==='failed')return '写入失败';return '写入完成 · 数量未知'}if(item.kind==='turn')return item.status==='processing'?'Session in progress':item.status==='interrupted'?'Session interrupted':'Session turn completed';if(item.kind==='search')return item.status==='failed'?'Search failed':'Search · '+memoryCount(item.count??0);if(item.status==='saved')return item.count===null?'Add · Count unknown':'Add · '+memoryCount(item.count);if(item.status==='skipped')return 'Add · No new memory';if(item.status==='processing')return 'Add in progress';if(item.status==='failed')return 'Add failed';return 'Add completed · Count unknown'}
|
|
61
62
|
function metaItem(value){return '<span class="meta-item">'+esc(value)+'</span>'}
|
|
@@ -63,7 +64,7 @@ export function memoryViewerUserHtml() {
|
|
|
63
64
|
function connection(ok){connectionState=ok;const current=copy(),pill=E('connection-pill');pill.classList.toggle('offline',!ok);E('connection').textContent=ok?current.connected:current.disconnected;E('connection-time').textContent=ok?current.updated:''}
|
|
64
65
|
async function refresh(){if(controller)controller.abort();const request=new AbortController();controller=request;E('refresh').classList.add('loading');E('refresh').disabled=true;try{const response=await fetch(endpoint(),{signal:request.signal,credentials:'same-origin'});if(!response.ok)throw new Error('HTTP '+response.status);render(await response.json());connection(true)}catch(error){if(error.name==='AbortError')return;connection(false);E('error').hidden=false}finally{if(controller===request){E('refresh').classList.remove('loading');E('refresh').disabled=false}}}
|
|
65
66
|
async function poll(){if(document.visibilityState==='visible')await refresh();setTimeout(poll,10000)}
|
|
66
|
-
|
|
67
|
+
clientSelect.onchange=()=>{if(clientSelect.value===client)return;client=clientSelect.value;selected='';syncClient();const next=new URL(location.href);next.searchParams.set('client',client);next.searchParams.delete('projectId');history.replaceState(null,'',next);refresh()};
|
|
67
68
|
project.onchange=()=>{selected=project.value;const next=new URL(location.href);next.searchParams.set('client',client);if(selected)next.searchParams.set('projectId',selected);else next.searchParams.delete('projectId');history.replaceState(null,'',next);refresh()};
|
|
68
69
|
E('language-toggle').onclick=()=>setLanguage(language==='zh'?'en':'zh');
|
|
69
70
|
E('theme-toggle').onclick=()=>setTheme(theme==='light'?'dark':'light');
|
|
@@ -80,7 +81,7 @@ export function memoryViewerUserHtml() {
|
|
|
80
81
|
.shell{width:min(1080px,calc(100% - 48px));margin:0 auto}
|
|
81
82
|
header{position:sticky;top:0;z-index:5;border-bottom:1px solid var(--header-border);background:var(--header-bg);backdrop-filter:blur(18px) saturate(150%)}
|
|
82
83
|
.header-inner{height:72px;display:flex;align-items:center}.brand{display:flex;align-items:center;gap:14px;min-width:0}.logo{display:block;height:27px;max-width:168px;transition:filter .18s}.brand-divider{width:1px;height:22px;background:var(--line-strong)}.product-name{font-size:13px;font-weight:650;letter-spacing:.01em;color:var(--product-ink);white-space:nowrap}[data-theme="dark"] .logo{filter:brightness(0) invert(1)}
|
|
83
|
-
.header-actions{margin-left:auto;display:flex;align-items:center;gap:10px}.client-switch{display:flex;padding:3px;border:1px solid var(--line);border-radius:10px;background:var(--control-bg)}.client-
|
|
84
|
+
.header-actions{margin-left:auto;display:flex;align-items:center;gap:10px}.client-switch{display:flex;padding:3px;border:1px solid var(--line);border-radius:10px;background:var(--control-bg)}.client-select{height:28px;min-width:134px;padding:0 8px;border:0;border-radius:7px;outline:0;background:var(--control-bg-strong);color:var(--ink);font-size:11px;font-weight:680;cursor:pointer}.connection{display:flex;align-items:center;gap:8px;min-height:34px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--control-bg);color:var(--muted);font-size:11px;font-weight:600}.connection-dot{position:relative;width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 0 4px rgba(22,132,82,.1)}.connection.offline{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,var(--line));background:var(--red-soft)}.connection.offline .connection-dot{background:var(--red);box-shadow:0 0 0 4px rgba(194,59,80,.1)}
|
|
84
85
|
.preference-actions{display:flex;align-items:center;gap:6px}.icon-button{display:grid;width:34px;height:34px;padding:0;place-items:center;border:1px solid var(--line);border-radius:10px;background:var(--control-bg);cursor:pointer;transition:border-color .18s,background-color .18s,transform .18s}.icon-button:hover{border-color:var(--line-strong);background:var(--control-bg-strong);transform:translateY(-1px)}.icon-button:active{transform:translateY(0)}.icon-button svg{width:15px;height:15px}.icon-button.loading svg{animation:spin .8s linear infinite}.language-button{font-size:10px;font-weight:760;letter-spacing:.02em}.theme-sun{display:none}[data-theme="dark"] .theme-sun{display:block}[data-theme="dark"] .theme-moon{display:none}
|
|
85
86
|
main{padding:56px 0 80px}.hero{display:grid;grid-template-columns:minmax(0,1fr) 280px;align-items:end;gap:40px;margin-bottom:28px}.eyebrow{display:flex;align-items:center;gap:8px;margin-bottom:11px;color:var(--violet);font-size:11px;font-weight:760;letter-spacing:.11em;text-transform:uppercase}.eyebrow:before{content:"";width:19px;height:2px;border-radius:2px;background:currentColor}.hero h1{margin:0;font-size:clamp(30px,4vw,42px);font-weight:730;line-height:1.12;letter-spacing:-.04em}.hero p{max-width:620px;margin:13px 0 0;color:var(--muted);font-size:14px;line-height:1.7}
|
|
86
87
|
.scope label{display:block;margin:0 0 8px;color:var(--muted);font-size:11px;font-weight:650}.select-wrap{position:relative}.select-wrap svg{position:absolute;right:13px;top:50%;width:14px;height:14px;pointer-events:none;transform:translateY(-50%);color:var(--quiet)}.scope select{width:100%;height:44px;padding:0 40px 0 13px;appearance:none;border:1px solid var(--line-strong);border-radius:12px;outline:none;background:var(--select-bg);color:var(--ink);font-size:13px;font-weight:570;box-shadow:0 1px 2px rgba(25,27,39,.025);transition:border-color .18s,box-shadow .18s}.scope select:hover{border-color:color-mix(in srgb,var(--violet) 28%,var(--line-strong))}.scope select:focus{border-color:color-mix(in srgb,var(--violet) 60%,transparent);box-shadow:0 0 0 4px color-mix(in srgb,var(--violet) 12%,transparent)}
|
|
@@ -91,13 +92,13 @@ export function memoryViewerUserHtml() {
|
|
|
91
92
|
.skeleton{overflow:hidden;color:transparent!important;border-radius:6px;background:linear-gradient(90deg,var(--skeleton-a) 25%,var(--skeleton-b) 50%,var(--skeleton-a) 75%);background-size:200% 100%;animation:shimmer 1.2s infinite}.metric.skeleton{width:70px;height:40px}.repo-state.skeleton{width:110px;height:25px}.loading-copy{width:90px;height:13px;margin-top:7px}
|
|
92
93
|
:focus-visible{outline:2px solid var(--violet);outline-offset:3px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shimmer{to{background-position:-200% 0}}
|
|
93
94
|
@media(max-width:780px){.shell{width:min(100% - 28px,1080px)}main{padding:38px 0 60px}.hero{grid-template-columns:1fr;gap:24px}.scope{max-width:none}.cards{grid-template-columns:1fr}.card{min-height:150px}.metric{margin-top:15px}.repo-state{margin-top:18px}.activity{padding:3px 16px}.section-head{padding:18px}.row{grid-template-columns:32px minmax(0,1fr);gap:11px}.status{grid-column:2;justify-self:start;margin-top:-7px}.brand-divider,.product-name{display:none}}
|
|
94
|
-
@media(max-width:720px){.header-inner{height:auto;min-height:108px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-content:center;gap:10px 12px;padding:10px 0}.header-actions{display:contents}.client-switch{grid-column:1/-1;grid-row:2}.client-
|
|
95
|
+
@media(max-width:720px){.header-inner{height:auto;min-height:108px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-content:center;gap:10px 12px;padding:10px 0}.header-actions{display:contents}.client-switch{grid-column:1/-1;grid-row:2}.client-select{width:100%}.connection{display:none}.preference-actions{grid-column:2;grid-row:1;justify-self:end}}
|
|
95
96
|
@media(max-width:440px){.shell{width:calc(100% - 22px)}.logo{height:24px;max-width:145px}.hero h1{font-size:29px}.hero p{font-size:13px}.card{border-radius:16px}.activity-section{border-radius:16px}.row-meta{display:block;white-space:normal;line-height:1.55}.meta-separator{display:none}.meta-item{margin-right:6px}}
|
|
96
97
|
@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
|
|
97
98
|
</style>
|
|
98
99
|
</head>
|
|
99
100
|
<body>
|
|
100
|
-
<header><div class="header-inner shell"><div class="brand"><img class="logo" src="/memory-viewer/logo" alt="MemoraX AI"><span class="brand-divider" aria-hidden="true"></span><span class="product-name" data-i18n="productName">Memory Viewer</span></div><div class="header-actions"><div class="client-switch"
|
|
101
|
+
<header><div class="header-inner shell"><div class="brand"><img class="logo" src="/memory-viewer/logo" alt="MemoraX AI"><span class="brand-divider" aria-hidden="true"></span><span class="product-name" data-i18n="productName">Memory Viewer</span></div><div class="header-actions"><div class="client-switch"><select id="client-select" class="client-select" aria-label="Select client" data-i18n-aria="clientGroup"><option value="codex">Codex</option><option value="claude-code">Claude Code</option><option value="dsh">DeepSeek</option><option value="opencode">OpenCode</option></select></div><div id="connection-pill" class="connection" role="status"><span class="connection-dot"></span><span id="connection" data-i18n="connecting">Connecting</span><span id="connection-time" class="connection-time"></span></div><div class="preference-actions"><button id="language-toggle" class="icon-button language-button" type="button" aria-label="切换到中文" title="切换到中文">中</button><button id="theme-toggle" class="icon-button" type="button" aria-label="Switch to dark mode" title="Switch to dark mode"><svg class="theme-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M20 15.1A8.5 8.5 0 0 1 8.9 4a8.5 8.5 0 1 0 11.1 11.1Z" stroke-linecap="round" stroke-linejoin="round"/></svg><svg class="theme-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="3.5"/><path d="M12 2v2M12 20v2M4.93 4.93l1.42 1.42M17.65 17.65l1.42 1.42M2 12h2M20 12h2M4.93 19.07l1.42-1.42M17.65 6.35l1.42-1.42" stroke-linecap="round"/></svg></button><button id="refresh" class="icon-button" type="button" aria-label="Refresh memory activity" title="Refresh memory activity" data-i18n-aria="refresh" data-i18n-title="refresh"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M20 11a8 8 0 1 0-2.34 5.66M20 4v7h-7" stroke-linecap="round" stroke-linejoin="round"/></svg></button></div></div></div></header>
|
|
101
102
|
<main class="shell">
|
|
102
103
|
<section class="hero">
|
|
103
104
|
<div class="hero-copy"><div class="eyebrow" data-i18n="eyebrow">Memory at a glance</div><h1 data-i18n="heading">Memory usage</h1><p data-i18n="intro">See how client sessions use project memory and whether repository knowledge is ready.</p></div>
|
|
@@ -1,148 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { existsSync } from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
export function resolveWindowsCliInvocation(command, args, options = {}) {
|
|
5
|
-
const platform = options.platform ?? process.platform;
|
|
6
|
-
if (platform !== "win32")
|
|
7
|
-
return { command, args };
|
|
8
|
-
const pathApi = path.win32;
|
|
9
|
-
const fileExists = options.existsSync ?? existsSync;
|
|
10
|
-
const env = options.env ?? process.env;
|
|
11
|
-
let resolvedCommand = options.resolvedCommand;
|
|
12
|
-
if (!resolvedCommand && !/[\\/]/.test(command)) {
|
|
13
|
-
const located = options.whereOutput === undefined
|
|
14
|
-
? (options.spawnSync ?? spawnSync)("where.exe", [command], {
|
|
15
|
-
env,
|
|
16
|
-
encoding: "utf8",
|
|
17
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
18
|
-
windowsHide: true,
|
|
19
|
-
})
|
|
20
|
-
: { status: 0, stdout: options.whereOutput };
|
|
21
|
-
if (located.status === 0) {
|
|
22
|
-
resolvedCommand = selectWindowsCommandCandidate(command, located.stdout);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
resolvedCommand ??= command;
|
|
26
|
-
if (/\.(?:exe|com)$/i.test(resolvedCommand))
|
|
27
|
-
return { command: resolvedCommand, args };
|
|
28
|
-
if (!/\.(?:cmd|bat)$/i.test(resolvedCommand)) {
|
|
29
|
-
throw new Error(`refusing to execute unsupported Windows command shim: ${resolvedCommand}`);
|
|
30
|
-
}
|
|
31
|
-
const name = pathApi.basename(resolvedCommand).replace(/\.(?:cmd|bat)$/i, "").toLowerCase();
|
|
32
|
-
const nativeCli = nativeCliEntrypointCandidates(name, resolvedCommand, env, pathApi)
|
|
33
|
-
.filter(isNativeEntrypoint)
|
|
34
|
-
.find((candidate) => fileExists(candidate));
|
|
35
|
-
if (nativeCli)
|
|
36
|
-
return { command: nativeCli, args };
|
|
37
|
-
const cli = cliEntrypointCandidates(name, resolvedCommand, env, pathApi)
|
|
38
|
-
.filter(isNodeEntrypoint)
|
|
39
|
-
.find((candidate) => fileExists(candidate));
|
|
40
|
-
if (!cli) {
|
|
41
|
-
const override = name === "claude" ? "MEMORAX_CODE_CLAUDE_CLI_JS" : "MEMORAX_CODE_CODEX_CLI_JS";
|
|
42
|
-
throw new Error(`refusing to execute ${pathApi.basename(resolvedCommand)} through a command shell; `
|
|
43
|
-
+ `set ${override} to its Node entrypoint`);
|
|
44
|
-
}
|
|
45
|
-
return { command: options.nodePath ?? process.execPath, args: [cli, ...args] };
|
|
46
|
-
}
|
|
47
|
-
function nativeCliEntrypointCandidates(name, command, env, pathApi) {
|
|
48
|
-
if (name !== "claude")
|
|
49
|
-
return [];
|
|
50
|
-
const root = pathApi.dirname(command);
|
|
51
|
-
return [
|
|
52
|
-
env.MEMORAX_CODE_CLAUDE_CLI_EXE,
|
|
53
|
-
env.CLAUDE_CLI_EXE,
|
|
54
|
-
pathApi.join(root, "node_modules", "@anthropic-ai", "claude-code", "bin", "claude.exe"),
|
|
55
|
-
pathApi.join(root, "..", "@anthropic-ai", "claude-code", "bin", "claude.exe"),
|
|
56
|
-
].filter((candidate) => typeof candidate === "string");
|
|
57
|
-
}
|
|
58
|
-
function cliEntrypointCandidates(name, command, env, pathApi) {
|
|
59
|
-
const root = pathApi.dirname(command);
|
|
60
|
-
if (name === "codex") {
|
|
61
|
-
return [
|
|
62
|
-
env.MEMORAX_CODE_CODEX_CLI_JS,
|
|
63
|
-
env.CODEX_CLI_JS,
|
|
64
|
-
pathApi.join(root, "node_modules", "@openai", "codex", "bin", "codex.js"),
|
|
65
|
-
pathApi.join(root, "..", "@openai", "codex", "bin", "codex.js"),
|
|
66
|
-
].filter((candidate) => typeof candidate === "string");
|
|
67
|
-
}
|
|
68
|
-
if (name === "claude") {
|
|
69
|
-
return [
|
|
70
|
-
env.MEMORAX_CODE_CLAUDE_CLI_JS,
|
|
71
|
-
env.CLAUDE_CLI_JS,
|
|
72
|
-
pathApi.join(root, "node_modules", "@anthropic-ai", "claude-code", "cli.js"),
|
|
73
|
-
pathApi.join(root, "..", "@anthropic-ai", "claude-code", "cli.js"),
|
|
74
|
-
].filter((candidate) => typeof candidate === "string");
|
|
75
|
-
}
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
|
-
function isNativeEntrypoint(value) {
|
|
79
|
-
return /\.(?:exe|com)$/i.test(value);
|
|
80
|
-
}
|
|
81
|
-
function isNodeEntrypoint(value) {
|
|
82
|
-
return /\.(?:cjs|js|mjs)$/i.test(value);
|
|
83
|
-
}
|
|
84
|
-
export function selectWindowsCommandCandidate(command, output) {
|
|
85
|
-
const candidates = String(output ?? "")
|
|
86
|
-
.split(/\r?\n/)
|
|
87
|
-
.map((value) => value.trim())
|
|
88
|
-
.filter(Boolean);
|
|
89
|
-
const selected = candidates.find((value) => /\.(?:cmd|bat)$/i.test(value))
|
|
90
|
-
?? candidates.find((value) => /\.(?:exe|com)$/i.test(value));
|
|
91
|
-
if (!selected) {
|
|
92
|
-
throw new Error(`where.exe did not return a safe executable or command shim for ${command}`);
|
|
93
|
-
}
|
|
94
|
-
return selected;
|
|
95
|
-
}
|
|
96
|
-
export function resolveWindowsNpmInvocation(args, env, options = {}) {
|
|
97
|
-
const platform = options.platform ?? process.platform;
|
|
98
|
-
if (platform !== "win32")
|
|
99
|
-
return { command: "npm", args };
|
|
100
|
-
const nodePath = options.nodePath ?? process.execPath;
|
|
101
|
-
const fileExists = options.existsSync ?? existsSync;
|
|
102
|
-
const candidates = [
|
|
103
|
-
env.MEMORAX_CODE_NPM_EXEC_PATH,
|
|
104
|
-
env.npm_execpath,
|
|
105
|
-
env.NPM_CLI_JS,
|
|
106
|
-
path.win32.join(path.win32.dirname(nodePath), "node_modules", "npm", "bin", "npm-cli.js"),
|
|
107
|
-
path.win32.join(path.win32.dirname(path.win32.dirname(nodePath)), "lib", "node_modules", "npm", "bin", "npm-cli.js"),
|
|
108
|
-
].filter((candidate) => (typeof candidate === "string" && /\.(?:cjs|js|mjs)$/i.test(candidate)));
|
|
109
|
-
const npmCli = candidates.find((candidate) => fileExists(candidate));
|
|
110
|
-
if (!npmCli) {
|
|
111
|
-
throw new Error("npm CLI JavaScript entrypoint was not found; set MEMORAX_CODE_NPM_EXEC_PATH, "
|
|
112
|
-
+ "npm_execpath, or NPM_CLI_JS");
|
|
113
|
-
}
|
|
114
|
-
return { command: nodePath, args: [npmCli, ...args] };
|
|
115
|
-
}
|
|
116
|
-
export function runProcessWithWindowsNpm(command, args, options) {
|
|
117
|
-
return new Promise((resolveResult) => {
|
|
118
|
-
let invocation = { command, args };
|
|
119
|
-
try {
|
|
120
|
-
if (command === "npm") {
|
|
121
|
-
invocation = resolveWindowsNpmInvocation(args, options.env);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
resolveResult({
|
|
126
|
-
ok: false,
|
|
127
|
-
stdout: "",
|
|
128
|
-
stderr: error instanceof Error ? error.message : String(error),
|
|
129
|
-
});
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const child = spawn(invocation.command, invocation.args, {
|
|
133
|
-
cwd: options.cwd,
|
|
134
|
-
env: options.env,
|
|
135
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
136
|
-
});
|
|
137
|
-
let stdout = "";
|
|
138
|
-
let stderr = "";
|
|
139
|
-
child.stdout.on("data", (chunk) => { stdout += String(chunk); });
|
|
140
|
-
child.stderr.on("data", (chunk) => { stderr += String(chunk); });
|
|
141
|
-
child.on("error", (error) => {
|
|
142
|
-
resolveResult({ ok: false, stdout, stderr: stderr || error.message });
|
|
143
|
-
});
|
|
144
|
-
child.on("close", (code) => {
|
|
145
|
-
resolveResult({ ok: code === 0, stdout, stderr });
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
}
|
|
1
|
+
export * from "./shared/windows-cli-invocation.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memorax-code/backend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Local memory integration, lifecycle, trace, and diagnostics for MemoraX Code.",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
14
14
|
"dev:backend": "node --watch dist/server.js",
|
|
15
15
|
"typecheck": "tsc --noEmit",
|
|
16
|
-
"test": "npm run build && node --test --test-timeout=5000 --test-force-exit test
|
|
17
|
-
"test:memory-viewer": "npm run build && node --test --test-timeout=5000 --test-force-exit test/memory-viewer-routes.test.mjs"
|
|
16
|
+
"test": "npm run build && node --test --test-timeout=5000 --test-force-exit \"test/**/*.test.mjs\"",
|
|
17
|
+
"test:memory-viewer": "npm run build && node --test --test-timeout=5000 --test-force-exit test/viewer/http/memory-viewer-routes.test.mjs"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "^24.13.2",
|