@memorax/memorax-code 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -12
- package/bin/memorax-code-npm-preinstall.mjs +7 -2
- package/bin/memorax-code-opencode.mjs +4 -0
- package/bin/memorax-code-plugin-postinstall.mjs +342 -93
- package/docs/configuration.md +148 -35
- package/docs/troubleshooting.md +73 -13
- package/lib/dsh-plugin-install.mjs +22 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-backend/dist/app/backend-server.js +210 -0
- package/lib/memorax-code-backend/dist/{server-observability.js → app/memory-observability.js} +4 -4
- package/lib/memorax-code-backend/dist/{backend-state.js → app/state.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-adapter-lifecycle.js → clients/claude/lifecycle.js} +2 -2
- package/lib/memorax-code-backend/dist/{claude-memory-hook-runtime.js → clients/claude/memory-hook-runtime.js} +7 -7
- package/lib/memorax-code-backend/dist/clients/codex/lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/{codex-memory-hook-runtime.js → clients/codex/memory-hook-runtime.js} +9 -9
- package/lib/memorax-code-backend/dist/{codex-plugin-hooks.js → clients/codex/plugin-hooks.js} +1 -1
- package/lib/memorax-code-backend/dist/{codex-plugin-install.js → clients/codex/plugin-install.js} +6 -6
- package/lib/memorax-code-backend/dist/clients/dsh/lifecycle.js +75 -0
- package/lib/memorax-code-backend/dist/clients/dsh/memory-hook-runtime.js +258 -0
- package/lib/memorax-code-backend/dist/clients/dsh/session-turn.js +249 -0
- package/lib/memorax-code-backend/dist/clients/opencode/lifecycle.js +54 -0
- package/lib/memorax-code-backend/dist/clients/opencode/memory-hook-runtime.js +277 -0
- package/lib/memorax-code-backend/dist/clients/opencode/message-turn.js +78 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +1 -131
- package/lib/memorax-code-backend/dist/{memorax-code-config.js → config/memorax-code.js} +32 -4
- package/lib/memorax-code-backend/dist/{server-cli.js → entrypoints/backend-cli.js} +137 -37
- package/lib/memorax-code-backend/dist/jsonl-append.js +1 -75
- package/lib/memorax-code-backend/dist/{active-client-selection.js → lifecycle/active-clients.js} +12 -1
- package/lib/memorax-code-backend/dist/{backend-service-cleanup.js → lifecycle/backend/cleanup.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-record.js → lifecycle/backend/record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-result.js → lifecycle/backend/result.js} +2 -2
- package/lib/memorax-code-backend/dist/{service.js → lifecycle/backend/service.js} +16 -16
- package/lib/memorax-code-backend/dist/{backend-token-record.js → lifecycle/backend/token-record.js} +1 -1
- package/lib/memorax-code-backend/dist/{backend-service-token.js → lifecycle/backend/token.js} +2 -2
- package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +109 -0
- package/lib/memorax-code-backend/dist/{client-selection.js → lifecycle/client-selection.js} +11 -5
- package/lib/memorax-code-backend/dist/{backend-lifecycle-lock.js → lifecycle/lock.js} +1 -1
- package/lib/memorax-code-backend/dist/{memorax-code-lifecycle.js → lifecycle/orchestrator.js} +325 -39
- package/lib/memorax-code-backend/dist/memorax-cli.js +1 -1
- package/lib/memorax-code-backend/dist/memorax-code.js +1 -1
- package/lib/memorax-code-backend/dist/{automatic-memory-retrieval.js → memory/automatic-retrieval.js} +3 -3
- package/lib/memorax-code-backend/dist/{automatic-memory-writeback.js → memory/automatic-writeback.js} +75 -21
- package/lib/memorax-code-backend/dist/{memory-cli.js → memory/cli.js} +23 -10
- package/lib/memorax-code-backend/dist/{memory-hook-command.js → memory/hook-command.js} +156 -9
- package/lib/memorax-code-backend/dist/memory/observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory/payload-redaction.js +212 -0
- package/lib/memorax-code-backend/dist/{memory-reminder-trace-recorder.js → memory/reminder-trace-recorder.js} +20 -7
- package/lib/memorax-code-backend/dist/{repository-memory-context.js → memory/repository-session.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-service.js → memory/service.js} +27 -5
- package/lib/memorax-code-backend/dist/{memory-turn-coordinator.js → memory/turn-coordinator.js} +2 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-buffer.js → memory/writeback-buffer.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-writeback-chunk.js → memory/writeback-chunk.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-writeback-reconciler.js → memory/writeback-reconciler.js} +6 -6
- package/lib/memorax-code-backend/dist/{memory-writeback-task-projection.js → memory/writeback-task-projection.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-adapter.js → provider/memorax/adapter.js} +5 -5
- package/lib/memorax-code-backend/dist/{memorax-config.js → provider/memorax/config.js} +4 -4
- package/lib/memorax-code-backend/dist/{memorax-http.js → provider/memorax/http.js} +1 -1
- package/lib/memorax-code-backend/dist/{repo-memory-readiness.js → repository/readiness.js} +3 -3
- package/lib/memorax-code-backend/dist/server.js +3 -212
- package/lib/memorax-code-backend/dist/service-entrypoint.js +1 -1
- package/lib/memorax-code-backend/dist/{debug-log.js → shared/debug-log.js} +1 -1
- package/lib/memorax-code-backend/dist/shared/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/dist/{trace-config.js → trace/config.js} +43 -5
- package/lib/memorax-code-backend/dist/{trace-context.js → trace/context.js} +53 -2
- package/lib/memorax-code-backend/dist/{trace-store.js → trace/store.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-health.js → transport/http/health.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-hook.js → transport/http/memory-hook.js} +3 -3
- package/lib/memorax-code-backend/dist/{server-http.js → transport/http/request.js} +1 -1
- package/lib/memorax-code-backend/dist/{claude-local-transcript.js → viewer/history/claude-transcript.js} +3 -3
- package/lib/memorax-code-backend/dist/{memory-viewer-session-title.js → viewer/history/session-title.js} +1 -1
- package/lib/memorax-code-backend/dist/{server-memory-viewer.js → viewer/http/public-routes.js} +15 -15
- package/lib/memorax-code-backend/dist/viewer/model.js +1 -0
- package/lib/memorax-code-backend/dist/{memory-viewer-activity.js → viewer/projection/activity.js} +2 -2
- package/lib/memorax-code-backend/dist/{memory-viewer-history-projection.js → viewer/projection/history.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-observability.js → viewer/projection/observability.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-user-projection.js → viewer/projection/user.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-writeback-status.js → viewer/projection/writeback-status.js} +1 -1
- package/lib/memorax-code-backend/dist/{memory-viewer-store.js → viewer/store.js} +59 -32
- package/lib/memorax-code-backend/dist/{memory-viewer-user-html.js → viewer/ui/user-html.js} +11 -10
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +1 -148
- package/lib/memorax-code-backend/package.json +3 -3
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +21 -14
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +26 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +86 -95
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-policy.mjs +58 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-auto-build.mjs +2 -2
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +13 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +1 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-codex-adapter/package.json +1 -1
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +10 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +11 -2
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +8 -5
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +37 -9
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +1 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +33 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +62 -13
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +11 -4
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +179 -59
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +18 -7
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +122 -39
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +73 -10
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +9 -1
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +23 -1
- package/lib/memorax-code-dsh-adapter/cordis.patch.yml +10 -0
- package/lib/memorax-code-dsh-adapter/hooks/repo-memory-job.mjs +68 -0
- package/lib/memorax-code-dsh-adapter/package.json +69 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-dsh-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-dsh-adapter/src/backend-client.mjs +119 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-message.mjs +32 -0
- package/lib/memorax-code-dsh-adapter/src/dsh-version.mjs +18 -0
- package/lib/memorax-code-dsh-adapter/src/http-client.mjs +55 -0
- package/lib/memorax-code-dsh-adapter/src/index.mjs +72 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context-worker.mjs +48 -0
- package/lib/memorax-code-dsh-adapter/src/personal-context.mjs +114 -0
- package/lib/memorax-code-dsh-adapter/src/plugin.mjs +724 -0
- package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1358 -0
- package/lib/memorax-code-dsh-adapter/src/protocol.mjs +145 -0
- package/lib/memorax-code-dsh-adapter/src/runtime-state.mjs +132 -0
- package/lib/memorax-code-opencode-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/package.json +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/SKILL.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-add.md +86 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/memorax-search.md +91 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-opencode-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-opencode-adapter/src/adapter-paths.mjs +37 -0
- package/lib/memorax-code-opencode-adapter/src/cli.mjs +260 -0
- package/lib/memorax-code-opencode-adapter/src/diagnostics.mjs +31 -0
- package/lib/memorax-code-opencode-adapter/src/plugin-install.mjs +673 -0
- package/lib/memorax-code-opencode-adapter/src/plugin.mjs +539 -0
- package/lib/memorax-code-opencode-adapter/src/repo-memory-server-runner.mjs +442 -0
- package/lib/run-entrypoint.mjs +6 -0
- package/package.json +7 -3
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +0 -67
- /package/lib/memorax-code-backend/dist/{claude-transcript-turn.js → clients/claude/transcript-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-effective-prompt.js → clients/codex/effective-prompt.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-rollout-turn.js → clients/codex/rollout-turn.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-session-turn-index.js → clients/codex/session-turn-index.js} +0 -0
- /package/lib/memorax-code-backend/dist/{codex-workspace-links.js → clients/codex/workspace-links.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-env.js → config/backend-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{proxy-env.js → config/proxy-env.js} +0 -0
- /package/lib/memorax-code-backend/dist/{entrypoint.js → entrypoints/main.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-process.js → lifecycle/backend/process.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-shutdown-request.js → lifecycle/backend/shutdown-request.js} +0 -0
- /package/lib/memorax-code-backend/dist/{backend-status.js → lifecycle/backend/status.js} +0 -0
- /package/lib/memorax-code-backend/dist/{adapter-lifecycle-participant.js → lifecycle/contracts.js} +0 -0
- /package/lib/memorax-code-backend/dist/{install-watchdog.js → lifecycle/install-watchdog.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-observability.js → lifecycle/participant.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-project.js → memory/project.js} +0 -0
- /package/lib/memorax-code-backend/dist/{repository-memory-scope.js → repository/scope.js} +0 -0
- /package/lib/memorax-code-backend/dist/{incremental-jsonl-projection.js → shared/incremental-jsonl-projection.js} +0 -0
- /package/lib/memorax-code-backend/dist/{utils.js → shared/record.js} +0 -0
- /package/lib/memorax-code-backend/dist/{server-json.js → transport/http/json.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-data-projection-cache.js → viewer/projection/cache.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-event-identity.js → viewer/projection/event-identity.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-redaction.js → viewer/projection/redaction.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-turn-reference.js → viewer/projection/turn-reference.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-icon.js → viewer/ui/icon.js} +0 -0
- /package/lib/memorax-code-backend/dist/{memory-viewer-logo.js → viewer/ui/logo.js} +0 -0
|
@@ -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, resolvedRepoMemoryWorktree, } 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());
|
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
|
+
}
|