@memorax/memorax-code 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -12
- package/bin/memorax-code-npm-preinstall.mjs +7 -2
- package/bin/memorax-code-opencode.mjs +4 -0
- package/bin/memorax-code-plugin-postinstall.mjs +424 -108
- package/docs/configuration.md +153 -29
- package/docs/troubleshooting.md +93 -7
- package/lib/dsh-plugin-install.mjs +22 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
- package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
- package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
- package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +16 -9
- package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +18 -11
- package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
- package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
- package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
- package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
- package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
- package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
- package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
- package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
- package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
- package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +157 -34
- package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
- package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
- package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
- package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
- package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
- package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
- package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
- package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
- package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
- package/lib/memorax-code-backend/dist/memorax-cli.js +3 -1
- package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
- package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
- package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +82 -21
- package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +45 -10
- package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
- package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
- package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
- package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +25 -4
- package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +30 -6
- package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +7 -3
- package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +31 -2
- package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
- package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
- package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
- package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
- package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +81 -33
- package/lib/memorax-code-backend/dist/server.js +3 -212
- package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
- package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
- package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
- package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
- package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +25 -14
- package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
- package/lib/memorax-code-backend/dist/viewer/ui/icon.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +14 -12
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
- package/lib/memorax-code-backend/package.json +3 -3
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +5 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +5 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +2 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +5 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +23 -15
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +5 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +2 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-codex-adapter/package.json +1 -1
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +16 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +23 -15
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +5 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +40 -10
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
- package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
- package/lib/memorax-code-dsh-adapter/package.json +69 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
- package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
- package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
- package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
- package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1289 -0
- package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
- package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
- package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/package.json +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
- package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
- package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
- package/lib/memorax-code-opencode-adapter/src/plugin.mjs +536 -0
- package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +207 -0
- package/lib/resolve-claude-command.mjs +154 -1
- package/lib/resolve-codex-command.mjs +56 -1
- package/lib/run-entrypoint.mjs +6 -0
- package/package.json +7 -3
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
- /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
- /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
- /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
- /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
- /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
- /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
|
@@ -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
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MEMORAX_ICON_DATA_URL = "data:image/png;base64,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";
|
|
@@ -5,6 +5,7 @@ export function memoryViewerUserHtml() {
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
7
7
|
<meta name="theme-color" content="#f7f8fc">
|
|
8
|
+
<link rel="icon" type="image/png" sizes="64x64" href="/memory-viewer/favicon.png">
|
|
8
9
|
<title>MemoraX Code Memory Viewer</title>
|
|
9
10
|
<script>
|
|
10
11
|
const THEME_STORAGE_KEY='memorax-code-memory-viewer-theme',LANGUAGE_STORAGE_KEY='memorax-code-memory-viewer-language';
|
|
@@ -15,9 +16,10 @@ export function memoryViewerUserHtml() {
|
|
|
15
16
|
document.documentElement.lang=language==='en'?'en':'zh-CN';
|
|
16
17
|
document.querySelector('meta[name="theme-color"]').content=theme==='dark'?'#10121a':'#f7f8fc';
|
|
17
18
|
window.addEventListener('DOMContentLoaded',()=>{
|
|
18
|
-
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;
|
|
19
20
|
if(params.has('token')){bootstrapUrl.searchParams.delete('token');history.replaceState(null,'',bootstrapUrl)}
|
|
20
|
-
|
|
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;
|
|
21
23
|
const esc=value=>String(value??'').replace(/[&<>"']/g,char=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char]));
|
|
22
24
|
const COPY={
|
|
23
25
|
zh:{
|
|
@@ -27,8 +29,8 @@ export function memoryViewerUserHtml() {
|
|
|
27
29
|
cardTurns:'会话',cardSearch:'搜索',cardAdd:'写入',cardRepo:'仓库记忆',loading:'正在加载',checking:'正在检查',repoLoading:'仓库知识状态',recentActivity:'最近活动',
|
|
28
30
|
empty:'当前范围还没有会话、搜索或写入活动',error:'暂时无法加载记忆活动,请稍后重试。',selectProject:'选择仓库',selectProjectForStatus:'选择仓库后查看状态',noProjects:'暂无可识别仓库',unassignedProject:'未归属仓库',systemActivity:'系统活动',
|
|
29
31
|
turnNote:'轮客户端会话',searchUnit:'次搜索',addUnit:'次写入',processingUnit:'个处理中',unknownUnit:'个数量未知',activityUnit:'条',
|
|
30
|
-
repoStates:{ready:'可用',preparing:'
|
|
31
|
-
reasons:{usable:'仓库知识可以使用',active_job:'正在生成或更新',bundle_missing:'
|
|
32
|
+
repoStates:{ready:'可用',preparing:'生成中',not_ready:'未就绪',unknown:'未知'},
|
|
33
|
+
reasons:{usable:'仓库知识可以使用',active_job:'正在生成或更新',bundle_missing:'正在生成仓库知识',bundle_missing_idle:'仓库知识尚未初始化',bundle_invalid:'仓库知识需要重新生成',project_unresolved:'无法定位仓库',validator_unavailable:'暂时无法检查'},
|
|
32
34
|
statuses:{completed:'完成',saved:'已保存',skipped:'未写入',processing:'进行中',interrupted:'已中断',failed:'失败',unknown:'数量未知'},
|
|
33
35
|
sources:{client:'客户端会话',assistant:'助手主动',automatic:'系统自动'}
|
|
34
36
|
},
|
|
@@ -39,8 +41,8 @@ export function memoryViewerUserHtml() {
|
|
|
39
41
|
cardTurns:'Turns',cardSearch:'Search',cardAdd:'Add',cardRepo:'Repo Memory',loading:'Loading',checking:'Checking',repoLoading:'Repository knowledge status',recentActivity:'Recent activity',
|
|
40
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',
|
|
41
43
|
turnNote:'client turns',searchUnit:'searches',addUnit:'adds',processingUnit:'processing',unknownUnit:'with unknown counts',activityUnit:'items',
|
|
42
|
-
repoStates:{ready:'Ready',preparing:'
|
|
43
|
-
reasons:{usable:'Repository knowledge is ready',active_job:'Generating or updating repository knowledge',bundle_missing:'Repository knowledge has not been
|
|
44
|
+
repoStates:{ready:'Ready',preparing:'Generating',not_ready:'Not Ready',unknown:'Unknown'},
|
|
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'},
|
|
44
46
|
statuses:{completed:'Completed',saved:'Saved',skipped:'No Add',processing:'Processing',interrupted:'Interrupted',failed:'Failed',unknown:'Count unknown'},
|
|
45
47
|
sources:{client:'Client session',assistant:'Assistant initiated',automatic:'Automatic'}
|
|
46
48
|
}
|
|
@@ -48,13 +50,13 @@ export function memoryViewerUserHtml() {
|
|
|
48
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>'};
|
|
49
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));
|
|
50
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}
|
|
51
|
-
function syncClient(){
|
|
53
|
+
function syncClient(){clientSelect.value=client}
|
|
52
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()}
|
|
53
55
|
function syncThemeButton(){const label=theme==='dark'?copy().themeLight:copy().themeDark;E('theme-toggle').setAttribute('aria-label',label);E('theme-toggle').title=label}
|
|
54
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()}
|
|
55
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)}
|
|
56
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}
|
|
57
|
-
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'};E('repo-state').className='repo-state';E('repo-dot').className='state-dot '+
|
|
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}
|
|
58
60
|
function memoryCount(value){if(language==='zh')return value+' 条记忆';return value+' '+(value===1?'memory':'memories')}
|
|
59
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'}
|
|
60
62
|
function metaItem(value){return '<span class="meta-item">'+esc(value)+'</span>'}
|
|
@@ -62,7 +64,7 @@ export function memoryViewerUserHtml() {
|
|
|
62
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:''}
|
|
63
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}}}
|
|
64
66
|
async function poll(){if(document.visibilityState==='visible')await refresh();setTimeout(poll,10000)}
|
|
65
|
-
|
|
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()};
|
|
66
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()};
|
|
67
69
|
E('language-toggle').onclick=()=>setLanguage(language==='zh'?'en':'zh');
|
|
68
70
|
E('theme-toggle').onclick=()=>setTheme(theme==='light'?'dark':'light');
|
|
@@ -79,7 +81,7 @@ export function memoryViewerUserHtml() {
|
|
|
79
81
|
.shell{width:min(1080px,calc(100% - 48px));margin:0 auto}
|
|
80
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%)}
|
|
81
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)}
|
|
82
|
-
.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)}
|
|
83
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}
|
|
84
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}
|
|
85
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)}
|
|
@@ -90,13 +92,13 @@ export function memoryViewerUserHtml() {
|
|
|
90
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}
|
|
91
93
|
:focus-visible{outline:2px solid var(--violet);outline-offset:3px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shimmer{to{background-position:-200% 0}}
|
|
92
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}}
|
|
93
|
-
@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}}
|
|
94
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}}
|
|
95
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}}
|
|
96
98
|
</style>
|
|
97
99
|
</head>
|
|
98
100
|
<body>
|
|
99
|
-
<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>
|
|
100
102
|
<main class="shell">
|
|
101
103
|
<section class="hero">
|
|
102
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.3",
|
|
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",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { resolveBackendConnection } from "../../memorax-code-adapter-common/src/backend-connection.mjs";
|
|
3
3
|
import { readStdinJson } from "../../memorax-code-adapter-common/src/config-utils.mjs";
|
|
4
|
+
import { scheduleMissingRepoMemoryBuild } from "../../memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs";
|
|
4
5
|
import { isRepoMemoryJobWorker } from "../../memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs";
|
|
5
6
|
|
|
6
7
|
const RETRIEVAL_BACKEND_TIMEOUT_MS = 12_000;
|
|
@@ -29,6 +30,10 @@ try {
|
|
|
29
30
|
cwd: stringValue(input.cwd),
|
|
30
31
|
workspaceKind: stringValue(input.workspace_kind) ?? stringValue(input.workspaceKind),
|
|
31
32
|
});
|
|
33
|
+
scheduleMissingRepoMemoryBuild(stringValue(response?.repoMemoryWorktree), {
|
|
34
|
+
debugEnv: "MEMORAX_CODE_CLAUDE_HOOK_DEBUG",
|
|
35
|
+
pluginRoot: process.env.CLAUDE_PLUGIN_ROOT,
|
|
36
|
+
});
|
|
32
37
|
const additionalContext = stringValue(response?.additionalContext);
|
|
33
38
|
if (additionalContext) {
|
|
34
39
|
process.stdout.write(`${JSON.stringify({
|
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memorax-code
|
|
3
3
|
description: >-
|
|
4
|
-
Use this skill as the single
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
reusable procedures or working rules, or durable user profile and interaction
|
|
10
|
-
preferences. This applies even when the user does not call it memory,
|
|
11
|
-
including naturally stated habits, preferences,
|
|
4
|
+
Use this skill as the single router for persistent coding and repository-local
|
|
5
|
+
memory. Invoke it whenever a request may involve prior-work knowledge,
|
|
6
|
+
repository memory, reusable procedures or rules, durable profile or
|
|
7
|
+
interaction preferences, or information worth retaining beyond the current
|
|
8
|
+
task. This applies without memory wording, including habits, preferences,
|
|
12
9
|
checklists, action sequences, prerequisites, gates, exceptions, validation
|
|
13
10
|
rules, communication style, preferred language, or result presentation.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
Classify the request as coding memory, repository memory, personal procedure
|
|
12
|
+
memory, personal profile memory, or no persistent memory, then route it to the
|
|
13
|
+
matching operation. Invoking this router does not require coding-memory
|
|
14
|
+
search. Reuse a relevant coding-memory result already retrieved in this
|
|
15
|
+
conversation; otherwise let the matching operation decide on search. Prefer
|
|
16
|
+
this router over underlying memory workflows. Ask one focused question only when
|
|
17
|
+
memory authority remains ambiguous.
|
|
19
18
|
---
|
|
20
19
|
|
|
21
20
|
# MemoraX Code
|
|
22
21
|
|
|
23
22
|
Classify the requested memory authority first, then its operation. Load only the matching reference unless the request genuinely spans authorities or operations.
|
|
24
23
|
|
|
24
|
+
After selecting an operation reference, read it completely in a standalone
|
|
25
|
+
tool call and wait for the full result before constructing or executing that
|
|
26
|
+
operation. Never combine reading a required reference with the command or
|
|
27
|
+
action it governs in the same shell command or tool call.
|
|
28
|
+
|
|
25
29
|
## Authority Router
|
|
26
30
|
|
|
27
31
|
### MemoraX Code Coding Memory
|
|
@@ -52,8 +56,11 @@ Use personal memory for user-owned repository procedures and durable profile or
|
|
|
52
56
|
- Route ordered actions, checklists, prerequisites, gates, exceptions, and validation rules to personal procedure memory, even when phrased as "I prefer", "I like", "我的习惯", or "我喜欢".
|
|
53
57
|
- Route preferred name, answer language, tone, verbosity, explanation style, and result presentation to personal profile memory.
|
|
54
58
|
- Route task-learned repairs, coding pitfalls, project engineering conventions, and reusable design lessons to MemoraX Code coding memory.
|
|
59
|
+
- Route prior project discussions, experiment conclusions, saved engineering findings, earlier fixes, and reusable project lessons to MemoraX Code coding memory. Do not route them to repo memory merely because they concern a project. Use repo memory for repository identity, architecture, module maps, commits, PRs, MRs, and issues.
|
|
55
60
|
- Route repository architecture, module maps, commit history, PRs, MRs, and issues to repo memory. Verify claims about current behavior against live code.
|
|
61
|
+
- Use both repo memory and MemoraX Code coding memory only when a request genuinely needs distinct repository evidence and reusable engineering lessons. This can apply to implementation, debugging, refactoring, migration planning, or validation when the answer may depend on repository module maps, commit/PR/issue evidence, and prior fixes, pitfalls, conventions, validation patterns, or design rationale. Do not use both authorities just because a request mentions a repository, file, module, or "previous".
|
|
56
62
|
- Route current-task instructions and temporary plans to the current task only; do not persist them.
|
|
63
|
+
- Current-task-only applies only when completing the request does not depend on prior project state. Do not select it merely because the requested action happens in the current turn. When implementation, debugging, review, experiment continuation, or validation depends on earlier project decisions, results, fixes, constraints, or plans that the user has not explicitly and completely supplied, route to MemoraX Code coding memory.
|
|
57
64
|
- Do not infer an authority from verbs such as "remember", "recall", "refresh", or "update" alone. Ask one focused question when the target remains ambiguous.
|
|
58
65
|
|
|
59
66
|
Examples:
|
|
@@ -73,11 +80,12 @@ Repo memory and personal memory remain local `.repo_memory` authorities. Resolve
|
|
|
73
80
|
|
|
74
81
|
Apply instructions in this order: system and developer instructions, `AGENTS.md`, the current user request, then stored memory. Memory is guidance or historical context, not proof of current repository behavior.
|
|
75
82
|
|
|
76
|
-
For MemoraX Code coding memory, use `memorax-cli` exactly as described by the selected reference. Invoke this skill as `$memorax-code` in Codex or `/memorax-code` in Claude Code
|
|
83
|
+
For MemoraX Code coding memory, use `memorax-cli` exactly as described by the selected reference. Invoke this skill as `$memorax-code` in Codex or `/memorax-code` in Claude Code. In OpenCode, ask the agent to use the `memorax-code` skill by name. These invocation forms are not shell commands. `memorax-code` is the lifecycle CLI and must not be used for memory search or add. Do not call MemoraX HTTP endpoints directly.
|
|
77
84
|
|
|
78
85
|
When explaining Memory Viewer, describe only `/memory-viewer`. It is a
|
|
79
86
|
content-free local summary and must not expose conversation or memory text,
|
|
80
87
|
session or turn identifiers, paths, or trace details. The page never queries
|
|
81
|
-
MemoraX directly; client
|
|
88
|
+
MemoraX directly; it projects client-qualified local activity and keeps each
|
|
89
|
+
supported harness isolated.
|
|
82
90
|
|
|
83
91
|
Never store secrets, credentials, `.env` content, sensitive personal data, raw transcripts, hidden tests, exact patches, temporary target commits, or unsafe destructive commands. Do not announce internal routing or reference loading.
|