@selesai/code 0.12.0 → 0.13.1
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/CHANGELOG.md +17 -0
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.js +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/usage-totals.d.ts +2 -0
- package/dist/core/usage-totals.js +10 -0
- package/dist/extensions/ascii.txt +9 -0
- package/dist/extensions/package.json +1 -2
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +371 -0
- package/dist/extensions/pi-hermes-memory/LICENSE +21 -0
- package/dist/extensions/pi-hermes-memory/README.md +643 -0
- package/dist/extensions/pi-hermes-memory/docs/0.1/TASKS.md +197 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/PLAN.md +290 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/TASKS.md +134 -0
- package/dist/extensions/pi-hermes-memory/docs/0.2/TEST-PLAN.md +216 -0
- package/dist/extensions/pi-hermes-memory/docs/0.3/PLAN.md +330 -0
- package/dist/extensions/pi-hermes-memory/docs/0.3/TASKS.md +125 -0
- package/dist/extensions/pi-hermes-memory/docs/0.4/PLAN.md +160 -0
- package/dist/extensions/pi-hermes-memory/docs/0.4/TASKS.md +113 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/CHANGELOG.md +57 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/PLAN.md +202 -0
- package/dist/extensions/pi-hermes-memory/docs/0.6/TASKS.md +144 -0
- package/dist/extensions/pi-hermes-memory/docs/0.7/PLAN.md +349 -0
- package/dist/extensions/pi-hermes-memory/docs/0.7/TASKS.md +110 -0
- package/dist/extensions/pi-hermes-memory/docs/PUBLISHING.md +149 -0
- package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +468 -0
- package/dist/extensions/pi-hermes-memory/docs/images/memory-architecture.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi-logo.svg +22 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.png +0 -0
- package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.svg +19 -0
- package/dist/extensions/pi-hermes-memory/docs/images/security-flow.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/session-lifecycle.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/images/source-architecture.svg +1 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/memory-architecture.mmd +49 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/security-flow.mmd +40 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/session-lifecycle.mmd +56 -0
- package/dist/extensions/pi-hermes-memory/docs/mermaid/source-architecture.mmd +54 -0
- package/dist/extensions/pi-hermes-memory/package-lock.json +3799 -0
- package/dist/extensions/pi-hermes-memory/package.json +66 -0
- package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +99 -0
- package/dist/extensions/pi-hermes-memory/scripts/ensure-dev.mjs +57 -0
- package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +6 -0
- package/dist/extensions/pi-hermes-memory/src/config.ts +178 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +424 -0
- package/dist/extensions/pi-hermes-memory/src/extension-root-migration.ts +639 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +401 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +297 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/child-process-watchdog.mjs +90 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +300 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +86 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +78 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/interview.ts +37 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/learn-memory.ts +186 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/message-parts.ts +27 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/pi-child-process.ts +485 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/preview-context.ts +105 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +506 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +145 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +151 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-live-index.ts +94 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +1334 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/standing-pin.ts +111 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/switch-project.ts +75 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +266 -0
- package/dist/extensions/pi-hermes-memory/src/index.ts +378 -0
- package/dist/extensions/pi-hermes-memory/src/lifecycle-timing.ts +54 -0
- package/dist/extensions/pi-hermes-memory/src/paths.ts +61 -0
- package/dist/extensions/pi-hermes-memory/src/project-context.ts +13 -0
- package/dist/extensions/pi-hermes-memory/src/project-memory-migration.ts +93 -0
- package/dist/extensions/pi-hermes-memory/src/project.ts +157 -0
- package/dist/extensions/pi-hermes-memory/src/prompt-context.ts +55 -0
- package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +375 -0
- package/dist/extensions/pi-hermes-memory/src/store/canonical-storage-path.ts +54 -0
- package/dist/extensions/pi-hermes-memory/src/store/content-scanner.ts +101 -0
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +1180 -0
- package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +101 -0
- package/dist/extensions/pi-hermes-memory/src/store/markdown-mutation-lock.ts +38 -0
- package/dist/extensions/pi-hermes-memory/src/store/memory-lookup.ts +24 -0
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +1191 -0
- package/dist/extensions/pi-hermes-memory/src/store/recovery-maintenance.ts +66 -0
- package/dist/extensions/pi-hermes-memory/src/store/schema.ts +118 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-anchor-search.ts +472 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +511 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-parser.ts +213 -0
- package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +234 -0
- package/dist/extensions/pi-hermes-memory/src/store/skill-store.ts +950 -0
- package/dist/extensions/pi-hermes-memory/src/store/skill-utils.ts +133 -0
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +1002 -0
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-native.ts +241 -0
- package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +247 -0
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +95 -0
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +469 -0
- package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +246 -0
- package/dist/extensions/pi-hermes-memory/src/tools/shared-output-view.ts +170 -0
- package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +333 -0
- package/dist/extensions/pi-hermes-memory/src/tools/tool-result-views.ts +105 -0
- package/dist/extensions/pi-hermes-memory/src/types.ts +214 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +434 -0
- package/dist/extensions/pi-hermes-memory/tests/extension-root-migration.test.ts +368 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +984 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +950 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/correction-detector.test.ts +671 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +157 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/interview.test.ts +127 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/pi-child-process.test.ts +905 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/preview-context.test.ts +152 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/prompt-context.test.ts +166 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/resources-discover.test.ts +71 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +614 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +192 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +677 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-live-index.test.ts +225 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +827 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/standing-pin.test.ts +134 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +491 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +199 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/thinking-max.test.ts +64 -0
- package/dist/extensions/pi-hermes-memory/tests/index.test.ts +30 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/flow.test.ts +126 -0
- package/dist/extensions/pi-hermes-memory/tests/lifecycle-timing.test.ts +76 -0
- package/dist/extensions/pi-hermes-memory/tests/paths.test.ts +23 -0
- package/dist/extensions/pi-hermes-memory/tests/project-memory-migration.test.ts +80 -0
- package/dist/extensions/pi-hermes-memory/tests/project-rebinding.test.ts +115 -0
- package/dist/extensions/pi-hermes-memory/tests/project.test.ts +120 -0
- package/dist/extensions/pi-hermes-memory/tests/run-all-timeout.test.ts +107 -0
- package/dist/extensions/pi-hermes-memory/tests/run-all.sh +45 -0
- package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-coordinator.test.ts +381 -0
- package/dist/extensions/pi-hermes-memory/tests/store/content-scanner.test.ts +388 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +1046 -0
- package/dist/extensions/pi-hermes-memory/tests/store/markdown-mutation-lock.test.ts +34 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +2150 -0
- package/dist/extensions/pi-hermes-memory/tests/store/recovery-maintenance.test.ts +170 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-anchor-search.test.ts +210 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +643 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-parser.test.ts +282 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +287 -0
- package/dist/extensions/pi-hermes-memory/tests/store/skill-store.test.ts +678 -0
- package/dist/extensions/pi-hermes-memory/tests/store/skill-utils.test.ts +21 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-lazy-load.test.ts +78 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +543 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +164 -0
- package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +171 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +84 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +709 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/session-search-tool.test.ts +345 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/shared-output-view.test.ts +362 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +478 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/tool-result-renderer-wiring.test.ts +40 -0
- package/dist/extensions/pi-hermes-memory/tsconfig.json +19 -0
- package/dist/extensions/pi-subagents/.oxlintrc.json +43 -0
- package/dist/extensions/pi-subagents/AGENTS.md +5 -0
- package/dist/extensions/pi-subagents/CHANGELOG.md +157 -0
- package/dist/extensions/pi-subagents/README.md +12 -6
- package/dist/extensions/pi-subagents/VISION.md +81 -0
- package/dist/extensions/pi-subagents/agents/claude-code-writer.md +15 -0
- package/dist/extensions/pi-subagents/agents/claude-code.md +15 -0
- package/dist/extensions/pi-subagents/agents/codex-exec-writer.md +15 -0
- package/dist/extensions/pi-subagents/agents/codex-exec.md +15 -0
- package/dist/extensions/pi-subagents/agents/cursor-agent-writer.md +14 -0
- package/dist/extensions/pi-subagents/agents/cursor-agent.md +14 -0
- package/dist/extensions/pi-subagents/agents/reviewer.md +1 -3
- package/dist/extensions/pi-subagents/docs/agents.md +488 -0
- package/dist/extensions/pi-subagents/docs/configuration.md +46 -9
- package/dist/extensions/pi-subagents/docs/extension-api.md +42 -3
- package/dist/extensions/pi-subagents/docs/models.md +27 -4
- package/dist/extensions/pi-subagents/docs/observability.md +10 -9
- package/dist/extensions/pi-subagents/docs/tool-reference.md +102 -6
- package/dist/extensions/pi-subagents/docs/workflows.md +135 -0
- package/dist/extensions/pi-subagents/package-lock.json +389 -2
- package/dist/extensions/pi-subagents/package.json +3 -1
- package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
- package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +3 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +7 -3
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +26 -5
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +41 -22
- package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +4 -4
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +9 -2
- package/dist/extensions/pi-subagents/src/agents/agents.ts +322 -75
- package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +6 -0
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-events.ts +70 -0
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +27 -20
- package/dist/extensions/pi-subagents/src/api/agents.ts +10 -5
- package/dist/extensions/pi-subagents/src/api/background-work.ts +5 -1
- package/dist/extensions/pi-subagents/src/api/delegation.ts +0 -7
- package/dist/extensions/pi-subagents/src/api/preflight.ts +34 -12
- package/dist/extensions/pi-subagents/src/extension/config.ts +70 -0
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +3 -3
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -3
- package/dist/extensions/pi-subagents/src/extension/index.ts +83 -30
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +44 -15
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +55 -19
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +41 -15
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -31
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -1
- package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -10
- package/dist/extensions/pi-subagents/src/inspectors/herdr/session-roots-codec.ts +42 -0
- package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +51 -3
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +2 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +5 -6
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +77 -10
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +176 -53
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +19 -12
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +29 -27
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +20 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +23 -261
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +73 -7
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +8 -3
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +74 -8
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +37 -21
- package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +8 -8
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +184 -9
- package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +45 -0
- package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +28 -14
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +38 -15
- package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +50 -13
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +93 -8
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +10 -4
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +4 -14
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +549 -377
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +58 -10
- package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +26 -1
- package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +23 -9
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +9 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +204 -129
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +9 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +23 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +773 -311
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +140 -115
- package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +119 -0
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +463 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +19 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +151 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +21 -7
- package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +129 -0
- package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +89 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +167 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +122 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +348 -55
- package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +5 -5
- package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +230 -0
- package/dist/extensions/pi-subagents/src/runs/shared/lane-metadata.ts +105 -0
- package/dist/extensions/pi-subagents/src/runs/shared/launch-cwd.ts +16 -0
- package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +422 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +221 -158
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +197 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +69 -7
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +47 -6
- package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +7 -2
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +9 -3
- package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +419 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +15 -1
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +81 -8
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +13 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +21 -1
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +44 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +98 -13
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +847 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +18 -0
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +46 -0
- package/dist/extensions/pi-subagents/src/shared/extension-context.ts +24 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +21 -0
- package/dist/extensions/pi-subagents/src/shared/formatters.ts +18 -3
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +5 -1
- package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +450 -0
- package/dist/extensions/pi-subagents/src/shared/session-file-trust.ts +19 -0
- package/dist/extensions/pi-subagents/src/shared/session-tokens.ts +14 -3
- package/dist/extensions/pi-subagents/src/shared/settings.ts +19 -105
- package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +17 -0
- package/dist/extensions/pi-subagents/src/shared/types.ts +359 -40
- package/dist/extensions/pi-subagents/src/shared/utils.ts +41 -84
- package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +116 -0
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -9
- package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +0 -4
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +1 -2
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +378 -88
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +22 -11
- package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +3 -0
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +147 -79
- package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +11 -5
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +39 -18
- package/dist/extensions/pi-subagents/src/tui/render.ts +369 -46
- package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +1 -1
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +6 -3
- package/dist/extensions/pi-subagents/src/workflows/host-command.ts +230 -0
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +740 -58
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +121 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +270 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +195 -6
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +246 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1114 -260
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +150 -3
- package/dist/extensions/pi-subagents/test/integration/claude-code-smoke.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/integration/claude-code-writer-smoke.test.ts +55 -0
- package/dist/extensions/pi-subagents/test/integration/codex-exec-smoke.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/integration/codex-exec-writer-smoke.test.ts +57 -0
- package/dist/extensions/pi-subagents/test/integration/cursor-agent-smoke.test.ts +59 -0
- package/dist/extensions/pi-subagents/test/integration/cursor-agent-writer-smoke.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +57 -1
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +20 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +4 -3
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +54 -4
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +482 -4
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +157 -9
- package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +5 -5
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1508 -291
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +423 -1
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/support/cursor-smoke-inputs.ts +51 -0
- package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +5 -5
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/abort-recovery.test.ts +152 -0
- package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +48 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +184 -6
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +66 -6
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +77 -0
- package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +18 -0
- package/dist/extensions/pi-subagents/test/unit/anti-slop-oxlint.test.ts +86 -0
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +101 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +121 -0
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +28 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +14 -7
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +190 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-snapshot.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +8 -4
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +78 -1
- package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-name.test.ts +50 -0
- package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +245 -0
- package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +192 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +150 -0
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +259 -0
- package/dist/extensions/pi-subagents/test/unit/cursor-smoke-inputs.test.ts +77 -0
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +1 -4
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/extension-context.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +223 -0
- package/dist/extensions/pi-subagents/test/unit/fast-mode-extension.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +208 -2
- package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +29 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +110 -1
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +10 -0
- package/dist/extensions/pi-subagents/test/unit/formatters.test.ts +14 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +18 -9
- package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +63 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +132 -0
- package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +156 -0
- package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +98 -0
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +178 -26
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +2 -1
- package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +138 -0
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +91 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +72 -7
- package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +20 -2
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +129 -1
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +4 -0
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +358 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +574 -21
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +109 -1
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +71 -1
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +214 -0
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +29 -8
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/result-delivery-ownership.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +101 -3
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +10 -8
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +71 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +41 -7
- package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +136 -2
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +137 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +33 -12
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +504 -1
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +12 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +3 -5
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +5 -6
- package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +0 -8
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +5 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +157 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +63 -4
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +27 -23
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +44 -0
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +7 -5
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +106 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +484 -9
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +38 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-preflight.test.ts +155 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +318 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +365 -0
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +349 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +2 -7
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/index.ts +13 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/rules/no-service-constructor-imports.ts +52 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/index.ts +41 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-chained-type-assertions.ts +77 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts +49 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-known-value-widening.ts +247 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-module-mocking.ts +91 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-object-parameters.ts +126 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-apply.ts +28 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-get.ts +28 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-runtime-typeof.ts +67 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts +39 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-parameters.ts +83 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-returns.ts +115 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-type-aliases.ts +72 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts +134 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts +366 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/require-safety-comment-for-type-assertion.ts +62 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/dictionary-types.ts +502 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/lexical-type-parameters.ts +60 -0
- package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/reflect-method.ts +35 -0
- package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +1 -1
- package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +2 -2
- package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +1 -1
- package/dist/extensions/pi-zentui/extensions/zentui/format.ts +2 -1
- package/dist/extensions/pi-zentui/test/format.test.ts +15 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/interactive-mode.js +11 -11
- package/dist/skills/workflow/SKILL.md +65 -50
- package/package.json +112 -110
- package/dist/extensions/enable-readonly-tools.test.ts +0 -63
- package/dist/extensions/enable-readonly-tools.ts +0 -24
- package/dist/extensions/model-prompt-injector/config.json +0 -16
- package/dist/extensions/model-prompt-injector/index.test.ts +0 -102
- package/dist/extensions/model-prompt-injector/index.ts +0 -148
- package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +0 -98
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +0 -250
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
import type { MemoryConfig, ThinkingLevel } from "../types.js";
|
|
8
|
+
import { AGENT_ROOT } from "../paths.js";
|
|
9
|
+
|
|
10
|
+
type ChildLlmConfig = Pick<MemoryConfig, "llmModelOverride" | "llmThinkingOverride" | "childExtensionPaths">;
|
|
11
|
+
|
|
12
|
+
interface PiExecResult {
|
|
13
|
+
code: number;
|
|
14
|
+
stdout?: string;
|
|
15
|
+
stderr?: string;
|
|
16
|
+
killed?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ChildPiModel {
|
|
20
|
+
provider: string;
|
|
21
|
+
id: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function resolveChildPiModel(
|
|
25
|
+
model: { provider?: string; id?: string } | undefined,
|
|
26
|
+
): ChildPiModel | undefined {
|
|
27
|
+
return model?.provider && model.id
|
|
28
|
+
? { provider: model.provider, id: model.id }
|
|
29
|
+
: undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface ExecChildPromptOptions {
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
cwd?: string;
|
|
35
|
+
model?: ChildPiModel;
|
|
36
|
+
timeoutMs: number;
|
|
37
|
+
retryWithoutOverrides?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface ExecChildPromptDependencies {
|
|
41
|
+
removeTemporaryDirectory: (dir: string) => Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const DEFAULT_EXEC_CHILD_PROMPT_DEPENDENCIES: ExecChildPromptDependencies = {
|
|
45
|
+
removeTemporaryDirectory: async (dir) => {
|
|
46
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const WATCHDOG_EXIT_GRACE_MS = 5000;
|
|
51
|
+
const CHILD_PROCESS_WATCHDOG_PATH = fileURLToPath(
|
|
52
|
+
new URL("./child-process-watchdog.mjs", import.meta.url),
|
|
53
|
+
);
|
|
54
|
+
export interface ChildPiInvocation {
|
|
55
|
+
command: string;
|
|
56
|
+
args: string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface ResolveChildPiInvocationOptions {
|
|
60
|
+
platform?: NodeJS.Platform;
|
|
61
|
+
execPath?: string;
|
|
62
|
+
argv?: string[];
|
|
63
|
+
piCliPath?: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const OVERRIDE_FAILURE_SUBJECT = /\b(model|provider|thinking)\b/i;
|
|
67
|
+
const OVERRIDE_FAILURE_REASON = /\b(not found|unknown|invalid|unsupported|unavailable|unrecognized|no match|no matches|cannot resolve|failed to resolve)\b/i;
|
|
68
|
+
|
|
69
|
+
// Resolve the path to pi-hermes-memory's own extension entry point.
|
|
70
|
+
// Used to pass -e <path> to child subprocesses so they only load this
|
|
71
|
+
// extension instead of all plugins from settings.json.
|
|
72
|
+
const OWN_EXTENSION_PATH: string = (() => {
|
|
73
|
+
try {
|
|
74
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "../index.ts");
|
|
75
|
+
} catch {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
})();
|
|
79
|
+
|
|
80
|
+
function normalizedModelOverride(config: ChildLlmConfig): string | undefined {
|
|
81
|
+
const trimmed = config.llmModelOverride?.trim();
|
|
82
|
+
return trimmed ? trimmed : undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function effectiveThinkingOverride(config: ChildLlmConfig): ThinkingLevel | undefined {
|
|
86
|
+
return config.llmThinkingOverride ?? (normalizedModelOverride(config) ? "off" : undefined);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function hasChildLlmOverrides(config: ChildLlmConfig): boolean {
|
|
90
|
+
return normalizedModelOverride(config) !== undefined || effectiveThinkingOverride(config) !== undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** @deprecated No longer called after PR #78 — kept for API backward compat. */
|
|
94
|
+
export function inheritedExtensionArgs(argv: string[] = process.argv.slice(2)): string[] {
|
|
95
|
+
const args: string[] = [];
|
|
96
|
+
|
|
97
|
+
for (let i = 0; i < argv.length; i++) {
|
|
98
|
+
const current = argv[i];
|
|
99
|
+
if (current === "-e" || current === "--extension") {
|
|
100
|
+
const next = argv[i + 1];
|
|
101
|
+
if (typeof next === "string" && next.length > 0) {
|
|
102
|
+
args.push(current, next);
|
|
103
|
+
i++;
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (current.startsWith("--extension=")) {
|
|
109
|
+
args.push(current);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return args;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Provider-auth-adapter packages (e.g. Anthropic/xAI/Codex OAuth) inject
|
|
117
|
+
// subscription billing headers via pi.registerProvider(). --no-extensions
|
|
118
|
+
// strips these from child `pi -p` subprocesses, which silently rebills
|
|
119
|
+
// subscription usage as pay-as-you-go "extra usage" instead (see issue #94).
|
|
120
|
+
//
|
|
121
|
+
// pi has no runtime API to enumerate loaded extensions or map a registered
|
|
122
|
+
// provider back to its extension file, so we can't ask pi "what adapter is
|
|
123
|
+
// active" directly. Instead we mirror pi's OWN static package-discovery
|
|
124
|
+
// convention (package.json -> "pi": { "extensions": [...] }, the same field
|
|
125
|
+
// pi-hermes-memory's own package.json declares) and match sibling package
|
|
126
|
+
// names against a naming convention, so a future xai-oauth-adapter or
|
|
127
|
+
// pi-codex-oauth-adapter is picked up automatically without a code change
|
|
128
|
+
// here — no code execution, just JSON reads of sibling package.json files.
|
|
129
|
+
const AUTH_ADAPTER_NAME_PATTERNS: readonly RegExp[] = [
|
|
130
|
+
/(^|[-/])oauth-adapter$/,
|
|
131
|
+
/(^|[-/])auth-adapter$/,
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
// These provider adapters predate the *-auth-adapter convention. Keep this
|
|
135
|
+
// list exact so an arbitrary suffixless *-auth package cannot access child
|
|
136
|
+
// maintenance prompts.
|
|
137
|
+
const AUTH_ADAPTER_PACKAGE_NAMES: ReadonlySet<string> = new Set([
|
|
138
|
+
"pi-claude-auth",
|
|
139
|
+
"@gotgenes/pi-anthropic-auth",
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
function isAuthAdapterPackageName(name: string): boolean {
|
|
143
|
+
return (
|
|
144
|
+
AUTH_ADAPTER_PACKAGE_NAMES.has(name)
|
|
145
|
+
|| AUTH_ADAPTER_NAME_PATTERNS.some((pattern) => pattern.test(name))
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Read a sibling package's "pi": { "extensions": [...] } manifest field —
|
|
150
|
+
// the same field pi's own loader reads — and resolve declared paths
|
|
151
|
+
// relative to that package's directory. Mirrors loader.js#resolveExtensionEntries.
|
|
152
|
+
function readPackageExtensionEntries(packageDir: string): string[] {
|
|
153
|
+
const packageJsonPath = join(packageDir, "package.json");
|
|
154
|
+
if (!existsSync(packageJsonPath)) return [];
|
|
155
|
+
|
|
156
|
+
let manifest: unknown;
|
|
157
|
+
try {
|
|
158
|
+
manifest = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
159
|
+
} catch {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const declaredExtensions = (manifest as { pi?: { extensions?: unknown } } | null)?.pi?.extensions;
|
|
164
|
+
if (!Array.isArray(declaredExtensions)) return [];
|
|
165
|
+
|
|
166
|
+
const entries: string[] = [];
|
|
167
|
+
for (const relativePath of declaredExtensions) {
|
|
168
|
+
if (typeof relativePath !== "string") continue;
|
|
169
|
+
const resolved = resolve(packageDir, relativePath);
|
|
170
|
+
if (existsSync(resolved)) entries.push(resolved);
|
|
171
|
+
}
|
|
172
|
+
return entries;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function scanRootForAuthAdapters(root: string): string[] {
|
|
176
|
+
let entries: string[];
|
|
177
|
+
try {
|
|
178
|
+
entries = readdirSync(root);
|
|
179
|
+
} catch {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const detected: string[] = [];
|
|
184
|
+
for (const entry of entries) {
|
|
185
|
+
if (entry.startsWith("@")) {
|
|
186
|
+
// Scoped org, e.g. @xai/pi-oauth-adapter — one extra level, no deeper.
|
|
187
|
+
const scopeDir = join(root, entry);
|
|
188
|
+
let scopedPackages: string[];
|
|
189
|
+
try {
|
|
190
|
+
scopedPackages = readdirSync(scopeDir);
|
|
191
|
+
} catch {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
for (const scopedName of scopedPackages) {
|
|
195
|
+
if (!isAuthAdapterPackageName(`${entry}/${scopedName}`)) continue;
|
|
196
|
+
detected.push(...readPackageExtensionEntries(join(scopeDir, scopedName)));
|
|
197
|
+
}
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (!isAuthAdapterPackageName(entry)) continue;
|
|
202
|
+
detected.push(...readPackageExtensionEntries(join(root, entry)));
|
|
203
|
+
}
|
|
204
|
+
return detected;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// `roots` is overridable so tests can point this at fixture directories
|
|
208
|
+
// instead of the real sibling-packages trees. Two roots are scanned by
|
|
209
|
+
// default: packages installed alongside pi-hermes-memory's own package
|
|
210
|
+
// (the common npm-managed-extensions layout), and AGENT_ROOT's npm
|
|
211
|
+
// directory (covers pi-hermes-memory being loaded from elsewhere, e.g. a
|
|
212
|
+
// local dev checkout via -e, while the adapter is still npm-managed).
|
|
213
|
+
export function detectAuthAdapterExtensionPaths(roots?: string[]): string[] {
|
|
214
|
+
const searchRoots = roots ?? [
|
|
215
|
+
OWN_EXTENSION_PATH ? resolve(dirname(dirname(OWN_EXTENSION_PATH)), "..") : "",
|
|
216
|
+
join(AGENT_ROOT, "npm", "node_modules"),
|
|
217
|
+
].filter((root) => root.length > 0);
|
|
218
|
+
|
|
219
|
+
const seenRoots: string[] = [];
|
|
220
|
+
const detected: string[] = [];
|
|
221
|
+
for (const root of searchRoots) {
|
|
222
|
+
if (seenRoots.includes(root)) continue;
|
|
223
|
+
seenRoots.push(root);
|
|
224
|
+
detected.push(...scanRootForAuthAdapters(root));
|
|
225
|
+
}
|
|
226
|
+
return detected;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function childExtensionSources(config: ChildLlmConfig): string[] {
|
|
230
|
+
const seen = new Set<string>();
|
|
231
|
+
const sources: string[] = [];
|
|
232
|
+
const append = (candidate: string | undefined): void => {
|
|
233
|
+
const trimmed = candidate?.trim();
|
|
234
|
+
if (!trimmed || seen.has(trimmed)) return;
|
|
235
|
+
seen.add(trimmed);
|
|
236
|
+
sources.push(trimmed);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// These paths are discovered by Hermes rather than explicitly trusted in
|
|
240
|
+
// configuration, so keep the local existence check before forwarding them.
|
|
241
|
+
if (OWN_EXTENSION_PATH && existsSync(OWN_EXTENSION_PATH)) append(OWN_EXTENSION_PATH);
|
|
242
|
+
for (const source of config.childExtensionPaths ?? []) append(source);
|
|
243
|
+
for (const adapterPath of detectAuthAdapterExtensionPaths()) {
|
|
244
|
+
const normalized = resolve(adapterPath);
|
|
245
|
+
if (existsSync(normalized)) append(normalized);
|
|
246
|
+
}
|
|
247
|
+
return sources;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function appendOwnExtensionArgs(args: string[], config: ChildLlmConfig): void {
|
|
251
|
+
// Skip all packages from settings.json (--no-extensions) — the subprocess
|
|
252
|
+
// loads only Hermes and explicitly trusted provider/auth sources. Leave
|
|
253
|
+
// configured sources untouched so Pi's -e resolver owns path expansion and
|
|
254
|
+
// package-source handling exactly as it does for normal CLI invocations.
|
|
255
|
+
args.push("--no-extensions");
|
|
256
|
+
for (const extensionSource of childExtensionSources(config)) {
|
|
257
|
+
args.push("-e", extensionSource);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function buildChildPiPromptArgs(
|
|
262
|
+
prompt: string,
|
|
263
|
+
config: ChildLlmConfig,
|
|
264
|
+
_argv: string[] = process.argv.slice(2),
|
|
265
|
+
activeModel?: ChildPiModel,
|
|
266
|
+
): string[] {
|
|
267
|
+
const args = ["-p", "--no-session"];
|
|
268
|
+
const model = normalizedModelOverride(config)
|
|
269
|
+
?? (activeModel?.provider && activeModel.id ? `${activeModel.provider}/${activeModel.id}` : undefined);
|
|
270
|
+
const thinking = effectiveThinkingOverride(config);
|
|
271
|
+
|
|
272
|
+
if (model) args.push("--model", model);
|
|
273
|
+
if (thinking) args.push("--thinking", thinking);
|
|
274
|
+
appendOwnExtensionArgs(args, config);
|
|
275
|
+
args.push(prompt);
|
|
276
|
+
|
|
277
|
+
return args;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function basePromptArgs(prompt: string, config: ChildLlmConfig, activeModel?: ChildPiModel): string[] {
|
|
281
|
+
// Always use --no-extensions + own path so the retry also avoids loading
|
|
282
|
+
// all settings.json packages — matching the primary code path.
|
|
283
|
+
const args = ["-p", "--no-session"];
|
|
284
|
+
if (activeModel?.provider && activeModel.id) {
|
|
285
|
+
args.push("--model", `${activeModel.provider}/${activeModel.id}`);
|
|
286
|
+
}
|
|
287
|
+
appendOwnExtensionArgs(args, config);
|
|
288
|
+
args.push(prompt);
|
|
289
|
+
return args;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function isCliJsPath(value: string | undefined): value is string {
|
|
293
|
+
if (!value) return false;
|
|
294
|
+
return value.replace(/\\/g, "/").toLowerCase().endsWith("/cli.js");
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function resolvedInstalledPiCliPath(): string | undefined {
|
|
298
|
+
try {
|
|
299
|
+
const packageEntry = import.meta.resolve("@selesai/code");
|
|
300
|
+
const entryPath = fileURLToPath(packageEntry);
|
|
301
|
+
const cliPath = join(dirname(entryPath), "cli.js");
|
|
302
|
+
return existsSync(cliPath) ? cliPath : undefined;
|
|
303
|
+
} catch {
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function resolvedPiCliPath(options: ResolveChildPiInvocationOptions): string | undefined {
|
|
309
|
+
if (options.piCliPath !== undefined) {
|
|
310
|
+
return options.piCliPath ?? undefined;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const argv = options.argv ?? process.argv;
|
|
314
|
+
const currentCli = argv[1];
|
|
315
|
+
if (isCliJsPath(currentCli) && existsSync(currentCli)) {
|
|
316
|
+
return currentCli;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return resolvedInstalledPiCliPath();
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function resolvedWindowsPiInvocation(
|
|
323
|
+
args: string[],
|
|
324
|
+
execPath: string,
|
|
325
|
+
): ChildPiInvocation | undefined {
|
|
326
|
+
const pathEntries = (process.env.PATH ?? process.env.Path ?? "")
|
|
327
|
+
.split(";")
|
|
328
|
+
.map((entry) => entry.trim().replace(/^"|"$/g, ""))
|
|
329
|
+
.filter(Boolean);
|
|
330
|
+
|
|
331
|
+
for (const directory of pathEntries) {
|
|
332
|
+
for (const executableName of ["selesai.exe", "selesai.com"]) {
|
|
333
|
+
const executablePath = join(directory, executableName);
|
|
334
|
+
if (existsSync(executablePath)) {
|
|
335
|
+
return { command: executablePath, args };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (!existsSync(join(directory, "selesai.cmd")) && !existsSync(join(directory, "selesai.bat"))) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
for (const cliPath of [
|
|
344
|
+
join(directory, "node_modules", "@selesai", "code", "dist", "cli.js"),
|
|
345
|
+
join(directory, "node_modules", "@selesai", "code", "cli.js"),
|
|
346
|
+
]) {
|
|
347
|
+
if (existsSync(cliPath)) {
|
|
348
|
+
return { command: execPath, args: [cliPath, ...args] };
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export function resolveChildPiInvocation(
|
|
357
|
+
args: string[],
|
|
358
|
+
options: ResolveChildPiInvocationOptions = {},
|
|
359
|
+
): ChildPiInvocation {
|
|
360
|
+
const platform = options.platform ?? process.platform;
|
|
361
|
+
if (platform !== "win32") {
|
|
362
|
+
return { command: "selesai", args };
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
const piCliPath = resolvedPiCliPath(options);
|
|
366
|
+
if (piCliPath) {
|
|
367
|
+
return {
|
|
368
|
+
command: options.execPath ?? process.execPath,
|
|
369
|
+
args: [piCliPath, ...args],
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const fallback = resolvedWindowsPiInvocation(args, options.execPath ?? process.execPath);
|
|
374
|
+
if (fallback) return fallback;
|
|
375
|
+
|
|
376
|
+
throw new Error("Unable to resolve a directly executable Pi CLI on Windows");
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function resolveWatchedChildPiInvocation(
|
|
380
|
+
invocation: ChildPiInvocation,
|
|
381
|
+
timeoutMs: number,
|
|
382
|
+
cancellationPath = "-",
|
|
383
|
+
): ChildPiInvocation {
|
|
384
|
+
return {
|
|
385
|
+
command: process.execPath,
|
|
386
|
+
args: [
|
|
387
|
+
CHILD_PROCESS_WATCHDOG_PATH,
|
|
388
|
+
String(timeoutMs),
|
|
389
|
+
cancellationPath,
|
|
390
|
+
invocation.command,
|
|
391
|
+
...invocation.args,
|
|
392
|
+
],
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function shouldRetryWithoutOverridesFromText(text: string | undefined): boolean {
|
|
397
|
+
if (!text) return false;
|
|
398
|
+
return OVERRIDE_FAILURE_SUBJECT.test(text) && OVERRIDE_FAILURE_REASON.test(text);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function shouldRetryWithoutOverrides(result: PiExecResult): boolean {
|
|
402
|
+
return shouldRetryWithoutOverridesFromText(result.stderr) || shouldRetryWithoutOverridesFromText(result.stdout);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function shouldRetryWithoutOverridesForError(error: unknown): boolean {
|
|
406
|
+
return shouldRetryWithoutOverridesFromText(String(error));
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
async function writePromptToTemporaryFile(prompt: string): Promise<{ dir: string; filePath: string }> {
|
|
410
|
+
const dir = await fs.mkdtemp(join(os.tmpdir(), "pi-hermes-prompt-"));
|
|
411
|
+
const filePath = join(dir, "prompt.md");
|
|
412
|
+
try {
|
|
413
|
+
await fs.writeFile(filePath, prompt, { encoding: "utf-8", mode: 0o600 });
|
|
414
|
+
return { dir, filePath };
|
|
415
|
+
} catch (error) {
|
|
416
|
+
try { await fs.rm(dir, { recursive: true, force: true }); } catch {}
|
|
417
|
+
throw error;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export async function execChildPrompt(
|
|
422
|
+
pi: Pick<ExtensionAPI, "exec">,
|
|
423
|
+
prompt: string,
|
|
424
|
+
config: ChildLlmConfig,
|
|
425
|
+
options: ExecChildPromptOptions,
|
|
426
|
+
dependencies: ExecChildPromptDependencies = DEFAULT_EXEC_CHILD_PROMPT_DEPENDENCIES,
|
|
427
|
+
): Promise<PiExecResult> {
|
|
428
|
+
const execOptions = {
|
|
429
|
+
cwd: options.cwd,
|
|
430
|
+
timeout: options.timeoutMs + WATCHDOG_EXIT_GRACE_MS,
|
|
431
|
+
};
|
|
432
|
+
const temporaryPrompt = await writePromptToTemporaryFile(prompt);
|
|
433
|
+
const promptReference = `@${temporaryPrompt.filePath}`;
|
|
434
|
+
const cancellationPath = join(temporaryPrompt.dir, "cancel");
|
|
435
|
+
let cancellationRequest: Promise<void> | undefined;
|
|
436
|
+
const requestCancellation = () => {
|
|
437
|
+
cancellationRequest ??= fs.writeFile(cancellationPath, "", { mode: 0o600 }).catch(() => {});
|
|
438
|
+
};
|
|
439
|
+
options.signal?.addEventListener("abort", requestCancellation, { once: true });
|
|
440
|
+
if (options.signal?.aborted) {
|
|
441
|
+
requestCancellation();
|
|
442
|
+
await cancellationRequest;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
try {
|
|
446
|
+
try {
|
|
447
|
+
const invocation = resolveWatchedChildPiInvocation(
|
|
448
|
+
resolveChildPiInvocation(buildChildPiPromptArgs(promptReference, config, process.argv.slice(2), options.model)),
|
|
449
|
+
options.timeoutMs,
|
|
450
|
+
cancellationPath,
|
|
451
|
+
);
|
|
452
|
+
const result = await pi.exec(invocation.command, invocation.args, execOptions) as PiExecResult;
|
|
453
|
+
if (
|
|
454
|
+
result.code === 0 ||
|
|
455
|
+
!options.retryWithoutOverrides ||
|
|
456
|
+
!hasChildLlmOverrides(config) ||
|
|
457
|
+
!shouldRetryWithoutOverrides(result)
|
|
458
|
+
) {
|
|
459
|
+
return result;
|
|
460
|
+
}
|
|
461
|
+
} catch (error) {
|
|
462
|
+
if (
|
|
463
|
+
!options.retryWithoutOverrides ||
|
|
464
|
+
!hasChildLlmOverrides(config) ||
|
|
465
|
+
!shouldRetryWithoutOverridesForError(error)
|
|
466
|
+
) {
|
|
467
|
+
throw error;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const retryInvocation = resolveWatchedChildPiInvocation(
|
|
472
|
+
resolveChildPiInvocation(basePromptArgs(promptReference, config, options.model)),
|
|
473
|
+
options.timeoutMs,
|
|
474
|
+
cancellationPath,
|
|
475
|
+
);
|
|
476
|
+
return await pi.exec(retryInvocation.command, retryInvocation.args, execOptions) as PiExecResult;
|
|
477
|
+
} finally {
|
|
478
|
+
options.signal?.removeEventListener("abort", requestCancellation);
|
|
479
|
+
try {
|
|
480
|
+
await dependencies.removeTemporaryDirectory(temporaryPrompt.dir);
|
|
481
|
+
} catch {
|
|
482
|
+
try { await fs.unlink(temporaryPrompt.filePath); } catch {}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview context command — /memory-preview-context shows the policy-only prompt
|
|
3
|
+
* or legacy memory blocks appended to the system prompt.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
import { MemoryStore } from "../store/memory-store.js";
|
|
8
|
+
import type { StandingInstructions } from "../store/standing-instructions.js";
|
|
9
|
+
import { resolveMemoryPolicyPrompt } from "../prompt-context.js";
|
|
10
|
+
import type { MemoryConfig } from "../types.js";
|
|
11
|
+
import { resolveProjectName, resolveProjectStore, type ProjectNameRef, type ProjectStoreRef } from "../project-context.js";
|
|
12
|
+
|
|
13
|
+
function appendStandingBlock(lines: string[], standing: StandingInstructions | null): number {
|
|
14
|
+
const rendered = standing?.render();
|
|
15
|
+
if (!rendered?.block) return 0;
|
|
16
|
+
lines.push(" ── STANDING INSTRUCTIONS (always injected) ─────────────────");
|
|
17
|
+
lines.push(rendered.block);
|
|
18
|
+
if (rendered.omittedCount > 0) {
|
|
19
|
+
lines.push(` ⚠️ ${rendered.omittedCount} pinned instruction(s) exceed the budget and are NOT injected.`);
|
|
20
|
+
}
|
|
21
|
+
lines.push("");
|
|
22
|
+
return 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function registerPreviewContextCommand(
|
|
26
|
+
pi: ExtensionAPI,
|
|
27
|
+
store: MemoryStore,
|
|
28
|
+
projectStore: ProjectStoreRef,
|
|
29
|
+
projectName: ProjectNameRef,
|
|
30
|
+
config: Pick<MemoryConfig, "memoryMode" | "memoryPolicyStyle" | "memoryPolicyCustomText"> = { memoryMode: "policy-only" },
|
|
31
|
+
standing: StandingInstructions | null = null,
|
|
32
|
+
): void {
|
|
33
|
+
pi.registerCommand("memory-preview-context", {
|
|
34
|
+
description: "Preview the memory policy or legacy memory context blocks",
|
|
35
|
+
handler: async (_args, ctx) => {
|
|
36
|
+
if (config.memoryMode === "policy-only") {
|
|
37
|
+
const policyPrompt = resolveMemoryPolicyPrompt(config);
|
|
38
|
+
const lines: string[] = [];
|
|
39
|
+
lines.push("");
|
|
40
|
+
lines.push(" ╔══════════════════════════════════════════════╗");
|
|
41
|
+
lines.push(" ║ Injected Context Preview ║");
|
|
42
|
+
lines.push(" ╚══════════════════════════════════════════════╝");
|
|
43
|
+
lines.push("");
|
|
44
|
+
lines.push(" Mode: policy-only");
|
|
45
|
+
lines.push(` Policy style: ${config.memoryPolicyStyle ?? "full"}`);
|
|
46
|
+
lines.push(" This is the memory policy appended to the system prompt.");
|
|
47
|
+
lines.push(" Full Markdown memories are NOT injected in this mode.");
|
|
48
|
+
lines.push("");
|
|
49
|
+
let blockCount = 0;
|
|
50
|
+
if (policyPrompt) {
|
|
51
|
+
blockCount++;
|
|
52
|
+
lines.push(policyPrompt);
|
|
53
|
+
lines.push("");
|
|
54
|
+
} else {
|
|
55
|
+
lines.push(" No memory policy context is injected for this policy style.");
|
|
56
|
+
lines.push("");
|
|
57
|
+
}
|
|
58
|
+
blockCount += appendStandingBlock(lines, standing);
|
|
59
|
+
lines.push(` Blocks shown: ${blockCount}`);
|
|
60
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const activeProjectStore = resolveProjectStore(projectStore);
|
|
64
|
+
const activeProjectName = resolveProjectName(projectName);
|
|
65
|
+
const memoryBlock = store.formatForSystemPrompt();
|
|
66
|
+
const projectBlock = activeProjectStore ? activeProjectStore.formatProjectBlock(activeProjectName ?? "") : "";
|
|
67
|
+
|
|
68
|
+
const lines: string[] = [];
|
|
69
|
+
lines.push("");
|
|
70
|
+
lines.push(" ╔══════════════════════════════════════════════╗");
|
|
71
|
+
lines.push(" ║ 👀 Injected Context Preview ║");
|
|
72
|
+
lines.push(" ╚══════════════════════════════════════════════╝");
|
|
73
|
+
lines.push("");
|
|
74
|
+
lines.push(" This is the memory context appended to the system prompt.");
|
|
75
|
+
lines.push(" (Core hidden system instructions are NOT shown.)");
|
|
76
|
+
lines.push("");
|
|
77
|
+
|
|
78
|
+
let blockCount = 0;
|
|
79
|
+
|
|
80
|
+
if (memoryBlock) {
|
|
81
|
+
blockCount++;
|
|
82
|
+
lines.push(" ── MEMORY + USER + RECENT FAILURES ─────────────────────────");
|
|
83
|
+
lines.push(memoryBlock);
|
|
84
|
+
lines.push("");
|
|
85
|
+
}
|
|
86
|
+
if (projectBlock) {
|
|
87
|
+
blockCount++;
|
|
88
|
+
lines.push(` ── PROJECT MEMORY (${activeProjectName ?? ""}) ─────────────────────────`);
|
|
89
|
+
lines.push(projectBlock);
|
|
90
|
+
lines.push("");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
blockCount += appendStandingBlock(lines, standing);
|
|
94
|
+
|
|
95
|
+
if (blockCount === 0) {
|
|
96
|
+
lines.push(" No memory context blocks are currently injected.");
|
|
97
|
+
lines.push(" Add memory entries, then run this command again.");
|
|
98
|
+
lines.push("");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
lines.push(` Blocks shown: ${blockCount}`);
|
|
102
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|