@memorax/memorax-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/bin/memorax-cli.mjs +28 -0
- package/bin/memorax-code-backend.mjs +4 -0
- package/bin/memorax-code-claude.mjs +4 -0
- package/bin/memorax-code-codex.mjs +4 -0
- package/bin/memorax-code-npm-preinstall.mjs +55 -0
- package/bin/memorax-code-plugin-postinstall.mjs +1236 -0
- package/bin/memorax-code.mjs +204 -0
- package/docs/configuration.md +232 -0
- package/docs/troubleshooting.md +179 -0
- package/lib/client-hook-runtime.mjs +32 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-backend/dist/active-client-selection.js +35 -0
- package/lib/memorax-code-backend/dist/adapter-lifecycle-participant.js +1 -0
- package/lib/memorax-code-backend/dist/automatic-memory-retrieval.js +113 -0
- package/lib/memorax-code-backend/dist/automatic-memory-writeback.js +297 -0
- package/lib/memorax-code-backend/dist/backend-env.js +13 -0
- package/lib/memorax-code-backend/dist/backend-lifecycle-lock.js +42 -0
- package/lib/memorax-code-backend/dist/backend-process.js +147 -0
- package/lib/memorax-code-backend/dist/backend-service-cleanup.js +18 -0
- package/lib/memorax-code-backend/dist/backend-service-record.js +206 -0
- package/lib/memorax-code-backend/dist/backend-service-result.js +37 -0
- package/lib/memorax-code-backend/dist/backend-service-token.js +11 -0
- package/lib/memorax-code-backend/dist/backend-shutdown-request.js +133 -0
- package/lib/memorax-code-backend/dist/backend-state.js +58 -0
- package/lib/memorax-code-backend/dist/backend-status.js +53 -0
- package/lib/memorax-code-backend/dist/backend-token-record.js +79 -0
- package/lib/memorax-code-backend/dist/claude-adapter-lifecycle.js +134 -0
- package/lib/memorax-code-backend/dist/claude-local-transcript.js +648 -0
- package/lib/memorax-code-backend/dist/claude-memory-hook-runtime.js +472 -0
- package/lib/memorax-code-backend/dist/claude-transcript-turn.js +876 -0
- package/lib/memorax-code-backend/dist/client-plugin-removal.js +67 -0
- package/lib/memorax-code-backend/dist/client-selection.js +36 -0
- package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +131 -0
- package/lib/memorax-code-backend/dist/codex-effective-prompt.js +54 -0
- package/lib/memorax-code-backend/dist/codex-memory-hook-runtime.js +541 -0
- package/lib/memorax-code-backend/dist/codex-plugin-hooks.js +421 -0
- package/lib/memorax-code-backend/dist/codex-plugin-install.js +523 -0
- package/lib/memorax-code-backend/dist/codex-rollout-turn.js +402 -0
- package/lib/memorax-code-backend/dist/codex-session-turn-index.js +88 -0
- package/lib/memorax-code-backend/dist/codex-workspace-links.js +55 -0
- package/lib/memorax-code-backend/dist/debug-log.js +21 -0
- package/lib/memorax-code-backend/dist/entrypoint.js +14 -0
- package/lib/memorax-code-backend/dist/incremental-jsonl-projection.js +271 -0
- package/lib/memorax-code-backend/dist/install-watchdog.js +71 -0
- package/lib/memorax-code-backend/dist/jsonl-append.js +75 -0
- package/lib/memorax-code-backend/dist/memorax-adapter.js +451 -0
- package/lib/memorax-code-backend/dist/memorax-cli.js +14 -0
- package/lib/memorax-code-backend/dist/memorax-code-config.js +279 -0
- package/lib/memorax-code-backend/dist/memorax-code-lifecycle.js +523 -0
- package/lib/memorax-code-backend/dist/memorax-code.js +3 -0
- package/lib/memorax-code-backend/dist/memorax-config.js +283 -0
- package/lib/memorax-code-backend/dist/memorax-http.js +142 -0
- package/lib/memorax-code-backend/dist/memory-cli.js +345 -0
- package/lib/memorax-code-backend/dist/memory-hook-command.js +200 -0
- package/lib/memorax-code-backend/dist/memory-observability.js +1 -0
- package/lib/memorax-code-backend/dist/memory-project.js +89 -0
- package/lib/memorax-code-backend/dist/memory-reminder-trace-recorder.js +58 -0
- package/lib/memorax-code-backend/dist/memory-service.js +66 -0
- package/lib/memorax-code-backend/dist/memory-turn-coordinator.js +139 -0
- package/lib/memorax-code-backend/dist/memory-viewer-activity.js +113 -0
- package/lib/memorax-code-backend/dist/memory-viewer-data-projection-cache.js +69 -0
- package/lib/memorax-code-backend/dist/memory-viewer-event-identity.js +3 -0
- package/lib/memorax-code-backend/dist/memory-viewer-history-projection.js +79 -0
- package/lib/memorax-code-backend/dist/memory-viewer-logo.js +1 -0
- package/lib/memorax-code-backend/dist/memory-viewer-observability.js +8 -0
- package/lib/memorax-code-backend/dist/memory-viewer-redaction.js +52 -0
- package/lib/memorax-code-backend/dist/memory-viewer-session-title.js +93 -0
- package/lib/memorax-code-backend/dist/memory-viewer-store.js +964 -0
- package/lib/memorax-code-backend/dist/memory-viewer-turn-reference.js +12 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-html.js +115 -0
- package/lib/memorax-code-backend/dist/memory-viewer-user-projection.js +168 -0
- package/lib/memorax-code-backend/dist/memory-viewer-writeback-status.js +97 -0
- package/lib/memorax-code-backend/dist/memory-writeback-buffer.js +217 -0
- package/lib/memorax-code-backend/dist/memory-writeback-chunk.js +120 -0
- package/lib/memorax-code-backend/dist/memory-writeback-reconciler.js +244 -0
- package/lib/memorax-code-backend/dist/memory-writeback-task-projection.js +377 -0
- package/lib/memorax-code-backend/dist/proxy-env.js +54 -0
- package/lib/memorax-code-backend/dist/repo-memory-readiness.js +188 -0
- package/lib/memorax-code-backend/dist/repository-memory-context.js +134 -0
- package/lib/memorax-code-backend/dist/repository-memory-scope.js +490 -0
- package/lib/memorax-code-backend/dist/server-cli.js +787 -0
- package/lib/memorax-code-backend/dist/server-health.js +16 -0
- package/lib/memorax-code-backend/dist/server-http.js +110 -0
- package/lib/memorax-code-backend/dist/server-json.js +4 -0
- package/lib/memorax-code-backend/dist/server-memory-hook.js +32 -0
- package/lib/memorax-code-backend/dist/server-memory-viewer.js +135 -0
- package/lib/memorax-code-backend/dist/server-observability.js +102 -0
- package/lib/memorax-code-backend/dist/server.js +220 -0
- package/lib/memorax-code-backend/dist/service-entrypoint.js +10 -0
- package/lib/memorax-code-backend/dist/service.js +567 -0
- package/lib/memorax-code-backend/dist/trace-config.js +112 -0
- package/lib/memorax-code-backend/dist/trace-context.js +111 -0
- package/lib/memorax-code-backend/dist/trace-store.js +571 -0
- package/lib/memorax-code-backend/dist/utils.js +3 -0
- package/lib/memorax-code-backend/dist/windows-cli-invocation.js +148 -0
- package/lib/memorax-code-backend/package.json +26 -0
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-claude-marketplace/.claude-plugin/marketplace.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hooks.json +66 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +391 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +13 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/cli.mjs +363 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config.mjs +544 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +33 -0
- package/lib/memorax-code-codex-adapter/assets/composer-icon.png +0 -0
- package/lib/memorax-code-codex-adapter/assets/logo.png +0 -0
- package/lib/memorax-code-codex-adapter/hooks/hook-launcher.mjs +26 -0
- package/lib/memorax-code-codex-adapter/hooks/hooks.json +61 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-job.mjs +38 -0
- package/lib/memorax-code-codex-adapter/hooks/repo-memory-update-policy.mjs +10 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-hook.mjs +4 -0
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +5 -0
- package/lib/memorax-code-codex-adapter/package.json +13 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/capture-cwd.mjs +18 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +82 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +125 -0
- package/lib/memorax-code-codex-adapter/runtime-hooks/memory-writeback.mjs +52 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +83 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +9 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +82 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +61 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +100 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +96 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +270 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +116 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
- package/lib/memorax-code-codex-adapter/src/adapter-paths.mjs +29 -0
- package/lib/memorax-code-codex-adapter/src/cli.mjs +368 -0
- package/lib/memorax-code-codex-adapter/src/config-utils.mjs +1 -0
- package/lib/memorax-code-codex-adapter/src/config.mjs +226 -0
- package/lib/memorax-code-codex-adapter/src/session-registry.mjs +331 -0
- package/lib/memorax-code-codex-adapter/src/workspace-kind.mjs +68 -0
- package/lib/node-version.mjs +11 -0
- package/lib/npm-invocation.mjs +31 -0
- package/lib/resolve-claude-command.mjs +47 -0
- package/lib/resolve-codex-command.mjs +94 -0
- package/lib/run-entrypoint.mjs +83 -0
- package/lib/vscode-extension-command.mjs +119 -0
- package/lib/windows-cli-invocation.mjs +100 -0
- package/package.json +45 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join, resolve, sep } from "node:path";
|
|
5
|
+
import { resolveWindowsCliInvocation } from "./windows-cli-invocation.js";
|
|
6
|
+
const PLUGIN_NAME = "memorax-code-codex-adapter";
|
|
7
|
+
const CLI_MARKETPLACE_NAME = "memorax-code";
|
|
8
|
+
const APP_SERVER_OPERATION_TIMEOUT_MS = 10_000;
|
|
9
|
+
const APP_SERVER_SHUTDOWN_GRACE_MS = 500;
|
|
10
|
+
const APP_SERVER_FORCE_SHUTDOWN_GRACE_MS = 250;
|
|
11
|
+
export async function inspectCodexPluginHooks(options = {}) {
|
|
12
|
+
const context = resolveCodexPluginContext(options);
|
|
13
|
+
const hooks = await listMemoraxCodeHooks(context.codexCommand, context.workspace, context.env);
|
|
14
|
+
return {
|
|
15
|
+
ok: true,
|
|
16
|
+
action: "codex-plugin-hooks",
|
|
17
|
+
codexHome: context.codexHome,
|
|
18
|
+
codexCommand: context.codexCommand,
|
|
19
|
+
workspace: context.workspace,
|
|
20
|
+
hooks,
|
|
21
|
+
startsBackend: false,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function trustCodexPluginHooks(options = {}) {
|
|
25
|
+
if (options.previousHooks !== undefined && options.selectedHooks !== undefined) {
|
|
26
|
+
throw new Error("Codex hook trust accepts either a previous hook snapshot or an explicit selection, not both");
|
|
27
|
+
}
|
|
28
|
+
const context = resolveCodexPluginContext(options);
|
|
29
|
+
const currentHooks = await listMemoraxCodeHooks(context.codexCommand, context.workspace, context.env);
|
|
30
|
+
const configPath = join(context.codexHome, "config.toml");
|
|
31
|
+
const requiresFullReview = options.previousHooks !== undefined
|
|
32
|
+
&& hookMarketplaceIdentityChanged(options.previousHooks, currentHooks);
|
|
33
|
+
const hooks = requiresFullReview ? [] : hooksRequiringTrust(currentHooks, options);
|
|
34
|
+
if (!options.check && hooks.length > 0) {
|
|
35
|
+
if (!options.yes)
|
|
36
|
+
await confirmHookTrust(hooks);
|
|
37
|
+
await trustHookSelectionWithContext(context, hooks);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
ok: true,
|
|
41
|
+
action: "codex-plugin-trust-hooks",
|
|
42
|
+
codexHome: context.codexHome,
|
|
43
|
+
codexCommand: context.codexCommand,
|
|
44
|
+
workspace: context.workspace,
|
|
45
|
+
hooks,
|
|
46
|
+
trustedHooks: options.check ? 0 : hooks.length,
|
|
47
|
+
configPath,
|
|
48
|
+
checkedOnly: options.check === true,
|
|
49
|
+
requiresFullReview,
|
|
50
|
+
startsBackend: false,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function trustCodexPluginHookSelection(options) {
|
|
54
|
+
if (options.hooks.length === 0)
|
|
55
|
+
return;
|
|
56
|
+
const context = resolveCodexPluginContext(options);
|
|
57
|
+
await trustHookSelectionWithContext(context, options.hooks);
|
|
58
|
+
}
|
|
59
|
+
export async function listMemoraxCodeHooks(command, workspace, env) {
|
|
60
|
+
return await withCodexAppServer(command, workspace, env, async (client) => {
|
|
61
|
+
return await listMemoraxCodeHooksFromClient(client, workspace);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export async function confirmHookTrust(hooks) {
|
|
65
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
66
|
+
throw new Error("refusing to trust Codex plugin hooks without an interactive terminal; rerun with --yes after reviewing the hooks");
|
|
67
|
+
}
|
|
68
|
+
console.log("MemoraX Code will trust the following Codex plugin hooks:");
|
|
69
|
+
for (const hook of hooks) {
|
|
70
|
+
console.log(` - ${hook.key}${hook.statusMessage ? ` (${hook.statusMessage})` : ""}`);
|
|
71
|
+
if (hook.eventName)
|
|
72
|
+
console.log(` event: ${hook.eventName}`);
|
|
73
|
+
if (hook.command)
|
|
74
|
+
console.log(` command: ${hook.command}`);
|
|
75
|
+
}
|
|
76
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
77
|
+
try {
|
|
78
|
+
const answer = (await rl.question("Trust these hooks? [y/N] ")).trim().toLowerCase();
|
|
79
|
+
if (answer !== "y" && answer !== "yes")
|
|
80
|
+
throw new Error("hook trust declined");
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
rl.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function resolveCodexPluginContext(options) {
|
|
87
|
+
const home = resolveHome(options.homeDir);
|
|
88
|
+
const codexHome = resolveCodexHome(options.codexHome, home);
|
|
89
|
+
return {
|
|
90
|
+
codexHome,
|
|
91
|
+
codexCommand: options.codexCommand ?? process.env.CODEX_CLI_PATH ?? "codex",
|
|
92
|
+
workspace: resolve(options.workspace ?? process.cwd()),
|
|
93
|
+
env: {
|
|
94
|
+
...process.env,
|
|
95
|
+
HOME: home,
|
|
96
|
+
CODEX_HOME: codexHome,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function trustHookSelectionWithContext(context, selectedHooks) {
|
|
101
|
+
await withCodexAppServer(context.codexCommand, context.workspace, context.env, async (client) => {
|
|
102
|
+
const currentHooks = await listMemoraxCodeHooksFromClient(client, context.workspace);
|
|
103
|
+
const reviewedHooks = exactCurrentHookSelection(currentHooks, selectedHooks);
|
|
104
|
+
const userLayer = await readCodexUserConfigLayer(client, context.workspace);
|
|
105
|
+
const edits = reviewedHooks
|
|
106
|
+
.filter(hookNeedsReview)
|
|
107
|
+
.map((hook) => ({
|
|
108
|
+
keyPath: `hooks.state.${tomlQuotedKey(hook.key)}.trusted_hash`,
|
|
109
|
+
value: hook.currentHash,
|
|
110
|
+
mergeStrategy: "upsert",
|
|
111
|
+
}));
|
|
112
|
+
if (edits.length > 0) {
|
|
113
|
+
const result = await requestResult(client, "config/batchWrite", {
|
|
114
|
+
edits,
|
|
115
|
+
filePath: userLayer.filePath,
|
|
116
|
+
expectedVersion: userLayer.version,
|
|
117
|
+
reloadUserConfig: true,
|
|
118
|
+
});
|
|
119
|
+
if ((result.status !== "ok" && result.status !== "okOverridden")
|
|
120
|
+
|| typeof result.version !== "string"
|
|
121
|
+
|| typeof result.filePath !== "string") {
|
|
122
|
+
throw new Error("Codex config/batchWrite returned an invalid response");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const verifiedHooks = await listMemoraxCodeHooksFromClient(client, context.workspace);
|
|
126
|
+
verifyTrustedHookSelection(verifiedHooks, reviewedHooks);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function exactCurrentHookSelection(currentHooks, selectedHooks) {
|
|
130
|
+
const currentByKey = new Map(currentHooks.map((hook) => [hook.key, hook]));
|
|
131
|
+
const selectedKeys = new Set();
|
|
132
|
+
return selectedHooks.map((expected) => {
|
|
133
|
+
if (selectedKeys.has(expected.key))
|
|
134
|
+
throw new Error(`duplicate Codex hook trust selection: ${expected.key}`);
|
|
135
|
+
selectedKeys.add(expected.key);
|
|
136
|
+
const current = currentByKey.get(expected.key);
|
|
137
|
+
if (!current || current.currentHash !== expected.currentHash) {
|
|
138
|
+
throw new Error(`Codex hook changed after review: ${expected.key}`);
|
|
139
|
+
}
|
|
140
|
+
return current;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function verifyTrustedHookSelection(currentHooks, selectedHooks) {
|
|
144
|
+
const currentByKey = new Map(currentHooks.map((hook) => [hook.key, hook]));
|
|
145
|
+
for (const expected of selectedHooks) {
|
|
146
|
+
const current = currentByKey.get(expected.key);
|
|
147
|
+
if (!current || current.currentHash !== expected.currentHash || hookNeedsReview(current)) {
|
|
148
|
+
throw new Error(`Codex hook trust could not be verified: ${expected.key}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function readCodexUserConfigLayer(client, workspace) {
|
|
153
|
+
const result = await requestResult(client, "config/read", { includeLayers: true, cwd: workspace });
|
|
154
|
+
if (!Array.isArray(result.layers))
|
|
155
|
+
throw new Error("Codex config/read did not return config layers");
|
|
156
|
+
const userLayers = result.layers.flatMap((layer) => {
|
|
157
|
+
if (!isRecord(layer) || !isRecord(layer.name) || layer.name.type !== "user")
|
|
158
|
+
return [];
|
|
159
|
+
if (!("profile" in layer.name)
|
|
160
|
+
|| (layer.name.profile !== null && typeof layer.name.profile !== "string")) {
|
|
161
|
+
throw new Error("Codex config/read returned an invalid user config layer");
|
|
162
|
+
}
|
|
163
|
+
if (layer.name.profile !== null)
|
|
164
|
+
return [];
|
|
165
|
+
if (typeof layer.name.file !== "string"
|
|
166
|
+
|| typeof layer.version !== "string"
|
|
167
|
+
|| !isRecord(layer.config)) {
|
|
168
|
+
throw new Error("Codex config/read returned an invalid base user config layer");
|
|
169
|
+
}
|
|
170
|
+
return [{ filePath: layer.name.file, version: layer.version, config: layer.config }];
|
|
171
|
+
});
|
|
172
|
+
if (userLayers.length !== 1) {
|
|
173
|
+
throw new Error(`Codex config/read returned ${userLayers.length} base user config layers; expected exactly one`);
|
|
174
|
+
}
|
|
175
|
+
return userLayers[0];
|
|
176
|
+
}
|
|
177
|
+
async function listMemoraxCodeHooksFromClient(client, workspace) {
|
|
178
|
+
const result = await requestResult(client, "hooks/list", { cwds: [workspace] });
|
|
179
|
+
if (!Array.isArray(result.data))
|
|
180
|
+
throw new Error("Codex hooks/list returned an invalid result.data payload");
|
|
181
|
+
const hooks = [];
|
|
182
|
+
const seenKeys = new Set();
|
|
183
|
+
for (const entry of result.data) {
|
|
184
|
+
if (!isRecord(entry) || !Array.isArray(entry.hooks)) {
|
|
185
|
+
throw new Error("Codex hooks/list returned an invalid workspace entry");
|
|
186
|
+
}
|
|
187
|
+
if (entry.errors !== undefined && !Array.isArray(entry.errors)) {
|
|
188
|
+
throw new Error("Codex hooks/list returned invalid discovery errors");
|
|
189
|
+
}
|
|
190
|
+
if (Array.isArray(entry.errors) && entry.errors.length > 0) {
|
|
191
|
+
throw new Error("Codex hooks/list reported hook discovery errors");
|
|
192
|
+
}
|
|
193
|
+
for (const value of entry.hooks) {
|
|
194
|
+
if (!isRecord(value) || (typeof value.pluginId !== "string" && value.pluginId !== null)) {
|
|
195
|
+
throw new Error("Codex hooks/list returned invalid hook metadata");
|
|
196
|
+
}
|
|
197
|
+
const memoraxCodePlugin = value.pluginId === `${PLUGIN_NAME}@${CLI_MARKETPLACE_NAME}`;
|
|
198
|
+
const memoraxCodeKey = typeof value.key === "string"
|
|
199
|
+
&& value.key.startsWith(`${PLUGIN_NAME}@${CLI_MARKETPLACE_NAME}:`);
|
|
200
|
+
if (!memoraxCodePlugin) {
|
|
201
|
+
if (memoraxCodeKey)
|
|
202
|
+
throw new Error("Codex hooks/list returned a mismatched MemoraX Code hook identity");
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (typeof value.pluginId !== "string"
|
|
206
|
+
|| typeof value.key !== "string"
|
|
207
|
+
|| typeof value.currentHash !== "string"
|
|
208
|
+
|| value.handlerType !== "command"
|
|
209
|
+
|| typeof value.eventName !== "string"
|
|
210
|
+
|| value.eventName.length === 0
|
|
211
|
+
|| typeof value.command !== "string"
|
|
212
|
+
|| value.command.length === 0
|
|
213
|
+
|| !isHookTrustStatus(value.trustStatus)) {
|
|
214
|
+
throw new Error("Codex hooks/list returned incomplete MemoraX Code hook metadata");
|
|
215
|
+
}
|
|
216
|
+
if (seenKeys.has(value.key))
|
|
217
|
+
throw new Error(`Codex hooks/list returned duplicate Hook key: ${value.key}`);
|
|
218
|
+
seenKeys.add(value.key);
|
|
219
|
+
hooks.push({
|
|
220
|
+
key: value.key,
|
|
221
|
+
currentHash: value.currentHash,
|
|
222
|
+
pluginId: value.pluginId,
|
|
223
|
+
handlerType: value.handlerType,
|
|
224
|
+
eventName: value.eventName,
|
|
225
|
+
command: value.command,
|
|
226
|
+
...(typeof value.statusMessage === "string" ? { statusMessage: value.statusMessage } : {}),
|
|
227
|
+
trustStatus: value.trustStatus,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return hooks;
|
|
232
|
+
}
|
|
233
|
+
async function withCodexAppServer(command, workspace, env, operation) {
|
|
234
|
+
const invocation = resolveWindowsCliInvocation(command, ["app-server", "--stdio"], { env });
|
|
235
|
+
const child = spawn(invocation.command, invocation.args, {
|
|
236
|
+
cwd: workspace,
|
|
237
|
+
env,
|
|
238
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
239
|
+
});
|
|
240
|
+
let stderr = "";
|
|
241
|
+
let nextRequestId = 0;
|
|
242
|
+
let closing = false;
|
|
243
|
+
let terminalError;
|
|
244
|
+
child.stderr.on("data", (chunk) => {
|
|
245
|
+
stderr = `${stderr}${String(chunk)}`.slice(-16_384);
|
|
246
|
+
});
|
|
247
|
+
const lines = createInterface({ input: child.stdout });
|
|
248
|
+
const pending = new Map();
|
|
249
|
+
const rejectPending = (error) => {
|
|
250
|
+
terminalError ??= error;
|
|
251
|
+
for (const request of pending.values())
|
|
252
|
+
request.reject(error);
|
|
253
|
+
pending.clear();
|
|
254
|
+
};
|
|
255
|
+
child.stdin.on("error", (error) => {
|
|
256
|
+
if (!closing)
|
|
257
|
+
rejectPending(error);
|
|
258
|
+
});
|
|
259
|
+
const childExited = new Promise((resolveExited) => {
|
|
260
|
+
child.once("error", (error) => {
|
|
261
|
+
if (!closing)
|
|
262
|
+
rejectPending(error);
|
|
263
|
+
resolveExited();
|
|
264
|
+
});
|
|
265
|
+
child.once("exit", () => resolveExited());
|
|
266
|
+
child.once("close", () => {
|
|
267
|
+
if (!closing)
|
|
268
|
+
rejectPending(new Error(stderr || "Codex app-server exited before completing the request"));
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
const reader = (async () => {
|
|
272
|
+
for await (const line of lines) {
|
|
273
|
+
let parsed;
|
|
274
|
+
try {
|
|
275
|
+
parsed = JSON.parse(line);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
if (!isRecord(parsed) || (typeof parsed.id !== "string" && typeof parsed.id !== "number"))
|
|
281
|
+
continue;
|
|
282
|
+
const id = String(parsed.id);
|
|
283
|
+
const request = pending.get(id);
|
|
284
|
+
if (!request)
|
|
285
|
+
continue;
|
|
286
|
+
pending.delete(id);
|
|
287
|
+
request.resolve(parsed);
|
|
288
|
+
}
|
|
289
|
+
})().catch((error) => {
|
|
290
|
+
if (!closing)
|
|
291
|
+
rejectPending(error instanceof Error ? error : new Error(String(error)));
|
|
292
|
+
});
|
|
293
|
+
const client = {
|
|
294
|
+
request(method, params) {
|
|
295
|
+
if (terminalError)
|
|
296
|
+
return Promise.reject(terminalError);
|
|
297
|
+
return new Promise((resolveMessage, reject) => {
|
|
298
|
+
const id = String(++nextRequestId);
|
|
299
|
+
pending.set(id, { resolve: resolveMessage, reject });
|
|
300
|
+
child.stdin.write(`${JSON.stringify({ id, method, params })}\n`, (error) => {
|
|
301
|
+
if (!error)
|
|
302
|
+
return;
|
|
303
|
+
pending.delete(id);
|
|
304
|
+
reject(error);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
const timeout = setTimeout(() => {
|
|
310
|
+
rejectPending(new Error("timed out while communicating with Codex app-server"));
|
|
311
|
+
child.kill("SIGTERM");
|
|
312
|
+
}, APP_SERVER_OPERATION_TIMEOUT_MS);
|
|
313
|
+
try {
|
|
314
|
+
await requestResult(client, "initialize", {
|
|
315
|
+
clientInfo: { name: "memorax-code-codex-plugin-hooks", version: "0" },
|
|
316
|
+
});
|
|
317
|
+
return await operation(client);
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
clearTimeout(timeout);
|
|
321
|
+
closing = true;
|
|
322
|
+
rejectPending(new Error("Codex app-server request was closed"));
|
|
323
|
+
await closeCodexAppServer(child, lines, reader, childExited);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async function requestResult(client, method, params) {
|
|
327
|
+
const response = await client.request(method, params);
|
|
328
|
+
if (isRecord(response.error)) {
|
|
329
|
+
throw new Error(String(response.error.message ?? `${method} failed`));
|
|
330
|
+
}
|
|
331
|
+
if (!isRecord(response.result))
|
|
332
|
+
throw new Error(`Codex ${method} returned an invalid response`);
|
|
333
|
+
return response.result;
|
|
334
|
+
}
|
|
335
|
+
async function closeCodexAppServer(child, lines, reader, childExited) {
|
|
336
|
+
lines.close();
|
|
337
|
+
child.stdin.end();
|
|
338
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
339
|
+
child.kill("SIGTERM");
|
|
340
|
+
if (!await settlesWithin(childExited, APP_SERVER_SHUTDOWN_GRACE_MS)) {
|
|
341
|
+
child.kill("SIGKILL");
|
|
342
|
+
child.stdin.destroy();
|
|
343
|
+
child.stdout.destroy();
|
|
344
|
+
child.stderr.destroy();
|
|
345
|
+
if (!await settlesWithin(childExited, APP_SERVER_FORCE_SHUTDOWN_GRACE_MS))
|
|
346
|
+
child.unref();
|
|
347
|
+
}
|
|
348
|
+
child.stdin.destroy();
|
|
349
|
+
child.stdout.destroy();
|
|
350
|
+
child.stderr.destroy();
|
|
351
|
+
await settlesWithin(reader, APP_SERVER_FORCE_SHUTDOWN_GRACE_MS);
|
|
352
|
+
}
|
|
353
|
+
async function settlesWithin(promise, timeoutMs) {
|
|
354
|
+
let timer;
|
|
355
|
+
try {
|
|
356
|
+
return await Promise.race([
|
|
357
|
+
promise.then(() => true, () => true),
|
|
358
|
+
new Promise((resolveTimeout) => {
|
|
359
|
+
timer = setTimeout(() => resolveTimeout(false), timeoutMs);
|
|
360
|
+
}),
|
|
361
|
+
]);
|
|
362
|
+
}
|
|
363
|
+
finally {
|
|
364
|
+
if (timer)
|
|
365
|
+
clearTimeout(timer);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function hooksRequiringTrust(currentHooks, options) {
|
|
369
|
+
if (options.selectedHooks !== undefined) {
|
|
370
|
+
return exactCurrentHookSelection(currentHooks, options.selectedHooks)
|
|
371
|
+
.filter(hookNeedsReview);
|
|
372
|
+
}
|
|
373
|
+
if (options.previousHooks !== undefined) {
|
|
374
|
+
const previousByKey = new Map(options.previousHooks.map((hook) => [hook.key, hook.currentHash]));
|
|
375
|
+
return currentHooks.filter((hook) => hookNeedsReview(hook)
|
|
376
|
+
&& previousByKey.get(hook.key) !== hook.currentHash);
|
|
377
|
+
}
|
|
378
|
+
return currentHooks.filter(hookNeedsReview);
|
|
379
|
+
}
|
|
380
|
+
function hookNeedsReview(hook) {
|
|
381
|
+
return hook.trustStatus === "untrusted" || hook.trustStatus === "modified";
|
|
382
|
+
}
|
|
383
|
+
function isHookTrustStatus(value) {
|
|
384
|
+
return value === "managed" || value === "untrusted" || value === "trusted" || value === "modified";
|
|
385
|
+
}
|
|
386
|
+
function hookMarketplaceIdentityChanged(previousHooks, currentHooks) {
|
|
387
|
+
if (previousHooks.length === 0 || currentHooks.length === 0)
|
|
388
|
+
return false;
|
|
389
|
+
const previous = new Set(previousHooks.map(hookPluginIdentity));
|
|
390
|
+
const current = new Set(currentHooks.map(hookPluginIdentity));
|
|
391
|
+
return previous.size !== current.size || [...previous].some((identity) => !current.has(identity));
|
|
392
|
+
}
|
|
393
|
+
function hookPluginIdentity(hook) {
|
|
394
|
+
return hook.pluginId ?? hook.key.split(":", 1)[0] ?? "";
|
|
395
|
+
}
|
|
396
|
+
function resolveHome(value) {
|
|
397
|
+
return resolve(expandHome(nonEmpty(value) ?? process.env.HOME ?? homedir(), homedir()));
|
|
398
|
+
}
|
|
399
|
+
function resolveCodexHome(value, home) {
|
|
400
|
+
const configured = nonEmpty(value) ?? nonEmpty(process.env.CODEX_HOME);
|
|
401
|
+
return resolve(expandHome(configured ?? join(home, ".codex"), home));
|
|
402
|
+
}
|
|
403
|
+
function expandHome(value, home) {
|
|
404
|
+
if (value === "~")
|
|
405
|
+
return home;
|
|
406
|
+
if (value.startsWith(`~${sep}`) || value.startsWith("~/"))
|
|
407
|
+
return join(home, value.slice(2));
|
|
408
|
+
return value;
|
|
409
|
+
}
|
|
410
|
+
function nonEmpty(value) {
|
|
411
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
412
|
+
}
|
|
413
|
+
function tomlString(value) {
|
|
414
|
+
return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
415
|
+
}
|
|
416
|
+
function tomlQuotedKey(value) {
|
|
417
|
+
return `"${tomlString(value)}"`;
|
|
418
|
+
}
|
|
419
|
+
function isRecord(value) {
|
|
420
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
421
|
+
}
|