gentle-pi 4.0.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +157 -18
- package/assets/agents/gentle-ai-explore.md +11 -4
- package/assets/agents/gentle-ai-verify.md +23 -4
- package/assets/agents/gentle-ai-worker.md +6 -6
- package/assets/install-wizard/index.html +47 -0
- package/assets/install-wizard/wizard.css +1279 -0
- package/assets/install-wizard/wizard.js +951 -0
- package/assets/orchestrator-delegation.md +70 -163
- package/assets/orchestrator-memory.md +11 -4
- package/assets/orchestrator-prompts.md +48 -0
- package/assets/orchestrator-tracking.md +53 -0
- package/assets/orchestrator-verification.md +28 -0
- package/assets/orchestrator-writer.md +38 -0
- package/assets/orchestrator.md +29 -25
- package/assets/sounds/LICENSE.md +52 -0
- package/assets/sounds/attention.wav +0 -0
- package/assets/sounds/error.wav +0 -0
- package/assets/sounds/success.wav +0 -0
- package/bin/engram-guard +9 -0
- package/bin/gentle-shell-install.mjs +302 -0
- package/bin/gentle-shell.mjs +708 -22
- package/contracts/review-provider-contract-mirror/provider-contract.lock.json +7 -7
- package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/manifest.json +2 -2
- package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/orchestration/pi.md +16 -4
- package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/generated/provider-capabilities.baseline.json +2 -2
- package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/generated/provider-roles.baseline.json +1 -1
- package/docs/auto-permission-answers.md +25 -0
- package/docs/auto-permission-evidence.md +39 -0
- package/docs/bundled-install.md +399 -0
- package/docs/delegated-verification.md +3 -5
- package/docs/gentle-agents-activity.md +513 -0
- package/docs/gentle-shell-uninstall.md +136 -0
- package/docs/gentle-shell.md +90 -33
- package/docs/install-wizard.md +2040 -0
- package/docs/native-authority-architecture.md +1 -1
- package/docs/permission-modes.md +127 -0
- package/docs/prompt-history.md +1 -1
- package/docs/readme-reference.md +310 -47
- package/docs/render-cache-performance.md +28 -0
- package/docs/session-profile-format.md +39 -0
- package/docs/sound-notifications-proposal.md +191 -0
- package/docs/sound-notifications.md +114 -0
- package/docs/yolo-mode.md +11 -10
- package/extensions/ask-user-choice.ts +4 -0
- package/extensions/ask-user-question.ts +6 -1
- package/extensions/child-context.ts +11 -2
- package/extensions/child-safety.ts +4 -2
- package/extensions/codegraph-tools.ts +18 -5
- package/extensions/gentle-agents.ts +718 -87
- package/extensions/gentle-ai.ts +991 -263
- package/extensions/gentle-herdr-activity.ts +81 -0
- package/extensions/gentle-notifications.ts +104 -0
- package/extensions/gentle-shell.ts +271 -80
- package/extensions/gentle-todo.ts +123 -18
- package/extensions/history/index.ts +11 -6
- package/extensions/pi-pretty.ts +39 -3
- package/extensions/quiet-tools.ts +91 -21
- package/extensions/skill-registry.ts +175 -46
- package/extensions/startup-banner.ts +11 -2
- package/lib/agent-home.ts +10 -1
- package/lib/agent-model-resolution.ts +80 -0
- package/lib/agent-profiles.ts +13 -3
- package/lib/agents-completion-delivery.ts +11 -3
- package/lib/agents-messaging.ts +1 -1
- package/lib/agents-protocol.ts +40 -1
- package/lib/agents-runner.ts +90 -15
- package/lib/auto-permission-answers.ts +133 -0
- package/lib/auto-permission-classifier.ts +459 -0
- package/lib/auto-permission-evidence.ts +88 -0
- package/lib/auto-permission-memory.ts +69 -0
- package/lib/auto-permission-runtime.ts +484 -0
- package/lib/auto-permission-tool-context.ts +61 -0
- package/lib/background-jobs-tools.ts +202 -0
- package/lib/background-jobs.ts +253 -0
- package/lib/background-monitor.ts +154 -0
- package/lib/bounded-writer-admission.ts +83 -10
- package/lib/builtin-codemode-optout.ts +166 -0
- package/lib/card-content-policy.ts +85 -0
- package/lib/child-package-injection.ts +62 -0
- package/lib/codemode-renderer.ts +14 -4
- package/lib/command-palette-catalog.ts +3 -2
- package/lib/context-threshold.ts +26 -0
- package/lib/destructive-command-guard.ts +104 -28
- package/lib/gentle-ai-binary.ts +109 -4
- package/lib/gentle-shell-bundled.ts +535 -0
- package/lib/gentle-shell-launcher.ts +75 -24
- package/lib/gentle-shell-startup-flow.ts +54 -0
- package/lib/gentle-shell-startup-update.ts +92 -0
- package/lib/gentle-shell-uninstall.ts +840 -0
- package/lib/gentle-shell-update-panel.ts +231 -0
- package/lib/herdr-activity.ts +183 -0
- package/lib/inprocess-reviewer.ts +3 -0
- package/lib/jobs-sidebar-state.ts +20 -0
- package/lib/jobs-view.ts +161 -0
- package/lib/model-price-ratio.ts +83 -0
- package/lib/model-routing-authority.ts +6 -1
- package/lib/nan-provider.ts +33 -11
- package/lib/native-review-cli.ts +194 -73
- package/lib/notification-audio-native.ts +162 -0
- package/lib/notification-audio-windows.ts +399 -0
- package/lib/notification-audio.ts +332 -0
- package/lib/notification-customize.ts +241 -0
- package/lib/notification-events.ts +113 -0
- package/lib/notification-policy.ts +148 -0
- package/lib/notification-pulse-client.ts +367 -0
- package/lib/notification-pulse-protocol.ts +305 -0
- package/lib/notification-pulse-stream.ts +213 -0
- package/lib/notification-pulse-worker.ts +66 -0
- package/lib/notification-scheduler.ts +173 -0
- package/lib/notification-service.ts +202 -0
- package/lib/notification-ui.ts +87 -0
- package/lib/odd-phase.ts +1 -1
- package/lib/orchestrator-alias.ts +20 -0
- package/lib/orchestrator-catalog.ts +79 -0
- package/lib/orchestrator-consultation.ts +61 -0
- package/lib/orchestrator-discovery.ts +49 -0
- package/lib/orchestrator-helper-consent.ts +122 -0
- package/lib/orchestrator-helper.ts +167 -0
- package/lib/orchestrator-message-card.ts +105 -0
- package/lib/orchestrator-presence.ts +115 -14
- package/lib/orchestrator-scope.ts +80 -0
- package/lib/orchestrator-state.ts +107 -0
- package/lib/orchestrator-tool-card.ts +280 -0
- package/lib/orchestrator-work-search.ts +218 -0
- package/lib/orchestrator-work.ts +79 -0
- package/lib/permission-mode-policy.ts +59 -0
- package/lib/review-candidate-view-owner.ts +8 -6
- package/lib/review-candidate-view.ts +3 -2
- package/lib/review-compact-contract.ts +2 -2
- package/lib/review-host-relay.ts +7 -2
- package/lib/review-integration-v2.ts +100 -22
- package/lib/review-publication-gate.ts +1 -1
- package/lib/review-risk-assessment.ts +77 -51
- package/lib/review-sidebar-state.ts +2 -1
- package/lib/review-transaction.ts +72 -3
- package/lib/runtime-metrics-children.ts +1 -1
- package/lib/runtime-metrics-native.ts +3 -2
- package/lib/selection-engine.ts +22 -7
- package/lib/session-change-capture.ts +5 -4
- package/lib/session-changes.ts +27 -22
- package/lib/session-profile-binding.ts +83 -0
- package/lib/session-profile-freeze.ts +261 -0
- package/lib/session-profile-persistence.ts +187 -0
- package/lib/session-worktree-registry.ts +74 -8
- package/lib/shell-bar.ts +41 -11
- package/lib/shell-changes-view.ts +40 -13
- package/lib/shell-changes.ts +88 -71
- package/lib/shell-prompt.ts +6 -4
- package/lib/shell-sidebar-layout.ts +5 -1
- package/lib/shell-todo.ts +81 -26
- package/lib/shell-usage.ts +4 -3
- package/lib/status-timing-diagnostics.ts +201 -0
- package/lib/telemetry-trigger.ts +3 -1
- package/lib/vim-editor-adapter.ts +27 -5
- package/lib/visual-customization-policy.ts +20 -9
- package/lib/visual-customize-view.ts +171 -20
- package/lib/writer-surfaces.ts +162 -0
- package/lib/yolo-session-policy.ts +198 -121
- package/package.json +5 -5
- package/runtime/child-package-injection.mjs +63 -0
- package/runtime/gentle-ai-binary.mjs +109 -4
- package/runtime/gentle-shell-bundled.mjs +536 -0
- package/runtime/gentle-shell-launcher.mjs +74 -23
- package/runtime/gentle-shell-startup-flow.mjs +55 -0
- package/runtime/gentle-shell-startup-update.mjs +93 -0
- package/runtime/gentle-shell-uninstall.mjs +841 -0
- package/runtime/gentle-shell-update-panel.mjs +232 -0
- package/runtime/native-review-cli.mjs +191 -70
- package/runtime/review-integration-v2.mjs +100 -22
- package/runtime/review-risk-assessment.mjs +77 -51
- package/runtime/status-timing-diagnostics.mjs +202 -0
- package/runtime/telemetry-trigger.mjs +3 -1
- package/scripts/bootstrap.cmd +255 -0
- package/scripts/bootstrap.sh +168 -0
- package/scripts/build-distribution.mjs +157 -0
- package/scripts/build-installer-bundles.mjs +136 -0
- package/scripts/build-runtime-modules.mjs +7 -0
- package/scripts/bundled-install.mjs +1308 -0
- package/scripts/bundled-wizard.mjs +399 -0
- package/scripts/check-types.mjs +4 -6
- package/scripts/gentle-ai-installer.mjs +79 -32
- package/scripts/install-gentle-ai.mjs +48 -1
- package/scripts/install-tui-mode-setting.mjs +10 -1
- package/scripts/install-wizard-preview.mjs +154 -0
- package/scripts/installer-downloads.mjs +648 -0
- package/scripts/installer-preflight.mjs +387 -0
- package/scripts/installer-probes.mjs +564 -0
- package/scripts/installer-runner.mjs +1102 -0
- package/scripts/installer-server.mjs +881 -0
- package/scripts/installer-windows-artifacts.json +15 -0
- package/scripts/installer-windows.mjs +752 -0
- package/scripts/main-channel.mjs +452 -0
- package/scripts/npm-pack-result.mjs +31 -0
- package/scripts/pi-update.mjs +223 -0
- package/scripts/render-cache-performance-worker.mjs +205 -0
- package/scripts/render-cache-performance.mjs +115 -0
- package/scripts/run-test-suite.mjs +22 -8
- package/scripts/test-installer-acceptance.sh +161 -0
- package/scripts/test-packed-runner.mjs +23 -5
- package/scripts/types-baseline.json +2 -92
- package/scripts/verify-package-files.mjs +82 -18
- package/skills/gentle-ai/SKILL.md +12 -11
- package/tests/agent-home.test.ts +56 -3
- package/tests/agent-model-resolution.test.ts +113 -0
- package/tests/agent-profiles.test.ts +12 -0
- package/tests/agent-risk-escalation.test.ts +123 -0
- package/tests/agents-completion-delivery.test.ts +17 -0
- package/tests/agents-protocol.test.ts +57 -0
- package/tests/agents-queries.test.ts +9 -9
- package/tests/agents-runner-process.test.ts +31 -0
- package/tests/agents-runner.test.ts +89 -4
- package/tests/append-system-prompt-route.test.ts +18 -1
- package/tests/auto-mode-human-answers.test.ts +68 -0
- package/tests/auto-mode-invariants.test.ts +276 -0
- package/tests/auto-mode-sdk.test.ts +84 -0
- package/tests/auto-mode.test.ts +49 -0
- package/tests/auto-permission-answers.test.ts +170 -0
- package/tests/auto-permission-classifier.test.ts +634 -0
- package/tests/auto-permission-compound.test.ts +24 -0
- package/tests/auto-permission-evidence.test.ts +88 -0
- package/tests/auto-permission-memory.test.ts +46 -0
- package/tests/auto-permission-public-regressions.test.ts +111 -0
- package/tests/auto-permission-runtime.test.ts +454 -0
- package/tests/autonomous-guard.test.ts +86 -16
- package/tests/background-cache-warming.test.ts +2 -1
- package/tests/background-jobs.test.ts +227 -0
- package/tests/background-monitor.test.ts +195 -0
- package/tests/background-subagents-default-mode.test.ts +28 -5
- package/tests/bounded-stop-contract.test.ts +85 -0
- package/tests/bounded-writer-admission.test.ts +52 -1
- package/tests/bridge-wake-lifecycle.test.ts +129 -0
- package/tests/bridge-wake-rendering.test.ts +56 -0
- package/tests/build-distribution.test.ts +269 -0
- package/tests/builtin-codemode-optout.test.ts +242 -0
- package/tests/bundled-install.test.ts +1319 -0
- package/tests/bundled-wizard.test.ts +505 -0
- package/tests/card-content-policy.test.ts +68 -0
- package/tests/card-style-policy.test.ts +34 -2
- package/tests/child-codegraph-bootstrap.test.ts +74 -0
- package/tests/child-package-entrypoints.test.ts +65 -0
- package/tests/child-package-injection.test.ts +74 -0
- package/tests/child-safety.test.ts +12 -0
- package/tests/child-web-package.test.ts +224 -0
- package/tests/codegraph-tools.test.ts +35 -0
- package/tests/codemode-rendering.test.ts +107 -2
- package/tests/command-palette.test.ts +5 -5
- package/tests/context-threshold.test.ts +31 -0
- package/tests/delegate-for-reason-contract.test.ts +327 -0
- package/tests/delegated-key-learnings-contract.test.ts +3 -2
- package/tests/devbinary/native-review-parity.devtest.ts +1 -1
- package/tests/devbinary/pi-host-relay.devtest.ts +173 -3
- package/tests/engram-safety.test.ts +316 -0
- package/tests/generic-agent-tools.test.ts +16 -1
- package/tests/gentle-agents.test.ts +1895 -76
- package/tests/gentle-ai-binary-isolation.test.ts +135 -0
- package/tests/gentle-ai-binary.test.ts +19 -2
- package/tests/gentle-ai-child-guards.test.ts +202 -0
- package/tests/gentle-ai-dev-binary-surfacing.test.ts +125 -15
- package/tests/gentle-ai-installer.test.ts +548 -58
- package/tests/gentle-ai-prompt-model-routing.test.ts +123 -0
- package/tests/gentle-ai-renderer.test.ts +6 -6
- package/tests/gentle-ai.test.ts +999 -31
- package/tests/gentle-herdr-activity.test.ts +100 -0
- package/tests/gentle-notifications.test.ts +427 -0
- package/tests/gentle-shell-bin.test.ts +263 -19
- package/tests/gentle-shell-bundled.test.ts +1036 -0
- package/tests/gentle-shell-launcher.test.ts +251 -25
- package/tests/gentle-shell-startup-flow.test.ts +75 -0
- package/tests/gentle-shell-startup-update.test.ts +85 -0
- package/tests/gentle-shell-uninstall.test.ts +978 -0
- package/tests/gentle-shell-update-panel.test.ts +158 -0
- package/tests/gentle-shell.test.ts +611 -100
- package/tests/gentle-todo.test.ts +317 -14
- package/tests/herdr-activity.test.ts +243 -0
- package/tests/history-agent-home.test.ts +81 -0
- package/tests/history-child-guard.test.ts +70 -0
- package/tests/inprocess-reviewer.test.ts +20 -0
- package/tests/install-gentle-ai-failure.test.ts +69 -0
- package/tests/install-tui-mode-setting.test.ts +15 -0
- package/tests/install-wizard.test.ts +1223 -0
- package/tests/installer-bundles.test.ts +122 -0
- package/tests/installer-posix-bootstrap.test.ts +1201 -0
- package/tests/installer-preflight.test.ts +750 -0
- package/tests/installer-probes.test.ts +1106 -0
- package/tests/installer-runner.test.ts +2159 -0
- package/tests/installer-server.test.ts +1567 -0
- package/tests/installer-windows-bootstrap.test.ts +2410 -0
- package/tests/jobs-view.test.ts +160 -0
- package/tests/main-channel-upgrade.test.ts +395 -0
- package/tests/main-channel.test.ts +344 -0
- package/tests/maintainer/provider-relay.maintest.ts +13 -12
- package/tests/model-price-ratio.test.ts +116 -0
- package/tests/model-profiles-preservation.test.ts +153 -0
- package/tests/model-routing-package.test.ts +10 -0
- package/tests/nan-provider-runtime.test.ts +156 -0
- package/tests/nan-provider.test.ts +28 -18
- package/tests/native-binary-gate.test.ts +2 -0
- package/tests/native-review-capability-contract.test.ts +7 -1
- package/tests/native-review-cli.test.ts +236 -1
- package/tests/native-review-consent.test.ts +2 -2
- package/tests/native-review-parity-runtime.test.ts +1 -1
- package/tests/native-review-parity.test.ts +12 -48
- package/tests/native-risk-evidence-parity.test.ts +21 -0
- package/tests/no-self-pause-contract.test.ts +87 -0
- package/tests/notification-audio-native.test.ts +281 -0
- package/tests/notification-audio-windows.test.ts +581 -0
- package/tests/notification-audio.test.ts +548 -0
- package/tests/notification-customize.test.ts +655 -0
- package/tests/notification-events.test.ts +115 -0
- package/tests/notification-policy.test.ts +201 -0
- package/tests/notification-pulse-client.test.ts +356 -0
- package/tests/notification-pulse-protocol.test.ts +213 -0
- package/tests/notification-pulse-stream.test.ts +320 -0
- package/tests/notification-scheduler.test.ts +258 -0
- package/tests/notification-ui.test.ts +157 -0
- package/tests/npm-pack-result.test.ts +41 -0
- package/tests/odd-integration.test.ts +14 -5
- package/tests/odd-routing-canonical-ratchet.test.ts +53 -12
- package/tests/odd-routing-contract.test.ts +80 -23
- package/tests/odd-runtime-delegation-gate.test.ts +4 -1
- package/tests/orchestrator-budget.test.ts +29 -6
- package/tests/orchestrator-catalog.test.ts +146 -0
- package/tests/orchestrator-consultation-sdk.test.ts +614 -0
- package/tests/orchestrator-consultation.test.ts +111 -0
- package/tests/orchestrator-discovery.test.ts +241 -0
- package/tests/orchestrator-helper-consent.test.ts +171 -0
- package/tests/orchestrator-helper.test.ts +297 -0
- package/tests/orchestrator-message-card.test.ts +190 -0
- package/tests/orchestrator-presence.test.ts +23 -0
- package/tests/orchestrator-rdd-ownership.test.ts +6 -5
- package/tests/orchestrator-scope.test.ts +107 -0
- package/tests/orchestrator-state.test.ts +114 -0
- package/tests/orchestrator-status-publication-contract.test.ts +34 -0
- package/tests/orchestrator-tool-card.test.ts +398 -0
- package/tests/orchestrator-work-search.test.ts +318 -0
- package/tests/orchestrator-work.test.ts +147 -0
- package/tests/package-manifest.test.ts +105 -21
- package/tests/packed-runner-owned-path.test.ts +35 -1
- package/tests/parallel-reason-contract.test.ts +21 -0
- package/tests/parallel-writer-admission.test.ts +210 -0
- package/tests/permission-mode-policy.test.ts +194 -0
- package/tests/persona-single-channel.test.ts +4 -12
- package/tests/pi-pretty.test.ts +56 -0
- package/tests/pi-update-launcher.test.ts +87 -0
- package/tests/pi-update.test.ts +186 -0
- package/tests/provider-defect-handoff.test.ts +4 -3
- package/tests/quiet-tool-rendering.test.ts +160 -3
- package/tests/rdd-aware-verification-contract.test.ts +29 -41
- package/tests/rdd-status-line.test.ts +52 -0
- package/tests/render-cache-performance.test.ts +48 -0
- package/tests/review-agent-end-preflight.test.ts +62 -10
- package/tests/review-candidate-view.test.ts +101 -12
- package/tests/review-contract-prompt.test.ts +33 -4
- package/tests/review-controller-native-recovery.test.ts +327 -17
- package/tests/review-controller-native-routing.test.ts +255 -1
- package/tests/review-controller-workspace-root.test.ts +43 -2
- package/tests/review-controller.test.ts +2 -2
- package/tests/review-correction-lifecycle.test.ts +2 -1
- package/tests/review-gate.test.ts +7 -4
- package/tests/review-graph-schema.test.ts +2 -2
- package/tests/review-host-relay-routing.test.ts +5 -3
- package/tests/review-host-relay.test.ts +49 -2
- package/tests/review-integration-v2-forward.test.ts +21 -1
- package/tests/review-json-arguments.test.ts +167 -0
- package/tests/review-last-event-closure.test.ts +157 -8
- package/tests/review-ledger-contract.test.ts +5 -4
- package/tests/review-policy-judgment-day.test.ts +1 -1
- package/tests/review-policy-ordinary.test.ts +2 -2
- package/tests/review-relay-transport-agent.test.ts +66 -1
- package/tests/review-risk-assessment.test.ts +109 -33
- package/tests/review-session-standing-permission-controller.test.ts +16 -17
- package/tests/review-session-standing-permission-ipc.test.ts +6 -5
- package/tests/review-test-fixtures.ts +7 -1
- package/tests/review-transaction.test.ts +18 -1
- package/tests/run-test-suite.test.ts +83 -5
- package/tests/runtime-harness.mjs +42 -15
- package/tests/runtime-metrics-extension.test.ts +1 -1
- package/tests/runtime-metrics-native.test.ts +31 -1
- package/tests/selection-engine.test.ts +65 -5
- package/tests/session-change-capture.test.ts +10 -10
- package/tests/session-changes-shell.test.ts +242 -48
- package/tests/session-changes.test.ts +17 -24
- package/tests/session-profile-binding.test.ts +163 -0
- package/tests/session-profile-freeze.test.ts +394 -0
- package/tests/session-profile-persistence.test.ts +334 -0
- package/tests/session-subject-routing-contract.test.ts +34 -0
- package/tests/session-worktree-registry.test.ts +57 -2
- package/tests/shell-bar.test.ts +40 -0
- package/tests/shell-changes-view.test.ts +85 -34
- package/tests/shell-changes.test.ts +79 -62
- package/tests/shell-render-cache-runtime.test.ts +69 -0
- package/tests/shell-render-cache.test.ts +129 -0
- package/tests/shell-sidebar-layout.test.ts +27 -2
- package/tests/shell-todo.test.ts +132 -11
- package/tests/shell-usage-view.test.ts +1 -1
- package/tests/shell-usage.test.ts +35 -0
- package/tests/short-check-routing-contract.test.ts +49 -0
- package/tests/skill-registry-watcher.test.ts +119 -0
- package/tests/skill-registry.test.ts +311 -5
- package/tests/startup-banner.test.ts +117 -3
- package/tests/startup-home-repo.test.ts +170 -0
- package/tests/status-timing-diagnostics.test.ts +283 -0
- package/tests/support/orchestrator-modules.ts +19 -0
- package/tests/task-size-routing-contract.test.ts +241 -0
- package/tests/telemetry-trigger.test.ts +27 -1
- package/tests/test-strength-contract.test.ts +124 -0
- package/tests/verify-agent-contract.test.ts +90 -0
- package/tests/verify-first-launch-contract.test.ts +139 -0
- package/tests/verify-package-files.test.ts +56 -0
- package/tests/vim-editor-adapter.test.ts +47 -21
- package/tests/visual-customization-policy.test.ts +32 -3
- package/tests/visual-customize-view.test.ts +288 -10
- package/tests/writer-edit-surface-scope.test.ts +59 -2
- package/tests/writer-surfaces.test.ts +199 -0
- package/tests/yolo-customize.test.ts +18 -3
- package/tests/yolo-mode-runtime.test.ts +37 -10
- package/tests/yolo-mode.test.ts +38 -5
- package/tests/yolo-session-policy.test.ts +1 -1
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/README.md +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/schemas/lens.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/schemas/refuter.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/schemas/targeted-validator.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/vectors/lens.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/vectors/refuter.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.2.0 → v1.3.0}/bundle/vectors/targeted-validator.json +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { after, test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
// S9: in a bundled install the store, its legacy files and the transcript
|
|
8
|
+
// scan follow the agent home Pi runs with (PI_CODING_AGENT_DIR). Everywhere
|
|
9
|
+
// else they stay under ~/.pi/agent, where existing histories live.
|
|
10
|
+
|
|
11
|
+
// The OS home is a temporary folder before the extension is imported, so even
|
|
12
|
+
// a resolver that ignores PI_CODING_AGENT_DIR (or reads the OS home at import)
|
|
13
|
+
// can never write into the real home.
|
|
14
|
+
const osHome = fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-os-home-"));
|
|
15
|
+
const previousHome = { HOME: process.env.HOME, USERPROFILE: process.env.USERPROFILE };
|
|
16
|
+
process.env.HOME = osHome;
|
|
17
|
+
process.env.USERPROFILE = osHome;
|
|
18
|
+
const { default: promptHistoryExtension } = await import("../extensions/history/index.ts");
|
|
19
|
+
const { setBundledInstallForTesting } = await import("../lib/gentle-shell-bundled.ts");
|
|
20
|
+
after(() => {
|
|
21
|
+
for (const [name, value] of Object.entries(previousHome)) {
|
|
22
|
+
if (value === undefined) delete process.env[name];
|
|
23
|
+
else process.env[name] = value;
|
|
24
|
+
}
|
|
25
|
+
fs.rmSync(osHome, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
type Handler = (...args: unknown[]) => unknown;
|
|
29
|
+
|
|
30
|
+
function load(env: NodeJS.ProcessEnv) {
|
|
31
|
+
const handlers = new Map<string, Handler[]>();
|
|
32
|
+
const pi = {
|
|
33
|
+
on: (name: string, handler: Handler) => {
|
|
34
|
+
handlers.set(name, [...(handlers.get(name) ?? []), handler]);
|
|
35
|
+
},
|
|
36
|
+
registerShortcut: () => {},
|
|
37
|
+
registerCommand: () => {},
|
|
38
|
+
};
|
|
39
|
+
promptHistoryExtension(pi as never, {
|
|
40
|
+
env: { GENTLE_PI_HISTORY_CAPTURE: "1", ...env },
|
|
41
|
+
cwd: "/pi-history-test/project-agent-home",
|
|
42
|
+
instanceId: "inst-agent-home",
|
|
43
|
+
now: () => 1700000000000,
|
|
44
|
+
gentlePiConfigHome: fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-agent-home-config-")),
|
|
45
|
+
});
|
|
46
|
+
return async (prompt: string) => {
|
|
47
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
48
|
+
for (const handler of handlers.get("before_agent_start") ?? []) await handler({ prompt }, {});
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function holds(store: string, prompt: string): boolean {
|
|
53
|
+
if (!fs.existsSync(store)) return false;
|
|
54
|
+
return fs.readdirSync(store, { recursive: true }).map(String)
|
|
55
|
+
.map((file) => path.join(store, file))
|
|
56
|
+
.filter((file) => fs.statSync(file).isFile())
|
|
57
|
+
.some((file) => fs.readFileSync(file, "utf8").includes(prompt));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("outside a bundled install prompt history stays under ~/.pi/agent, whatever agent home Pi runs with", async (t) => {
|
|
61
|
+
const agentHome = fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-agent-home-"));
|
|
62
|
+
t.after(() => fs.rmSync(agentHome, { recursive: true, force: true }));
|
|
63
|
+
// The isolated launcher's home, and a prefix variable this package is not installed in.
|
|
64
|
+
await load({ PI_CODING_AGENT_DIR: agentHome, GENTLE_SHELL_PREFIX: agentHome })("isolated home prompt");
|
|
65
|
+
assert.ok(holds(path.join(osHome, ".pi", "agent", "history"), "isolated home prompt"));
|
|
66
|
+
assert.equal(fs.existsSync(path.join(agentHome, "history")), false);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("in a bundled install prompt history lives under the agent home Pi runs with", async (t) => {
|
|
70
|
+
const agentHome = fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-agent-home-"));
|
|
71
|
+
const prefix = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-prefix-")));
|
|
72
|
+
// The testing overlay stands in for this package running from that prefix.
|
|
73
|
+
setBundledInstallForTesting({ root: prefix });
|
|
74
|
+
t.after(() => {
|
|
75
|
+
setBundledInstallForTesting(undefined);
|
|
76
|
+
for (const dir of [agentHome, prefix]) fs.rmSync(dir, { recursive: true, force: true });
|
|
77
|
+
});
|
|
78
|
+
await load({ PI_CODING_AGENT_DIR: agentHome, GENTLE_SHELL_PREFIX: prefix })("bundled prompt");
|
|
79
|
+
assert.ok(holds(path.join(agentHome, "history"), "bundled prompt"));
|
|
80
|
+
assert.equal(holds(path.join(osHome, ".pi", "agent", "history"), "bundled prompt"), false);
|
|
81
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import promptHistoryExtension from "../extensions/history/index.ts";
|
|
7
|
+
|
|
8
|
+
// gentle-shell#1690: delegated children (GENTLE_PI_AGENTS_CHILD=1) receive
|
|
9
|
+
// the package too. Their before_agent_start prompt is a delegation brief,
|
|
10
|
+
// not user history, so a child must never initialize, capture or GC the
|
|
11
|
+
// store, even when capture is opted in. The selector may still register.
|
|
12
|
+
|
|
13
|
+
const CWD = "/pi-history-test/project-child";
|
|
14
|
+
|
|
15
|
+
type Handler = (...args: unknown[]) => unknown;
|
|
16
|
+
|
|
17
|
+
function load(child: boolean) {
|
|
18
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-child-"));
|
|
19
|
+
const handlers = new Map<string, Handler[]>();
|
|
20
|
+
const commands: string[] = [];
|
|
21
|
+
const shortcuts: string[] = [];
|
|
22
|
+
const pi = {
|
|
23
|
+
on: (name: string, handler: Handler) => {
|
|
24
|
+
handlers.set(name, [...(handlers.get(name) ?? []), handler]);
|
|
25
|
+
},
|
|
26
|
+
registerShortcut: (key: string) => { shortcuts.push(key); },
|
|
27
|
+
registerCommand: (name: string) => { commands.push(name); },
|
|
28
|
+
};
|
|
29
|
+
promptHistoryExtension(pi as never, {
|
|
30
|
+
env: { GENTLE_PI_HISTORY_CAPTURE: "1", GENTLE_PI_AGENTS_CHILD: child ? "1" : "0" },
|
|
31
|
+
root,
|
|
32
|
+
cwd: CWD,
|
|
33
|
+
instanceId: `inst-${child ? "child" : "parent"}`,
|
|
34
|
+
now: () => 1700000000000,
|
|
35
|
+
agentDir: path.join(root, "agent"),
|
|
36
|
+
sessionsRoot: path.join(root, "sessions"),
|
|
37
|
+
gentlePiConfigHome: fs.mkdtempSync(path.join(os.tmpdir(), "pi-history-child-config-")),
|
|
38
|
+
});
|
|
39
|
+
const fire = async (name: string, event: unknown) => {
|
|
40
|
+
for (const handler of handlers.get(name) ?? []) await handler(event, {});
|
|
41
|
+
};
|
|
42
|
+
return { root, fire, commands, shortcuts };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const flush = () => new Promise((resolve) => setImmediate(resolve));
|
|
46
|
+
|
|
47
|
+
test("a delegated child never initializes, captures or GCs prompt history", async () => {
|
|
48
|
+
const { root, fire, commands, shortcuts } = load(true);
|
|
49
|
+
await flush();
|
|
50
|
+
assert.deepEqual(fs.readdirSync(root), [], "no warm-up writer init");
|
|
51
|
+
await fire("before_agent_start", { prompt: "delegated task brief" });
|
|
52
|
+
assert.deepEqual(fs.readdirSync(root), [], "no prompt capture");
|
|
53
|
+
await fire("session_shutdown", {});
|
|
54
|
+
assert.deepEqual(fs.readdirSync(root), [], "no GC rewrite");
|
|
55
|
+
assert.deepEqual(commands, ["history"]);
|
|
56
|
+
assert.equal(shortcuts.length, 1);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("an opted-in parent still captures prompt history", async () => {
|
|
60
|
+
const { root, fire } = load(false);
|
|
61
|
+
await flush();
|
|
62
|
+
await fire("before_agent_start", { prompt: "parent prompt" });
|
|
63
|
+
const files = fs.readdirSync(root, { recursive: true }).map(String);
|
|
64
|
+
assert.ok(files.length > 0, "the parent initializes its store");
|
|
65
|
+
const captured = files
|
|
66
|
+
.map((file) => path.join(root, file))
|
|
67
|
+
.filter((file) => fs.statSync(file).isFile())
|
|
68
|
+
.some((file) => fs.readFileSync(file, "utf8").includes("parent prompt"));
|
|
69
|
+
assert.ok(captured, `the parent prompt is persisted: ${JSON.stringify(files)}`);
|
|
70
|
+
});
|
|
@@ -647,3 +647,23 @@ test("the no-apiKey options shape is identical on the composed-provider and deps
|
|
|
647
647
|
assert.deepEqual(providerKeys, completeKeys, "routing through the composed provider must not change which credential fields this module forwards");
|
|
648
648
|
assert.equal(providerKeys.includes("apiKey"), false, "neither path may carry an apiKey the registry did not resolve");
|
|
649
649
|
});
|
|
650
|
+
|
|
651
|
+
for (const transport of ["sse", "websocket", "websocket-cached", "auto", undefined] as const) {
|
|
652
|
+
for (const composed of [false, true]) {
|
|
653
|
+
test(`reviewer forwards transport ${transport ?? "absent"} through ${composed ? "composed provider" : "compat completion"} unchanged`, async () => {
|
|
654
|
+
const model = fakeModel();
|
|
655
|
+
const registry = fakeRegistry([model]);
|
|
656
|
+
const captured = capturingComplete(assistantText("review result"));
|
|
657
|
+
if (composed) registry.getProvider = () => ({
|
|
658
|
+
streamSimple: (model, context, options) => ({ result: () => captured.complete(model, context, options) }),
|
|
659
|
+
});
|
|
660
|
+
const outcome = await runInProcessReviewer(baseRequest({ transport }), { registry, complete: captured.complete });
|
|
661
|
+
assert.deepEqual(outcome, { kind: "text", text: "review result", reviewerModel: "openai/gpt-5" });
|
|
662
|
+
assert.equal(captured.calls.length, 1);
|
|
663
|
+
assert.equal(captured.calls[0]!.options?.transport, transport);
|
|
664
|
+
assert.equal(Object.hasOwn(captured.calls[0]!.options!, "transport"), transport !== undefined);
|
|
665
|
+
assert.equal(captured.calls[0]!.options?.apiKey, "test-key");
|
|
666
|
+
assert.equal(captured.calls[0]!.options?.timeoutMs, 30_000);
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { copyFileSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
|
|
8
|
+
// The postinstall entry with a stub installer that fails the way a Windows Go source
|
|
9
|
+
// build does: GentleAiInstallerError caused by execFile's error, which carries stdout
|
|
10
|
+
// and stderr. pnpm shows this stderr in its lifecycle output, and the installer wizard
|
|
11
|
+
// reports the line its one-line detail rule selects.
|
|
12
|
+
function postinstall(failure: string) {
|
|
13
|
+
const root = mkdtempSync(join(tmpdir(), "gentle-pi-postinstall-failure-"));
|
|
14
|
+
try {
|
|
15
|
+
const scripts = join(root, "node_modules", "gentle-pi", "scripts");
|
|
16
|
+
mkdirSync(scripts, { recursive: true });
|
|
17
|
+
copyFileSync(new URL("../scripts/install-gentle-ai.mjs", import.meta.url), join(scripts, "install-gentle-ai.mjs"));
|
|
18
|
+
copyFileSync(new URL("../scripts/install-tui-mode-setting.mjs", import.meta.url), join(scripts, "install-tui-mode-setting.mjs"));
|
|
19
|
+
writeFileSync(join(scripts, "gentle-ai-installer.mjs"), `export const INSTALLER_VERSION = "4.0.0";\nexport async function installGentleAi() {\n${failure}\n}\n`);
|
|
20
|
+
return spawnSync(process.execPath, [join(scripts, "install-gentle-ai.mjs")], { encoding: "utf8",
|
|
21
|
+
env: { ...process.env, GENTLE_PI_AGENT_HOME: join(root, "agent"), GENTLE_PI_SKIP_GENTLE_AI_INSTALL: "0" } });
|
|
22
|
+
} finally { rmSync(root, { recursive: true, force: true }); }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
test("a failed postinstall prints the whole cause chain with codes and the failing command's output, and exits 1", () => {
|
|
26
|
+
const result = postinstall(`
|
|
27
|
+
const go = Object.assign(new Error("Command failed: C:\\\\go\\\\bin\\\\go.exe install pkg@v4.0.0\\ngo: downloading pkg v4.0.0\\ngo: verifying pkg@v4.0.0: checksum mismatch"),
|
|
28
|
+
{ code: 1, stdout: "", stderr: "go: downloading pkg v4.0.0\\ngo: verifying pkg@v4.0.0: checksum mismatch\\n" });
|
|
29
|
+
throw Object.assign(new Error("Gentle AI Go SumDB source installation failed for pkg@v4.0.0.", { cause: go }), { code: "GENTLE_AI_GO_INSTALL_FAILED" });`);
|
|
30
|
+
assert.equal(result.status, 1);
|
|
31
|
+
assert.equal(result.stderr, [
|
|
32
|
+
"gentle-pi could not install its package-local Gentle AI v4.0.0 binary: Gentle AI Go SumDB source installation failed for pkg@v4.0.0. (code GENTLE_AI_GO_INSTALL_FAILED)",
|
|
33
|
+
" caused by Error: Command failed: C:\\go\\bin\\go.exe install pkg@v4.0.0 (code 1)",
|
|
34
|
+
" stderr:",
|
|
35
|
+
" | go: downloading pkg v4.0.0",
|
|
36
|
+
" | go: verifying pkg@v4.0.0: checksum mismatch",
|
|
37
|
+
// Last, in the `Error:` form the installer wizard's one-line detail selects.
|
|
38
|
+
" root cause Error: go: verifying pkg@v4.0.0: checksum mismatch",
|
|
39
|
+
"",
|
|
40
|
+
].join("\n"));
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("a failed postinstall without a cause reads exactly as before", () => {
|
|
44
|
+
for (const [failure, shown] of [["throw new Error(\"plain failure\");", "plain failure"], ["throw \"boom\";", "boom"]]) {
|
|
45
|
+
const result = postinstall(failure);
|
|
46
|
+
assert.equal(result.status, 1);
|
|
47
|
+
assert.equal(result.stderr, `gentle-pi could not install its package-local Gentle AI v4.0.0 binary: ${shown}\n`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("a failed postinstall bounds each output to its last 4000 characters, reports a signal, and ends a cause cycle", () => {
|
|
52
|
+
const bounded = postinstall(`
|
|
53
|
+
const timeout = Object.assign(new Error("Command failed: go.exe install"), { code: null, signal: "SIGTERM", stderr: "x".repeat(5000) + "\\nlast line", stdout: "progress\\n" });
|
|
54
|
+
throw new Error("top", { cause: timeout });`);
|
|
55
|
+
assert.equal(bounded.status, 1);
|
|
56
|
+
assert.match(bounded.stderr, /caused by Error: Command failed: go\.exe install \(signal SIGTERM\)/);
|
|
57
|
+
assert.match(bounded.stderr, /stderr \(last 4000 characters\):/);
|
|
58
|
+
assert.doesNotMatch(bounded.stderr, /x{3991}/);
|
|
59
|
+
assert.match(bounded.stderr, /stdout:\n {4}\| progress/);
|
|
60
|
+
assert.match(bounded.stderr, /root cause Error: last line\n$/, "stderr wins over stdout");
|
|
61
|
+
const cyclic = postinstall(`
|
|
62
|
+
const first = new Error("first");
|
|
63
|
+
const second = new Error("second", { cause: first });
|
|
64
|
+
Object.assign(first, { cause: second });
|
|
65
|
+
throw new Error("top", { cause: first });`);
|
|
66
|
+
assert.equal(cyclic.status, 1);
|
|
67
|
+
assert.equal(cyclic.stderr.split("\n").filter((line) => line.startsWith(" caused by ")).length, 6);
|
|
68
|
+
assert.match(cyclic.stderr, /further causes omitted\n$/);
|
|
69
|
+
});
|
|
@@ -378,3 +378,18 @@ for (const [name, packagePath] of [
|
|
|
378
378
|
});
|
|
379
379
|
}
|
|
380
380
|
}
|
|
381
|
+
|
|
382
|
+
// #1258 / #2109: on recent Windows, lstat by path reports dev 0 while fstat on
|
|
383
|
+
// the opened handle reports the volume serial, so settings.json looked replaced
|
|
384
|
+
// and every `pi install npm:gentle-pi` postinstall exited 1.
|
|
385
|
+
test("sameOpenedFile accepts the same Windows file whose path stat has no volume id", async () => {
|
|
386
|
+
const { sameOpenedFile } = await import("../scripts/install-tui-mode-setting.mjs");
|
|
387
|
+
assert.equal(sameOpenedFile({ dev: 0, ino: 42 }, { dev: 2384917313, ino: 42 }, "win32"), true);
|
|
388
|
+
assert.equal(sameOpenedFile({ dev: 2384917313, ino: 42 }, { dev: 2384917313, ino: 42 }, "win32"), true);
|
|
389
|
+
// A different file is still refused on Windows, and a known volume id still has to match.
|
|
390
|
+
assert.equal(sameOpenedFile({ dev: 0, ino: 42 }, { dev: 2384917313, ino: 43 }, "win32"), false);
|
|
391
|
+
assert.equal(sameOpenedFile({ dev: 7, ino: 42 }, { dev: 2384917313, ino: 42 }, "win32"), false);
|
|
392
|
+
// POSIX keeps the full device and inode check.
|
|
393
|
+
assert.equal(sameOpenedFile({ dev: 0, ino: 42 }, { dev: 2384917313, ino: 42 }, "linux"), false);
|
|
394
|
+
assert.equal(sameOpenedFile({ dev: 66, ino: 42 }, { dev: 66, ino: 42 }, "darwin"), true);
|
|
395
|
+
});
|