@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,10 +1,10 @@
|
|
|
1
|
-
import { readClaudeInterruptedTranscriptTurn, readClaudeTranscriptTurn, } from "./
|
|
2
|
-
import { retrieveAutomaticMemoryContext } from "
|
|
3
|
-
import { createAutomaticMemoryWritebackRuntime, } from "
|
|
4
|
-
import { createMemoryTurnCoordinator, } from "
|
|
5
|
-
import { createRepositoryMemorySessionRuntime, } from "
|
|
6
|
-
import { traceContextFromClaudeHookBody } from "
|
|
7
|
-
import { markCurrentClaudeTurnOutcome, readOpenClaudeTurn, recordClaudeTraceEvent, traceTurnEventId, writeCurrentClaudeTurn, } from "
|
|
1
|
+
import { readClaudeInterruptedTranscriptTurn, readClaudeTranscriptTurn, } from "./transcript-turn.js";
|
|
2
|
+
import { retrieveAutomaticMemoryContext } from "../../memory/automatic-retrieval.js";
|
|
3
|
+
import { createAutomaticMemoryWritebackRuntime, } from "../../memory/automatic-writeback.js";
|
|
4
|
+
import { createMemoryTurnCoordinator, } from "../../memory/turn-coordinator.js";
|
|
5
|
+
import { createRepositoryMemorySessionRuntime, resolvedRepoMemoryWorktree, } from "../../memory/repository-session.js";
|
|
6
|
+
import { traceContextFromClaudeHookBody } from "../../trace/context.js";
|
|
7
|
+
import { markCurrentClaudeTurnOutcome, readOpenClaudeTurn, recordClaudeTraceEvent, traceTurnEventId, writeCurrentClaudeTurn, } from "../../trace/store.js";
|
|
8
8
|
const CLAUDE_MEMORY_TURN_CLIENT = "claude-code";
|
|
9
9
|
const DEFAULT_TRANSCRIPT_READ_ATTEMPTS = 6;
|
|
10
10
|
const DEFAULT_TRANSCRIPT_RETRY_DELAY_MS = 100;
|
|
@@ -23,7 +23,9 @@ export function createClaudeMemoryHookRuntime(options = {}) {
|
|
|
23
23
|
cleanupIntervalMs: options.cleanupIntervalMs,
|
|
24
24
|
});
|
|
25
25
|
const ownsTurnCoordinator = options.turnCoordinator === undefined;
|
|
26
|
-
const repositoryMemorySession = options.repositoryMemorySession ?? createRepositoryMemorySessionRuntime(
|
|
26
|
+
const repositoryMemorySession = options.repositoryMemorySession ?? createRepositoryMemorySessionRuntime({
|
|
27
|
+
onScopeUpgrade: automaticWritebackRuntime?.discardForScopeUpgrade,
|
|
28
|
+
});
|
|
27
29
|
const ownsRepositoryMemorySession = options.repositoryMemorySession === undefined;
|
|
28
30
|
const automaticRetrievalPrompts = new Set();
|
|
29
31
|
const automaticRetrievalPromptLimit = positiveInteger(options.maxEntries, 256);
|
|
@@ -45,6 +47,7 @@ export function createClaudeMemoryHookRuntime(options = {}) {
|
|
|
45
47
|
await reconcilePreviousInterruptedTurn(turnCoordinator, turn, options, now);
|
|
46
48
|
turnCoordinator.pruneExpired();
|
|
47
49
|
const repositoryMemory = await resolveHookRepositoryMemory(turn, options, repositoryMemorySession);
|
|
50
|
+
const repoMemoryWorktree = resolvedRepoMemoryWorktree(repositoryMemory);
|
|
48
51
|
turnCoordinator.recordTurnStart({
|
|
49
52
|
client: CLAUDE_MEMORY_TURN_CLIENT,
|
|
50
53
|
sessionId: turn.sessionId,
|
|
@@ -84,7 +87,10 @@ export function createClaudeMemoryHookRuntime(options = {}) {
|
|
|
84
87
|
now: () => new Date(now()),
|
|
85
88
|
}), options.diagnosticLogger);
|
|
86
89
|
if (!claimAutomaticRetrievalPrompt(automaticRetrievalPrompts, automaticRetrievalPromptLimit, turn.sessionId, turn.promptId)) {
|
|
87
|
-
return {
|
|
90
|
+
return {
|
|
91
|
+
ok: true,
|
|
92
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
93
|
+
};
|
|
88
94
|
}
|
|
89
95
|
const retrieval = await retrieveAutomaticMemoryContext({
|
|
90
96
|
diagnosticLogger: options.diagnosticLogger,
|
|
@@ -99,6 +105,7 @@ export function createClaudeMemoryHookRuntime(options = {}) {
|
|
|
99
105
|
});
|
|
100
106
|
return {
|
|
101
107
|
ok: true,
|
|
108
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
102
109
|
...(retrieval.context ? { additionalContext: retrieval.context } : {}),
|
|
103
110
|
};
|
|
104
111
|
},
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { installCodexPlugin, isCodexPluginActive, isCodexPluginStaged, removeCodexPlugin, } from "./plugin-install.js";
|
|
3
|
+
const BACKEND_PREFIX = "[MemoraX Code Backend]:";
|
|
4
|
+
const GREEN = "\x1b[32m";
|
|
5
|
+
const RESET = "\x1b[0m";
|
|
6
|
+
export async function enableCodexAdapterForStart(argv, serviceOptions, backendUrl) {
|
|
7
|
+
try {
|
|
8
|
+
let options = codexAdapterOptions(argv, serviceOptions, backendUrl);
|
|
9
|
+
const codexHome = typeof options.codexHome === "string" ? options.codexHome : undefined;
|
|
10
|
+
if (!isCodexPluginActive({ codexHome }) && !isCodexPluginStaged({ codexHome })) {
|
|
11
|
+
const installed = await maybeInstallCodexPluginForStart(argv);
|
|
12
|
+
if (installed) {
|
|
13
|
+
backendLog(green("Codex plugin source registered. Activate the MemoraX Code Codex Adapter plugin, then restart or refresh Codex."));
|
|
14
|
+
}
|
|
15
|
+
else if (installed === false) {
|
|
16
|
+
return codexPluginNotInstalled();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
options = codexAdapterOptions(argv, serviceOptions, backendUrl);
|
|
20
|
+
if (!isCodexPluginActive({ codexHome })) {
|
|
21
|
+
return isCodexPluginStaged({ codexHome })
|
|
22
|
+
? codexPluginActivationRequired()
|
|
23
|
+
: codexPluginNotInstalled();
|
|
24
|
+
}
|
|
25
|
+
return (await loadCodexAdapterConfig()).enableCodexAdapter(options);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { ok: false, action: "enable", error: error instanceof Error ? error.message : String(error) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function readCodexAdapterStatusForLifecycle(argv, serviceOptions, backendUrl) {
|
|
32
|
+
try {
|
|
33
|
+
return (await loadCodexAdapterConfig()).readCodexAdapterStatus(codexAdapterOptions(argv, serviceOptions, backendUrl));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return { ok: false, action: "status", error: error instanceof Error ? error.message : String(error) };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function disableCodexAdapterForLifecycle(argv, serviceOptions) {
|
|
40
|
+
try {
|
|
41
|
+
return (await loadCodexAdapterConfig()).disableCodexAdapter(codexAdapterOptions(argv, serviceOptions));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return { ok: false, action: "disable", error: error instanceof Error ? error.message : String(error) };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export const codexAdapterLifecycle = {
|
|
48
|
+
status: ({ argv, serviceOptions, backendUrl }) => (readCodexAdapterStatusForLifecycle(argv, serviceOptions, backendUrl)),
|
|
49
|
+
prepareEnable: ({ argv, serviceOptions, backendUrl }) => (enableCodexAdapterForStart(argv, serviceOptions, backendUrl)),
|
|
50
|
+
disable: ({ argv, serviceOptions }) => (disableCodexAdapterForLifecycle(argv, serviceOptions)),
|
|
51
|
+
remove: ({ argv }) => removeCodexPlugin(codexPluginRemoveOptions(argv)),
|
|
52
|
+
};
|
|
53
|
+
function codexAdapterOptions(argv, serviceOptions, backendUrl) {
|
|
54
|
+
const codexHome = argValue(argv, "--codex-home");
|
|
55
|
+
return {
|
|
56
|
+
...(codexHome ? { codexHome } : {}),
|
|
57
|
+
memoraxCodeHome: serviceOptions.home,
|
|
58
|
+
...(backendUrl ? { backendUrl } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function codexPluginNotInstalled() {
|
|
62
|
+
return {
|
|
63
|
+
ok: true,
|
|
64
|
+
action: "enable",
|
|
65
|
+
skipped: true,
|
|
66
|
+
reason: "codex_plugin_not_installed",
|
|
67
|
+
message: "Codex plugin is not installed; run `memorax-code codex-plugin install`, then activate it and rerun `memorax-code start`.",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function codexPluginActivationRequired() {
|
|
71
|
+
return {
|
|
72
|
+
ok: true,
|
|
73
|
+
action: "enable",
|
|
74
|
+
skipped: true,
|
|
75
|
+
reason: "codex_plugin_activation_required",
|
|
76
|
+
message: "Codex plugin source is registered but not active; run `memorax-code codex-plugin activate --yes`, then rerun `memorax-code start`.",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function maybeInstallCodexPluginForStart(argv) {
|
|
80
|
+
if (argv.includes("--json"))
|
|
81
|
+
return undefined;
|
|
82
|
+
if (argv.includes("--yes")) {
|
|
83
|
+
await installCodexPlugin(codexPluginInstallOptions(argv));
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
if (!canPromptOnStdin())
|
|
87
|
+
return undefined;
|
|
88
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
89
|
+
try {
|
|
90
|
+
const answer = await rl.question(`${BACKEND_PREFIX} Install MemoraX Code Codex Adapter plugin now? [y/N] `);
|
|
91
|
+
if (!process.stdout.isTTY)
|
|
92
|
+
process.stdout.write("\n");
|
|
93
|
+
if (!/^y(?:es)?$/i.test(answer.trim()))
|
|
94
|
+
return false;
|
|
95
|
+
await installCodexPlugin(codexPluginInstallOptions(argv));
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
rl.close();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function codexPluginInstallOptions(argv) {
|
|
103
|
+
return {
|
|
104
|
+
codexHome: argValue(argv, "--codex-home"),
|
|
105
|
+
marketplacePath: argValue(argv, "--marketplace-path"),
|
|
106
|
+
pluginSourcePath: argValue(argv, "--plugin-source-path"),
|
|
107
|
+
codexCommand: argValue(argv, "--codex-command"),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function codexPluginRemoveOptions(argv) {
|
|
111
|
+
return {
|
|
112
|
+
...codexPluginInstallOptions(argv),
|
|
113
|
+
workspace: argValue(argv, "--workspace"),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function canPromptOnStdin() {
|
|
117
|
+
return process.stdin.isTTY === true;
|
|
118
|
+
}
|
|
119
|
+
function backendLog(message) {
|
|
120
|
+
console.log(`${BACKEND_PREFIX} ${message}`);
|
|
121
|
+
}
|
|
122
|
+
function green(value) {
|
|
123
|
+
return `${GREEN}${value}${RESET}`;
|
|
124
|
+
}
|
|
125
|
+
function argValue(argv, name) {
|
|
126
|
+
const index = argv.indexOf(name);
|
|
127
|
+
return index >= 0 ? argv[index + 1] : undefined;
|
|
128
|
+
}
|
|
129
|
+
async function loadCodexAdapterConfig() {
|
|
130
|
+
return await import(new URL("../../../../memorax-code-codex-adapter/src/config.mjs", import.meta.url).href);
|
|
131
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { readCodexInterruptedRolloutTurn, readCodexRolloutTurn, } from "./
|
|
2
|
-
import { createAutomaticMemoryWritebackRuntime, } from "
|
|
3
|
-
import { retrieveAutomaticMemoryContext } from "
|
|
4
|
-
import { readCodexSessionTurnIndex } from "./
|
|
5
|
-
import { resolveCodexWorkspaceRoot } from "./
|
|
6
|
-
import { createMemoryTurnCoordinator, } from "
|
|
7
|
-
import { createRepositoryMemorySessionRuntime, } from "
|
|
8
|
-
import { traceContextFromHookBody } from "
|
|
9
|
-
import { markCurrentCodexTurnOutcome, readCurrentCodexTurn, readOpenCodexTurn, recordCodexTraceEvent, traceTurnEventId, writeCurrentCodexTurn, } from "
|
|
1
|
+
import { readCodexInterruptedRolloutTurn, readCodexRolloutTurn, } from "./rollout-turn.js";
|
|
2
|
+
import { createAutomaticMemoryWritebackRuntime, } from "../../memory/automatic-writeback.js";
|
|
3
|
+
import { retrieveAutomaticMemoryContext } from "../../memory/automatic-retrieval.js";
|
|
4
|
+
import { readCodexSessionTurnIndex } from "./session-turn-index.js";
|
|
5
|
+
import { resolveCodexWorkspaceRoot } from "./workspace-links.js";
|
|
6
|
+
import { createMemoryTurnCoordinator, } from "../../memory/turn-coordinator.js";
|
|
7
|
+
import { createRepositoryMemorySessionRuntime, resolvedRepoMemoryWorktree, } from "../../memory/repository-session.js";
|
|
8
|
+
import { traceContextFromHookBody } from "../../trace/context.js";
|
|
9
|
+
import { markCurrentCodexTurnOutcome, readCurrentCodexTurn, readOpenCodexTurn, recordCodexTraceEvent, traceTurnEventId, writeCurrentCodexTurn, } from "../../trace/store.js";
|
|
10
10
|
const CODEX_MEMORY_TURN_CLIENT = "codex";
|
|
11
11
|
export function createCodexMemoryHookRuntime(options = {}) {
|
|
12
12
|
const now = options.now ?? (() => Date.now());
|
|
@@ -23,7 +23,9 @@ export function createCodexMemoryHookRuntime(options = {}) {
|
|
|
23
23
|
cleanupIntervalMs: options.cleanupIntervalMs,
|
|
24
24
|
});
|
|
25
25
|
const ownsTurnCoordinator = options.turnCoordinator === undefined;
|
|
26
|
-
const repositoryMemorySession = options.repositoryMemorySession ?? createRepositoryMemorySessionRuntime(
|
|
26
|
+
const repositoryMemorySession = options.repositoryMemorySession ?? createRepositoryMemorySessionRuntime({
|
|
27
|
+
onScopeUpgrade: automaticWritebackRuntime?.discardForScopeUpgrade,
|
|
28
|
+
});
|
|
27
29
|
const ownsRepositoryMemorySession = options.repositoryMemorySession === undefined;
|
|
28
30
|
const automaticRetrievalTurns = new Set();
|
|
29
31
|
const automaticRetrievalTurnLimit = positiveInteger(options.maxEntries, 256);
|
|
@@ -44,6 +46,7 @@ export function createCodexMemoryHookRuntime(options = {}) {
|
|
|
44
46
|
resolveHookRepositoryMemory(turn, options, repositoryMemorySession),
|
|
45
47
|
resolveSessionTurnIndex(turn, options.diagnosticLogger),
|
|
46
48
|
]);
|
|
49
|
+
const repoMemoryWorktree = resolvedRepoMemoryWorktree(repositoryMemory);
|
|
47
50
|
if (turn.turnId) {
|
|
48
51
|
turnCoordinator.recordTurnStart({
|
|
49
52
|
client: CODEX_MEMORY_TURN_CLIENT,
|
|
@@ -90,7 +93,10 @@ export function createCodexMemoryHookRuntime(options = {}) {
|
|
|
90
93
|
}), options.diagnosticLogger);
|
|
91
94
|
if (!turn.turnId
|
|
92
95
|
|| !claimAutomaticRetrievalTurn(automaticRetrievalTurns, automaticRetrievalTurnLimit, turn.sessionId, turn.turnId)) {
|
|
93
|
-
return {
|
|
96
|
+
return {
|
|
97
|
+
ok: true,
|
|
98
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
99
|
+
};
|
|
94
100
|
}
|
|
95
101
|
const retrieval = await retrieveAutomaticMemoryContext({
|
|
96
102
|
diagnosticLogger: options.diagnosticLogger,
|
|
@@ -105,6 +111,7 @@ export function createCodexMemoryHookRuntime(options = {}) {
|
|
|
105
111
|
});
|
|
106
112
|
return {
|
|
107
113
|
ok: true,
|
|
114
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
108
115
|
...(retrieval.context ? { additionalContext: retrieval.context } : {}),
|
|
109
116
|
};
|
|
110
117
|
},
|
package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js}
RENAMED
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { createInterface } from "node:readline/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join, resolve, sep } from "node:path";
|
|
5
|
-
import { resolveWindowsCliInvocation } from "
|
|
5
|
+
import { resolveWindowsCliInvocation } from "../../shared/windows-cli-invocation.js";
|
|
6
6
|
const PLUGIN_NAME = "memorax-code-codex-adapter";
|
|
7
7
|
const CLI_MARKETPLACE_NAME = "memorax-code";
|
|
8
8
|
const APP_SERVER_OPERATION_TIMEOUT_MS = 10_000;
|
package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js}
RENAMED
|
@@ -5,10 +5,10 @@ import { existsSync, readdirSync } from "node:fs";
|
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
6
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
-
import { activeCodexPluginRoot, isCompleteCodexPluginArtifact, } from "
|
|
9
|
-
import { atomicWriteJson } from "
|
|
10
|
-
import { confirmHookTrust, listMemoraxCodeHooks, trustCodexPluginHookSelection, } from "./
|
|
11
|
-
import { resolveWindowsCliInvocation } from "
|
|
8
|
+
import { activeCodexPluginRoot, isCompleteCodexPluginArtifact, } from "../../../../memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs";
|
|
9
|
+
import { atomicWriteJson } from "../../../../memorax-code-adapter-common/src/config-utils.mjs";
|
|
10
|
+
import { confirmHookTrust, listMemoraxCodeHooks, trustCodexPluginHookSelection, } from "./plugin-hooks.js";
|
|
11
|
+
import { resolveWindowsCliInvocation } from "../../shared/windows-cli-invocation.js";
|
|
12
12
|
const PLUGIN_NAME = "memorax-code-codex-adapter";
|
|
13
13
|
const CLI_MARKETPLACE_NAME = "memorax-code";
|
|
14
14
|
const ADAPTER_COMMON_NAME = "memorax-code-adapter-common";
|
|
@@ -263,8 +263,8 @@ function stringField(record, key) {
|
|
|
263
263
|
function adapterSourceRoot() {
|
|
264
264
|
const current = dirname(fileURLToPath(import.meta.url));
|
|
265
265
|
const candidates = [
|
|
266
|
-
resolve(current, "..", "..", "memorax-code-codex-adapter"),
|
|
267
|
-
resolve(current, "..", "memorax-code-codex-adapter"),
|
|
266
|
+
resolve(current, "..", "..", "..", "..", "memorax-code-codex-adapter"),
|
|
267
|
+
resolve(current, "..", "..", "..", "memorax-code-codex-adapter"),
|
|
268
268
|
];
|
|
269
269
|
const found = candidates.find((candidate) => existsSync(join(candidate, ".codex-plugin", "plugin.json")));
|
|
270
270
|
if (!found)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export async function collectDshAdapterLifecycleStatus(context) {
|
|
2
|
+
try {
|
|
3
|
+
return normalizeDshReport((await loadDshProfileLifecycle()).collectDshAdapterStatus(dshAdapterOptions(context)));
|
|
4
|
+
}
|
|
5
|
+
catch (error) {
|
|
6
|
+
return dshFailure("status", error);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Keep the DSH state lock for a complete Backend lifecycle command. The caller
|
|
11
|
+
* already owns the Backend lifecycle lock, establishing one lock order for
|
|
12
|
+
* both user commands and native DSH recovery.
|
|
13
|
+
*/
|
|
14
|
+
export async function withDshAdapterLifecycleLock(context, operation) {
|
|
15
|
+
const module = await loadDshProfileLifecycle();
|
|
16
|
+
return module.withDshPluginLifecycleLock(dshAdapterOptions(context), (lifecycle) => (operation(lockedDshAdapterLifecycle(lifecycle))));
|
|
17
|
+
}
|
|
18
|
+
function lockedDshAdapterLifecycle(lifecycle) {
|
|
19
|
+
return {
|
|
20
|
+
status: () => runLockedDshPhase("status", () => lifecycle.status()),
|
|
21
|
+
prepareEnable: () => runLockedDshPhase("prepareEnable", () => lifecycle.ensureInstalled({ enabled: false })),
|
|
22
|
+
activate: () => runLockedDshPhase("activate", () => lifecycle.activate()),
|
|
23
|
+
quiesce: () => runLockedDshPhase("quiesce", () => lifecycle.quiesce()),
|
|
24
|
+
disable: () => runLockedDshPhase("disable", () => lifecycle.disable()),
|
|
25
|
+
remove: () => runLockedDshPhase("remove", () => lifecycle.remove()),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async function runLockedDshPhase(action, operation) {
|
|
29
|
+
try {
|
|
30
|
+
return normalizeDshReport(operation());
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return dshFailure(action, error);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function normalizeDshReport(report) {
|
|
37
|
+
return {
|
|
38
|
+
integration: "plugin",
|
|
39
|
+
runtime: "dsh",
|
|
40
|
+
...report,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function dshAdapterOptions(context) {
|
|
44
|
+
const { argv, serviceOptions } = context;
|
|
45
|
+
return {
|
|
46
|
+
memoraxCodeHome: serviceOptions.home,
|
|
47
|
+
...(argValue(argv, "--dsh-home") ? { dshHome: argValue(argv, "--dsh-home") } : {}),
|
|
48
|
+
...(argValue(argv, "--dsh-command") ? { dshCommand: argValue(argv, "--dsh-command") } : {}),
|
|
49
|
+
...(argValue(argv, "--dsh-adapter-root")
|
|
50
|
+
? { adapterRoot: argValue(argv, "--dsh-adapter-root") }
|
|
51
|
+
: {}),
|
|
52
|
+
...(argValue(argv, "--memorax-code-command")
|
|
53
|
+
? { memoraxCodeCommand: argValue(argv, "--memorax-code-command") }
|
|
54
|
+
: {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function dshFailure(action, error) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
action,
|
|
61
|
+
integration: "plugin",
|
|
62
|
+
runtime: "dsh",
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function loadDshProfileLifecycle() {
|
|
67
|
+
return await import(new URL("../../../../memorax-code-dsh-adapter/src/profile-lifecycle.mjs", import.meta.url).href);
|
|
68
|
+
}
|
|
69
|
+
function argValue(argv, name) {
|
|
70
|
+
const index = argv.indexOf(name);
|
|
71
|
+
if (index >= 0)
|
|
72
|
+
return argv[index + 1];
|
|
73
|
+
const inline = argv.find((arg) => arg.startsWith(`${name}=`));
|
|
74
|
+
return inline?.slice(name.length + 1);
|
|
75
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { retrieveAutomaticMemoryContext } from "../../memory/automatic-retrieval.js";
|
|
2
|
+
import { resolvedRepoMemoryWorktree, } from "../../memory/repository-session.js";
|
|
3
|
+
import { dshSessionEventTurn, } from "./session-turn.js";
|
|
4
|
+
import { traceContextFromDshSessionEventLog, traceContextFromDshTurnStart, } from "../../trace/context.js";
|
|
5
|
+
import { markCurrentTraceTurnOutcome, recordTraceEvent, traceTurnEventId, writeCurrentTraceTurn, } from "../../trace/store.js";
|
|
6
|
+
const DSH_MEMORY_TURN_CLIENT = "dsh";
|
|
7
|
+
export function createDshMemoryHookRuntime(options) {
|
|
8
|
+
const now = options.now ?? (() => Date.now());
|
|
9
|
+
const { repositoryMemorySession, turnCoordinator } = options;
|
|
10
|
+
const retrievalTurns = new Set();
|
|
11
|
+
const retrievalTurnLimit = positiveInteger(options.maxEntries, 256);
|
|
12
|
+
return {
|
|
13
|
+
async recordTurnStart(command) {
|
|
14
|
+
turnCoordinator.pruneExpired();
|
|
15
|
+
const createdAt = now();
|
|
16
|
+
const traceContext = traceContextFromDshTurnStart(command, new Date(createdAt).toISOString());
|
|
17
|
+
const repositoryMemory = await resolveHookRepositoryMemory(command, options, repositoryMemorySession);
|
|
18
|
+
turnCoordinator.recordTurnStart({
|
|
19
|
+
client: DSH_MEMORY_TURN_CLIENT,
|
|
20
|
+
sessionId: command.sessionId,
|
|
21
|
+
clientTurnId: String(command.turn),
|
|
22
|
+
cwd: command.cwd,
|
|
23
|
+
eventStartSeq: command.startSeq,
|
|
24
|
+
createdAt,
|
|
25
|
+
traceContext,
|
|
26
|
+
repositoryMemory,
|
|
27
|
+
});
|
|
28
|
+
options.diagnosticLogger?.("dsh_memory.turn_start", {
|
|
29
|
+
sessionId: command.sessionId,
|
|
30
|
+
turn: command.turn,
|
|
31
|
+
startSeq: command.startSeq,
|
|
32
|
+
cacheSize: turnCoordinator.size(DSH_MEMORY_TURN_CLIENT),
|
|
33
|
+
workspace: repositoryMemory.ok ? repositoryMemory.memory.scope?.repositorySlug : undefined,
|
|
34
|
+
workspaceScopeReason: repositoryMemory.ok ? undefined : repositoryMemory.reason,
|
|
35
|
+
});
|
|
36
|
+
await recordDshTraceBestEffort("dsh_memory.turn_start_event", recordTraceEvent({
|
|
37
|
+
eventId: traceTurnEventId(traceContext, "turn_start"),
|
|
38
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
39
|
+
env: options.env,
|
|
40
|
+
traceContext,
|
|
41
|
+
type: "turn_start",
|
|
42
|
+
source: "dsh-cordis",
|
|
43
|
+
operation: "query",
|
|
44
|
+
ok: true,
|
|
45
|
+
request: {
|
|
46
|
+
start_seq: command.startSeq,
|
|
47
|
+
},
|
|
48
|
+
}), options.diagnosticLogger);
|
|
49
|
+
await recordDshTraceBestEffort("dsh_memory.current_turn_write", writeCurrentTraceTurn(traceContext, {
|
|
50
|
+
client: "dsh",
|
|
51
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
52
|
+
env: options.env,
|
|
53
|
+
now: () => new Date(now()),
|
|
54
|
+
}), options.diagnosticLogger);
|
|
55
|
+
const repoMemoryWorktree = resolvedRepoMemoryWorktree(repositoryMemory);
|
|
56
|
+
const retrievalKey = JSON.stringify([command.sessionId, command.turn, command.startSeq]);
|
|
57
|
+
if (retrievalTurns.has(retrievalKey)) {
|
|
58
|
+
return {
|
|
59
|
+
ok: true,
|
|
60
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
retrievalTurns.add(retrievalKey);
|
|
64
|
+
while (retrievalTurns.size > retrievalTurnLimit) {
|
|
65
|
+
const oldest = retrievalTurns.values().next().value;
|
|
66
|
+
if (typeof oldest !== "string")
|
|
67
|
+
break;
|
|
68
|
+
retrievalTurns.delete(oldest);
|
|
69
|
+
}
|
|
70
|
+
const retrieval = await retrieveAutomaticMemoryContext({
|
|
71
|
+
diagnosticLogger: options.diagnosticLogger,
|
|
72
|
+
env: options.env ?? process.env,
|
|
73
|
+
fetchImpl: options.fetchImpl,
|
|
74
|
+
memoryObservability: options.memoryObservability,
|
|
75
|
+
memoryObservabilitySource: "dsh_native_retrieval",
|
|
76
|
+
query: command.prompt,
|
|
77
|
+
repositoryMemory,
|
|
78
|
+
sessionKey: command.sessionId,
|
|
79
|
+
traceContext,
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
ok: true,
|
|
83
|
+
...(repoMemoryWorktree ? { repoMemoryWorktree } : {}),
|
|
84
|
+
...(retrieval.context ? { additionalContext: retrieval.context } : {}),
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
async writeback(command) {
|
|
88
|
+
turnCoordinator.pruneExpired();
|
|
89
|
+
const key = dshTurnKey(command.sessionId, command.turn);
|
|
90
|
+
const entry = turnCoordinator.getTurn(key);
|
|
91
|
+
if (entry
|
|
92
|
+
&& (entry.eventStartSeq !== command.startSeq || entry.cwd !== command.cwd))
|
|
93
|
+
return skippedWriteback(command, "turn_metadata_mismatch", options);
|
|
94
|
+
const materialized = dshSessionEventTurn(command);
|
|
95
|
+
if (!materialized.ok) {
|
|
96
|
+
if (materialized.reason === "turn_not_completed") {
|
|
97
|
+
const traceContext = traceContextFromDshSessionEventLog(command);
|
|
98
|
+
await recordDshTurnEnd(options, traceContext, {
|
|
99
|
+
outcome: "interrupted",
|
|
100
|
+
nativeOutcome: materialized.outcome,
|
|
101
|
+
startSeq: command.startSeq,
|
|
102
|
+
endSeq: command.endSeq,
|
|
103
|
+
});
|
|
104
|
+
const discarded = turnCoordinator.discardTurn(key, "interrupted");
|
|
105
|
+
return skippedWriteback(command, materialized.reason, options, discarded ? "consumed" : "absent");
|
|
106
|
+
}
|
|
107
|
+
return skippedWriteback(command, materialized.reason, options);
|
|
108
|
+
}
|
|
109
|
+
const traceContext = traceContextFromDshSessionEventLog(command);
|
|
110
|
+
await recordDshTurnEnd(options, traceContext, {
|
|
111
|
+
outcome: "completed",
|
|
112
|
+
nativeOutcome: materialized.turn.outcome,
|
|
113
|
+
startSeq: materialized.turn.startSeq,
|
|
114
|
+
endSeq: materialized.turn.endSeq,
|
|
115
|
+
turn: materialized.turn,
|
|
116
|
+
});
|
|
117
|
+
const writeback = await turnCoordinator.completeMaterializedTurn({
|
|
118
|
+
key,
|
|
119
|
+
metadata: entry,
|
|
120
|
+
resolveRepositoryMemory: () => resolveCurrentHookRepositoryMemory(entry, command, options, repositoryMemorySession),
|
|
121
|
+
userText: materialized.turn.userPrompt,
|
|
122
|
+
assistantText: materialized.turn.assistantReply,
|
|
123
|
+
writeback: {
|
|
124
|
+
client: DSH_MEMORY_TURN_CLIENT,
|
|
125
|
+
sessionKey: command.sessionId,
|
|
126
|
+
env: options.env ?? process.env,
|
|
127
|
+
fetchImpl: options.fetchImpl,
|
|
128
|
+
memoryObservability: options.memoryObservability,
|
|
129
|
+
memoryObservabilitySource: "dsh_native_writeback",
|
|
130
|
+
traceContext,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
if (!writeback.scheduled) {
|
|
134
|
+
return skippedWriteback(command, writeback.reason, options, writeback.metadataDisposition);
|
|
135
|
+
}
|
|
136
|
+
options.diagnosticLogger?.("dsh_memory.writeback", {
|
|
137
|
+
scheduled: true,
|
|
138
|
+
metadataDisposition: writeback.metadataDisposition,
|
|
139
|
+
sessionId: command.sessionId,
|
|
140
|
+
turn: command.turn,
|
|
141
|
+
startSeq: command.startSeq,
|
|
142
|
+
endSeq: command.endSeq,
|
|
143
|
+
outcome: materialized.turn.outcome,
|
|
144
|
+
promptChars: materialized.turn.userPrompt.length,
|
|
145
|
+
assistantChars: materialized.turn.assistantReply.length,
|
|
146
|
+
contentSource: "dsh_session_event_interval",
|
|
147
|
+
});
|
|
148
|
+
return { ok: true, scheduled: true };
|
|
149
|
+
},
|
|
150
|
+
close() {
|
|
151
|
+
retrievalTurns.clear();
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function recordDshTurnEnd(options, traceContext, details) {
|
|
156
|
+
const eventId = traceTurnEventId(traceContext, "turn_end");
|
|
157
|
+
const recorded = await recordDshTraceBestEffort("dsh_memory.turn_end_event", recordTraceEvent({
|
|
158
|
+
eventId,
|
|
159
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
160
|
+
env: options.env,
|
|
161
|
+
traceContext,
|
|
162
|
+
type: "turn_end",
|
|
163
|
+
source: "dsh-session-event-log",
|
|
164
|
+
operation: "reply",
|
|
165
|
+
ok: true,
|
|
166
|
+
outcome: details.outcome,
|
|
167
|
+
request: {
|
|
168
|
+
start_seq: details.startSeq,
|
|
169
|
+
end_seq: details.endSeq,
|
|
170
|
+
native_outcome: details.nativeOutcome,
|
|
171
|
+
},
|
|
172
|
+
}), options.diagnosticLogger);
|
|
173
|
+
if (!recorded || (!recorded.written && recorded.reason !== "duplicate_event"))
|
|
174
|
+
return;
|
|
175
|
+
if (details.turn && eventId) {
|
|
176
|
+
await recordDshTraceBestEffort("dsh_memory.turn_materialized_event", recordTraceEvent({
|
|
177
|
+
eventId: traceTurnEventId(traceContext, "turn_materialized"),
|
|
178
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
179
|
+
env: options.env,
|
|
180
|
+
traceContext,
|
|
181
|
+
type: "turn_materialized",
|
|
182
|
+
source: "dsh-session-event-log",
|
|
183
|
+
operation: "reply",
|
|
184
|
+
ok: true,
|
|
185
|
+
outcome: details.outcome,
|
|
186
|
+
request: {
|
|
187
|
+
original_event_id: eventId,
|
|
188
|
+
start_seq: details.startSeq,
|
|
189
|
+
end_seq: details.endSeq,
|
|
190
|
+
prompt: details.turn.userPrompt,
|
|
191
|
+
},
|
|
192
|
+
response: {
|
|
193
|
+
assistantMessage: details.turn.assistantReply,
|
|
194
|
+
},
|
|
195
|
+
}), options.diagnosticLogger);
|
|
196
|
+
}
|
|
197
|
+
await recordDshTraceBestEffort("dsh_memory.current_turn_close", markCurrentTraceTurnOutcome(traceContext, details.outcome, {
|
|
198
|
+
client: "dsh",
|
|
199
|
+
memoraxCodeHome: options.memoraxCodeHome,
|
|
200
|
+
env: options.env,
|
|
201
|
+
}), options.diagnosticLogger);
|
|
202
|
+
}
|
|
203
|
+
async function recordDshTraceBestEffort(label, promise, diagnosticLogger) {
|
|
204
|
+
try {
|
|
205
|
+
return await promise;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
diagnosticLogger?.("dsh_trace.write_failed", {
|
|
209
|
+
label,
|
|
210
|
+
error: error instanceof Error ? error.message : String(error),
|
|
211
|
+
});
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function dshTurnKey(sessionId, turn) {
|
|
216
|
+
return {
|
|
217
|
+
client: DSH_MEMORY_TURN_CLIENT,
|
|
218
|
+
sessionId,
|
|
219
|
+
clientTurnId: String(turn),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
async function resolveHookRepositoryMemory(command, options, repositoryMemorySession) {
|
|
223
|
+
return await repositoryMemorySession.resolve({
|
|
224
|
+
client: DSH_MEMORY_TURN_CLIENT,
|
|
225
|
+
sessionId: command.sessionId,
|
|
226
|
+
workspaceRoot: command.cwd,
|
|
227
|
+
memoraxCodeHome: options.memoraxCodeHome ?? options.env?.MEMORAX_CODE_HOME,
|
|
228
|
+
env: options.env,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async function resolveCurrentHookRepositoryMemory(entry, command, options, repositoryMemorySession) {
|
|
232
|
+
return await repositoryMemorySession.resolve({
|
|
233
|
+
client: DSH_MEMORY_TURN_CLIENT,
|
|
234
|
+
sessionId: command.sessionId,
|
|
235
|
+
workspaceRoot: command.cwd,
|
|
236
|
+
// DSH's persisted session header and exact event interval remain native
|
|
237
|
+
// authority after a Backend restart, when the in-memory binding is gone.
|
|
238
|
+
requireBoundScope: entry !== undefined,
|
|
239
|
+
memoraxCodeHome: options.memoraxCodeHome ?? options.env?.MEMORAX_CODE_HOME,
|
|
240
|
+
env: options.env,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
function skippedWriteback(command, reason, options, metadataDisposition = "retained") {
|
|
244
|
+
options.diagnosticLogger?.("dsh_memory.writeback", {
|
|
245
|
+
scheduled: false,
|
|
246
|
+
reason,
|
|
247
|
+
metadataDisposition,
|
|
248
|
+
sessionId: command.sessionId,
|
|
249
|
+
turn: command.turn,
|
|
250
|
+
startSeq: command.startSeq,
|
|
251
|
+
endSeq: command.endSeq,
|
|
252
|
+
});
|
|
253
|
+
return { ok: true, scheduled: false, reason };
|
|
254
|
+
}
|
|
255
|
+
function positiveInteger(value, fallback) {
|
|
256
|
+
const parsed = Number(value);
|
|
257
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
258
|
+
}
|