@fusengine/harness 0.1.89 → 0.1.91
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/dist/adapters/claude/index.d.mts +1 -1
- package/dist/adapters/claude/index.mjs +1 -1
- package/dist/adapters/cline/index.mjs +1 -1
- package/dist/adapters/codex/index.d.mts +2 -2
- package/dist/adapters/codex/index.mjs +5 -4
- package/dist/adapters/cursor/index.d.mts +15 -28
- package/dist/adapters/cursor/index.mjs +35 -46
- package/dist/adapters/gemini/index.mjs +1 -1
- package/dist/adapters/hermes/index.d.mts +1 -1
- package/dist/adapters/hermes/index.mjs +1 -1
- package/dist/adapters/kimi/index.d.mts +1 -1
- package/dist/adapters/kimi/index.mjs +1 -1
- package/dist/{claude-5bC8TDAz.mjs → claude-Ckv2_TgP.mjs} +3 -43
- package/dist/cli/bin.mjs +429 -16
- package/dist/cli/index.mjs +1 -1
- package/dist/command-string-CALMTnwN.mjs +42 -0
- package/dist/{evaluate-C1VSI5pb.mjs → evaluate-CMiIqHeH.mjs} +261 -13
- package/dist/{handle-DHhukRdh.mjs → handle-C43gA-Pr.mjs} +737 -150
- package/dist/{hermes-kP6NUQlG.mjs → hermes-B9-p_3IF.mjs} +3 -2
- package/dist/{index-DBgnIZn9.d.mts → index-B8PG82su.d.mts} +1 -1
- package/dist/{index-D4C2-IIc.d.mts → index-SmKYkk2N.d.mts} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/init/index.d.mts +1 -1
- package/dist/init/index.mjs +1 -1
- package/dist/{kimi-D6X7b8wF.mjs → kimi-G2wcSh5-.mjs} +3 -2
- package/dist/normalize-BjG6unTj.mjs +317 -0
- package/dist/permission-mode-B-SFyR0X.mjs +226 -0
- package/dist/policy/index.d.mts +1 -1
- package/dist/policy/index.mjs +2 -2
- package/dist/prompt/index.d.mts +1 -1
- package/dist/{run-CdIlUtjv.mjs → run-DkrzC0gb.mjs} +1 -1
- package/dist/{run-TAXNRSpD.mjs → run-GHAMqcOn.mjs} +26 -3
- package/dist/runtime/index.d.mts +27 -16
- package/dist/runtime/index.mjs +2 -2
- package/dist/{types-C0-igRKr.d.mts → types-Bh0jEF3_.d.mts} +2 -0
- package/dist/{validate-DZFtAbLP.mjs → validate-KjZ1X9tH.mjs} +1 -1
- package/package.json +3 -2
- package/src/adapters/claude/index.ts +92 -0
- package/src/adapters/cline/index.ts +36 -0
- package/src/adapters/codex/apply-patch.ts +94 -0
- package/src/adapters/codex/index.ts +84 -0
- package/src/adapters/codex/permission-mode.ts +16 -0
- package/src/adapters/cursor/context.ts +46 -0
- package/src/adapters/cursor/events.ts +38 -0
- package/src/adapters/cursor/index.ts +43 -0
- package/src/adapters/cursor/interfaces/types.ts +88 -0
- package/src/adapters/cursor/native-response.ts +158 -0
- package/src/adapters/cursor/normalize.ts +123 -0
- package/src/adapters/cursor/respond.ts +123 -0
- package/src/adapters/gemini/index.ts +36 -0
- package/src/adapters/hermes/index.ts +55 -0
- package/src/adapters/hermes/interfaces/types.ts +26 -0
- package/src/adapters/kimi/index.ts +96 -0
- package/src/adapters/kimi/interfaces/types.ts +55 -0
- package/src/cache/compact.ts +55 -0
- package/src/cache/index.ts +5 -0
- package/src/cache/io.ts +38 -0
- package/src/cache/mcp-response.ts +39 -0
- package/src/cache/mcp-store.ts +70 -0
- package/src/cache/store.ts +93 -0
- package/src/changelog/fetch.ts +79 -0
- package/src/cli/bin.ts +100 -0
- package/src/cli/cursor-event-scanner.ts +175 -0
- package/src/cli/cursor-stdin-reader.ts +65 -0
- package/src/cli/doctor.ts +96 -0
- package/src/cli/hook-io.ts +130 -0
- package/src/cli/hook-sound.ts +49 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/json-primitive-scanner.ts +83 -0
- package/src/cli/run.ts +36 -0
- package/src/cli/scope.ts +31 -0
- package/src/codex-rules/build.ts +63 -0
- package/src/codex-rules/index.ts +8 -0
- package/src/codex-rules/mapping.ts +42 -0
- package/src/codex-rules/rules/absolute-paths.ts +52 -0
- package/src/codex-rules/rules/ask.ts +44 -0
- package/src/codex-rules/rules/chmod-ask.ts +57 -0
- package/src/codex-rules/rules/dd.ts +23 -0
- package/src/codex-rules/rules/diskutil.ts +33 -0
- package/src/codex-rules/rules/mkfs.ts +42 -0
- package/src/codex-rules/rules/privilege.ts +49 -0
- package/src/codex-rules/rules/remote-fetch.ts +31 -0
- package/src/codex-rules/rules/rm-variants.ts +58 -0
- package/src/codex-rules/rules/single-commands.ts +57 -0
- package/src/codex-rules/skip-list.ts +25 -0
- package/src/codex-rules/starlark.ts +46 -0
- package/src/codex-rules/types.ts +36 -0
- package/src/config/dotenv.ts +55 -0
- package/src/config/env.ts +10 -0
- package/src/config/home-dir.ts +36 -0
- package/src/config/index.ts +5 -0
- package/src/config/layout.ts +52 -0
- package/src/config/limits.ts +56 -0
- package/src/config/ttl.ts +30 -0
- package/src/detect/harness.ts +73 -0
- package/src/detect/index.ts +1 -0
- package/src/detect/interfaces/types.ts +18 -0
- package/src/freshness/agent-evidence-record.ts +95 -0
- package/src/freshness/agent-evidence.ts +95 -0
- package/src/freshness/codex-spawn-evidence.ts +91 -0
- package/src/freshness/doc-helpers.ts +90 -0
- package/src/freshness/evidence-harvest-io.ts +72 -0
- package/src/freshness/evidence-harvest.ts +61 -0
- package/src/freshness/explore-tools.ts +95 -0
- package/src/freshness/index.ts +2 -0
- package/src/freshness/query-framework.ts +73 -0
- package/src/freshness/ref-evidence.ts +49 -0
- package/src/freshness/ref-journal.ts +98 -0
- package/src/freshness/trivial-edit-counter.ts +30 -0
- package/src/index.ts +11 -0
- package/src/init/index.ts +2 -0
- package/src/init/run.ts +32 -0
- package/src/init/templates.ts +75 -0
- package/src/memory/gitignore.ts +14 -0
- package/src/memory/index.ts +3 -0
- package/src/memory/registry.ts +39 -0
- package/src/memory/session-roots.ts +99 -0
- package/src/memory/state.ts +58 -0
- package/src/policy/apex-authorization.ts +100 -0
- package/src/policy/apex-gates.ts +91 -0
- package/src/policy/apex-target-steps.ts +73 -0
- package/src/policy/apex-target.ts +49 -0
- package/src/policy/apex-task-context.ts +81 -0
- package/src/policy/apex.ts +94 -0
- package/src/policy/cartographer/build-tree.ts +69 -0
- package/src/policy/cartographer/describe.ts +53 -0
- package/src/policy/cartographer/entry.ts +38 -0
- package/src/policy/cartographer/frontmatter.ts +48 -0
- package/src/policy/cartographer/indicators.ts +34 -0
- package/src/policy/claude-md-context.ts +66 -0
- package/src/policy/conventions/index.ts +11 -0
- package/src/policy/conventions/interfaces.ts +71 -0
- package/src/policy/conventions/langs.ts +53 -0
- package/src/policy/conventions/query.ts +49 -0
- package/src/policy/conventions/react-hooks.ts +18 -0
- package/src/policy/conventions/store-or-query.ts +21 -0
- package/src/policy/conventions/stores.ts +56 -0
- package/src/policy/conventions/strip.ts +87 -0
- package/src/policy/conventions/verdict.ts +38 -0
- package/src/policy/creation-intent.ts +11 -0
- package/src/policy/deny-loop.ts +88 -0
- package/src/policy/design/allowed-write.ts +28 -0
- package/src/policy/design/content-checks.ts +45 -0
- package/src/policy/design/corpus-fs.ts +21 -0
- package/src/policy/design/corpus-resolve-cache.ts +49 -0
- package/src/policy/design/corpus-resolve.ts +99 -0
- package/src/policy/design/corpus.ts +92 -0
- package/src/policy/design/design-system-rules.ts +45 -0
- package/src/policy/design/flag.ts +30 -0
- package/src/policy/design/gates-pipeline.ts +105 -0
- package/src/policy/design/gates.ts +87 -0
- package/src/policy/design/screenshot-tools.ts +24 -0
- package/src/policy/design/skill-evidence.ts +34 -0
- package/src/policy/design/skill-gate.ts +81 -0
- package/src/policy/design/skill-triggers.ts +51 -0
- package/src/policy/design/state.ts +92 -0
- package/src/policy/design/template-urls.ts +54 -0
- package/src/policy/design/transitions.ts +68 -0
- package/src/policy/detect-claude-md-project-type.ts +32 -0
- package/src/policy/detect-framework.ts +99 -0
- package/src/policy/detect-primitive-checks.ts +100 -0
- package/src/policy/detect-primitive-lib.ts +55 -0
- package/src/policy/detect-project.ts +99 -0
- package/src/policy/edit-outcome.ts +53 -0
- package/src/policy/evaluate.ts +81 -0
- package/src/policy/expert-agents.ts +60 -0
- package/src/policy/file-size-scope.ts +32 -0
- package/src/policy/file-size.ts +99 -0
- package/src/policy/framework-solid-exclude.ts +52 -0
- package/src/policy/framework-solid-extended.ts +93 -0
- package/src/policy/framework-solid-gates-systems.ts +99 -0
- package/src/policy/framework-solid-gates.ts +98 -0
- package/src/policy/framework-solid.ts +88 -0
- package/src/policy/gemini-mcp-gate.ts +83 -0
- package/src/policy/git-gates.ts +40 -0
- package/src/policy/guards/bash-command-anchor.ts +40 -0
- package/src/policy/guards/bash-write-patterns.ts +140 -0
- package/src/policy/guards/bash-write-redirects.ts +201 -0
- package/src/policy/guards/bash-write-safe-paths.ts +62 -0
- package/src/policy/guards/bash-write.ts +76 -0
- package/src/policy/guards/context.ts +12 -0
- package/src/policy/guards/index.ts +61 -0
- package/src/policy/guards/install.ts +22 -0
- package/src/policy/guards/interface-separation-ext.ts +41 -0
- package/src/policy/guards/interface-separation.ts +100 -0
- package/src/policy/guards/protected-path.ts +100 -0
- package/src/policy/guards/security.ts +97 -0
- package/src/policy/index.ts +19 -0
- package/src/policy/interfaces/types.ts +46 -0
- package/src/policy/js-gate-route.ts +51 -0
- package/src/policy/lessons/lesson-gate.ts +0 -0
- package/src/policy/lessons/trigger-index.ts +84 -0
- package/src/policy/lessons/types.ts +31 -0
- package/src/policy/module-layout.ts +31 -0
- package/src/policy/nearest-manifest.ts +75 -0
- package/src/policy/never-approval.ts +95 -0
- package/src/policy/patterns.ts +80 -0
- package/src/policy/seo/validate.ts +51 -0
- package/src/policy/shadcn-project.ts +22 -0
- package/src/policy/shadcn-skill-gate.ts +97 -0
- package/src/policy/shell-read-refs.ts +96 -0
- package/src/policy/skill-path.ts +46 -0
- package/src/policy/skill-patterns/laravel.ts +40 -0
- package/src/policy/skill-patterns/nextjs.ts +29 -0
- package/src/policy/skill-patterns/react.ts +27 -0
- package/src/policy/skill-patterns/shadcn-subskills.ts +33 -0
- package/src/policy/skill-patterns/shadcn.ts +66 -0
- package/src/policy/skill-patterns/swift.ts +30 -0
- package/src/policy/skill-patterns/tailwind.ts +40 -0
- package/src/policy/skill-source.ts +52 -0
- package/src/policy/skill-trigger-patterns.ts +33 -0
- package/src/policy/skill-triggers.ts +108 -0
- package/src/policy/tailwind-skill-gate.ts +63 -0
- package/src/policy/trivial-edits.ts +52 -0
- package/src/policy/verbosity.ts +39 -0
- package/src/prompt/index.ts +1 -0
- package/src/prompt/types.ts +36 -0
- package/src/refs/discover.ts +69 -0
- package/src/refs/frontmatter.ts +24 -0
- package/src/refs/index.ts +4 -0
- package/src/refs/loader.ts +59 -0
- package/src/refs/ref-key.ts +41 -0
- package/src/refs/router.ts +63 -0
- package/src/refs/types.ts +25 -0
- package/src/runtime/activity.ts +99 -0
- package/src/runtime/apply-patch-gate.ts +41 -0
- package/src/runtime/burst-window.ts +21 -0
- package/src/runtime/codex-shell-tool.ts +37 -0
- package/src/runtime/command-string.ts +37 -0
- package/src/runtime/confirm/codex-confirm.ts +126 -0
- package/src/runtime/confirm/codex-prompt-origin.ts +16 -0
- package/src/runtime/confirm/confirm-code.ts +33 -0
- package/src/runtime/confirm/confirm-gate.ts +65 -0
- package/src/runtime/confirm/confirm-irreversible.ts +32 -0
- package/src/runtime/confirm/confirm-pending.ts +34 -0
- package/src/runtime/confirm/confirm-state.ts +56 -0
- package/src/runtime/confirm/confirm-subagent.ts +112 -0
- package/src/runtime/confirm/confirm-submit.ts +38 -0
- package/src/runtime/core-guards-active.ts +84 -0
- package/src/runtime/core-guards-wired.ts +47 -0
- package/src/runtime/deny-loop-store.ts +94 -0
- package/src/runtime/deny-notice.ts +52 -0
- package/src/runtime/design-cache-resolve.ts +51 -0
- package/src/runtime/design-content-gate.ts +95 -0
- package/src/runtime/design-files-gate.ts +114 -0
- package/src/runtime/design-helpers.ts +93 -0
- package/src/runtime/design-lifecycle.ts +39 -0
- package/src/runtime/design-read-credit.ts +28 -0
- package/src/runtime/design.ts +116 -0
- package/src/runtime/dev-context.ts +43 -0
- package/src/runtime/dry-patterns.ts +32 -0
- package/src/runtime/dry.ts +96 -0
- package/src/runtime/fragment-registry.ts +33 -0
- package/src/runtime/framework-skill-gate.ts +79 -0
- package/src/runtime/fs-cleanup.ts +71 -0
- package/src/runtime/gate-apex.ts +81 -0
- package/src/runtime/gate-helpers.ts +52 -0
- package/src/runtime/gate-input.ts +26 -0
- package/src/runtime/gate.ts +128 -0
- package/src/runtime/handle-post.ts +104 -0
- package/src/runtime/handle-pre.ts +137 -0
- package/src/runtime/handle-scope-async.ts +29 -0
- package/src/runtime/handle-types.ts +27 -0
- package/src/runtime/handle.ts +116 -0
- package/src/runtime/home-state.ts +55 -0
- package/src/runtime/index.ts +18 -0
- package/src/runtime/inform.ts +28 -0
- package/src/runtime/inject-budget-recap.ts +47 -0
- package/src/runtime/inject-budget.ts +81 -0
- package/src/runtime/inject-context.ts +85 -0
- package/src/runtime/inject-dedup-exclusive.ts +98 -0
- package/src/runtime/inject-dedup.ts +89 -0
- package/src/runtime/is-agent-tool.ts +19 -0
- package/src/runtime/lifecycle/agent-files.ts +49 -0
- package/src/runtime/lifecycle/agent-memory.ts +82 -0
- package/src/runtime/lifecycle/agent-transcript.ts +80 -0
- package/src/runtime/lifecycle/aipilot/analytics.ts +99 -0
- package/src/runtime/lifecycle/aipilot/apex-task-store.ts +61 -0
- package/src/runtime/lifecycle/aipilot/cache-base.ts +48 -0
- package/src/runtime/lifecycle/aipilot/cache-doc.ts +100 -0
- package/src/runtime/lifecycle/aipilot/cache-lessons.ts +58 -0
- package/src/runtime/lifecycle/aipilot/cache-test.ts +70 -0
- package/src/runtime/lifecycle/aipilot/curate-lessons.ts +64 -0
- package/src/runtime/lifecycle/aipilot/dispatch-aipilot.ts +100 -0
- package/src/runtime/lifecycle/aipilot/doc-cache-gate.ts +69 -0
- package/src/runtime/lifecycle/aipilot/inject-apex.ts +98 -0
- package/src/runtime/lifecycle/aipilot/inject-doc.ts +62 -0
- package/src/runtime/lifecycle/aipilot/inject-explore.ts +64 -0
- package/src/runtime/lifecycle/aipilot/inject-lessons.ts +61 -0
- package/src/runtime/lifecycle/aipilot/inject-test.ts +48 -0
- package/src/runtime/lifecycle/aipilot/lesson-archive.ts +60 -0
- package/src/runtime/lifecycle/aipilot/lesson-inject.ts +98 -0
- package/src/runtime/lifecycle/aipilot/lesson-parse.ts +74 -0
- package/src/runtime/lifecycle/aipilot/lessons.ts +72 -0
- package/src/runtime/lifecycle/aipilot/promote-global-lessons.ts +92 -0
- package/src/runtime/lifecycle/aipilot/solid-compliance.ts +69 -0
- package/src/runtime/lifecycle/aipilot/solid-notice.ts +47 -0
- package/src/runtime/lifecycle/aipilot/solid-transcript.ts +60 -0
- package/src/runtime/lifecycle/aipilot/source-scan.ts +56 -0
- package/src/runtime/lifecycle/aipilot/sync-task.ts +75 -0
- package/src/runtime/lifecycle/aipilot/transcript.ts +88 -0
- package/src/runtime/lifecycle/aipilot/types.ts +72 -0
- package/src/runtime/lifecycle/auto-document-reads.ts +73 -0
- package/src/runtime/lifecycle/cartographer/detect.ts +57 -0
- package/src/runtime/lifecycle/cartographer/ecosystem-map.ts +56 -0
- package/src/runtime/lifecycle/cartographer/fs-util.ts +64 -0
- package/src/runtime/lifecycle/cartographer/merge.ts +51 -0
- package/src/runtime/lifecycle/cartographer/project-map.ts +49 -0
- package/src/runtime/lifecycle/cartographer/scan-hooks.ts +48 -0
- package/src/runtime/lifecycle/cartographer/scan.ts +81 -0
- package/src/runtime/lifecycle/cartographer/session-start.ts +33 -0
- package/src/runtime/lifecycle/cartographer/track-enrichment.ts +45 -0
- package/src/runtime/lifecycle/cartographer/write-plugin-map.ts +43 -0
- package/src/runtime/lifecycle/cartographer/write-tree.ts +44 -0
- package/src/runtime/lifecycle/changelog-research.ts +43 -0
- package/src/runtime/lifecycle/check-file-size.ts +61 -0
- package/src/runtime/lifecycle/codex-resync/fingerprint.ts +63 -0
- package/src/runtime/lifecycle/codex-resync/lock.ts +46 -0
- package/src/runtime/lifecycle/codex-resync/managed-destination.ts +39 -0
- package/src/runtime/lifecycle/codex-resync/materialize-agents.ts +57 -0
- package/src/runtime/lifecycle/codex-resync/plugin-files.ts +65 -0
- package/src/runtime/lifecycle/codex-resync/plugin-roots.ts +62 -0
- package/src/runtime/lifecycle/codex-resync/resync.ts +45 -0
- package/src/runtime/lifecycle/codex-resync/symlink-commands.ts +25 -0
- package/src/runtime/lifecycle/dispatch.ts +109 -0
- package/src/runtime/lifecycle/failure-lesson.ts +51 -0
- package/src/runtime/lifecycle/index.ts +34 -0
- package/src/runtime/lifecycle/inject-rules.ts +50 -0
- package/src/runtime/lifecycle/instructions-loaded.ts +22 -0
- package/src/runtime/lifecycle/kimi-rules-native.ts +44 -0
- package/src/runtime/lifecycle/lessons/dispatch.ts +88 -0
- package/src/runtime/lifecycle/lessons/reminder.ts +89 -0
- package/src/runtime/lifecycle/lessons/state.ts +23 -0
- package/src/runtime/lifecycle/memory/agent-lesson.ts +35 -0
- package/src/runtime/lifecycle/memory/capture-error.ts +41 -0
- package/src/runtime/lifecycle/memory/client.ts +65 -0
- package/src/runtime/lifecycle/memory/dispatch.ts +42 -0
- package/src/runtime/lifecycle/memory/recall.ts +30 -0
- package/src/runtime/lifecycle/memory/salience.ts +31 -0
- package/src/runtime/lifecycle/memory/state.ts +49 -0
- package/src/runtime/lifecycle/memory/track-ops.ts +15 -0
- package/src/runtime/lifecycle/post-compact.ts +38 -0
- package/src/runtime/lifecycle/post-edit-ts.ts +49 -0
- package/src/runtime/lifecycle/post-tracking.ts +40 -0
- package/src/runtime/lifecycle/pre-compact.ts +38 -0
- package/src/runtime/lifecycle/rules-root.ts +83 -0
- package/src/runtime/lifecycle/security/check-skill.ts +63 -0
- package/src/runtime/lifecycle/security/scan-patterns.ts +53 -0
- package/src/runtime/lifecycle/security/scan.ts +76 -0
- package/src/runtime/lifecycle/security/skill-state.ts +47 -0
- package/src/runtime/lifecycle/security/track-mcp.ts +29 -0
- package/src/runtime/lifecycle/security/track-skill-read.ts +31 -0
- package/src/runtime/lifecycle/seo/post-tool-use.ts +45 -0
- package/src/runtime/lifecycle/session-end.ts +17 -0
- package/src/runtime/lifecycle/session-start.ts +57 -0
- package/src/runtime/lifecycle/snapshot/board.ts +27 -0
- package/src/runtime/lifecycle/snapshot/format.ts +60 -0
- package/src/runtime/lifecycle/snapshot/git.ts +71 -0
- package/src/runtime/lifecycle/snapshot/index.ts +52 -0
- package/src/runtime/lifecycle/snapshot/version.ts +34 -0
- package/src/runtime/lifecycle/solid-detect.ts +56 -0
- package/src/runtime/lifecycle/stop-core.ts +35 -0
- package/src/runtime/lifecycle/subagent-cache.ts +61 -0
- package/src/runtime/lifecycle/task-completed.ts +94 -0
- package/src/runtime/lifecycle/teammate-idle-check.ts +63 -0
- package/src/runtime/lifecycle/teammate-idle.ts +28 -0
- package/src/runtime/lifecycle/tool-failure.ts +24 -0
- package/src/runtime/lifecycle/track-changes.ts +61 -0
- package/src/runtime/lifecycle/validate-solid.ts +70 -0
- package/src/runtime/lifecycle/validate-tailwind.ts +80 -0
- package/src/runtime/lifecycle-bridge.ts +74 -0
- package/src/runtime/mcp-key.ts +44 -0
- package/src/runtime/mcp-tool-name.ts +92 -0
- package/src/runtime/mcp.ts +91 -0
- package/src/runtime/modular.ts +77 -0
- package/src/runtime/normalize.ts +107 -0
- package/src/runtime/notices.ts +91 -0
- package/src/runtime/notification-sound.ts +49 -0
- package/src/runtime/notifications.ts +77 -0
- package/src/runtime/paths.ts +59 -0
- package/src/runtime/post-fanout.ts +41 -0
- package/src/runtime/post-outcome.ts +61 -0
- package/src/runtime/pre-allow.ts +97 -0
- package/src/runtime/precommit.ts +60 -0
- package/src/runtime/prompt-text.ts +38 -0
- package/src/runtime/receipt-capture.ts +34 -0
- package/src/runtime/record.ts +26 -0
- package/src/runtime/respond.ts +92 -0
- package/src/runtime/solid-file-size-gate.ts +58 -0
- package/src/runtime/solid-pre.ts +53 -0
- package/src/runtime/storage.ts +9 -0
- package/src/statusline/colors.ts +31 -0
- package/src/statusline/constants.ts +17 -0
- package/src/statusline/formatters.ts +54 -0
- package/src/statusline/index.ts +4 -0
- package/src/statusline/progress-bar.ts +46 -0
- package/src/tracking/codex-post-failure.ts +73 -0
- package/src/tracking/index.ts +2 -0
- package/src/tracking/integrity.ts +99 -0
- package/src/tracking/one-shot-dedup.ts +34 -0
- package/src/tracking/one-shot-failure.ts +42 -0
- package/src/tracking/one-shot-store.ts +95 -0
- package/src/tracking/one-shot.ts +93 -0
- package/src/tracking/receipts.ts +95 -0
- package/src/tracking/session-state.ts +94 -0
- package/src/tracking/store.ts +96 -0
- package/src/tracking/track-compact.ts +100 -0
- package/src/tracking/track-diff.ts +50 -0
- package/src/tracking/track-journal.ts +97 -0
- package/src/tracking/track-lock-sync.ts +83 -0
- package/src/tracking/track-lock.ts +67 -0
- package/src/util/compact-json.ts +23 -0
- package/src/util/index.ts +2 -0
- package/src/util/json-io.ts +47 -0
- package/src/util/project-root.ts +41 -0
- package/src/util/runtime-io.ts +85 -0
- package/src/util/semver.ts +30 -0
- package/dist/permission-mode-B0MUl7FT.mjs +0 -136
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { t as evaluate } from "./evaluate-
|
|
1
|
+
import { t as evaluate } from "./evaluate-CMiIqHeH.mjs";
|
|
2
2
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { t as commandToString } from "./command-string-CALMTnwN.mjs";
|
|
4
|
+
import { c as readClaudeInput } from "./claude-Ckv2_TgP.mjs";
|
|
4
5
|
//#region src/adapters/hermes/index.ts
|
|
5
6
|
/**
|
|
6
7
|
* Hermes Agent adapter (hook-mode). Nous Research's hermes-agent (2026) pipes a
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as PromptKind, r as formatPrompt, t as Prompt } from "./types-
|
|
1
|
+
import { n as PromptKind, r as formatPrompt, t as Prompt } from "./types-Bh0jEF3_.mjs";
|
|
2
2
|
import { _ as queryHash, a as cacheLookupSubstringMeta, c as mcpCacheKey, d as extractText, f as IndexSummary, g as jaccardSimilar, h as compactMarkdown, i as cacheLookupSubstring, l as mcpCacheWrite, m as summarizeIndex, n as cacheLookup, o as cachePath, p as loadIndex, r as cacheLookupMeta, s as cacheStore, t as CacheHit, u as webfetchCacheWrite } from "./index-DhmV2MPh.mjs";
|
|
3
3
|
import { _ as DEFAULT_TTL_SEC, a as ProjectLayout, b as ttlLabel, c as projectLayout, d as MAX_LINES_ENV_KEY, f as hookBudget, g as storeBudget, h as splitTarget, i as parseEnvFile, l as DEFAULT_MAX_LINES, m as resolveStdinMaxBytes, n as envCandidates, o as STATE_GITIGNORE, p as resolveMaxLines, r as loadDotenv, s as STATE_ROOT, t as HOME_DIR, u as DEFAULT_STDIN_MAX_BYTES, v as TTL_ENV_KEY, x as parseEnvInt, y as resolveTtlSec } from "./index-oXXPs2xl.mjs";
|
|
4
4
|
import { i as HarnessVia, n as HarnessInfo, r as HarnessMode, t as HarnessId } from "./types-DvXTI71X.mjs";
|
|
@@ -6,7 +6,7 @@ import { n as detectMode, r as modeFor, t as detectHarness } from "./index-CigBu
|
|
|
6
6
|
import { a as isDocConsulted, i as formatDocSatisfactionStatus, n as DocSatisfactionStatus, o as resolveSessions, r as formatDocDeny, t as AuthEntry } from "./doc-helpers-BGCzP9VF.mjs";
|
|
7
7
|
import { t as incrementTrivialEditCounter } from "./index-84heAAm_.mjs";
|
|
8
8
|
import { a as compactJson, i as walkUpFor, n as projectRoot, r as projectRootOrNull, t as isCodeFile } from "./index-p9fLrSOD.mjs";
|
|
9
|
-
import { $ as detectCreationIntent, $t as countFrameworkCodeLines, A as TreeEntry, At as APEX_GATES, B as loadApexTaskState, Bt as evaluate, C as maskCommentsAndStrings, Ct as protectedPathGuard, D as descFromText, Dt as securityGuard, E as missingSeoElements, Et as LabeledPattern, F as EXCLUDE_DIRS, Ft as brainstormGate, G as detectRequiredSkills, Gt as PROJECT_INSTALL, H as buildApexInstruction, Ht as PolicyResult, I as PROJECT_INDICATORS, It as docConsultedGate, J as SKILL_TRIGGERS, Jt as isRalphMode, K as skillTriggerGate, Kt as RALPH_SAFE, L as ApexTaskState, Lt as evaluateApex, M as parseEntry, Mt as ApexGate, N as parseBodyDesc, Nt as POST_AUTH_GATES, O as firstComment, Ot as Guard, P as parseField, Pt as PRE_AUTH_GATES, Q as capVerbosity, Qt as SOLID_REF, R as buildApexTaskContext, Rt as freshnessGate, S as LexProfile, St as PROTECTED_GIT_RE, T as isHtmlLike, Tt as CRITICAL_PATTERNS, U as buildClaudeMdContext, Ut as GIT_ASK, V as DEV_VERBS, Vt as PolicyContext, W as detectClaudeMdProjectType, Wt as GIT_BLOCKED, X as MAX_EXA_RESULTS, Xt as FileSizeVerdict, Y as frameworkSolidGate, Yt as matchPatterns, Z as MAX_TOKENS, Zt as PLUGINS_DIR, _ as isStoresPath, _t as CODE_REDIRECT, a as countStores, an as ProjectType, at as installGuard, b as langOfPath, bt as SESSION_STATE_FRAGMENT, c as InterfaceDeclLevel, cn as isApexCommand, ct as PHP_DECL_RE, d as interfaceDeclLevel, dt as SWIFT_PROTO_RE, en as countLines, et as FAIL_CLOSED, f as LangFamily, ft as TS_DECL_RE, g as isQueryPath, gt as CODE_MUTATORS, h as isInterfacesPath, ht as ASK_WRITERS, i as StoreLib, in as ModularArchitecture, it as runGuards, j as parseEnrichment, jt as ApexContext, k as firstHeading, kt as GuardContext, l as declaresExportedTypeAlias, ln as requiredArchSkill, lt as PY_MODEL_RE, m as isHooksPath, mt as bashWriteGuard, n as importsTanstackQuery, nn as detectFramework, nt as clearUserGuards, o as declaresStore, on as detectModularArchitecture, ot as GO_DECL_RE, p as isComponentsPath, pt as interfaceSeparationGuard, q as usesTailwindUtilities, qt as SYSTEM_INSTALL, r as queryCapActive, rn as DEV_KEYWORDS, rt as registerGuard, s as declaresCustomHook, sn as detectProjectType, st as JAVA_DECL_RE, t as declaresQueryHook, tn as evaluateFileSize, tt as GUARDS, u as declaresInterface, ut as RUST_DECL_RE, v as isTypesPath, vt as FILE_REDIRECT, w as maskCommentsOnly, wt as ASK_PATTERNS, x as lexProfileOf, xt as PROTECTED_FRAGMENTS, y as isVendorPath, yt as SAFE_PREFIXES, z as buildApexTaskInjection, zt as solidReadGate } from "./index-
|
|
9
|
+
import { $ as detectCreationIntent, $t as countFrameworkCodeLines, A as TreeEntry, At as APEX_GATES, B as loadApexTaskState, Bt as evaluate, C as maskCommentsAndStrings, Ct as protectedPathGuard, D as descFromText, Dt as securityGuard, E as missingSeoElements, Et as LabeledPattern, F as EXCLUDE_DIRS, Ft as brainstormGate, G as detectRequiredSkills, Gt as PROJECT_INSTALL, H as buildApexInstruction, Ht as PolicyResult, I as PROJECT_INDICATORS, It as docConsultedGate, J as SKILL_TRIGGERS, Jt as isRalphMode, K as skillTriggerGate, Kt as RALPH_SAFE, L as ApexTaskState, Lt as evaluateApex, M as parseEntry, Mt as ApexGate, N as parseBodyDesc, Nt as POST_AUTH_GATES, O as firstComment, Ot as Guard, P as parseField, Pt as PRE_AUTH_GATES, Q as capVerbosity, Qt as SOLID_REF, R as buildApexTaskContext, Rt as freshnessGate, S as LexProfile, St as PROTECTED_GIT_RE, T as isHtmlLike, Tt as CRITICAL_PATTERNS, U as buildClaudeMdContext, Ut as GIT_ASK, V as DEV_VERBS, Vt as PolicyContext, W as detectClaudeMdProjectType, Wt as GIT_BLOCKED, X as MAX_EXA_RESULTS, Xt as FileSizeVerdict, Y as frameworkSolidGate, Yt as matchPatterns, Z as MAX_TOKENS, Zt as PLUGINS_DIR, _ as isStoresPath, _t as CODE_REDIRECT, a as countStores, an as ProjectType, at as installGuard, b as langOfPath, bt as SESSION_STATE_FRAGMENT, c as InterfaceDeclLevel, cn as isApexCommand, ct as PHP_DECL_RE, d as interfaceDeclLevel, dt as SWIFT_PROTO_RE, en as countLines, et as FAIL_CLOSED, f as LangFamily, ft as TS_DECL_RE, g as isQueryPath, gt as CODE_MUTATORS, h as isInterfacesPath, ht as ASK_WRITERS, i as StoreLib, in as ModularArchitecture, it as runGuards, j as parseEnrichment, jt as ApexContext, k as firstHeading, kt as GuardContext, l as declaresExportedTypeAlias, ln as requiredArchSkill, lt as PY_MODEL_RE, m as isHooksPath, mt as bashWriteGuard, n as importsTanstackQuery, nn as detectFramework, nt as clearUserGuards, o as declaresStore, on as detectModularArchitecture, ot as GO_DECL_RE, p as isComponentsPath, pt as interfaceSeparationGuard, q as usesTailwindUtilities, qt as SYSTEM_INSTALL, r as queryCapActive, rn as DEV_KEYWORDS, rt as registerGuard, s as declaresCustomHook, sn as detectProjectType, st as JAVA_DECL_RE, t as declaresQueryHook, tn as evaluateFileSize, tt as GUARDS, u as declaresInterface, ut as RUST_DECL_RE, v as isTypesPath, vt as FILE_REDIRECT, w as maskCommentsOnly, wt as ASK_PATTERNS, x as lexProfileOf, xt as PROTECTED_FRAGMENTS, y as isVendorPath, yt as SAFE_PREFIXES, z as buildApexTaskInjection, zt as solidReadGate } from "./index-B8PG82su.mjs";
|
|
10
10
|
import { n as RouteResult, r as ScoredRef, t as RefMeta } from "./types-CY5qT2X1.mjs";
|
|
11
11
|
import { a as ReminderState, c as readState, d as throttleMs, i as registryFile, l as setStateField, n as addRoot, o as lessonsFileFor, r as readRoots, s as nowStamp, t as ensureMemoryGitignore, u as stateFileFor } from "./index-DLYhervv.mjs";
|
|
12
12
|
import { a as globToRe, i as scoreReferences, n as toRefMeta, o as parseFrontmatter, r as routeReferences, t as loadRefs } from "./index-DEfz82BP.mjs";
|
package/dist/index.mjs
CHANGED
|
@@ -4,11 +4,11 @@ import { n as STATE_ROOT, r as projectLayout, t as STATE_GITIGNORE } from "./lay
|
|
|
4
4
|
import { t as compactJson } from "./compact-json-DK2nX-MK.mjs";
|
|
5
5
|
import { i as walkUpFor, n as projectRoot, r as projectRootOrNull, t as isCodeFile } from "./project-root-3kk7gCOp.mjs";
|
|
6
6
|
import { n as detectMode, r as modeFor, t as detectHarness } from "./harness-BMuLJ9lm.mjs";
|
|
7
|
-
import { $ as
|
|
7
|
+
import { $ as isRalphMode, B as protectedPathGuard, C as isInterfacesPath, D as isVendorPath, E as isTypesPath, F as FILE_REDIRECT, H as ASK_PATTERNS, I as SAFE_PREFIXES, J as GIT_ASK, L as SESSION_STATE_FRAGMENT, M as ASK_WRITERS, N as CODE_MUTATORS, O as langOfPath, P as CODE_REDIRECT, Q as SYSTEM_INSTALL, R as PROTECTED_FRAGMENTS, S as isHooksPath, T as isStoresPath, U as CRITICAL_PATTERNS, W as securityGuard, X as PROJECT_INSTALL, Y as GIT_BLOCKED, Z as RALPH_SAFE, a as registerGuard, at as maskCommentsOnly, b as interfaceDeclLevel, c as GO_DECL_RE, ct as detectProjectType, d as PY_MODEL_RE, et as matchPatterns, f as RUST_DECL_RE, h as interfaceSeparationGuard, i as clearUserGuards, it as maskCommentsAndStrings, j as bashWriteGuard, k as lexProfileOf, l as JAVA_DECL_RE, lt as isApexCommand, m as TS_DECL_RE, n as FAIL_CLOSED, o as runGuards, ot as DEV_KEYWORDS, p as SWIFT_PROTO_RE, r as GUARDS, s as installGuard, st as detectModularArchitecture, t as evaluate, tt as detectFramework, u as PHP_DECL_RE, ut as requiredArchSkill, v as declaresExportedTypeAlias, w as isQueryPath, x as isComponentsPath, y as declaresInterface, z as PROTECTED_GIT_RE } from "./evaluate-CMiIqHeH.mjs";
|
|
8
8
|
import { d as countFrameworkCodeLines, f as countLines, l as PLUGINS_DIR, p as evaluateFileSize, u as SOLID_REF } from "./home-state-oUGFB4ds.mjs";
|
|
9
9
|
import { i as resolveSessions, n as formatDocSatisfactionStatus, r as isDocConsulted, t as formatDocDeny } from "./doc-helpers-CWZegVdR.mjs";
|
|
10
10
|
import { i as parseFrontmatter, n as scoreReferences, r as globToRe, t as routeReferences } from "./router-PKVNBHge.mjs";
|
|
11
|
-
import { A as importsTanstackQuery, B as APEX_GATES, C as detectRequiredSkills, D as frameworkSolidGate, E as SKILL_TRIGGERS, G as evaluateApex, H as PRE_AUTH_GATES, I as MAX_EXA_RESULTS, K as freshnessGate, L as MAX_TOKENS, M as countStores, N as declaresStore, O as declaresCustomHook, R as capVerbosity, S as parseField, T as usesTailwindUtilities, U as brainstormGate, V as POST_AUTH_GATES, W as docConsultedGate, _ as detectClaudeMdProjectType, a as firstHeading, c as EXCLUDE_DIRS, d as buildApexTaskInjection, f as loadApexTaskState, g as buildClaudeMdContext, h as buildApexInstruction, i as firstComment, j as queryCapActive, k as declaresQueryHook, l as PROJECT_INDICATORS, m as DEV_VERBS, n as missingSeoElements, o as parseEnrichment, q as solidReadGate, r as descFromText, s as parseEntry, t as isHtmlLike, u as buildApexTaskContext, w as skillTriggerGate, x as parseBodyDesc, z as detectCreationIntent } from "./validate-
|
|
11
|
+
import { A as importsTanstackQuery, B as APEX_GATES, C as detectRequiredSkills, D as frameworkSolidGate, E as SKILL_TRIGGERS, G as evaluateApex, H as PRE_AUTH_GATES, I as MAX_EXA_RESULTS, K as freshnessGate, L as MAX_TOKENS, M as countStores, N as declaresStore, O as declaresCustomHook, R as capVerbosity, S as parseField, T as usesTailwindUtilities, U as brainstormGate, V as POST_AUTH_GATES, W as docConsultedGate, _ as detectClaudeMdProjectType, a as firstHeading, c as EXCLUDE_DIRS, d as buildApexTaskInjection, f as loadApexTaskState, g as buildClaudeMdContext, h as buildApexInstruction, i as firstComment, j as queryCapActive, k as declaresQueryHook, l as PROJECT_INDICATORS, m as DEV_VERBS, n as missingSeoElements, o as parseEnrichment, q as solidReadGate, r as descFromText, s as parseEntry, t as isHtmlLike, u as buildApexTaskContext, w as skillTriggerGate, x as parseBodyDesc, z as detectCreationIntent } from "./validate-KjZ1X9tH.mjs";
|
|
12
12
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
13
13
|
import { a as nowStamp, c as stateFileFor, i as lessonsFileFor, l as throttleMs, n as readRoots, o as readState, r as registryFile, s as setStateField, t as addRoot, u as ensureMemoryGitignore } from "./registry-IhHk2KlT.mjs";
|
|
14
14
|
import { a as cacheLookupSubstring, c as cacheStore, d as loadIndex, f as summarizeIndex, h as queryHash, i as cacheLookupMeta, l as mcpCacheKey, m as jaccardSimilar, n as webfetchCacheWrite, o as cacheLookupSubstringMeta, p as compactMarkdown, r as cacheLookup, s as cachePath, t as mcpCacheWrite, u as extractText } from "./mcp-store-BkBDmuxN.mjs";
|
package/dist/init/index.d.mts
CHANGED
|
@@ -15,7 +15,7 @@ interface InitFile {
|
|
|
15
15
|
declare function claudeInit(command: string): InitFile[];
|
|
16
16
|
/** Codex CLI: `.codex/hooks.json` (Claude-compatible shape). */
|
|
17
17
|
declare function codexInit(command: string): InitFile[];
|
|
18
|
-
/** Cursor: `.cursor/hooks.json` (version 1) —
|
|
18
|
+
/** Cursor: `.cursor/hooks.json` (version 1) — supported pre gates and post observers. */
|
|
19
19
|
declare function cursorInit(command: string): InitFile[];
|
|
20
20
|
/** Gemini CLI: `.gemini/settings.json` — BeforeTool(edits) + AfterTool(all, regex). */
|
|
21
21
|
declare function geminiInit(command: string): InitFile[];
|
package/dist/init/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as codexInit, i as clineInit, n as writeInitFile, o as cursorInit, r as claudeInit, s as geminiInit, t as initFor } from "../run-
|
|
1
|
+
import { a as codexInit, i as clineInit, n as writeInitFile, o as cursorInit, r as claudeInit, s as geminiInit, t as initFor } from "../run-GHAMqcOn.mjs";
|
|
2
2
|
export { claudeInit, clineInit, codexInit, cursorInit, geminiInit, initFor, writeInitFile };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { t as evaluate } from "./evaluate-
|
|
1
|
+
import { t as evaluate } from "./evaluate-CMiIqHeH.mjs";
|
|
2
2
|
import { t as formatPrompt } from "./types-ernB1Dy3.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { t as commandToString } from "./command-string-CALMTnwN.mjs";
|
|
4
|
+
import { c as readClaudeInput } from "./claude-Ckv2_TgP.mjs";
|
|
4
5
|
//#region src/adapters/kimi/index.ts
|
|
5
6
|
/**
|
|
6
7
|
* Kimi Code CLI adapter (hook-mode). Moonshot AI's Kimi Code CLI (v0.27.0,
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { t as commandToString } from "./command-string-CALMTnwN.mjs";
|
|
2
|
+
import { isAbsolute, normalize, relative } from "node:path";
|
|
3
|
+
import { realpathSync } from "node:fs";
|
|
4
|
+
//#region src/adapters/cursor/events.ts
|
|
5
|
+
const EVENT_CONTRACTS = {
|
|
6
|
+
sessionStart: {
|
|
7
|
+
phase: "pre",
|
|
8
|
+
lifecycle: "SessionStart",
|
|
9
|
+
response: "session-context",
|
|
10
|
+
blockable: false,
|
|
11
|
+
known: true
|
|
12
|
+
},
|
|
13
|
+
sessionEnd: {
|
|
14
|
+
phase: "post",
|
|
15
|
+
lifecycle: "SessionEnd",
|
|
16
|
+
response: "neutral",
|
|
17
|
+
blockable: false,
|
|
18
|
+
known: true
|
|
19
|
+
},
|
|
20
|
+
beforeSubmitPrompt: {
|
|
21
|
+
phase: "pre",
|
|
22
|
+
lifecycle: "UserPromptSubmit",
|
|
23
|
+
response: "submit-control",
|
|
24
|
+
blockable: true,
|
|
25
|
+
known: true
|
|
26
|
+
},
|
|
27
|
+
preCompact: {
|
|
28
|
+
phase: "pre",
|
|
29
|
+
lifecycle: "PreCompact",
|
|
30
|
+
response: "compact-notice",
|
|
31
|
+
blockable: false,
|
|
32
|
+
known: true
|
|
33
|
+
},
|
|
34
|
+
subagentStart: {
|
|
35
|
+
phase: "pre",
|
|
36
|
+
lifecycle: "SubagentStart",
|
|
37
|
+
response: "permission",
|
|
38
|
+
blockable: true,
|
|
39
|
+
known: true
|
|
40
|
+
},
|
|
41
|
+
subagentStop: {
|
|
42
|
+
phase: "post",
|
|
43
|
+
lifecycle: "SubagentStop",
|
|
44
|
+
response: "followup",
|
|
45
|
+
blockable: false,
|
|
46
|
+
known: true
|
|
47
|
+
},
|
|
48
|
+
preToolUse: {
|
|
49
|
+
phase: "pre",
|
|
50
|
+
lifecycle: "PreToolUse",
|
|
51
|
+
response: "permission",
|
|
52
|
+
blockable: true,
|
|
53
|
+
known: true
|
|
54
|
+
},
|
|
55
|
+
postToolUse: {
|
|
56
|
+
phase: "post",
|
|
57
|
+
lifecycle: "PostToolUse",
|
|
58
|
+
response: "post-context",
|
|
59
|
+
blockable: false,
|
|
60
|
+
known: true
|
|
61
|
+
},
|
|
62
|
+
postToolUseFailure: {
|
|
63
|
+
phase: "post",
|
|
64
|
+
lifecycle: "PostToolUseFailure",
|
|
65
|
+
response: "neutral",
|
|
66
|
+
blockable: false,
|
|
67
|
+
known: true
|
|
68
|
+
},
|
|
69
|
+
beforeShellExecution: {
|
|
70
|
+
phase: "pre",
|
|
71
|
+
lifecycle: "BeforeShellExecution",
|
|
72
|
+
response: "permission",
|
|
73
|
+
blockable: true,
|
|
74
|
+
known: true
|
|
75
|
+
},
|
|
76
|
+
afterShellExecution: {
|
|
77
|
+
phase: "post",
|
|
78
|
+
lifecycle: "AfterShellExecution",
|
|
79
|
+
response: "neutral",
|
|
80
|
+
blockable: false,
|
|
81
|
+
known: true
|
|
82
|
+
},
|
|
83
|
+
beforeMCPExecution: {
|
|
84
|
+
phase: "pre",
|
|
85
|
+
lifecycle: "BeforeMCPExecution",
|
|
86
|
+
response: "permission",
|
|
87
|
+
blockable: true,
|
|
88
|
+
known: true
|
|
89
|
+
},
|
|
90
|
+
afterMCPExecution: {
|
|
91
|
+
phase: "post",
|
|
92
|
+
lifecycle: "AfterMCPExecution",
|
|
93
|
+
response: "neutral",
|
|
94
|
+
blockable: false,
|
|
95
|
+
known: true
|
|
96
|
+
},
|
|
97
|
+
beforeReadFile: {
|
|
98
|
+
phase: "pre",
|
|
99
|
+
lifecycle: "BeforeReadFile",
|
|
100
|
+
response: "permission",
|
|
101
|
+
blockable: true,
|
|
102
|
+
known: true
|
|
103
|
+
},
|
|
104
|
+
afterFileEdit: {
|
|
105
|
+
phase: "post",
|
|
106
|
+
lifecycle: "AfterFileEdit",
|
|
107
|
+
response: "neutral",
|
|
108
|
+
blockable: false,
|
|
109
|
+
known: true
|
|
110
|
+
},
|
|
111
|
+
beforeTabFileRead: {
|
|
112
|
+
phase: "pre",
|
|
113
|
+
lifecycle: "BeforeTabFileRead",
|
|
114
|
+
response: "permission",
|
|
115
|
+
blockable: true,
|
|
116
|
+
known: true
|
|
117
|
+
},
|
|
118
|
+
afterTabFileEdit: {
|
|
119
|
+
phase: "post",
|
|
120
|
+
lifecycle: "AfterTabFileEdit",
|
|
121
|
+
response: "neutral",
|
|
122
|
+
blockable: false,
|
|
123
|
+
known: true
|
|
124
|
+
},
|
|
125
|
+
afterAgentResponse: {
|
|
126
|
+
phase: "post",
|
|
127
|
+
lifecycle: "AfterAgentResponse",
|
|
128
|
+
response: "neutral",
|
|
129
|
+
blockable: false,
|
|
130
|
+
known: true
|
|
131
|
+
},
|
|
132
|
+
afterAgentThought: {
|
|
133
|
+
phase: "post",
|
|
134
|
+
lifecycle: "AfterAgentThought",
|
|
135
|
+
response: "neutral",
|
|
136
|
+
blockable: false,
|
|
137
|
+
known: true
|
|
138
|
+
},
|
|
139
|
+
stop: {
|
|
140
|
+
phase: "post",
|
|
141
|
+
lifecycle: "Stop",
|
|
142
|
+
response: "followup",
|
|
143
|
+
blockable: false,
|
|
144
|
+
known: true
|
|
145
|
+
},
|
|
146
|
+
workspaceOpen: {
|
|
147
|
+
phase: "pre",
|
|
148
|
+
lifecycle: "WorkspaceOpen",
|
|
149
|
+
response: "plugin-paths",
|
|
150
|
+
blockable: false,
|
|
151
|
+
known: true
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const UNKNOWN_EVENT = {
|
|
155
|
+
phase: "post",
|
|
156
|
+
lifecycle: null,
|
|
157
|
+
response: "neutral",
|
|
158
|
+
blockable: false,
|
|
159
|
+
known: false
|
|
160
|
+
};
|
|
161
|
+
/** Return explicit routing and response metadata for a Cursor event name. */
|
|
162
|
+
function cursorEventContract(eventName) {
|
|
163
|
+
return EVENT_CONTRACTS[eventName] ?? UNKNOWN_EVENT;
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/adapters/cursor/context.ts
|
|
167
|
+
/** Preserve a Cursor path value only when it is non-empty and NUL-free. */
|
|
168
|
+
function cursorPath(value) {
|
|
169
|
+
return typeof value === "string" && value.length > 0 && !value.includes("\0") ? value : void 0;
|
|
170
|
+
}
|
|
171
|
+
/** Validate and normalize an absolute path supplied by Cursor. */
|
|
172
|
+
function cursorAbsolutePath(value) {
|
|
173
|
+
const candidate = cursorPath(value);
|
|
174
|
+
if (!candidate || !isAbsolute(candidate)) return void 0;
|
|
175
|
+
const path = normalize(candidate);
|
|
176
|
+
try {
|
|
177
|
+
return realpathSync.native(path);
|
|
178
|
+
} catch {
|
|
179
|
+
return path;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Preserve distinct, validated Cursor workspace roots in wire order. */
|
|
183
|
+
function cursorWorkspaceRoots(value) {
|
|
184
|
+
if (!Array.isArray(value)) return [];
|
|
185
|
+
const roots = value.map(cursorAbsolutePath).filter((root) => root !== void 0);
|
|
186
|
+
return [...new Set(roots)];
|
|
187
|
+
}
|
|
188
|
+
function contains(root, filePath) {
|
|
189
|
+
const rel = relative(root, filePath);
|
|
190
|
+
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
191
|
+
}
|
|
192
|
+
/** Select Cursor's project scope without replacing a valid payload cwd. */
|
|
193
|
+
function cursorProjectCwd(cwd, workspaceRoots, filePath, fallback) {
|
|
194
|
+
if (cwd) return cwd;
|
|
195
|
+
if (filePath) {
|
|
196
|
+
const matches = workspaceRoots.filter((root) => contains(root, filePath));
|
|
197
|
+
if (matches.length > 0) return matches.sort((a, b) => b.length - a.length)[0];
|
|
198
|
+
}
|
|
199
|
+
return workspaceRoots[0] ?? fallback;
|
|
200
|
+
}
|
|
201
|
+
//#endregion
|
|
202
|
+
//#region src/adapters/cursor/normalize.ts
|
|
203
|
+
function record(value) {
|
|
204
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
205
|
+
}
|
|
206
|
+
function str(value) {
|
|
207
|
+
return typeof value === "string" ? value : void 0;
|
|
208
|
+
}
|
|
209
|
+
function inputRecord(value) {
|
|
210
|
+
const direct = record(value);
|
|
211
|
+
if (direct || typeof value !== "string") return direct;
|
|
212
|
+
try {
|
|
213
|
+
return record(JSON.parse(value));
|
|
214
|
+
} catch {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const MCP_ROOT_FIELDS = [
|
|
219
|
+
"mcp_server_name",
|
|
220
|
+
"mcp_server_url",
|
|
221
|
+
"url",
|
|
222
|
+
"result_json",
|
|
223
|
+
"duration"
|
|
224
|
+
];
|
|
225
|
+
function cursorMcpInput(raw, input) {
|
|
226
|
+
const merged = { ...input };
|
|
227
|
+
for (const field of MCP_ROOT_FIELDS) if (Object.hasOwn(raw, field)) merged[field] = raw[field];
|
|
228
|
+
return merged;
|
|
229
|
+
}
|
|
230
|
+
function sanitizedCursorInput(input) {
|
|
231
|
+
const safe = { ...input };
|
|
232
|
+
if (typeof safe.file_path === "string" && cursorPath(safe.file_path) === void 0) delete safe.file_path;
|
|
233
|
+
if (typeof safe.path === "string" && cursorPath(safe.path) === void 0) delete safe.path;
|
|
234
|
+
if (Object.hasOwn(safe, "cwd")) {
|
|
235
|
+
const cwd = cursorAbsolutePath(safe.cwd);
|
|
236
|
+
if (cwd) safe.cwd = cwd;
|
|
237
|
+
else delete safe.cwd;
|
|
238
|
+
}
|
|
239
|
+
if (Object.hasOwn(safe, "workspace_roots")) if (Array.isArray(safe.workspace_roots)) safe.workspace_roots = cursorWorkspaceRoots(safe.workspace_roots);
|
|
240
|
+
else delete safe.workspace_roots;
|
|
241
|
+
return safe;
|
|
242
|
+
}
|
|
243
|
+
function cursorToolName(raw, event, tool, hasCommand) {
|
|
244
|
+
if (hasCommand) return "Bash";
|
|
245
|
+
const server = str(raw.mcp_server_name)?.trim().replace(/[^A-Za-z0-9_-]+/g, "_");
|
|
246
|
+
if (/^(before|after)MCPExecution$/i.test(event) && server && tool && !tool.startsWith("mcp__")) return `mcp__${server}__${tool}`;
|
|
247
|
+
if (tool === "Write") return "Edit";
|
|
248
|
+
return tool ?? "";
|
|
249
|
+
}
|
|
250
|
+
function cursorCommands(raw, input) {
|
|
251
|
+
const candidates = [commandToString(raw.command), commandToString(input.command)].filter((candidate) => candidate !== void 0);
|
|
252
|
+
return [...new Set(candidates)];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Extract one Cursor hook payload into the shared runtime shape.
|
|
256
|
+
*
|
|
257
|
+
* @param payload - Cursor hook stdin payload.
|
|
258
|
+
* @returns Cursor-specific phase, tool, command, and edit fields.
|
|
259
|
+
*/
|
|
260
|
+
function extractCursorEvent(payload) {
|
|
261
|
+
const raw = payload;
|
|
262
|
+
const hookEvent = str(raw.hook_event_name) ?? "";
|
|
263
|
+
const parsedInput = inputRecord(raw.tool_input);
|
|
264
|
+
const input = sanitizedCursorInput((parsedInput && /^(before|after)MCPExecution$/i.test(hookEvent) ? cursorMcpInput(raw, parsedInput) : parsedInput) ?? raw);
|
|
265
|
+
const contract = cursorEventContract(hookEvent);
|
|
266
|
+
const metadata = {
|
|
267
|
+
eventName: hookEvent,
|
|
268
|
+
lifecycleEvent: contract.lifecycle,
|
|
269
|
+
responseKind: contract.response,
|
|
270
|
+
blockable: contract.blockable,
|
|
271
|
+
cwd: cursorAbsolutePath(raw.cwd),
|
|
272
|
+
workspaceRoots: cursorWorkspaceRoots(raw.workspace_roots)
|
|
273
|
+
};
|
|
274
|
+
if (!contract.known) return {
|
|
275
|
+
...metadata,
|
|
276
|
+
phase: contract.phase,
|
|
277
|
+
tool: "",
|
|
278
|
+
input
|
|
279
|
+
};
|
|
280
|
+
const afterFileEdit = /^afterFileEdit$/i.test(hookEvent);
|
|
281
|
+
const beforeReadFile = /^beforeReadFile$/i.test(hookEvent);
|
|
282
|
+
const beforeTabFileRead = /^beforeTabFileRead$/i.test(hookEvent);
|
|
283
|
+
const edits = Array.isArray(raw.edits) ? raw.edits.map(record).filter((edit) => edit !== void 0) : [];
|
|
284
|
+
const filePath = cursorPath(raw.file_path);
|
|
285
|
+
if (filePath && edits.length > 0) {
|
|
286
|
+
const files = edits.map((edit) => ({
|
|
287
|
+
filePath,
|
|
288
|
+
oldString: str(edit.old_string),
|
|
289
|
+
content: str(edit.new_string) ?? "",
|
|
290
|
+
op: "update"
|
|
291
|
+
}));
|
|
292
|
+
return {
|
|
293
|
+
...metadata,
|
|
294
|
+
phase: contract.phase,
|
|
295
|
+
tool: "Edit",
|
|
296
|
+
input,
|
|
297
|
+
filePath,
|
|
298
|
+
content: files.map((file) => file.content).join("\n"),
|
|
299
|
+
files
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const commands = cursorCommands(raw, input);
|
|
303
|
+
const command = commands[0];
|
|
304
|
+
return {
|
|
305
|
+
...metadata,
|
|
306
|
+
phase: contract.phase,
|
|
307
|
+
tool: afterFileEdit ? "Edit" : beforeReadFile || beforeTabFileRead ? "Read" : cursorToolName(raw, hookEvent, str(raw.tool_name), command !== void 0),
|
|
308
|
+
input,
|
|
309
|
+
filePath: cursorPath(input.file_path) ?? cursorPath(input.path),
|
|
310
|
+
content: str(input.content) ?? str(input.new_string),
|
|
311
|
+
oldString: str(input.old_string),
|
|
312
|
+
command,
|
|
313
|
+
commandCandidates: /^beforeMCPExecution$/i.test(hookEvent) && commands.length > 0 ? commands : void 0
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
//#endregion
|
|
317
|
+
export { cursorProjectCwd as n, cursorEventContract as r, extractCursorEvent as t };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
//#region src/adapters/codex/apply-patch.ts
|
|
2
|
+
const BEGIN = "*** Begin Patch";
|
|
3
|
+
const END = "*** End Patch";
|
|
4
|
+
const ADD = "*** Add File: ";
|
|
5
|
+
const DEL = "*** Delete File: ";
|
|
6
|
+
const UPD = "*** Update File: ";
|
|
7
|
+
const MOVE = "*** Move to: ";
|
|
8
|
+
const EOF = "*** End of File";
|
|
9
|
+
const ENV = "*** Environment ID: ";
|
|
10
|
+
/**
|
|
11
|
+
* Parse a Codex freeform patch into its per-file changes. Lenient on whitespace
|
|
12
|
+
* around structural markers (as Codex's own parser is); returns `[]` when no
|
|
13
|
+
* recognizable hunk is present (malformed input fails open, not closed).
|
|
14
|
+
* @param text - Raw patch body from `tool_input.command`.
|
|
15
|
+
* @returns One {@link PatchedFile} per Add/Update/Delete hunk, in order.
|
|
16
|
+
*/
|
|
17
|
+
function parseApplyPatch(text) {
|
|
18
|
+
const files = [];
|
|
19
|
+
let cur = null;
|
|
20
|
+
let buf = [];
|
|
21
|
+
const flush = () => {
|
|
22
|
+
if (cur) {
|
|
23
|
+
cur.content = buf.join("\n");
|
|
24
|
+
files.push(cur);
|
|
25
|
+
}
|
|
26
|
+
cur = null;
|
|
27
|
+
buf = [];
|
|
28
|
+
};
|
|
29
|
+
for (const line of text.split("\n")) {
|
|
30
|
+
const marker = line.trimStart();
|
|
31
|
+
if (marker === BEGIN || marker.startsWith(ENV)) continue;
|
|
32
|
+
if (marker === END) {
|
|
33
|
+
flush();
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (marker.startsWith(ADD)) {
|
|
37
|
+
flush();
|
|
38
|
+
cur = {
|
|
39
|
+
path: marker.slice(14).trim(),
|
|
40
|
+
content: "",
|
|
41
|
+
op: "add"
|
|
42
|
+
};
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (marker.startsWith(DEL)) {
|
|
46
|
+
flush();
|
|
47
|
+
files.push({
|
|
48
|
+
path: marker.slice(17).trim(),
|
|
49
|
+
content: "",
|
|
50
|
+
op: "delete"
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (marker.startsWith(UPD)) {
|
|
55
|
+
flush();
|
|
56
|
+
cur = {
|
|
57
|
+
path: marker.slice(17).trim(),
|
|
58
|
+
content: "",
|
|
59
|
+
op: "update"
|
|
60
|
+
};
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (marker.startsWith(MOVE)) {
|
|
64
|
+
if (cur) cur.path = marker.slice(13).trim();
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (marker === EOF || !cur) continue;
|
|
68
|
+
if (cur.op === "add") {
|
|
69
|
+
if (line.startsWith("+")) buf.push(line.slice(1));
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (line.startsWith("@@")) continue;
|
|
73
|
+
if (line.startsWith("+")) buf.push(line.slice(1));
|
|
74
|
+
else if (line.startsWith("-")) continue;
|
|
75
|
+
else buf.push(line.startsWith(" ") ? line.slice(1) : line);
|
|
76
|
+
}
|
|
77
|
+
flush();
|
|
78
|
+
return files;
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/runtime/codex-shell-tool.ts
|
|
82
|
+
/**
|
|
83
|
+
* @module codex-shell-tool
|
|
84
|
+
* Canonicalizes a Codex-only shell `tool_name` alias to `"Bash"`, so every
|
|
85
|
+
* existing `tool === "Bash"` consumer (activity credit, explore-tools
|
|
86
|
+
* classification, the protected-path guard, the design corpus read gate, …)
|
|
87
|
+
* treats a Code Mode exec dispatch exactly like a native Bash call — no
|
|
88
|
+
* per-consumer change needed.
|
|
89
|
+
*
|
|
90
|
+
* A Code Mode-wrapped call (`functions.exec` -> `tools.exec_command(...)`)
|
|
91
|
+
* surfaces via the generic `CoreToolRuntime` hook default (openai/codex#23757,
|
|
92
|
+
* commit 5c20513), which keeps the raw function-tool name `"exec_command"`
|
|
93
|
+
* verbatim — unlike a DIRECT `exec_command` dispatch, which
|
|
94
|
+
* `ExecCommandHandler`'s own `pre_tool_use_payload` override re-labels
|
|
95
|
+
* `"Bash"` (`tool_name: HookToolName::bash()`). This is the exact call chain
|
|
96
|
+
* a real Codex CLI 0.146.0 session was observed emitting for a `sed -n` skill
|
|
97
|
+
* read. Only ONE alias is confirmed here — `ToolName::plain("exec_command")`
|
|
98
|
+
* in `core/src/tools/handlers/unified_exec/exec_command.rs`; `shell`,
|
|
99
|
+
* `unified_exec`, `local_shell`, and `shell_command` were audited but not
|
|
100
|
+
* evidenced as a distinct hook `tool_name` value, so they are deliberately
|
|
101
|
+
* left out rather than guessed.
|
|
102
|
+
* @packageDocumentation
|
|
103
|
+
*/
|
|
104
|
+
/** Codex `tool_name` values that are a shell execution but not literally `"Bash"`. */
|
|
105
|
+
const CODEX_SHELL_TOOL_ALIASES = /* @__PURE__ */ new Set(["exec_command"]);
|
|
106
|
+
/**
|
|
107
|
+
* Canonicalize a Codex-only shell tool alias to `"Bash"`. Scoped to
|
|
108
|
+
* `id === "codex"` — every other harness id, and every non-aliased tool
|
|
109
|
+
* name, passes through unchanged (see `test/codex-shell-read-credit.test.ts`
|
|
110
|
+
* for the non-regression proof).
|
|
111
|
+
* @param id - Harness adapter id (e.g. "codex", "claude-code", "kimi").
|
|
112
|
+
* @param tool - Raw `tool_name` from the hook payload.
|
|
113
|
+
*/
|
|
114
|
+
function canonicalizeCodexShellTool(id, tool) {
|
|
115
|
+
return id === "codex" && CODEX_SHELL_TOOL_ALIASES.has(tool) ? "Bash" : tool;
|
|
116
|
+
}
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region src/runtime/mcp-tool-name.ts
|
|
119
|
+
/**
|
|
120
|
+
* @module mcp-tool-name
|
|
121
|
+
* Canonicalizes a Codex-only MCP `tool_name` alias back to its original
|
|
122
|
+
* hyphenated form, so every existing dash-keyed consumer (`SHOT_TOOLS`,
|
|
123
|
+
* `RESEARCH_TOOLS`/`classifyExplore`, `docSourceOf`, the design-pipeline
|
|
124
|
+
* `NAV`/`SCROLL`/`GEMINI` constants, …) recognizes a Codex MCP call exactly
|
|
125
|
+
* like the same call on Claude/Kimi/Cursor/Cline/Gemini — no per-consumer
|
|
126
|
+
* change needed.
|
|
127
|
+
*
|
|
128
|
+
* Codex CLI globally rewrites every `-` to `_` across the FULL qualified MCP
|
|
129
|
+
* tool identifier before it ever reaches a hook, in `sanitize_responses_api_tool_name()`
|
|
130
|
+
* (`codex-rs/core/src/mcp_connection_manager.rs`, introduced by
|
|
131
|
+
* openai/codex#14605 — "Normalize MCP tool names to code-mode safe form",
|
|
132
|
+
* code-mode forbids `-` in identifiers). openai/codex#18385's own
|
|
133
|
+
* `SCENARIO_DASH_TOOL` test proves the REWRITTEN form is what reaches hooks:
|
|
134
|
+
* the `echo-tool` tool of server `rmcp` is delivered to hooks as
|
|
135
|
+
* `mcp__rmcp__echo_tool`. Confirmed independently in THIS repo's terrain:
|
|
136
|
+
* `~/.codex/config.toml` declares `[mcp_servers.fuse-browser]` (dash) while
|
|
137
|
+
* Codex session logs and this harness's own dual-marketplace hook payloads
|
|
138
|
+
* (`~/.codex/plugins/.../hooks.json` matchers) observe `mcp__fuse_browser__*`
|
|
139
|
+
* (underscore) — Claude never emits that form (0 occurrences across its
|
|
140
|
+
* transcripts vs 137x the dash form).
|
|
141
|
+
*
|
|
142
|
+
* The rewrite is deliberately NOT undone with a generic `_` -> `-` regex:
|
|
143
|
+
* openai/codex#15832 and #15565 document it as NON-INVERSIBLE — a server
|
|
144
|
+
* literally named `autok_local` collides with a dash-named `autok-local`
|
|
145
|
+
* once both pass through the same rewrite, and OpenAI's own fix was a closed
|
|
146
|
+
* canonical table, never a general regex. The SAME ambiguity exists on our
|
|
147
|
+
* side: a generic reversal would corrupt tool segments that legitimately
|
|
148
|
+
* contain an underscore already (`browser_screenshot`, `node_repl`,
|
|
149
|
+
* `build_sim`, …). So this module only reverses the FOUR entries proven
|
|
150
|
+
* above to matter to this repo's gates — every other segment passes through
|
|
151
|
+
* untouched.
|
|
152
|
+
* @packageDocumentation
|
|
153
|
+
*/
|
|
154
|
+
/**
|
|
155
|
+
* Codex-mangled MCP server segment -> its real (dash) server name. Closed set
|
|
156
|
+
* — see module doc. `Object.create(null)` (never a `{}` literal): `serverKey`
|
|
157
|
+
* is an attacker-influenced string (an MCP server can register itself as
|
|
158
|
+
* `"__proto__"`/`"constructor"`/`"toString"`), and a `{}`-literal lookup by
|
|
159
|
+
* such a key returns the INHERITED `Object.prototype` member instead of
|
|
160
|
+
* `undefined` — an object/function, so `?? serverKey` never falls back and
|
|
161
|
+
* the result silently corrupts to `"mcp__[object Object]__…"` (proven in
|
|
162
|
+
* `test/mcp-tool-name.test.ts`, prototype-pollution-read case). A null-
|
|
163
|
+
* prototype object has no inherited members, so every lookup outside the two
|
|
164
|
+
* literal keys below is a clean miss.
|
|
165
|
+
*/
|
|
166
|
+
const SERVER_ALIASES = Object.assign(Object.create(null), {
|
|
167
|
+
fuse_browser: "fuse-browser",
|
|
168
|
+
gemini_design: "gemini-design"
|
|
169
|
+
});
|
|
170
|
+
/**
|
|
171
|
+
* Codex-mangled MCP tool segment -> its real (dash) tool name. Both entries
|
|
172
|
+
* are `context7`-exclusive tool names — applied ONLY when the canonical
|
|
173
|
+
* server is `"context7"` (see the explicit guard in
|
|
174
|
+
* {@link canonicalizeMcpToolName}), never globally. A same-named tool on any
|
|
175
|
+
* other server (e.g. a hypothetical `exa__query_docs`) passes through
|
|
176
|
+
* untouched: openai/codex#15832 documents exactly this class of collision as
|
|
177
|
+
* the reason the rewrite must stay a closed, scoped table, never a blanket
|
|
178
|
+
* one. Closed set, same null-prototype rationale as {@link SERVER_ALIASES}.
|
|
179
|
+
*/
|
|
180
|
+
const TOOL_ALIASES = Object.assign(Object.create(null), {
|
|
181
|
+
query_docs: "query-docs",
|
|
182
|
+
resolve_library_id: "resolve-library-id"
|
|
183
|
+
});
|
|
184
|
+
/**
|
|
185
|
+
* Canonicalize a Codex-only MCP tool-name alias to its dash form. Scoped to
|
|
186
|
+
* `id === "codex"` — every other harness id passes through unchanged. The
|
|
187
|
+
* server segment is rewritten via the closed {@link SERVER_ALIASES} table;
|
|
188
|
+
* the tool segment is rewritten via {@link TOOL_ALIASES} ONLY when the
|
|
189
|
+
* (already-resolved) canonical server is `"context7"` — every other server's
|
|
190
|
+
* tool segment is left untouched even if it happens to share a name with a
|
|
191
|
+
* context7 tool. Every other `mcp__<server>__<tool>` segment (or non-MCP
|
|
192
|
+
* tool name) is returned byte-identical (see `test/mcp-tool-name.test.ts`
|
|
193
|
+
* for the non-regression proof across ids, trap tool names, and the
|
|
194
|
+
* server-scoping cases).
|
|
195
|
+
* @param id - Harness adapter id (e.g. "codex", "claude-code", "kimi").
|
|
196
|
+
* @param tool - Raw `tool_name` from the hook payload.
|
|
197
|
+
*/
|
|
198
|
+
function canonicalizeMcpToolName(id, tool) {
|
|
199
|
+
if (id !== "codex") return tool;
|
|
200
|
+
const parts = tool.split("__");
|
|
201
|
+
if (parts.length < 3 || parts[0] !== "mcp") return tool;
|
|
202
|
+
const serverKey = parts[1] ?? "";
|
|
203
|
+
const toolKey = parts.slice(2).join("__");
|
|
204
|
+
const server = SERVER_ALIASES[serverKey] ?? serverKey;
|
|
205
|
+
return `mcp__${server}__${server === "context7" ? TOOL_ALIASES[toolKey] ?? toolKey : toolKey}`;
|
|
206
|
+
}
|
|
207
|
+
//#endregion
|
|
208
|
+
//#region src/adapters/codex/permission-mode.ts
|
|
209
|
+
/**
|
|
210
|
+
* Codex maps `AskForApproval::Never` -> `permission_mode: "bypassPermissions"`
|
|
211
|
+
* in its hook payload (codex-rs/core/src/hook_runtime.rs::hook_permission_mode)
|
|
212
|
+
* — the only value that isolates `never`; the other three approval policies
|
|
213
|
+
* (`untrusted`, `on-failure`, `on-request`) all collapse to `"default"`.
|
|
214
|
+
* Verified at openai/codex@342e4d4b, hook_runtime.rs run_pre_tool_use_hooks +
|
|
215
|
+
* pre_tool_use.rs PreToolUseRequest. Undocumented implementation detail, not
|
|
216
|
+
* a public contract — see the mapping-regression test that pins this string.
|
|
217
|
+
* @param permissionMode - The payload's `permission_mode` field, if present.
|
|
218
|
+
* @returns True only on an EXACT match — fail-closed. A near-miss
|
|
219
|
+
* (`"BypassPermissions"`, `"bypassPermissions "`, or a substring match) must
|
|
220
|
+
* never accidentally grant the neverApproval exemption.
|
|
221
|
+
*/
|
|
222
|
+
function isBypassPermissions(permissionMode) {
|
|
223
|
+
return permissionMode === "bypassPermissions";
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
export { parseApplyPatch as i, canonicalizeMcpToolName as n, canonicalizeCodexShellTool as r, isBypassPermissions as t };
|
package/dist/policy/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as detectCreationIntent, $t as countFrameworkCodeLines, A as TreeEntry, At as APEX_GATES, B as loadApexTaskState, Bt as evaluate, C as maskCommentsAndStrings, Ct as protectedPathGuard, D as descFromText, Dt as securityGuard, E as missingSeoElements, Et as LabeledPattern, F as EXCLUDE_DIRS, Ft as brainstormGate, G as detectRequiredSkills, Gt as PROJECT_INSTALL, H as buildApexInstruction, Ht as PolicyResult, I as PROJECT_INDICATORS, It as docConsultedGate, J as SKILL_TRIGGERS, Jt as isRalphMode, K as skillTriggerGate, Kt as RALPH_SAFE, L as ApexTaskState, Lt as evaluateApex, M as parseEntry, Mt as ApexGate, N as parseBodyDesc, Nt as POST_AUTH_GATES, O as firstComment, Ot as Guard, P as parseField, Pt as PRE_AUTH_GATES, Q as capVerbosity, Qt as SOLID_REF, R as buildApexTaskContext, Rt as freshnessGate, S as LexProfile, St as PROTECTED_GIT_RE, T as isHtmlLike, Tt as CRITICAL_PATTERNS, U as buildClaudeMdContext, Ut as GIT_ASK, V as DEV_VERBS, Vt as PolicyContext, W as detectClaudeMdProjectType, Wt as GIT_BLOCKED, X as MAX_EXA_RESULTS, Xt as FileSizeVerdict, Y as frameworkSolidGate, Yt as matchPatterns, Z as MAX_TOKENS, Zt as PLUGINS_DIR, _ as isStoresPath, _t as CODE_REDIRECT, a as countStores, an as ProjectType, at as installGuard, b as langOfPath, bt as SESSION_STATE_FRAGMENT, c as InterfaceDeclLevel, cn as isApexCommand, ct as PHP_DECL_RE, d as interfaceDeclLevel, dt as SWIFT_PROTO_RE, en as countLines, et as FAIL_CLOSED, f as LangFamily, ft as TS_DECL_RE, g as isQueryPath, gt as CODE_MUTATORS, h as isInterfacesPath, ht as ASK_WRITERS, i as StoreLib, in as ModularArchitecture, it as runGuards, j as parseEnrichment, jt as ApexContext, k as firstHeading, kt as GuardContext, l as declaresExportedTypeAlias, ln as requiredArchSkill, lt as PY_MODEL_RE, m as isHooksPath, mt as bashWriteGuard, n as importsTanstackQuery, nn as detectFramework, nt as clearUserGuards, o as declaresStore, on as detectModularArchitecture, ot as GO_DECL_RE, p as isComponentsPath, pt as interfaceSeparationGuard, q as usesTailwindUtilities, qt as SYSTEM_INSTALL, r as queryCapActive, rn as DEV_KEYWORDS, rt as registerGuard, s as declaresCustomHook, sn as detectProjectType, st as JAVA_DECL_RE, t as declaresQueryHook, tn as evaluateFileSize, tt as GUARDS, u as declaresInterface, ut as RUST_DECL_RE, v as isTypesPath, vt as FILE_REDIRECT, w as maskCommentsOnly, wt as ASK_PATTERNS, x as lexProfileOf, xt as PROTECTED_FRAGMENTS, y as isVendorPath, yt as SAFE_PREFIXES, z as buildApexTaskInjection, zt as solidReadGate } from "../index-
|
|
1
|
+
import { $ as detectCreationIntent, $t as countFrameworkCodeLines, A as TreeEntry, At as APEX_GATES, B as loadApexTaskState, Bt as evaluate, C as maskCommentsAndStrings, Ct as protectedPathGuard, D as descFromText, Dt as securityGuard, E as missingSeoElements, Et as LabeledPattern, F as EXCLUDE_DIRS, Ft as brainstormGate, G as detectRequiredSkills, Gt as PROJECT_INSTALL, H as buildApexInstruction, Ht as PolicyResult, I as PROJECT_INDICATORS, It as docConsultedGate, J as SKILL_TRIGGERS, Jt as isRalphMode, K as skillTriggerGate, Kt as RALPH_SAFE, L as ApexTaskState, Lt as evaluateApex, M as parseEntry, Mt as ApexGate, N as parseBodyDesc, Nt as POST_AUTH_GATES, O as firstComment, Ot as Guard, P as parseField, Pt as PRE_AUTH_GATES, Q as capVerbosity, Qt as SOLID_REF, R as buildApexTaskContext, Rt as freshnessGate, S as LexProfile, St as PROTECTED_GIT_RE, T as isHtmlLike, Tt as CRITICAL_PATTERNS, U as buildClaudeMdContext, Ut as GIT_ASK, V as DEV_VERBS, Vt as PolicyContext, W as detectClaudeMdProjectType, Wt as GIT_BLOCKED, X as MAX_EXA_RESULTS, Xt as FileSizeVerdict, Y as frameworkSolidGate, Yt as matchPatterns, Z as MAX_TOKENS, Zt as PLUGINS_DIR, _ as isStoresPath, _t as CODE_REDIRECT, a as countStores, an as ProjectType, at as installGuard, b as langOfPath, bt as SESSION_STATE_FRAGMENT, c as InterfaceDeclLevel, cn as isApexCommand, ct as PHP_DECL_RE, d as interfaceDeclLevel, dt as SWIFT_PROTO_RE, en as countLines, et as FAIL_CLOSED, f as LangFamily, ft as TS_DECL_RE, g as isQueryPath, gt as CODE_MUTATORS, h as isInterfacesPath, ht as ASK_WRITERS, i as StoreLib, in as ModularArchitecture, it as runGuards, j as parseEnrichment, jt as ApexContext, k as firstHeading, kt as GuardContext, l as declaresExportedTypeAlias, ln as requiredArchSkill, lt as PY_MODEL_RE, m as isHooksPath, mt as bashWriteGuard, n as importsTanstackQuery, nn as detectFramework, nt as clearUserGuards, o as declaresStore, on as detectModularArchitecture, ot as GO_DECL_RE, p as isComponentsPath, pt as interfaceSeparationGuard, q as usesTailwindUtilities, qt as SYSTEM_INSTALL, r as queryCapActive, rn as DEV_KEYWORDS, rt as registerGuard, s as declaresCustomHook, sn as detectProjectType, st as JAVA_DECL_RE, t as declaresQueryHook, tn as evaluateFileSize, tt as GUARDS, u as declaresInterface, ut as RUST_DECL_RE, v as isTypesPath, vt as FILE_REDIRECT, w as maskCommentsOnly, wt as ASK_PATTERNS, x as lexProfileOf, xt as PROTECTED_FRAGMENTS, y as isVendorPath, yt as SAFE_PREFIXES, z as buildApexTaskInjection, zt as solidReadGate } from "../index-B8PG82su.mjs";
|
|
2
2
|
export { APEX_GATES, ASK_PATTERNS, ASK_WRITERS, ApexContext, ApexGate, ApexTaskState, CODE_MUTATORS, CODE_REDIRECT, CRITICAL_PATTERNS, DEV_KEYWORDS, DEV_VERBS, EXCLUDE_DIRS, FAIL_CLOSED, FILE_REDIRECT, FileSizeVerdict, GIT_ASK, GIT_BLOCKED, GO_DECL_RE, GUARDS, Guard, GuardContext, InterfaceDeclLevel, JAVA_DECL_RE, LabeledPattern, LangFamily, LexProfile, MAX_EXA_RESULTS, MAX_TOKENS, ModularArchitecture, PHP_DECL_RE, PLUGINS_DIR, POST_AUTH_GATES, PRE_AUTH_GATES, PROJECT_INDICATORS, PROJECT_INSTALL, PROTECTED_FRAGMENTS, PROTECTED_GIT_RE, PY_MODEL_RE, type PolicyContext, type PolicyResult, ProjectType, RALPH_SAFE, RUST_DECL_RE, SAFE_PREFIXES, SESSION_STATE_FRAGMENT, SKILL_TRIGGERS, SOLID_REF, SWIFT_PROTO_RE, SYSTEM_INSTALL, StoreLib, TS_DECL_RE, TreeEntry, bashWriteGuard, brainstormGate, buildApexInstruction, buildApexTaskContext, buildApexTaskInjection, buildClaudeMdContext, capVerbosity, clearUserGuards, countFrameworkCodeLines, countLines, countStores, declaresCustomHook, declaresExportedTypeAlias, declaresInterface, declaresQueryHook, declaresStore, descFromText, detectClaudeMdProjectType, detectCreationIntent, detectFramework, detectModularArchitecture, detectProjectType, detectRequiredSkills, docConsultedGate, evaluate, evaluateApex, evaluateFileSize, firstComment, firstHeading, frameworkSolidGate, freshnessGate, importsTanstackQuery, installGuard, interfaceDeclLevel, interfaceSeparationGuard, isApexCommand, isComponentsPath, isHooksPath, isHtmlLike, isInterfacesPath, isQueryPath, isRalphMode, isStoresPath, isTypesPath, isVendorPath, langOfPath, lexProfileOf, loadApexTaskState, maskCommentsAndStrings, maskCommentsOnly, matchPatterns, missingSeoElements, parseBodyDesc, parseEnrichment, parseEntry, parseField, protectedPathGuard, queryCapActive, registerGuard, requiredArchSkill, runGuards, securityGuard, skillTriggerGate, solidReadGate, usesTailwindUtilities };
|